首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >坚固性:有加减运算的直线顺序

坚固性:有加减运算的直线顺序
EN

Ethereum用户
提问于 2017-10-16 09:24:17
回答 2查看 931关注 0票数 1

在查看了许多不同的自定义令牌契约之后,我注意到transferFrom()函数的标准如下:

代码语言:javascript
复制
  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...
  }

如果这些线路:

代码语言:javascript
复制
balances[_from] = balances[_from] -= _value;
balances[_to] = balances[_to] += _value;

是相反的顺序:

代码语言:javascript
复制
  balances[_to] = balances[_to] += _value;
  balances[_from] = balances[_from] -= _value;

或者没有恶意用户可以黑掉这段代码的情况?

EN

回答 2

Ethereum用户

发布于 2017-10-16 10:14:55

AFAIK,互换这两行不会造成任何漏洞。但问题是你为什么要这么做?理想情况下,我们首先从发送方减去余额,然后将其添加到接收方。

这只有在第一行执行而第二行不执行的情况下才会造成伤害,但我想这是不应该发生的。即使与事务一起提供的气体在第一行之后完成,完整的事务也将回滚。这样你就可以换行了。

票数 1
EN

Ethereum用户

发布于 2017-10-16 11:17:50

第二,互换两行不会造成任何漏洞,但是,如果在更新“balances”映射之前发送任何形式的值,则可能容易受到重入攻击。只需确保在发送任何类型的值之前,无论顺序如何,都要实现这两行(尽管减法是最好的做法,然后逻辑上再添加)。

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

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

复制
相关文章

相似问题

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