Автор: Павел Найданов 🕵️♂️
Стандарт EIP-140 предлагает добавить инструкцию REVERT которая нашла широкое применение в смарт-контрактах на языке solidity. Использование этой инструкции позволяет остановить выполнение, отменить изменение состояния блокчейна и вернуть причину остановки.
Знаете ли вы!? Инструкция REVERT была предложена только 6 февраля 2017 года. До этого момента подобной инструкции не существовало.
До внедрения стандарта разработчики использовали assert() для того, чтобы откатить выполнение транзакции при наступление некоторого условия. В отличие от REVERT, использование assert() потребляло весь оставшийся газ, независимо от места вызова в коде.
Инструкция REVERT представлена кодом операции 0xfd. Этот код операции принимает два параметра, которые находятся последними в стеке:
- offset. Смещение в памяти, указывающее на возвращаемые данные
- size. размер возвращаемых данных
Важно! Семантически использование REVERT относительно памяти и стоимости памяти идентично инструкции RETURN и принимает одинаковые параметры.
Возврат транзакции без информации об ошибке:
function withdraw(uint256 amount) external {
if (_balance < amount) {
revert();
}
...
}Возврат транзакции с указанием текстовой ошибки:
function withdraw(uint256 amount) external {
if (_balance < amount) {
revert("Insufficient amount");
}
...
}Возврат транзакции с использованием кастомной ошибки:
error InsufficientAmount();
function withdraw(uint256 amount) external {
if (_balance < amount) {
revert InsufficientAmount();
}
...
}- EIP-140: REVERT instruction
- Документация solidity по инструкции revert()
- Для тех кому интересна история обсуждения внедрения EIP