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?
Puede dividir constantVerifier
para 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 constantVerifier
la función para verificar si el parámetro es válido. Si vuelve true
y luego llama changeState
, o nada. Espero que ayude ~
Ketan Bhokray
Ketan Bhokray
BinGoBinBin
if (contractA.constantVerifier(param)) { contractA.changeState(); } else { // do something }
Ketan Bhokray
BinGoBinBin
Ketan Bhokray