继续追寻中本聪的脚步

防止溢出和下溢_智能合约_MOAC BlockChain SafeMath库@李预清

在编写智能合约的时候需要注意的一个主要的安全特性:防止溢出和下溢。为了防止这些情况,OpenZeppelin建立了一个叫做SafeMath的库(library),默认情况下可以防止这些问题。

什么是溢出(overflow)

假设我们有一个uint8, 只能存储8 bit数据。这意味着我们能存储的最大数字就是二进制11111111(或者说十进制的2^8-1 =255).

来看看下面的代码。最后 number 将会是什么值?

什么是溢出(overflow)

在这个例子中,我们导致了溢出—虽然我们加了1,但是number出乎意料地等于0了。

下溢(underflow)也类似,如果你从一个等于0的uint8减去1, 它将变成255 (因为uint是无符号的,其不能等于负数)。

分析 SafeMath源码

1.加法,仅限内部调用,返回 uint256

require(c>=a && c>=b); //验证结果: 两个正数相加,和一定大于每个加数

SafeMath源码加法

2.减法,仅限内部调用,返回 uint256

require(b <= a) 因为返回值需要是 正数,所以此处判断 b必须小于等于a

SafeMath源码减法

3.乘法,仅限内部调用,返回 uint256

uint256 c = a * b; 容易溢出,比如 a=2,b=2^255 乘积 2^256 刚好溢出。结果取后面的256位(全为0),导致 c=0。

SafeMath源码乘法

所以使用 (a == 0 || c / a == b),验证结果的一致性。

4.除法,仅限内部调用,返回 uint256

require(b > 0), 确保被除数不能为0

require(a == b * c + a % b);防止溢出,验证结果的一致性

SafeMath源码除法

总结:

不要直接使用简单的 “+-*/” ,尽量使用 library SafeMath 中的函数,避免整数溢出的隐患。

 

赞(0) 群聊
文章链接:https://tucaod.xyz/5717.html
资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

神吐槽 抢沙发

讨论群终身200元

永远不解散,不涨价。不荐股、不带单。
ai学习安装,美股分析交流,不构成任何投资建议。终身免费指导。
AI产业链资料整理+资料库

联系我们

觉得文章有用就可以进群

继续追寻中本聪的脚步

支付宝扫一扫打赏