Solidity

如何將靜態呼叫結果從字節轉換為字元串數組?

  • November 23, 2022

我已經能夠使用staticcallsmart 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;
   }
  } 

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