首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >整数溢出检查

整数溢出检查
EN

Ethereum用户
提问于 2019-04-17 19:55:16
回答 2查看 1.6K关注 0票数 1

Coin合同代码中:

https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example

有以下函数,它要求金额小于10^60

代码语言:javascript
复制
function mint(address receiver, uint amount) public {
        require(msg.sender == minter);
        require(amount < 1e60);
        balances[receiver] += amount;
    }

我认为uint可以容纳的最大数是2^256 ~= 10^77。据医生说:

第二个调用要求确保硬币不会太多,这可能会在以后造成溢出错误。

当流量大于10^60 ~= 2^200时,会导致什么样的溢出?

EN

回答 2

Ethereum用户

回答已采纳

发布于 2019-04-17 20:06:24

为了这个例子,我认为这是一个完全任意的数字,可能是因为某个人需要调用mint函数的1.157920892373162e+17时间才能有一个溢出(如果他们在1e60下创建一个值)。

此外,如果您将令牌传输给其他人,它不会考虑潜在的溢出,但同样地,solidity中的代码片段只是一个例子。

无论何时执行敏感的算术操作,都应该使用SafeMath库。

票数 2
EN

Ethereum用户

发布于 2019-04-17 20:40:57

这是一个讨厌的做法,我认为这是不可靠的。

使用SafeMath方法。

如果是a + b = c,则c必须大于a或发生溢出。

来自SafeMath:

代码语言:javascript
复制
function add(uint256 a, uint256 b) internal pure returns (uint256) {
  uint256 c = a + b;
  require(c >= a);
  return c;
}

希望能帮上忙。

票数 2
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/69785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档