区块链研究实验室-探讨一下以太坊智能合约安全的漏洞(下)( 四 )

最后 , 有调用堆栈深度限制 。 EVM的调用堆栈的硬限制为1024.这意味着如果嵌套调用的数量达到1024 , 则合同将失败 。 攻击者可以递归调用1023次合同 , 然后调用我们的合同函数 , 导致发送默认失败 , 因为这个限制 。 PullPayment.sol如上所述 , 并允许轻松实现拉动支付 。 继承PullPayment并使用asyncSend可以保护您免受此攻击 。

更新:EIP150解决了这个问题 , 通过减少每个递归调用获得的气体量来消除调用堆栈攻击的可能性 。

以下是修复所有这些问题的代码的修改版本:

总而言之 , 请务必记住(1)您使用的类型的限制 , (2)合同的gas费用限制 , 以及(3)调用堆栈深度限制 。

推荐阅读