區塊鏈鼻祖比特幣之10:merkle tree與spv節點

尹成發表於2018-04-27

區塊鏈的每一個區塊都包含了該區塊產生期間的所有交易,並用Merkle樹的形式表示。Merkle 樹是一種Hash二叉樹,用作快速歸納和校驗大規模資料完整性的資料結構。

在比特幣網路中,Merkle樹被用來歸納一個區塊的所有交易,同時生成整個交易集合的數字指紋,且提供了一種校驗區塊是否存在某交易的高效途徑。生成一棵完整的 Merkle樹需要遞迴地對雜湊節點對進行雜湊,並將新生成的雜湊節點插入到Merkle樹中,直到只剩一個雜湊節點,該節點就是Merkle樹的根。在比特幣的Merkle樹中兩次使用到了SHA256演算法,因此其加密雜湊演算法也被稱為Double-SHA256

N個資料元素經過加密後插入Merkle樹,至多計算2*log2(N)次就能檢查出任意某資料元素是否在該樹中,這使得該資料結構非常高效;但同時無法從Merkle樹內找到對應的交易,這是區塊鏈單向驗證性的特點。Merkle樹是自底向上構建的,舉例說明:同一時間發生ABCD四筆交易,起始所有交易都存於基礎節點,分別進行Hash,以交易AHash過程為例,得到HA= SHA256(SHA256(交易A)),同樣得到HBHCHD;然後建立二層節點HAB=SHA256(SHA256(HA + HB)),同樣得到HCD;繼續操作直到生成頂端唯一的節點——HABCD。如下圖所示:


因為Merkle樹是二叉樹,所以每一層需要偶數個點,如果節點數為奇數,系統將複製一份數值使得節點數變成偶數。這種偶數個分層節點的樹也被稱為平衡二叉樹。如下圖所示,C點就被複制了一份。


為四個交易構造Merkle樹的方法同樣適用於為任意交易數量構造Merkle樹。在比特幣中,在單個區塊中有成百上千的交易是非常普遍的,這些交易都會採用同樣的方法歸納起來,產生一個僅僅32位元組的資料作為Merkle根。下圖出現了多個節點,其運算過程與四個節點是一致的,其實無論多少個節點都可以通過Merkle樹歸納為32個位元組。


為了證明區塊鏈記憶體在某一個特定的交易,一個節點只需要計算log2(N)32位元組的雜湊值,形成一條從特定交易到樹根的認證路徑或者Merkle路徑即可。隨著交易數量的急劇增加,這樣的計算量就顯得異常重要,因為相對於交易數量的增長,以基底為2的交易數量的對數的增長會緩慢許多。這使得比特幣節點能夠高效地產生一條10或者12個雜湊值(320-384位元組)的路徑,來證明了在一個巨量位元組大小的區塊中某筆交易的存在。

在圖5中,一個節點能夠通過生成一條僅有432位元組雜湊值長度(總128位元組)的Merkle路徑,來證明區塊中存在一筆交易K。該路徑有4個雜湊值(在圖5中由藍色標註)HLHIJHMNOPHABCDEFGH。由這4個雜湊值產生的認證路徑,再通過計算另外四對雜湊值HKLHIJKLHIJKLMNOPMerkle樹根(在圖中由虛線標註),任何節點都能證明HK(在圖中由綠色標註)包含在Merkle根中。


用列表表示交易數量對路徑大小的影響,如表1所示,當區塊大小由16筆交易(4KB)急劇增加至65535筆交易(16MB)時,為證明交易存在的Merkle路徑長度增長極其緩慢,僅僅從128位元組到512位元組。有了Merkle樹,一個節點能夠僅下載區塊頭(80位元組/區塊),然後從一個節點回溯就能認證一筆交易的存在,而不需要儲存或者傳輸區塊鏈中大多數內容。這被稱作簡單支付驗證(SPV)節點,它不需要下載整個區塊,而通過Merkle路徑去驗證交易的存在。





網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052備註:CSDN

尹成學院微信:備註:CSDN



網址:http://www.qukuailianxueyuan.io/



欲領取造幣技術與全套虛擬機器資料

區塊鏈技術交流QQ群:756146052  備註:CSDN

尹成學院微信:備註:CSDN

相關文章