function withdrawAll() public payable onlyOwner {
uint256 _each = address(this).balance / 4;
require(payable(t1).send(_each), "Account is being paid out");
require(payable(t2).send(_each), "Account is being paid out");
require(payable(t3).send(_each), "Account is being paid out");
require(payable(t4).send(_each), "Account is being paid out");
}这是给我林特警告的功能。我只是想知道这个警告有多严重。Linter: Avoid multiple calls of "send" method in single transaction [multiple-sends],这不是空投的工作原理吗?由于某种原因,这个交易有更大的失败机会吗?我找不到关于这个主题的任何文档,所以现在我将对它置之不理,因为我现在只是部署在testnets上。
发布于 2022-05-11 07:38:45
您正在发送本地资产(以太)。你通常不会在空投中发送本地资产,而是一些象征性的东西。
主要(技术)区别在于,如果发送本机资产,接收契约可能(可能)触发重入漏洞,但如果发送令牌,则无法触发重入漏洞。另一个问题是,如果转让失败,应该发生什么?您应该检查返回值,并在其失败时执行一些操作。
如果可能的话,允许您的用户从合同中提取他们的资产,而不是推动他们。这样做的安全性更好,这样你就不必为运送资产的天然气买单了。
您使用的send仅转发2300 gas,这不足以触发任何漏洞。另一方面,你也不应该依赖任何恒定的气体量。一般来说,应该由你来决定要输送多少汽油(如果有的话)。这里有更多信息:https://consensys.net/diligence/blog/2019/09/stop-using-soliditys-transfer-now/ (也适用于send)。
将本机资产发送到某个地址可能会失败,例如,如果接收方是一个合同,它在接收资产时就会恢复。
总之:如果可能的话,不要将本机资产推给用户。如果你必须这样做,决定如何做,如果转移失败。
https://ethereum.stackexchange.com/questions/127975
复制相似问题