在编写智能合约时,一定要注意对合约参数和行为的检查,尤其是那些对外部开放的合约函数。

Solidity提供了require、revert、assert等关键字来进行异常的检测和处理。

一旦检测并发现错误,整个函数调用会被回滚,所有状态修改都会被回退,就像从未调用过函数一样。

以下分别使用了三个关键字,实现了相同的语义。

require(_data == data, "require data is valid");
if(_data != data) { revert("require data is valid"); }
assert(_data == data);

不过,这三个关键字一般适用于不同的使用场景:

  • require:最常用的检测关键字,用来验证输入参数和调用函数结果是否合法。

  • revert:适用在某个分支判断的场景下。

  • assert: 检查结果是否正确、合法,一般用于函数结尾。

在一个合约的函数中,可以使用函数修饰器来抽象部分参数和条件的检查。

在函数体内,可以对运行状态使用if-else等判断语句进行检查,对异常的分支使用revert回退。

在函数运行结束前,可以使用assert对执行结果或中间状态进行断言检查。

在实践中,推荐使用require关键字,并将条件检查移到函数修饰器中去;这样可以让函数的职责更为单一,更专注到业务逻辑中。同时,函数修饰器等条件代码也更容易被复用,合约也会更加安全、层次化。

在本文中,我们以一个水果店库存管理系统为例,设计一个水果超市的合约。这个合约只包含了对店内所有水果品类和库存数量的管理,setFruitStock函数提供了对应水果库存设置的函数。在这个合约中,我们需要检查传入的参数,即水果名称不能为空。

pragma solidity ^0.4.25;
contract FruitStore {    mapping(bytes => uint) _fruitStock;    modifier validFruitName(bytes fruitName) {        require(fruitName.length > 0, "fruite name is invalid!");        _;    }    function setFruitStock(bytes fruitName, uint stock) validFruitName(fruitName) external {        _fruitStock[fruitName] = stock;    }}

如上所述,我们添加了函数执行前的参数检查的函数修饰器。同理,通过使用函数执行前和函数执行后检查的函数修饰器,可以保证智能合约更加安全、清晰。智能合约的编写需要设置严格的前置和后置函数检查,来保证其安全性。

区块链 以太坊 solidity require revert assert相关推荐

  1. 区块链-以太坊学习资料汇总

    最近一段时间以来,对区块链的底层研究和基于区块链的应用开发已经越来越火热了.机缘巧合,目前我也在进行区块链方面的开发,在之后的博客中,我会和大家一起分享区块链开发中的酸甜苦辣.今天我先来对收藏区块链- ...

  2. 【区块链-以太坊】5 Ubuntu下truffle ganache安装及使用

    [区块链-以太坊]5 Ubuntu下truffle & ganache安装及使用 1 truffle安装 1)输入sudo npm install -g truffle 2)将truffle复 ...

  3. 8支团队正在努力构建下一代区块链以太坊Ethereum 2.0

    2019独角兽企业重金招聘Python工程师标准>>> "我们不想在构建 Ethereum 2.0时重新造轮子." 谈到开发人员为 Ethereum 区块链进行两 ...

  4. 可编程区块链以太坊的未来

    区块链的火热就不用说了,回看一下Vinay Gupta 2015年发表的文章<内容可编程的区块链:以太坊的未来>,感受一下先行者的思想. 到本文结束时,你将了解一般的区块链(特别是下一代区 ...

  5. 回看2015年是如何描述区块链以太坊的未来

    区块链的火热就不用说了,回看一下Vinay Gupta 2015年发表的文章<内容可编程的区块链:以太坊的未来>,感受一下先行者的思想. 到本文结束时,你将了解一般的区块链(特别是下一代区 ...

  6. 回望Vinay2015年的文章:内容可编程的区块链——以太坊的未来

    2019独角兽企业重金招聘Python工程师标准>>> 区块链的火热就不用说了,回看一下Vinay Gupta 2015年发表的文章<内容可编程的区块链:以太坊的未来>, ...

  7. 上下文可编程区块链——以太坊的未来

    区块链的火热就不用说了,回看一下Vinay Gupta 2015年发表的文章<内容可编程的区块链:以太坊的未来>,感受一下先行者的思想. 到本文结束时,你将了解一般的区块链(特别是下一代区 ...

  8. 区块链以太坊以及hyperledger总结

    https://learnblockchain.cn/ 1.什么是智能合约?它有什么特点? 就是具有交互能力而且能够在区块链中传递的合约 一个由计算机代码控制的以太币账户 特点: 公开透明.能即时与区 ...

  9. 区块链 以太坊 区块结构详解

    一.结构 区块由两部分组成,分别是 区块头(header) 区块体(body) 1. 结构图 2. 区块头(header) 区块头存储了区块的元信息,用来对区块内容进行一些标识,校验,说明等. 通用字 ...

  10. 带你玩转区块链--以太坊基础、发币、基于智能合约实现彩票项目-第二章-第一节【以太坊篇】

    意义: 在上一节知识学习中,我们已经了解如何实现一个基础区块链,并重构了BTC关键代码.对比传统的中心化项目,区块链项目拥有很多优势,如:追溯性.不可传篡改性.在中心化项目中的网络协议是:[数据层-- ...

最新文章

  1. Error writing file '/tmp/...' (Errcode: 28)
  2. python项目-python项目
  3. 探讨增强现实(AR)基于模型的追踪技术
  4. 【Apache】 LXC 容器中重启 Apache 报错: Failed to set up mount namespacing: Permission denied
  5. 小程序成长之路(四)-- 深入腾讯云(环境搭建)
  6. 三调 图斑地类面积_关于三调,国土空间规划中至少需要这些知识
  7. 图片前后旋转(头像前后旋转)
  8. html打开无法显示网页怎么回事,Win7打开网页提示“Internet Explorer无法显示该页面”如何解决?...
  9. 曲线之美(一)贝塞尔曲线
  10. 数据分析型产品的需求分析6大步骤
  11. 数字货币或将消灭银行 未来3至5年,银行业可能将崩溃?
  12. matlab regress 非线性,MATLAB用regress作多元非线性回归
  13. DXF图元数据的组织
  14. flashback六大技术之flashback drop
  15. 架构师小跟班:推荐46个非常经典的Linux面试题
  16. S7-1500 PLC编程
  17. Android之低功耗蓝牙的基本使用
  18. #每天一道算法题:出现一次与出现k次的数
  19. C#学习笔记-思维导图
  20. 封神台—高校靶场ctf—第一期Web web_008

热门文章

  1. 管理例程——数据库管理员
  2. The binding handle is invalid 绑定句柄无效
  3. 认识并学会springCloud的使用
  4. [USACO11DEC] 牧草种植Grass Planting
  5. 2015 HIAST Collegiate Programming Contest C
  6. Android新组件CardView
  7. MFC 中获取各种类指针的方法
  8. android背景图边框渐变,GitHub - jvyun/TestShape: 使用自定义属性替代项目中的shape文件,可以给View设置背景色、弧度、背景渐变、边框、边框颜色、渐变方向等...
  9. java 9 api_Java9 Process API
  10. 一般纳米材料是指尺度为_水溶性单分散纳米材料的开发意义