有限的转移()气体,重新进入仍然是一个问题..?

时间:2018-01-23 13:31:02

标签: ethereum solidity

我会限定我的问题:

1)每当你将address.transfer()发送到另一个地址时,他们就会接管执行。 (例如,着名的过去的黑客)。

2)是的,他们肯定可以通过导致恢复来使用此控件终止呼叫。

但是,他们是否可以重新进入你的合同并做任何事情。我的理解是当你将()转移到另一个地址(合同)时,气体限制在2300左右,所以他们实际上没有足够的气体来回到你的状态并写入状态或进一步转移......

我已经进行了测试并进行了大量的挖掘,这似乎也是正确的,但是仍然有很多材料说重新进入仍然是个问题。

2 个答案:

答案 0 :(得分:1)

  

还有很多材料说再入手还是个问题。

如果你:

  1. 使用构造子手动而不是transfer() AND
  2. 发送
  3. 之后更新内部会计变量

    然后你仍然可以获得重新进入的漏洞。

    所以你需要意识到在EVM中并没有完全不可能,只有Solidity的良好做法才能防止已知的重新入侵问题。

答案 1 :(得分:0)

我的理解与你的理解基本相同。我认为那里的文件试图将这一点归咎于这一点,因为早期的一个常见错误就是在收到超过2300天然气津贴的合同时增加了额外的逻辑。当发生这种情况时,有些人会通过修改发件人合同来使用call并发送更多的气体来解决它,从而打开了重新进入的问题。 transfer的原始提案甚至谈到允许转发天然气,但这被认为是危险的。显然,即使您遵守2300气体限制,也应遵循Checks-Effects-Interactions pattern