梅克爾樹

梅克爾樹

梅克爾樹

默克爾樹(又叫哈希樹)是一種二叉樹,由一個根節(jié)點、一組中間節(jié)點和一組葉節(jié)點組成。最下面的葉節(jié)點包含存儲數(shù)據(jù)或其哈希值,每個中間節(jié)點是它的兩個孩子節(jié)點內(nèi)容的哈希值,根節(jié)點也是由它的兩個子節(jié)點內(nèi)容的哈希值組成。

進(jìn)一步的,默克爾樹可以推廣到多叉樹的情形。
默克爾樹的特點是,底層數(shù)據(jù)的任何變動,都會傳遞到其父親節(jié)點,一直到樹根。

默克爾樹的典型應(yīng)用場景包括:

  • 快速比較大量數(shù)據(jù):當(dāng)兩個默克爾樹根相同時,則意味著所代表的數(shù)據(jù)必然相同。
  • 快速定位修改:例如上例中,如果 D1 中數(shù)據(jù)被修改,會影響到 N1,N4 和 Root。因此,沿著 Root --> N4 --> N1,可以快速定位到發(fā)生改變的 D1;
  • 零知識證明:例如如何證明某個數(shù)據(jù)(D0……D3)中包括給定內(nèi)容 D0,很簡單,構(gòu)造一個默克爾樹,公布 N0,N1,N4,Root,D0 擁有者可以很容易檢測 D0 存在,但不知道其它內(nèi)容。

Neo中的梅克爾樹

我們看一下Neo的代碼,看看如此神奇的的數(shù)據(jù)結(jié)構(gòu),到底怎么實現(xiàn)的。
代碼在/neo/Cryptography/MerkleTree.cs

構(gòu)造函數(shù)

image.png
  1. 構(gòu)造函數(shù)的參數(shù)傳入了一個hash數(shù)組,這些數(shù)組,就是葉子節(jié)點。
  2. 調(diào)用的build函數(shù),返回root,說明build函數(shù)是用來把數(shù)組變成一顆樹的函數(shù)。
  3. for循環(huán)計算樹的高度。

build樹

樹的節(jié)點

節(jié)點
  1. 每個節(jié)點都有一個hash值
  2. 有三個指針,父節(jié)點指針,左孩子指針,右孩子指針。

建立樹的算法

建立樹

對于圖中的標(biāo)記,解釋一下。

  1. 參數(shù)就是葉子節(jié)點。
  2. 計算父節(jié)點的數(shù)目,創(chuàng)建父節(jié)點數(shù)組,父節(jié)點的數(shù)目為(leaves.Length + 1) / 2
  3. 通過一個循環(huán),給父節(jié)點賦值。
  4. 如果葉子節(jié)點是奇數(shù),則最后一個父節(jié)點的左右孩子是一樣的。
  5. 根據(jù)左右孩子的hash值,產(chǎn)生父節(jié)點。
  6. 當(dāng)前生成的parent,又變成leaves,遞歸調(diào)用build方法。

退出的時候,就是leaves.Length == 1的時候,當(dāng)做root的返回。

Neo如何使用梅克爾樹

計算根節(jié)點

計算根節(jié)點

根節(jié)點會被包含在block中,block就是區(qū)塊鏈的塊,后面看到這塊代碼再仔細(xì)分析。

從樹變成數(shù)組

從樹變成數(shù)組

使用的地方

MerkleBlockPayload里面,保存的是這個數(shù)組,我想可能是這樣可以節(jié)省一點空間吧。后面繼續(xù)研究具體存在這里干嘛。

裁剪樹

裁剪樹

BitArray和BloomFilter相關(guān),這里就是根據(jù)這個array來表示存在的節(jié)點,然后把梅克爾樹修剪一下,具體什么時候才會用到這個呢,后面跑起來再看看,現(xiàn)在還不知道。

總結(jié)

我們看到Neo實現(xiàn)的梅克爾樹還是很簡練的,而且有一些使用場景,需要進(jìn)一步研究。

參考文檔

merkling-in-ethereum
C#并行編程-PLINQ:聲明式數(shù)據(jù)并行
Merkle 樹

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表,棧,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,788評論 1 31
  • 默克爾樹(又叫哈希樹)是一種二叉樹,由一個根節(jié)點、一組中間節(jié)點和一組葉節(jié)點組成。 最下面的葉節(jié)點包含存儲數(shù)據(jù)或其哈...
    天狼42閱讀 2,030評論 0 0
  • 哈希算法(Hash) 哈希算法也叫散列算法,一般來說滿足這樣的關(guān)系:Func(data)=key,輸入任意長度的 ...
    葉開源閱讀 1,490評論 0 15
  • 母親生我的時候是難產(chǎn)。二天三夜的疼痛讓母親眼淌熱淚,精疲力盡。父親坐立不安,雙唇不知不覺布滿了水泡。他焦灼地守在租...
    詩意的云閱讀 641評論 0 3
  • 雪花漫舞落無聲,風(fēng)雪神作美畫成。 天凍地寒銀素裹,地天一色眼朦朧。 歡心喜悅踏霜雪,勝景無垠釋傲情。 無際鵝絨披遍...
    徐一村閱讀 227評論 6 9

友情鏈接更多精彩內(nèi)容