Solidity
如何將乙太幣從智能合約轉移到賬戶?
我寫了一個非常簡單的智能合約。目標是:
- 將一些乙太幣從賬戶 A轉移到智能合約
- 然後從智能合約到另一個賬戶 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 從賬戶 A
truffle 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
。那麼這就是您應該轉移給收款人的金額。