Transfer
將乙太幣從 SC 發送到 EAO
我看到很多部落格都說將乙太幣從一份合約發送到另一份合約的事實標準,以及為什麼一個比另一個更好。但是,將乙太幣從合約發送到 EAO 的最佳實踐是什麼(在三個提款功能中)?
//SPDX-License-Identifier: MIT pragma solidity ^0.8.5; contract WalletApp { mapping(address => uint256) public balances; function depositBalance() external payable { balances[msg.sender] = msg.value; } // Different ways to withdraw the deposit to externally owned account! // Gas usage: 30462 gas function withdrawDeposit() external payable { (bool success, ) = payable(msg.sender).call{ value: balances[msg.sender] }(""); require(success); } // Gas usage: 30320 gas function withdrawDeposit2() external payable { payable(msg.sender).transfer(balances[msg.sender]); } // Gas usage: 30256 gas function withdrawDeposit3() external payable { (bool success) = payable(msg.sender).send(balances[msg.sender]); require(success); } }
如果您確定這
msg.sender
是一個外部擁有的帳戶 (EOA),那麼它們都很好,.transfer
可能由於它處理錯誤的方式而具有輕微的 gas 優勢。話雖如此,你不應該做出這樣的假設,因為有辦法繞過它,可能會讓你暴露在漏洞中。
總體上最好的(即最安全和最通用的)方法是:
這裡有一個很好的答案,詳細介紹了
.transfer
.send
和之間的差異.call
。