Transfer

將乙太幣從 SC 發送到 EAO

  • March 30, 2022

我看到很多部落格都說將乙太幣從一份合約發送到另一份合約的事實標準,以及為什麼一個比另一個更好。但是,將乙太幣從合約發送到 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

引用自:https://ethereum.stackexchange.com/questions/125064