在查看了许多不同的自定义令牌契约之后,我注意到transferFrom()函数的标准如下:
function transferFrom(address _from, address _to, uint256 _value) public returns (bool) {
// some code...
balances[_from] = balances[_from] -= _value;
balances[_to] = balances[_to] += _value;
allowed[_from][msg.sender] = allowed[_from][msg.sender] -= _value;
// some code...
}如果这些线路:
balances[_from] = balances[_from] -= _value;
balances[_to] = balances[_to] += _value;是相反的顺序:
balances[_to] = balances[_to] += _value;
balances[_from] = balances[_from] -= _value;或者没有恶意用户可以黑掉这段代码的情况?
发布于 2017-10-16 10:14:55
AFAIK,互换这两行不会造成任何漏洞。但问题是你为什么要这么做?理想情况下,我们首先从发送方减去余额,然后将其添加到接收方。
这只有在第一行执行而第二行不执行的情况下才会造成伤害,但我想这是不应该发生的。即使与事务一起提供的气体在第一行之后完成,完整的事务也将回滚。这样你就可以换行了。
发布于 2017-10-16 11:17:50
第二,互换两行不会造成任何漏洞,但是,如果在更新“balances”映射之前发送任何形式的值,则可能容易受到重入攻击。只需确保在发送任何类型的值之前,无论顺序如何,都要实现这两行(尽管减法是最好的做法,然后逻辑上再添加)。
https://ethereum.stackexchange.com/questions/28563
复制相似问题