函数assertrequire可以用于检查条件,如果条件不满足则抛出异常。

assert():

函数只能用于测试内部错误,检查不变量,正常的函数代码永远不会产生Panic, 甚至是基于一个无效的外部输入时。 如果发生了,那就说明出现了一个需要你修复的 bug。如果使用得当,语言分析工具可以识别出那些会导致 Panic 的 assert 条件和函数调用。

想象为一个过于自信的实现方式,即使有错误,也会执行并扣除 gas。

下列情况将会产生一个Panic异常: 提供的错误码编号,用来指示Panic的类型。

  1. 0x01: 如果你调用 assert 的参数(表达式)结果为 false 。
  2. 0x11: 在``unchecked { … }``外,如果算术运算结果向上或向下溢出。
  3. 0x12; 如果你用零当除数做除法或模运算(例如 5 / 0 或 23 % 0 )。
  4. 0x21: 如果你将一个太大的数或负数值转换为一个枚举类型。
  5. 0x22: 如果你访问一个没有正确编码的存储byte数组.
  6. 0x31: 如果在空数组上 .pop() 。
  7. 0x32: 如果你访问 bytesN 数组(或切片)的索引太大或为负数。(例如: x[i] 而 i >= x.length或 i < 0).
  8. 0x41: 如果你分配了太多的内内存或创建了太大的数组。
  9. 0x51: 如果你调用了零初始化内部函数类型变量。

require():

想象为一个更有礼貌些的实现方式,会发现错误,不扣除 gas。

函数要么创建一个 Error(string) 类型的错误,或者没有错误数据的错误并且 require函数应该用于确认条件有效性,例如输入变量,或合约状态变量是否满足条件,或验证外部合约调用返回的值。

下列情况将会产生一个 Error(string) (或没有数据)的错误:

  1. 如果你调用 require 的参数(表达式)最终结果为 false 。
  2. 如果你在不包含代码的合约上执行外部函数调用。
  3. 如果你通过合约接收以太币,而又没有 payable 修饰符的公有函数(包括构造函数和 fallback 函数)。
  4. 如果你的合约通过公有 getter 函数接收 Ether 。

在下面的情况下,来自外部调用的错误数据(如果提供的话)被转发,这意味可能 Error 或 Panic 都有可能触发。

  1. 如果 .transfer() 失败。
  2. 如果你通过消息调用调用某个函数,但该函数没有正确结束(例如, 它耗尽了 gas,没有匹配函数,或者本身抛出一个异常),不包括使用低级别 call , send , delegatecall , callcode或 staticcall 的函数调用。低级操作不会抛出异常,而通过返回 false 来指示失败。
  3. 如果你使用 new 关键字创建合约,但合约创建 没有正确结束 。

可以给 require 提供一个消息字符串,而 assert 不行。 在下例中,你可以看到如何轻松使用``require`` 检查输入条件以及如何使用 assert 检查内部错误.

revert():

revert 函数是另一个可以在代码块中处理异常的方法, 可以用来标记错误并回退当前的调用。revert 调用中还可以包含有关错误信息的参数,这个信息会被返回给调用者,并且产生一个 Error(string) 错误。

https://blog.csdn.net/tianlongtc/article/details/80261757

https://learnblockchain.cn/docs/solidity/control-structures.html#assert-require-revert

Solidity 中 revert(), assert() 和 require()相关推荐

  1. Solidity 中 revert(), assert() 和 require() 的使用方法

    转载自:https://ethfans.org/posts/when-to-use-revert-assert-and-require-in-solidity Solidity 0.4.10 版本发布 ...

  2. Solidity 中的对数计算

    背景 在进行 solidity 开发时,某些场景可能需要进行对数的计算.对数计算虽然在通用编程领域已经有成熟的解决方案(几乎所有编程语言都有相关的内置库或者第三方库来实现).但是在 solidity ...

  3. c++ 数组引用_在 Solidity中使用值数组以降低 gas 消耗

    背景 我们Datona Labs在开发和测试Solidity数据访问合约(S-DAC:Smart-Data-Access-Contract)模板过程中,经常需要使用只有很小数值的小数组(数组元素个数少 ...

  4. C++中#error/assert/static_assert的区别及使用

    C++ 语言支持可帮助您调试应用程序的三个错误处理机制:#error 指令.static_assert 关键字和 assert (CRT) 宏.所有的三种机制都会发出错误消息. #error可看做预编 ...

  5. 使用编译器——Solidity中文文档(8)

    写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第八部分<使用编译器>,特发布出来邀请solidity爱好者.开发者做公开 ...

  6. java中的assert

    Java陷阱之assert关键字 一.概述 在C和C++语言中都有assert关键,表示断言. 在Java中,同样也有assert关键字,表示断言,用法和含义都差不多. 二.语法 在Java中,ass ...

  7. 已知bug列表——Solidity中文文档(12)

    写在前面:HiBlock区块链社区成立了翻译小组,翻译区块链相关的技术文档及资料,本文为Solidity文档翻译的第十二部分<已知bug列表>,特发布出来邀请solidity爱好者.开发者 ...

  8. Ruby中的require_relative和require有什么区别?

    本文翻译自:What is the difference between require_relative and require in Ruby? Ruby中的require_relative和re ...

  9. junit4 assert类中的assert方法总结

    junit中的assert方法全部放在Assert类中,总结一下junit类中assert方法的分类. 1.assertTrue/False([String message,]boolean cond ...

最新文章

  1. 【转载】c#类的成员初始化顺序
  2. ISE中ChipScope软件使用
  3. Java-大集合拆分为指定大小的小集合
  4. 自动生成业务单据流水号方案
  5. 【读书笔记《Android游戏编程之从零开始》】12.游戏开发基础(Canvas 画布)
  6. 华为杯数学建模2020什么时候出结果_第17届华为杯数学建模竞赛来啦
  7. 技巧|在苹果Mac上打开“终端”的3种方法
  8. H3C_利用设置缺省静态路由优先级实现出口双线路的主备功能
  9. Redshift渲染器和Octane渲染器哪个更适合渲染C4D动画?
  10. cad线段总和lisp_autocadlisp统计多段线方法
  11. 阿里巴巴天猫总裁蒋凡被认定为杭州高层次人才
  12. php的常见加密方式,记录接口中常见的简单内容加密方式:恺撒加密的PHP实现
  13. SQL Server无法以local 登陆问题的解决方法provider: Named Pipes Provider, error: 40 - Could not open a connection
  14. laydate-v5.0.9自定义小时范围和分钟间隔(半小时)
  15. PHP环境配置和验证
  16. 西行漫记(15):重构到模式
  17. 云海IOP 3.0:为行业云而生
  18. CH9121网络通信IC
  19. 【推荐算法论文阅读】BERT4Rec: Sequential Recommendation with Bidirectional Encoder Representations from Trans
  20. 线性表之顺序存储结构与链式存储结构 及 应用

热门文章

  1. 港大计算机专业世界排名,香港大学优势专业及优势专业排名(QS世界排名)
  2. 部署Redis作为mysql缓存实现读写分离
  3. 刘翔赛前曾接近12秒80 退赛意义大于10个栏架
  4. 仙人掌之歌——直播业务立项(1)
  5. 倍增收入,大学生兼职经验分享
  6. 【Win10】Java开发环境搭建新手教程(图文)
  7. 基于vue+echarts 数据可视化大屏展示[附源码]
  8. 2006年德国世界杯各国参赛球队口号
  9. windows10下安装refind
  10. 【Java】sql实现插入,插入值的主键自增,防止迁移数据时报主键冲突的错误;