狀態根最終篇:一文讀懂MPT的實施 | 三分鐘入門Neo3

買賣虛擬貨幣

在上一篇「三分鐘入門Neo3」文章中,我們介紹了 Patricia樹、Merkle樹 以及如何將 Merkle證明 用於輕量級的交易驗證。

作為狀態根系列的最後一篇文章,將結合前面兩篇關於Patricia樹 與 Merkle樹 的文章來介紹 Merkle Patricia Trie(MPT)。理解 MPT 的實施邏輯有助於更好地理解 Neo3 的資料儲存。

節點儲存

Neo 網路上的每個節點都會處理區塊內的資料,並按順序讀取並執行每筆交易。有些交易是隻讀模式,例如查詢特定資產的總量,但有些則需要修改節點的儲存區。例如,從一個地址向另一個地址進行轉賬,將修改這兩個地址的資產餘額。

節點以鍵值對的形式儲存資料。鍵可以認為是與特定資料段相對應的名稱或者唯一識別符號,例如智慧合約的名稱或者特定地址的資產餘額資訊。

更改特定的值,需要使用鍵資訊。由於每個節點都以完全相同的順序處理每一筆交易,因此每個節點應該有相同的鍵和值資料,從而共享相同的狀態。

使用 MPT樹 的資料結構,可以驗證節點是否共享了相同狀態。如先前文章所述,Patricia樹 是一種可以以任意共享字首來組織鍵資料的資料結構,Merkle樹 則提供了可用於驗證狀態的整個結構的加密指紋。

MPT樹

下圖我們提供了一個簡化的 MPT樹,其中儲存了3個鍵值對,可以將此樹看作節點儲存的快照。透過該圖,我們將說明 3 筆餘額資料是如何儲存的。

在樹的頂部有一個包含 鍵b3 的節點,b3 是 b31d4、b38a2 和 b3d6f 這三個鍵的共享字首。如果有其他以 b3 作為字首的鍵,它們都會儲存在該節點的子樹中。

為了獲取每個鍵的值,可以像操作 Patricia樹 那樣向下繼續查詢。下一個節點 n2 內提供了 16 個可選擇的分支,每個分支對應著十六進位制資料(0-9,a-f)中的其中一個。例如,如果我們想查詢與鍵 b38a2 相對應的值,則可以從 8 開始向下查詢併到達節點 n4。在該圖中,該節點儲存了鍵的最後一部分值 a2,並指向了最終儲存的值:13.12GAS。

相反,正如前文所述的 Merkle樹 操作那樣,我們也可以從儲存的值開始沿著樹向上查詢 Merkle 的根節點。要查詢 n3、n4 和 n5 節點的雜湊值,首先需要獲取每個值的雜湊。我們可以將這些節點和它們的雜湊值一起進行雜湊處理,從而確定 n2 節點的雜湊值。根據 n2 的雜湊可以進一步確定 n1 的雜湊,即 Merkle 的根節點雜湊。

如果網路上的所有節點都儲存著完全相同的資料,即也共同享有相同的 Merkle 根節點。相反,如果有一個節點儲存了不同的資料,比如某個鍵的值不正確,那麼雜湊計算後將會生成完全不同的 Merkle 根節點。這就能很容易地驗證節點是否與共識節點具有一致的狀態。

MPT的實施

目前 NGD 開發工程師張濤正在實施 Neo 的 MPT 功能。結構中使用了 4 種主要的節點型別:

1. 分支節點:具有 16 個分支,每個分支分別對應 十六 進位制數 00~0F,最後再加上一個值(n2)
2. 擴充套件節點:包含鍵以及指向下一個節點的指標(n1、n3、n4)
3. 葉子節點:儲存了鍵對應的值(v1、v2、v3)
4. 雜湊節點:儲存了特定節點的雜湊。這主要是為了提高效率,因為許多儲存的值並不會立即被查詢,因此不需要儲存特定節點的完整資料。

如果以後需要這些資料,我們可以使用狀態根以及 Merkle 證明來確定正確的值,正如張濤解釋地那樣:

“當我們想要儲存一個節點,如 n1 節點,n2 可以表示為一個雜湊節點。因此在資料庫中,鍵是 n1 的雜湊,值是 n1 的鍵部分加上 n2 的雜湊。因此我們可以使用資料庫和狀態根雜湊來逐步構建所需的整棵樹結構。”

MPT 作為儲存區塊資料的關鍵資料結構,也提供了新的應用場景,例如透過檢查點來簡化輕節點的本地計算,並確保節點儲存的可審計和可信任,這也是目前普通終端使用者和企業應用程式都需要的。

實施 MPT 及其他所需元件後,Neo 網路上的全節點和輕節點都將提供強大的儲存一致性保證。

「狀態根」系列已正式完結。下一篇「三分鐘入門Neo3」將進入「區塊同步」系列,介紹旨在最佳化網路效率的一些嘗試。

免責聲明:

  1. 本文版權歸原作者所有,僅代表作者本人觀點,不代表鏈報觀點或立場。
  2. 如發現文章、圖片等侵權行爲,侵權責任將由作者本人承擔。
  3. 鏈報僅提供相關項目信息,不構成任何投資建議

推荐阅读

;