У меня есть вариант использования, когда пользователь должен иметь возможность изменять состояние контракта только тогда, когда входные данные проходят проверку проверки. Однако проверки требуют больших затрат и могут выполняться локально, поскольку они зависят только от параметров функции. Можно ли выполнить проверку с помощью вызова контракта, а затем, если она пройдет, передать транзакцию изменения состояния с помощью транзакции отправки?
Вот пример, который я имею в виду:
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++;
}
}
Этот конкретный фрагмент не меняет состояние. Можно ли добиться чего-то подобного в Solidity? В общем, каков шаблон проектирования для обработки дорогостоящих проверок перед изменением состояния контрактов?
Вы можете разделить constantVerifier
, чтобы избежать дорогостоящей проверки. Код выглядит следующим образом:
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++;
}
}
Сначала вы должны вызвать constantVerifier
функцию, чтобы проверить, действителен ли параметр. Если вернуться true
и потом звонить changeState
, то ничего. Надеюсь поможет~
Кетан Бхокрай
Кетан Бхокрай
БинГоБинБин
if (contractA.constantVerifier(param)) { contractA.changeState(); } else { // do something }
Кетан Бхокрай
БинГоБинБин
Кетан Бхокрай