Solidity

從已部署的合約呼叫函式

  • October 11, 2021

我想知道如何使用其地址實例化**部署在區塊鏈上的現有合約。**例如:

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

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