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
广告