Безопасно ли вызывать revert() вместо возврата значения?

У меня есть следующий фрагмент кода:

function func() public returns (bool) {
    if (some condition on msg.sender) {
        do some stuff
        return true;
    }
    revert();
}

Компилятор (0.4.24) не выдает никаких предупреждений об этом, хотя не все пути выполнения возвращают значение.

Конечно, я мог бы позвонить revert()в самом начале (с противоположным условием) и избежать этой проблемы, но из соображений внутреннего стиля кодирования я предпочитаю, как показано выше.

Теперь я знаю, что в C++, например, функция может генерировать исключение вместо возврата значения, и все остается «в такт». Поэтому я предполагаю, что здесь может быть то же самое, но я все же хочу быть уверенным, что нет возможности повреждения стека или чего-то подобного (из-за того, что при завершении функции в стек ничего не помещается).

Согласно документам , revertкод операции действительно что-то возвращает.

Но я не уверен, что revert функция работает, и даже если да, она не обязательно будет того же типа, что и в моей функции ( boolв данном случае).

Итак... мне есть о чем беспокоиться, или выброшенное исключение "заботится" о возвращаемом значении?

Спасибо!

Ответы (1)

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

Есть несколько незначительных исключений из этого правила, а именно delegatecallи аналогичные функции. Вы можете узнать больше об этом поведении (и о возврате в целом) по адресу: https://solidity.readthedocs.io/en/v0.4.24/control-structures.html#error-handling-assert-require-revert-and-exceptions .