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.");
// 执行销售操作
}
当调用revert时,它将返回十六进制数据,如下所示。
0x08c379a0 // 错误函数选择器(字符串)
0x0000000000000000000000000000000000000000000000000000000000000020 // 数据偏移/Data offset
0x000000000000000000000000000000000000000000000000000000000000001a // 字符串长度/String length
0x4e6f7420656e6f7567682045746865722070726f76696465642e000000000000 // 字符串数据/String data