Solidity

如何將乙太幣從智能合約轉移到賬戶?

  • November 1, 2021

我寫了一個非常簡單的智能合約。目標是:

  1. 將一些乙太幣從賬戶 A轉移到智能合約
  2. 然後從智能合約到另一個賬戶 B

這是契約:

pragma solidity ^0.8.0;

contract MyContract {

   function fundContract() external payable {

   }

   function getBalance() public view returns(uint){
       return address(this).balance;
   }

   function transferAmount(address payable _recipient) external payable {
       _recipient.transfer(msg.value);
   }

   function callAmount(address payable _recipient) external payable {
       (bool success,  bytes memory data) = _recipient.call{value:msg.value}("");
       require(success, "Transaction Failed!");

   }

}

通過使用以下命令,我能夠將 5 ETH 從賬戶 Atruffle console轉移到智能合約:

MyContract.deployed().then(function(i) { contract=i;})
contract.fundContract({value: 500000000000000000})
contract.getBalance().then(function(r){result=r;})
parseFloat(result)

但是,當我嘗試使用以下程式碼行將1 ETH 從智能合約發送到另一個賬戶 B時:

contract.transferAmount('0x60407B3b7a3acd2dAE922610129433B915A3C238', {value:100000000000000000})

或者

contract.callAmount('0x60407B3b7a3acd2dAE922610129433B915A3C238', {value:100000000000000000})

該金額是從使用者的餘額(賬戶 A)而不是智能合約中減去的,智能合約似乎有 5 ETH 而不是 4 ETH(因為我試圖轉移 1 ETH)。我究竟做錯了什麼?您能否提出一種聰明而優雅的方式來實現這一目標(將 1 ETH 從智能合約餘額發送到賬戶 B)?

呼叫時transferAmount,您正在提供value,這意味著您正在向合約發送額外的 ETH - 這是您不想要的。transferAmount然後繼續將此值發送給收件人(使用msg.value)。

不用transferAmount支付和發送 ETH 給它,而是向transferAmount:添加另一個參數uint _amount。那麼這就是您應該轉移給收款人的金額。

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