• Solidity - 合约结构 - 错误(error)- ^0.8.4版本新增


    我们知道,合约结构包含 状态变量、函数、函数修改器(modifier)、事件(event)、结构体(struct)和枚举类型(enum)

    在^0.8.4版本,合约结构增加了错误(error),为应对失败时,错误可以在revert 中使用。与错误字符串相比,error花费更少的gas(即更便宜),并且允许编码额外的数据,还可以使用natspec注释形式。

    举个栗子,代码如下:

    1. // SPDX-License-Identifier: MIT
    2. pragma solidity ^0.8.4;
    3. /// @dev 没有足够的金额
    4. /// @param _balance表示当前合约账户余额
    5. /// @param _amount 转账金额
    6. error NotEnoughFunds(uint _balance,uint _amount);
    7. contract TestError {
    8. /// @dev 事件 - 记录转账信息
    9. event Tansfer(address _from, address _to, uint _amount);
    10. /// @dev 当合约账户余额小于转账金额时,使用字符串 revert
    11. function transfer(address _to, uint _amount) external {
    12. if (address(this).balance < _amount) {
    13. revert("no enough funds");
    14. }
    15. emit Tansfer(msg.sender, _to, _amount);
    16. }
    17. /// @dev 当合约账户余额小于转账金额时,使用error revert
    18. function transferWithError(address _to, uint _amount) external {
    19. if (address(this).balance < _amount) {
    20. revert NotEnoughFunds(address(this).balance, _amount);
    21. }
    22. emit Tansfer(msg.sender, _to, _amount);
    23. }
    24. }

    error同struct一样,可以写在合约里,也可以写在合约外面,以上代码写在了合约外面。同时使用了natspec注释形式。 

    使用Remix中JavaScript VM部署合约,执行合约中两个函数(一个使用error结构,另一个使用错误字符串),验证失败时花费的gas:

    (1)执行transfer函数(使用错误字符串)

    执行后可以看到错误信息提示“no enough funds”,花费的gas为22513

    (2)执行transferWithError函数(使用error结构)

    执行后可以看到错误中输出的参数值,感觉与前端的console.log一样,可以当作调试信息,花费的gas为22497,比上面少了16个gas

    若部署到测试网,如 Popsten,执行函数会直接先提示(如下图所示),若强制进行交易,则与上面结果相同。

     

     

  • 相关阅读:
    Linux 网络巨型帧设置方法
    LLMs之InternLM:InternLM-20B的简介、安装、使用方法之详细攻略
    第二十五届全国青少年信息学奥林匹克联赛初赛
    顺序栈的入栈出栈
    HTML使用 crypto-js-AES 加密
    javaweb之ajax异步交互
    Linux信号量(简易版)
    做一个物联网温湿度传感器(一)SHT30传感器介绍
    MySQL 有这一篇就够(呕心狂敲37k字,只为博君一点赞!!!)
    vue预览txt
  • 原文地址:https://blog.csdn.net/ling1998/article/details/125548188