Ejecución del contrato CrowdFunder en Mix y causas del modificador de función - Excepción de solidez (mal salto)

Estoy experimentando con el contrato CrowdFunder que encontré en la red.

https://github.com/nemild/learnxinyminutes-docs/blob/solidity/solidity.html.markdown

y obtengo un error de excepción de solidez (mal salto) cuando se ejecuta la función payOut () y la variable de enumeración de estado es diferente a la que se pasa a inState (State.Successful)

enum State {
        Fundraising,
        ExpiredRefundPending,
        Successful,
        ExpiredRefundComplete
    }


   modifier inState(State _state) {
        if (state != _state) throw;
        _
    }

Si estado == _estado entonces no hay error. La función se ejecuta como se esperaba.

function payOut()
    public
    inState(State.Successful)
    {
        if(!fundRecipient.send(this.balance)) {
            throw;
        }

        winnerPaid(fundRecipient);
    }

¿Es esto porque la función inState está definida para ejecutarse cuando _state !=state . ¿Es esta la causa de la excepción Solidity (mal salto)?

Respuestas (2)

El modificador inState(State _state) es básicamente una afirmación que asegura que antes de que se ejecute la función real (representada por _ en el código del modificador), el estado actual del contrato está en el estado dado. Me parece que está funcionando exactamente como debería. Es otra forma de decir "esta función (payOut) solo debe ejecutarse si el estado de los contratos es _state.

El _ en el código de modificadores representa el código en la función que se está modificando. Entonces, si el _ viene después de la prueba de modificadores, payOut solo se ejecutará si se cumple la condición. Si el _ viniera antes de la prueba de modificadores, payOut se habría ejecutado primero y luego se ejecutaría la prueba de modificadores.

En los viejos tiempos de la programación en C sin procesar, esto puede haberse hecho con una macro #define.

"mal salto" es solo la forma en que se modela "lanzamiento", por lo que es el comportamiento esperado.