Solidity
如何呼叫函式並從外部部署的合約地址讀取返回值?
我正在嘗試使用以下格式從已部署的契約地址呼叫函式
DeployedContractAddress.call(bytes4(keccak256("get(address)")),0xfffff);
但是當嘗試使用部署的合約地址(沒有 abi 編碼)呼叫 get(_address) 時,它應該返回一個數組。但在這裡,它返回布爾值true或false。
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); }
但是,如果您嘗試呼叫任意方法,這當然不起作用。