Solidity

在 Solidity 中返回結構和列表

  • August 16, 2018

Solidity 阻止您返回結構、列表和其他資料結構是否有特殊原因?我知道它需要是安全的,並且允許數組/列表訪問可能會弄亂數據,但為什麼連結構都不能呢?我正在嘗試制定一份契約,該契約從事故記錄的區塊鏈中返回一個特定車牌(這是結構中的欄位之一)發生的事故列表,但我只設法得到它返回一條記錄,這也是它的各個欄位。這對我來說似乎效率很低..

請注意,我首先嘗試返回字元串

$$ $$但必須將其更改為字節$$ $$因為 Solidity 也不允許這樣做。

/*
To get a list of incidents from a startID 
*/
function listIncidents(uint _startID, uint _count) constant returns(uint[10] _incIDs, bytes[10] _names, bytes[10] _descriptions, bytes[10] _places, bytes[10] _times, bytes[10] _dates) {

 uint maxIters = _count;
 if((_startID + _count) > getIncidentCount()) {
 maxIters = getIncidentCount() - _startID;
 }

 _incIDs = new uint[](maxIters);
 _names = new bytes[](maxIters);
 _descriptions = new bytes[](maxIters);
 _places = new bytes[](maxIters);
 _times = new bytes[](maxIters);
 _dates = new bytes[](maxIters);

 for(uint i=0;i<maxIters;i++) {
   uint _incidentID = _startID + i;

   PoliceRecord memory r = incidents[_incidentID];
   _incIDs[i] = _incidentID;
   _names[i] = bytes(r.incName);
   _descriptions[i] = bytes(r.incDescription);
   _places[i] = bytes(r.incPlace);
   _times[i] = bytes(r.incTime);
   _dates[i] = bytes(r.incDate);
  }
}

您可以返回數組。你不能做的是返回數組的數組,包括string[]or bytes[](因為stringorbytes已經是一個數組)。

原因只是 ABI(應用程序二進制介面)的限制。當您嘗試執行此操作時,您應該會看到來自編譯器的警告:

此類型僅在新的實驗性 ABI 編碼器中受支持。使用“pragma Experimental ABIEncoderV2;” 啟用該功能。

如果您可以將字元串長度限制為 32,則可以bytes32改用。此程式碼工作正常:

pragma 穩固性 ^0.4.24;

contract Test {
   function test() public pure returns (bytes32[]) {
       bytes32[] memory foo = new bytes32[](2);
       foo[0] = "hello";
       foo[1] = "goodbye";

       return foo;
   }
}

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