Локальный вызов проверки Solidity перед отправкой транзакции изменения состояния

У меня есть вариант использования, когда пользователь должен иметь возможность изменять состояние контракта только тогда, когда входные данные проходят проверку проверки. Однако проверки требуют больших затрат и могут выполняться локально, поскольку они зависят только от параметров функции. Можно ли выполнить проверку с помощью вызова контракта, а затем, если она пройдет, передать транзакцию изменения состояния с помощью транзакции отправки?

Вот пример, который я имею в виду:

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? В общем, каков шаблон проектирования для обработки дорогостоящих проверок перед изменением состояния контрактов?

Ответы (1)

Вы можете разделить 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, то ничего. Надеюсь поможет~

Я только что понял, насколько это было глупо и очевидно. Спасибо :)
РЕДАКТИРОВАТЬ: О, подождите. Мне нужно, чтобы функция changeState() вызывалась только в том случае, если проверка прошла успешно. Приведенное выше решение дает мне возможность изменить состояние, даже если параметры недействительны. Этого не должно быть
Сначала запустите контракт A, а затем вызовите этот код:if (contractA.constantVerifier(param)) { contractA.changeState(); } else { // do something }
Это все равно будет стоить мне газа и, кроме того, увеличит расход газа из-за дополнительного вызова, как указано в этой теме: ethereum.stackexchange.com/q/13851/5791 . Я ищу бесплатный механизм доверенной проверки без изменения состояния. , если это возможно
@KetanBhokray Функция ConstantVerifier является постоянной функцией, она не потребляет газ.
Пожалуйста, проверьте ссылку выше. Постоянная функция не потребляет газ, пока она вызывается только на локальном узле. При вызове из непостоянной функции, поскольку операции постоянной функции выполняются на удаленном узле, это будет стоить газа