错误
在Solidity中,开发者可以以三种主要形式定义错误: revert、 require 和 assert。 从功能角度来看,这些方法的主要区别有两个:
- 它们是否可以抛出开发者定义的错误原因;
 - 它们是否可以抛出携带变量的开发者定义错误;
 
主要区别如下:
| 类型 | 自定义原因 | 携带变量 | 示例 | 
|---|---|---|---|
revert | ✅ | ✅ | Reason: UnauthorizedAccess(0x05D01CAF54524A610CCF187082201120757f7AE5) | 
require | ✅ | ❌ | 原因:UnauthorizedAccess | 
assert | ❌ | ❌ | 原因: Assertion violated | 
代码演示
下面,我们使用三种形式的错误来观察gas使用的变化:
contract Error {
    error UnauthorizedAccess();
    // gas: 164
    function errorRevert() external pure {
        if (true) revert UnauthorizedAccess();
    }
    // gas: 268
    function errorRequire() external pure {
        require(false, "UnauthorizedAccess");
    }
    // gas: 180
    function errorAssert() external pure {
        assert(false);
    }
}
gas优化建议如下:
🌟1. revert 最为推荐,因为它既可以抛出错误消息,也可以抛出相关变量。
🌟2. require 中的字符串存储在链上,这不仅消耗更多的gas,还增加了  合约大小。 建议根据实际需求选择。
🌟3. 如果有使用 assert 的场景,建议用 revert 替换。