Solidity

您將如何呈現這種資料結構?

  • October 17, 2018

我編寫了一個智能合約,它允許儲存某種類型的資料結構,可以這樣描述:

├── Client1(Contract)
│   ├── Year2018 (Struct containing string,uint and struct)
│   │   ├── Case 1 (Struct containing string)
│   │   └── Case 2 (Struct containing string)
│   └── Year2017
│       └── Case 1 (Struct containing string)
├── Client 2
│   └── Year2018
│          ├──Case1 (Struct containing string)
│          └──Case2 (You got it)

我設法正確填寫並解析它(但只有一個案例)。我希望能夠有一個函式以有組織的方式返回所有數據(例如多維數組或 JSON)。我應該使用什麼?是否可以將所有這些值儲存在字節數組中?

感謝您的想法,祝您有美好的一天!

編輯:

我應該嘗試這樣的事情嗎?

function massImport(bytes[] _datas)  view external onlyOwner(){
       for(uint i = 0;i<_datas.length;i++){
           addYear(bytes(_datas[i]));
           for(uint j = 0; j<_datas[i].length;j++){
               addCase(bytes(_datas[i][j]));
           }
       }
   }

我鍵入函式bytes()是因為我假設在這種情況下字節是唯一可能的數組?

編輯2:這是結構’YEAR'

struct Year{ 
   string entryName; 
   string entryYear; 
   uint permissionType; 
   Elem elem; 
   uint[] elemList; 
   mapping(uint => Elem) allElem; 
   uint elemId; 
}

你認為完全儲存在區塊鏈上太重了嗎?

使用那些嵌套的 for 循環可能會耗盡 gas。有一個從 uint 到 string 的映射,並用它來儲存每年資訊的雜湊值呢?然後你可以將你的結構儲存在一個集中的數據庫中,並使用區塊鏈進行驗證。

這背後的想法是,為了利用區塊鏈的不變性,不需要儲存整個內容,只需儲存內容的雜湊值。然後,您可以使用該雜湊來證明您在鏈下擁有的資訊沒有改變(因為如果改變了,它的雜湊將與鏈上的不同)。很多項目都是這樣做的,例如https://www.po.et:在區塊鏈中儲存一整本書是不可行的,但是如果你對它進行雜湊並儲存雜湊,那麼這就足以證明有那麼一刻,你有一本書,裡面有確切的文字。

如果您確實想將所有內容儲存在契約中,我不會嘗試直接從契約中返回這樣的複雜結構。相反,我會用 Javascript 編寫該邏輯並多次呼叫合約以返回每對年份和案例編號(或者可能只是年份)的資訊。

將東西儲存在 Solidity 中時,一個好的經驗法則是“我需要在鏈上操作這些數據嗎?” 如果您不需要,那麼您可能不需要將其放入儲存中。如果你只是將這些東西發佈到區塊鏈上以便稍後閱讀,那麼你可以只用一個事件記錄數據並在以後以這種方式獲取它,這比將它們全部儲存起來要便宜得多。

您還可以使用pragma experimental ABIEncoderV2;以便為函式提供結構,從而使massImport函式更易於查看。請注意,儘管 ABIEncoderv2 對某些庫的支持仍在進行中(不過最新的 Web3.js 有很好的支持。)

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