Solidity
從傳統 DB 到 ETH 的思考
我正在尋找一種像這樣的資料結構:
[ "data": { "id": 0, "hash" : "5feceb66ffc86f38d952786c6d696c79c2dbc239dd4e91b46729d73a27fb57e9", "owner" : 0, "status" : "allocated" }, "data": { "id": 1, "hash" : "6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b", "owner" : null, "status" : "pending" }, "data": { "id": 2, "hash" : "d4735e3a265e16eee03f59718b9b5d03019c07d8b6c51f90da3a666eec13ab35", "owner" : 0 "status" : "allocated" }, "data": { "id": 3, "hash" : "4e07408562bedb8b60ce05c1decfe3ad16b72230967de01f640b7e4729b49fce", "owner" : 1 "status" : "allocated" }, "data": { "id": 4, "hash" : "4b227777d4dd1fc61c6f884f48641d02b4d121d3fd328cb08b5531fcacdabf8a", "owner" : null "status" : null } ]
我的案例將儲存大量的記錄,從 0 到許多萬億,記錄它們的所有者和狀態。
具體來說,我想訪問以下類型的查詢,在這裡用 SQL 編寫(但當然不需要開放學習任何其他語言或查詢邏輯包):
SELECT * FROM dataset WHERE data.owner = 1; SELECT * FROM dataset WHERE data.id = 4; UPDATE dataset SET data.status = "pending" WHERE data.id = 4; UPDATE dataset SET data.status = "allocated", data.owner = 1 WHERE data.id = 4 and data.status = "pending";
我想在鏈下預先填充 ids 的值並一次上傳它們,然後通過鏈上的合約進行 UPDATE 語句之類的計算。
我非常討厭的問題是:
- ETH 是一個不錯的選擇嗎?如果沒有,有更合適的嗎?
- 當數據不可變時,我該如何設置這種東西?
- 如果您確實必須以分佈式方式儲存 10^1000 條記錄,但想要對上述元數據進行某種應用程序控制,以及用於分割欄位的查詢基礎架構,那麼有什麼好的方法呢?
- 處理鏈上和鏈下的好方法是什麼?
旁注,只寫出 0…5500000000 = 55GB 的整數,所以這可能是一個昂貴的數據量。
您應該考慮使用智能合約來映射結構的儲存資料結構。首先,定義一個表示您的對象的結構
struct Data { string hash, uint owner, string status }
然後,您可以定義將唯一數據 ID 映射到其值的映射,例如:
mapping(uint=>Data) idTodataMapping; uint[] allIds;
這些欄位將被所有節點複製,並為您提供您正在尋找的數據分佈。並且
allIds
可以用於儲存映射的所有鍵,因此您可以稍後循環映射。uint count
請注意,如果 Id 是增量的,您可以省略此數組並將其替換為簡單的。現在,如果你想操作數據,到目前為止還沒有什麼能像 SQL 查詢那樣可靠,但你可以通過遍歷你的
idTodataMapping
. 例如:for (uint i = 0; i < allIds.length; i++) { if (idTodataMapping[i].owner == "1") { idTodataMapping[i].status = "allocated"; } }