因此,我想在一个令牌合同中尽可能简单地编写退出函数,该合同也没有使用Safemath,原因很简单:我承认我不太了解EVM中的数据类型,所以我宁愿坚持使用基本的逻辑语句来防止黑客入侵,所以这有多安全:
function withdrawTokens(uint _amount) external returns (uint _available) {
_available = _amount < balances[msg.sender] ? _amount : balances[msg.sender];
msg.sender.transfer(_available);
balances[msg.sender] -= _available;
emit eventWithd(msg.sender, _available);
}我最关心的是这句话:
balances[msg.sender] -= _available;如果msg.sender的余额是5,并且他们将6作为参数(5-6 = -1,但在uint中它是巨大的正数.),这显然会减少,所以我打赌,这两条线中至少有一条将不会恢复到上面的危险线:
_available = _amount < balances[msg.sender] ? _amount balances[msg.sender];
msg.sender.transfer(_available);有什么想法吗?非常感谢!
发布于 2019-11-20 05:01:38
所以我打赌这两条线中至少有一条会恢复
您的代码中唯一可以恢复的行是msg.sender.transfer(_available)。
如果是address(this).balance < _available,这一行将恢复。
如果msg.sender是一个契约,那么它也可以在address(this).balance >= _available时恢复。
除此之外,行balances[msg.sender] -= _available显然不会下流,因为您的代码预先确保了balances[msg.sender] >= _available (即使这样做了,这种场景也不会导致执行恢复)。
发布于 2019-11-20 01:04:09
你的密码在我看来没问题。
如果查看一下SafeMath库的减法函数,就会发现它以类似的方式工作:
function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
require(b <= a, errorMessage);
uint256 c = a - b;
return c;
}你所做的是将要减去的金额上限到一个帐户的实际余额,这是完全可以的。减去的任何值都将介于0和msg.sender之间。
此外,海事组织没有真正的理由不使用SafeMath tbh。solidty中的数据类型是有限的,在SafeMath中,您只处理uint (在内部是uint256)类型,正如您在上面看到的,代码实际上并不复杂。
https://ethereum.stackexchange.com/questions/77635
复制相似问题