Evm
是否可以使用委託呼叫發送乙太幣?
我在 Remix 中對此進行了測試,似乎乙太保留在委託人契約中並且沒有被轉發。使用下面的程式碼進行測試:
contract SomeContract { address public sender; uint public value; function callMe() public payable { sender = msg.sender; value = msg.value; } function getBalance() public view returns (uint) { return address(this).balance; } } contract CallAnotherContract { address public sender; uint public value; // Check if you can send ETH to non-payable function function callTheOtherContract(address _contractAddress) public payable { (bool success, bytes memory returnData) = (_contractAddress.delegatecall(abi.encode(bytes4(keccak256("callMe()"))))); require(success); } function getBalance() public view returns (uint) { return address(this).balance; } }
正如@smarx 提到的那樣,
delegatecall
不會對您提供的契約執行實際操作,也就是_contractAddress
複制程式碼function callMe()
並在CallAnotherContract
.在 Solidity 的文件中,它說明了以下特性
delegatecall
:delegatecall 的目的是使用儲存在另一個合約中的庫程式碼。使用者必須確保兩個合約中的儲存佈局都適合使用委託呼叫。
更具體地說:
…僅使用給定地址的程式碼,所有其他方面(儲存,餘額,…)均取自目前合約。
SomeContract
要執行所需的操作,即在呼叫時callTheOtherContract
將值轉發到CallAnotherContract
,我們可以通過callTheOtherContract
以下方式修改:function callTheOtherContract(address _contractAddress) public payable { (bool success, bytes memory returnData) = (_contractAddress.call.value(msg.value)(abi.encode(bytes4(keccak256("callMe()"))))); require(success); }