Автор: Павел Найданов 🕵️♂️
Стандарт 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