Evm

是否可以使用委託呼叫發送乙太幣?

  • January 24, 2019

我在 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);
}

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