Merkle樹

Merkle根是區塊鏈結構中的重要組成部分,Merkle是Merkle樹的根。

那什麼是Merkle樹呢?

就是存儲hash值的一棵樹。Merkle樹的葉子是數據塊(例如,文件或者文件的集合)的hash值。
在這裏插入圖片描述
圖1.簡單Merkle樹的結構


1.創建Merckle Tree

加入最底層有9個數據塊。

step1:(紅色線)對數據塊做hash運算,Node0i = hash(Data0i), i=1,2,…,9

step2: (橙色線)相鄰兩個hash塊串聯,然後做hash運算,Node1((i+1)/2) = hash(Node0i+Node0(i+1)), i=1,3,5,7;對於i=9, Node1((i+1)/2) = hash(Node0i)

step3: (黃色線)重複step2

step4:(綠色線)重複step2

step5:(藍色線)重複step2,生成Merkle Tree Root

在這裏插入圖片描述
創建過程簡述
Merkle樹是從底向上創建的,將原始數據進行Hash運算後,作爲葉子節點。
將相鄰兩個葉子節點再一次進行Hash運算後得到的值,作爲這兩個節點的父節點,依次向上,最後得到的根節點,就是Merkle數的根。

創建Merkle Tree是O(n)複雜度(這裏指O(n)次hash運算),n是數據塊的大小。得到Merkle Tree的樹高是log(n)+1


2. 檢索數據塊

爲了更好理解,我們假設有A和B兩臺機器,A需要與B相同目錄下有8個文件,文件分別是f1 f2 f3 …f8。這個時候我們就可以通過Merkle Tree來進行快速比較。假設我們在文件創建的時候每個機器都構建了一個Merkle Tree。具體如下圖:
在這裏插入圖片描述
從上圖可得知,葉子節點node7的value = hash(f1),是f1文件的HASH;而其父親節點node3的value = hash(v7, v8),也就是其子節點node7 node8的值得HASH。就是這樣表示一個層級運算關係。root節點的value其實是所有葉子節點的value的唯一特徵。

假如A上的文件5與B上的不一樣。我們怎麼通過兩個機器的merkle treee信息找到不相同的文件? 這個比較檢索過程如下:

Step1. 首先比較v0是否相同,如果不同,檢索其孩子node1和node2.

Step2. v1 相同,v2不同。檢索node2的孩子node5 node6;

Step3. v5不同,v6相同,檢索比較node5的孩子node 11 和node 12

Step4. v11不同,v12相同。node 11爲葉子節點,獲取其目錄信息。

Step5. 檢索比較完畢。

以上過程的理論複雜度是Log(N)。過程描述圖如下:
在這裏插入圖片描述
從上圖可以得知整個過程可以很快的找到對應的不相同的文件。

3. 更新,插入和刪除

對於Merkle Tree數據塊的更新操作其實是很簡單的,更新完數據塊,然後接着更新其到樹根路徑上的Hash值就可以了,這樣不會改變Merkle Tree的結構。但是,插入和刪除操作肯定會改變Merkle Tree的結構,如下圖,一種插入操作是這樣的:
在這裏插入圖片描述
 插入數據塊0後(考慮數據塊的位置),Merkle Tree的結構是這樣的:
 在這裏插入圖片描述
 而stackexchange在考慮一種插入的算法,滿足下面條件:

  • re-hashing操作的次數控制在log(n)以內
  • 數據塊的校驗在log(n)+1以內
  • 除非原始樹的n是偶數,插入數據後的樹沒有孤兒,並且如果有孤兒,那麼孤兒是最後一個數據塊
  • 數據塊的順序保持一致
  • 插入後的Merkle Tree保持平衡
    然後上面的插入結果就會變成這樣:
    在這裏插入圖片描述
    根據stackexchange中回答者所說,Merkle Tree的插入和刪除操作其實是一個工程上的問題,不同問題會有不同的插入方法。如果要確保樹是平衡的或者是樹高是log(n)的,可以用任何的標準的平衡二叉樹的模式,如AVL樹,紅黑樹,伸展樹,2-3樹等。這些平衡二叉樹的更新模式可以在O(lgn)時間內完成插入操作,並且能保證樹高是O(lgn)的。那麼很容易可以看出更新所有的Merkle Hash可以在O((lgn)2)時間內完成(對於每個節點如要更新從它到樹根O(lgn)個節點,而爲了滿足樹高的要求需要更新O(lgn)個節點)。如果仔細分析的話,更新所有的hash實際上可以在O(lgn)時間內完成,因爲要改變的所有節點都是相關聯的,即他們要不是都在從某個葉節點到樹根的一條路徑上,或者這種情況相近。

