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