Compilation
從版本 4 轉換到版本 5:編譯問題
我從以下網址獲得了以下 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); }