【发布时间】:2020-10-06 17:22:18
【问题描述】:
我在 2019 年 9 月遇到了这个 article,关于避免使用solidity 的transfer()/send()。以下是文章中的推理:
看起来 EIP 1884 正在伊斯坦布尔硬分叉中前进。这一变化增加了 SLOAD 操作的 gas 成本,因此破坏了一些现有的智能合约。
这些合约将会失效,因为它们的后备功能过去消耗的 gas 少于 2300,而现在它们会消耗更多。为什么 2300 gas 很重要?如果通过 Solidity 的 transfer() 或 send() 方法调用合约的后备函数,它就是接收到的 gas 量。 1
自推出以来,安全社区通常推荐 transfer(),因为它有助于防止重入攻击。假设天然气成本不会改变,这一指导是有道理的,但事实证明这个假设是不正确的。我们现在建议避免使用 transfer() 和 send()。
在remix中,有一条关于下面代码的警告信息:
(bool success, ) = recipient.call{value:_amount, gas: _gas}("");
警告:
Low level calls: Use of "call": should be avoided whenever possible. It can lead to unexpected behavior if return value is not handled properly. Please use Direct Calls via specifying the called contract's interface. more
我不是执行智能合约和安全性的 gas 成本方面的专家。因此,我发布了这篇文章,并希望能得到有关它的想法和意见。
【问题讨论】:
-
那么问题是什么?