Solidity
從已部署的合約呼叫函式
我想知道如何使用其地址實例化**部署在區塊鏈上的現有合約。**例如:
contract A { function f1() {} }
A
部署在區塊鏈上,在契約中B
我想呼叫該函式f1()
並獲得它的返回。例如:contract B { address contrac_A=0x123456; //call f1 from A }
我應該如何使用 的地址來呼叫它
A
?
如果部署的契約不遵守 ABI,但您知道契約簽名(名稱和參數類型),您可以使用:
contract_address.call(bytes4(sha3("function_name(types)")),parameters_values)
例如:
contrac_A.call(bytes4(sha3("f()"))
雖然您的範例中沒有輸入,但沒有參數。用您的憑據替換contract_address,function_name,parameters_values。
編輯: 由於 sha3 已被棄用,最好使用 keccak256 代替,如下所示:
bytes4(keccak256("f()")).
此外,從 Solidity 0.4.22 開始,全域函式
abi.encode(), abi.encodePacked(), abi.encodeWithSelector() and abi.encodeWithSignature()
已被定義為對結構化數據進行編碼,因此可以幫助我們建構有效呼叫(它們返回所需的 4 個字節),如下所示:contract_address.call.value(1 ether).gas(10)(abi.encodeWithSignature("register(string)", "MyName"));
文件:
https://github.com/ethereum/wiki/wiki/Solidity-Features#generic-call-method
https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABI#function-selector