在Coin合同代码中:
https://solidity.readthedocs.io/en/latest/introduction-to-smart-contracts.html#subcurrency-example
有以下函数,它要求金额小于10^60。
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时,会导致什么样的溢出?
发布于 2019-04-17 20:06:24
为了这个例子,我认为这是一个完全任意的数字,可能是因为某个人需要调用mint函数的1.157920892373162e+17时间才能有一个溢出(如果他们在1e60下创建一个值)。
此外,如果您将令牌传输给其他人,它不会考虑潜在的溢出,但同样地,solidity中的代码片段只是一个例子。
无论何时执行敏感的算术操作,都应该使用SafeMath库。
发布于 2019-04-17 20:40:57
这是一个讨厌的做法,我认为这是不可靠的。
使用SafeMath方法。
如果是a + b = c,则c必须大于a或发生溢出。
来自SafeMath:
function add(uint256 a, uint256 b) internal pure returns (uint256) {
uint256 c = a + b;
require(c >= a);
return c;
}希望能帮上忙。
https://ethereum.stackexchange.com/questions/69785
复制相似问题