Solidity

從傳統 DB 到 ETH 的思考

  • November 13, 2018

我正在尋找一種像這樣的資料結構:

[
 "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 語句之類的計算。

我非常討厭的問題是:

  1. ETH 是一個不錯的選擇嗎?如果沒有,有更合適的嗎?
  2. 當數據不可變時,我該如何設置這種東西?
  3. 如果您確實必須以分佈式方式儲存 10^1000 條記錄,但想要對上述元數據進行某種應用程序控制,以及用於分割欄位的查詢基礎架構,那麼有什麼好的方法呢?
  4. 處理鏈上和鏈下的好方法是什麼?

旁注,只寫出 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";
   }
}

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