Skip to content

Latest commit

 

History

History
58 lines (42 loc) · 3.17 KB

README.md

File metadata and controls

58 lines (42 loc) · 3.17 KB

EIP-140: REVERT instruction

Автор: Павел Найданов 🕵️‍♂️

Стандарт EIP-140 предлагает добавить инструкцию REVERT которая нашла широкое применение в смарт-контрактах на языке solidity. Использование этой инструкции позволяет остановить выполнение, отменить изменение состояния блокчейна и вернуть причину остановки.

Знаете ли вы!? Инструкция REVERT была предложена только 6 февраля 2017 года. До этого момента подобной инструкции не существовало.

До внедрения стандарта разработчики использовали assert() для того, чтобы откатить выполнение транзакции при наступление некоторого условия. В отличие от REVERT, использование assert() потребляло весь оставшийся газ, независимо от места вызова в коде.

Инструкция REVERT представлена кодом операции 0xfd. Этот код операции принимает два параметра, которые находятся последними в стеке:

  • offset. Смещение в памяти, указывающее на возвращаемые данные
  • size. размер возвращаемых данных

Важно! Семантически использование REVERT относительно памяти и стоимости памяти идентично инструкции RETURN и принимает одинаковые параметры.

Варианты использования revert в коде solidity

Возврат транзакции без информации об ошибке:

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();
    }
    ...
}

Links

  1. EIP-140: REVERT instruction
  2. Документация solidity по инструкции revert()
  3. Для тех кому интересна история обсуждения внедрения EIP