stackexchange的回答者說實際上Merkle Tree的結構(是否平衡,樹高限制多少)在大多數應用中並不重要,而且保持數據塊的順序也在大多數應用中也不需要。因此,可以根據具體應用的情況,設計自己的插入和刪除操作。一個通用的Merkle Tree插入刪除操作是沒有意義的。


Merkle樹的典型應用場景

Merkle樹比較典型的應用場景就是P2P下載。在點對點網絡中數據傳輸的時候,會同時從多個機器上下載數據,而且很多機器可以認爲是不穩定或者不可信的。爲了校驗數據的完整性,較好的辦法是把大的文件分割成小的數據塊(例如,把分割成2K爲單位的數據塊)。這樣的好處是,如果小塊數據在傳輸過程中損壞了,那麼只要重新下載這一快數據就行了,不用重新下載整個文件。
除了P2P下載外,默克爾樹還可以被用來快速比較大量的數據,因爲當兩個默克爾樹根相同時,則意味着所代表的數據必然相同。還有就是可以用來實現零知識證明(零知識證明指的是證明者能夠在不向驗證者提供任何有用的信息的情況下,使驗證者相信某個論斷是正確的)。
1. 數字簽名
  最初Merkle Tree目的是高效的處理Lamport one-time signatures。 每一個Lamport key只能被用來簽名一個消息,但是與Merkle tree結合可以來簽名多條Merkle。這種方法成爲了一種高效的數字簽名框架,即Merkle Signature Scheme。
2. P2P網絡
  在P2P網絡中,Merkle Tree用來確保從其他節點接受的數據塊沒有損壞且沒有被替換,甚至檢查其他節點不會欺騙或者發佈虛假的塊。大家所熟悉的BT下載就是採用了P2P技術來讓客戶端之間進行數據傳輸,一來可以加快數據下載速度,二來減輕下載服務器的負擔。BT即BitTorrent,是一種中心索引式的P2P文件分分析通信協議。


P2P傳輸
在P2P網絡環境中,彼此連接的多臺計算機之間都處於對等的地位,各臺計算機有相同的功能,無主從之分,一臺計算機既可作爲服務器,設定共享資源供網絡中其他計算機所使用,又可以作爲工作站,整個網絡一般來說不依賴專用的集中服務器,也沒有專用的工作站。


3. Trusted Computing

可信計算是可信計算組爲分佈式計算環境中參與節點的計算平臺提供端點可信性而提出的。可信計算技術在計算平臺的硬件層引入可信平臺模塊(Trusted Platform,TPM),實際上爲計算平臺提供了基於硬件的可信根(Root of trust,RoT)。從可信根出發,使用信任鏈傳遞機制,可信計算技術可對本地平臺的硬件及軟件實施逐層的完整性度量,並將度量結果可靠地保存再TPM的平臺配置寄存器(Platform configuration register,PCR)中,此後遠程計算平臺可通過遠程驗證機制(Remote Attestation)比對本地PCR中度量結果,從而驗證本地計算平臺的可信性。可信計算技術讓分佈式應用的參與節點擺脫了對中心服務器的依賴,而直接通過用戶機器上的TPM芯片來建立信任,使得創建擴展性更好、可靠性更高、可用性更強的安全分佈式應用成爲可能[10]。可信計算技術的核心機制是遠程驗證(remote attestation),分佈式應用的參與結點正是通過遠程驗證機制來建立互信,從而保障應用的安全。
  在這裏插入圖片描述
  文獻“徐梓耀, 賀也平, 鄧靈莉. 一種保護隱私的高效遠程驗證機制[J]. Journal of Software, 2011, 22(2).”提出了一種基於Merkle Tree的遠程驗證機制,其核心是完整性度量值哈希樹。

首先,RAMT 在內核中維護的不再是一張完整性度量值列表(ML),而是一棵完整性度量值哈希樹(integrity measurement hash tree,簡稱IMHT).其中,IMHT的葉子結點存儲的數據對象是待驗證計算平臺上被度量的各種程序的完整性哈希值,而其內部結點則依據Merkle 哈希樹的構建規則由子結點的連接的哈希值動態生成。

其次,爲了維護IMHT 葉子結點的完整性,RAMT 需要使用TPM 中的一段存儲器來保存IMHT 可信根哈希的值。

再次,RAMT 的完整性驗證過程基於認證路徑(authentication path)實施.認證路徑是指IMHT 上從待驗證葉子結點到根哈希的路徑。

發佈了83 篇原創文章 · 獲贊 25 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章