Solidity

如何呼叫函式並從外部部署的合約地址讀取返回值?

  • November 2, 2019

我正在嘗試使用以下格式從已部署的契約地址呼叫函式

DeployedContractAddress.call(bytes4(keccak256("get(address)")),0xfffff);

但是當嘗試使用部署的合約地址(沒有 abi 編碼)呼叫 get(_address) 時,它應該返回一個數組。但在這裡,它返回布爾值truefalse

function get(address _address) public returns (uint256[]){
for(uint i=0;i<n;i++){
    arr[address].push(i);
}
return (arr);
}

有沒有不使用 ABI 編碼的簡單方法來獲取數組值?

根據Solidity 文件,從 0.5.0 版本開始,可以通過呼叫訪問返回數據:

address.call(bytes memory) returns (bool, bytes memory)

使用給定的有效載荷發出低級CALL,返回成功條件和返回數據,轉發所有可用的氣體,可調

數據以單個bytes數組的形式給出,因此您可能需要對其進行解碼abi.decode以使用它。

在 0.5.0 版本之前,您可以依靠返回值在返回時保留在堆棧中這一事實call()。可以訪問它們,但您必須使用程序集。

call方法僅根據呼叫所述方法的成功返回一個布爾值( true / false )。

如果您想讀取“返回值”,您需要處理 ABI,或者您可以進行程序集呼叫並手動讀取和處理這些值。

查看如何使用內聯彙編構造對另一個契約的呼叫?

您始終可以為要使用的 abi 指定一個抽象介面:

contract AbiInterface {
   function get(address _address) public returns (uint256[]);
}

function doIt() {
   AbiInterface myContract = AbiInterface.at(DeployedContractAddress);
   myContract.get(0xfffff);
}

但是,如果您嘗試呼叫任意方法,這當然不起作用。

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