Solidity

此類型僅在新的實驗性 ABI 編碼器中受支持 - 為什麼?

  • December 30, 2018

我有以下結構,契約儲存了它的數組:

struct Issuer {
   address id;
   bytes32 name;
   IssuerStatus status;
   uint index; 
}

我還有一個函式,它通過數組中的索引返回 Issuer:

function getIssuerAtIndex(uint index) public view returns (Issuer) {
   return issuers[issuersIndex[index]];   
}

我使用solidity 0.4.21。VS CodeIssuer在函式中突出顯示紅色作為返回類型並顯示錯誤:

TypeError: This type is only supported in the new experimental ABI encoder. Use "pragma experimental ABIEncoderV2;" to enable the feature.
function getIssuerAtIndex(uint index) public view returns (Issuer) {
                                                         ^-------^

我不知道為什麼不支持該類型作為返回類型。有任何想法嗎?

標準 ABI 不支持結構。您可以在固定長度的通常分隔的介面中返回結構的成員。例如:

function getter(bytes32 key) public returns(byte32 name, uint amount, bool isValid) :

return(myStruct[key].name, myStruct[key].amount, myStruct[key].isValid);

返回結構對象的想法是實驗性的,例如

return(myStruct[key]);

此外,您的片段不包括整個內容,但我懷疑這issuerIndex是一個鍵列表,而不是實際對象。您的界面說它返回對象(實驗功能),但可能您的意思是returns(bytes32 key)可以。

希望能幫助到你。

更新

根據下面的評論,問題是返回值被轉換為類型“Issuer”,這將是實驗性結構對象。它應該被轉換為類型地址。

要從映射中返回頒發者的地址:

returns(address issuer) { ...

return issuersIndex[index];

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