Compilation

從版本 4 轉換到版本 5:編譯問題

  • January 10, 2022

我從以下網址獲得了以下 Solidity 程式碼: https ://www.zupzup.org/smart-contract-interaction/

pragma solidity ^0.5.6;

contract Caller {
   function someAction(address addr) returns(uint) {
       Callee c = Callee(addr);
       return c.getValue(100);
   }
   function storeAction(address addr) returns(uint) {
       Callee c = Callee(addr);
       c.storeValue(100);
       return c.getValues();
   }
   
   function someUnsafeAction(address addr) {
       addr.call(bytes4(keccak256("storeValue(uint256)")), 100);
   }
}

contract Callee {
   function getValue(uint initialValue) returns(uint);
   function storeValue(uint value);
   function getValues() returns(uint);
}

當我編譯時,我得到以下錯誤:

已編譯 Yetcontracts/Caller.sol:17:9:TypeError:函式呼叫的參數計數錯誤:給出了 2 個參數,但預期為 1。此函式需要一個字節參數。如果所有參數都是值類型,則可以使用 abi.encode(…) 正確生成它。addr.call(bytes4(keccak256(“storeValue(uint256)”)), 100); ^————————————————- —–^

有人請指導我如何擺脫編譯錯誤?

祖爾菲。

從 0.5 開始,需要對函式可見區進行顯式描述,並使用abi.encodeWithSignature函式生成呼叫數據:

pragma solidity ^0.5.6;

contract Caller {
   function someAction(address addr) public returns(uint) {
       Callee c = Callee(addr);
       return c.getValue(100);
   }
   function storeAction(address addr) public returns(uint) {
       Callee c = Callee(addr);
       c.storeValue(100);
       return c.getValues();
   }
   
   function someUnsafeAction(address addr) public {

        (bool  result,)=addr.call( abi.encodeWithSignature("storeValue(uint256)", 100) );
   if(result==false) {
//                          Call result processing
                     }

   }
}

contract Callee {
   function getValue(uint initialValue) public returns(uint);
   function storeValue(uint value) public ;
   function getValues() public returns(uint);
}

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