您將如何呈現這種資料結構?
我編寫了一個智能合約,它允許儲存某種類型的資料結構,可以這樣描述:
├── 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 有很好的支持。)