Solidity
如何將靜態呼叫結果從字節轉換為字元串數組?
我已經能夠使用staticcall
smart contracts
根據無參數函式的名稱從中檢索值,如下所示:bytes memory bresult; bool success; (success, bresult) = address(this).staticcall(abi.encodeWithSignature(functionName.concat("()")));
如果我知道返回類型,對於簡單類型(字元串、uint、bool、地址),我已經能夠弄清楚如何將staticcall 返回的字節數組轉換為適當類型的值。
> > 但是對於返回字元串數組的函式,我不確定該怎麼做。 > > >
即這樣的功能:
function nameList() public view returns (string[] memory) { string[] returnValue = new string[](3); returnValue[0]="John"; returnValue[1]="Paul"; returnValue[2]="Luke"; return returnValue; }
如果我呼叫 (success, bresult) = address(contractAddress).staticcall(abi.encodeWithSignature(“nameList()”));
> > 如何將結果轉換回
string array
函式返回的值? > > >
因此對於 abi.encodeWithSignature() ,函式需要用引號引起來。
abi.encodeWithSignature("myFunc(string)","myString")
其次是參數
然後你可以簡單地使用需要字節的 abi.decode
$$ $$您要解碼的類型,例如:
abi.decode(retVal,(string))
這是資源(官方文件有答案!) https://docs.soliditylang.org/en/v0.8.9/units-and-global-variables.html#abi-encoding-and-decoding-functions
對於您的特定情況,這樣的方法有效:
contract StringArrayContract { string[] public blob= ["joe","joel","janine"]; function stringArrayFunc() public view returns(string[] memory){ return blob; } } contract callReceiver { function callAndReturn(address _add) external view returns (string[] memory){ string[] memory temp; (bool success, bytes memory retVal) = _add.staticcall(abi.encodeWithSignature("stringArrayFunc()")); if(success){ temp = abi.decode(retVal, (string[]));} return temp; } }