Llamada de validación local de Solidity antes de enviar la transacción de cambio de estado

Tengo un caso de uso en el que el usuario debería poder cambiar el estado de un contrato solo cuando las entradas pasan una verificación de validación. Sin embargo, las validaciones son costosas de realizar y se pueden realizar localmente porque dependen solo de los parámetros de la función. ¿Es posible realizar la validación con una llamada de contrato y luego, si pasa, transmitir la transacción de cambio de estado con una transacción de envío?

Este es el ejemplo que tengo en mente:

contract A {

    uint8 stateVariable = 0;

    //constant callable function for expensive verification
    function constantVerifier(uint8 param) constant {
        //expensive verification
        require(param <= 5);
        //broadcast transaction to change state of this instance
        A(this).changeState();
    }

    //state changing function
    function changeState() {
        //only this contract allowed to change state
        require(msg.sender == address(this));
        //change state
        stateVariable++;
    }
}

Este fragmento en particular no cambia el estado. ¿Es posible lograr algo así en Solidity? En general, ¿cuál es el patrón de diseño para manejar cheques costosos antes de cambiar el estado de los contratos?

Respuestas (1)

Puede dividir constantVerifierpara evitar una costosa verificación. El código de la siguiente manera:

contract A {

    uint8 stateVariable = 0;

    //constant callable function for expensive verification
    function constantVerifier(uint8 param) constant returns (bool){
        if (param <= 5) {
            return true;
        }
        return false;
    }

    //state changing function
    function changeState() {
        //only this contract allowed to change state
        require(msg.sender == address(this));
        //change state
        stateVariable++;
    }

}

Al principio, debe llamar a constantVerifierla función para verificar si el parámetro es válido. Si vuelve truey luego llama changeState, o nada. Espero que ayude ~

Me acabo de dar cuenta de lo tonto que era eso. Gracias :)
EDITAR: Oh, espera. Necesito que se llame a la función changeState() solo si pasa la verificación. La solución anterior me da una forma de cambiar el estado incluso cuando los parámetros no son válidos. eso no deberia pasar
Iniciando primero el contrato A, y luego llamando a este código:if (contractA.constantVerifier(param)) { contractA.changeState(); } else { // do something }
Eso aún me costaría gasolina y, además, aumentaría el consumo de gasolina debido a la llamada adicional, como se indica en este hilo: ethereum.stackexchange.com/q/13851/5791 . Estoy buscando un mecanismo de validación confiable que no cambie de estado y no se cobre. , si es posible
@KetanBhokray La función constantVerifier es una función constante, no consume gas.
Por favor revise el enlace de arriba. Una función constante no consume gas siempre que se llame solo en un nodo local. Si se llama desde una función no constante, dado que las operaciones de la función constante se realizan en un nodo remoto, costará gasolina