Solidity - обработка ошибок

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

  • assert(bool condition)- В случае, если условие не выполняется, вызов этого метода вызывает недопустимый код операции, и любые изменения, внесенные в состояние, возвращаются. Этот метод используется при внутренних ошибках.

  • require(bool condition)- Если условие не выполняется, вызов этого метода возвращается в исходное состояние. - Этот метод следует использовать для ошибок на входах или внешних компонентах.

  • require(bool condition, string memory message)- Если условие не выполняется, вызов этого метода возвращается в исходное состояние. - Этот метод следует использовать для ошибок на входах или внешних компонентах. Он предоставляет возможность предоставить собственное сообщение.

  • revert() - Этот метод прерывает выполнение и отменяет любые изменения, внесенные в состояние.

  • revert(string memory reason)- Этот метод прерывает выполнение и отменяет любые изменения, внесенные в состояние. Он предоставляет возможность предоставить собственное сообщение.

пример

Попробуйте использовать следующий код, чтобы понять, как работает обработка ошибок в Solidity.

pragma solidity ^0.5.0;

contract Vendor {
   address public seller;
   modifier onlySeller() {
      require(
         msg.sender == seller,
         "Only seller can call this."
      );
      _;
   }
   function sell(uint amount) public payable onlySeller { 
      if (amount > msg.value / 2 ether)
         revert("Not enough Ether provided.");
      // Perform the sell operation.
   }
}

Когда вызывается revert, он возвращает шестнадцатеричные данные, как показано ниже.

Вывод

0x08c379a0                     // Function selector for Error(string)
0x0000000000000000000000000000000000000000000000000000000000000020 // Data offset
0x000000000000000000000000000000000000000000000000000000000000001a // String length
0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // String data