【Awesome EOS】從 Hash 到 Merkle Tree

哈希算法(Hash)

哈希算法也叫散列算法雹嗦,一般來說滿足這樣的關(guān)系:Func(data)=key,輸入任意長度的 data幸斥,經(jīng)過哈希算法處理后輸出一個定長的數(shù)據(jù) key勋篓。同時這個過程是不可逆的,無法由 key 逆推出 data此熬。

  • MD5
  • SHA:SHA-1庭呜,SHA-224, SHA-256,SHA-384犀忱,SHA-512

注意募谎,哈希表(HashTable)是利用了哈希函數(shù)的一種數(shù)據(jù)結(jié)構(gòu)

散列表(Hash table,也叫哈希表)阴汇,是根據(jù)關(guān)鍵碼值 (key/value) 而直接進行訪問的數(shù)據(jù)結(jié)構(gòu)近哟。也就是說,它通過把關(guān)鍵碼值映射到表中一個位置來訪問記錄鲫寄,以加快查找的速度吉执。這個映射函數(shù)叫做散列函數(shù),存放記錄的數(shù)組叫做散列表地来。給定表 M戳玫,存在函數(shù) Func(key),對任意給定的關(guān)鍵字值 key未斑,代入函數(shù)后若能得到包含該關(guān)鍵字的記錄在表中的地址咕宿,則稱表 M 為哈希表,函數(shù) Func(key) 為哈希函數(shù)蜡秽。
哈希表是一種通過哈希函數(shù)將特定的鍵映射到特定值的一種數(shù)據(jù)結(jié)構(gòu)府阀,他維護著 key 和 value 之間的一 一對應(yīng)關(guān)系。


Hash List

在點對點網(wǎng)絡(luò)中作數(shù)據(jù)傳輸?shù)臅r候芽突,會同時從多個機器上下載數(shù)據(jù)试浙,而且很多機器可以認(rèn)為是不穩(wěn)定或者不可信的。為了校驗數(shù)據(jù)的完整性寞蚌,更好的辦法是把大的文件分割成小的數(shù)據(jù)塊(例如田巴,把分割成 64KB 為單位的數(shù)據(jù)塊)钠糊。這樣的好處是,如果小塊數(shù)據(jù)在傳輸過程中損壞了壹哺,那么只要重新下載這一快數(shù)據(jù)就行了抄伍,不用重新下載整個文件。

怎么確定小的數(shù)據(jù)塊沒有損壞哪管宵?只需要為每個數(shù)據(jù)塊做 Hash截珍。BT下載的時候,在下載到真正數(shù)據(jù)之前箩朴,我們會先下載一個 Hash 列表岗喉。那么問題又來了,怎么確定這個Hash列表本事是正確的哪隧饼?答案是把每個小塊數(shù)據(jù)的Hash值拼到一起沈堡,然后對這個長字符串在作一次Hash運算静陈,這樣就得到Hash列表的根Hash(Top Hash or Root Hash)燕雁。下載數(shù)據(jù)的時候,首先從可信的數(shù)據(jù)源得到正確的根Hash鲸拥,就可以用它來校驗Hash列表了拐格,然后通過校驗后的Hash列表校驗數(shù)據(jù)塊。


默克爾樹(Merkle Tree)

  • 二叉樹:平衡二叉樹刑赶,非平衡二叉樹

    在計算機科學(xué)中捏浊,二叉樹是每個節(jié)點最多有兩個子樹的樹結(jié)構(gòu),每個節(jié)點代表一條結(jié)構(gòu)化數(shù)據(jù)撞叨。通常子樹被稱作“左子樹”(left subtree)和“右子樹”(right subtree)金踪。
    二叉樹常被用于實現(xiàn)數(shù)據(jù)快速查詢。二叉樹如下圖所示:

  • 默克爾樹

默克爾樹(Merkle tree)是一種哈希二叉樹牵敷,1979年由 Ralph Merkle 發(fā)明胡岔。
Merkle Tree可以看做Hash List的泛化(Hash List可以看作一種特殊的Merkle Tree,即樹高為2的多叉Merkle Tree)枷餐。

在最底層靶瘸,和哈希列表一樣,我們把數(shù)據(jù)分成小的數(shù)據(jù)塊毛肋,有相應(yīng)地哈希和它對應(yīng)怨咪。但是往上走,并不是直接去運算根哈希润匙,而是把相鄰的兩個哈希合并成一個字符串诗眨,然后運算這個字符串的哈希,這樣每兩個哈希就結(jié)婚生子孕讳,得到了一個”子哈狭苫埃“肄鸽。如果最底層的哈希總數(shù)是單數(shù)油啤,那到最后必然出現(xiàn)一個單身哈希典徘,這種情況就直接對它進行哈希運算,所以也能得到它的子哈希益咬。于是往上推逮诲,依然是一樣的方式,可以得到數(shù)目更少的新一級哈希幽告,最終必然形成一棵倒掛的樹梅鹦,到了樹根的這個位置,這一代就剩下一個根哈希了冗锁,我們把它叫做 Merkle Root[3]齐唆。

在 P2P 網(wǎng)絡(luò)下載網(wǎng)絡(luò)之前,先從可信的源獲得文件的 Merkle Tree 樹根冻河。一旦獲得了樹根箍邮,就可以從其他從不可信的源獲取 Merkle tree。通過可信的樹根來檢查接受到的Merkle Tree叨叙。如果 Merkle Tree 是損壞的或者虛假的锭弊,就從其他源獲得另一 個Merkle Tree,直到獲得一個與可信樹根匹配的 Merkle Tree擂错。

Merkle Tree 和Hash List 的主要區(qū)別是味滞,可以直接下載并立即驗證 Merkle Tree 的一個分支。因為可以將文件切分成小的數(shù)據(jù)塊钮呀,這樣如果有一塊數(shù)據(jù)損壞剑鞍,僅僅重新下載這個數(shù)據(jù)塊就行了。如果文件非常大爽醋,那么 Merkle tree 和 Hash list 都很到蚁署,但是 Merkle tree 可以一次下載一個分支,然后立即驗證這個分支子房,如果分支驗證通過形用,就可以下載數(shù)據(jù)了。而Hash list只有下載整個hash list才能驗證证杭。


典型應(yīng)用

  • 快速比較大量數(shù)據(jù):當(dāng)兩個默克爾樹根相同時田度,則意味著所代表的數(shù)據(jù)必然相同(哈希算法決定的)。
  • 快速定位修改:例如上例中解愤,如果 D1 中數(shù)據(jù)被修改镇饺,會影響到Hash0-0,Hash0 和 Root送讲。因此奸笤,沿著 Root --> 0 --> 0-0惋啃,可以快速定位到發(fā)生改變的 D1;
  • 零知識證明:例如如何證明某個數(shù)據(jù)(D0……D3)中包括給定內(nèi)容 D0监右,很簡單边灭,構(gòu)造一個默克爾樹,公布 N0健盒,N1绒瘦,N4,Root扣癣,D0 擁有者可以很容易檢測 D0 存在惰帽,但不知道其它內(nèi)容。
  • 數(shù)據(jù)完整性校驗:git 版本控制系統(tǒng)父虑,ZFS/IPFS 分布式文件系統(tǒng)以及 BT 下載该酗,都是通過 Merkle Tree 來進行完整性校驗的。
  • 在分布式存儲系統(tǒng)中的應(yīng)用:

    為了保持?jǐn)?shù)據(jù)一致士嚎,分布系統(tǒng)間數(shù)據(jù)需要同步呜魄,如果對機器上所有數(shù)據(jù)都進行比對的話,數(shù)據(jù)傳輸量就會很大航邢,從而造成“網(wǎng)絡(luò)擁擠”耕赘。為了解決這個問題骄蝇,可以在每臺機器上構(gòu)造一棵 Merkle Tree膳殷,這樣,在兩臺機器間進行數(shù)據(jù)比對時九火,從 Merkle Tree 的根節(jié)點開始進行比對赚窃,如果根節(jié)點一樣,則表示兩個副本目前是一致的岔激,不再需要任何處理勒极;如果不一樣,則沿著hash值不同的節(jié)點路徑查詢虑鼎,很快就能定位到數(shù)據(jù)不一致的葉節(jié)點辱匿,只用把不一致的數(shù)據(jù)同步即可,這樣大大節(jié)省了比對時間以及數(shù)據(jù)的傳輸量炫彩。

相對于 Hash List匾七,MT的明顯的一個好處是可以單獨拿出一個分支來(作為一個小樹)對部分?jǐn)?shù)據(jù)進行校驗,這個很多使用場合就帶來了哈希列表所不能比擬的方便和高效江兢。正是源于這些優(yōu)點昨忆,MT常用于分布式系統(tǒng)或分布式存儲中。

more..

  • Merkle Tree 在數(shù)字加密貨幣中首先應(yīng)用于比特幣(BTC)杉允,以太坊(Etherum)采用了改進的 Merkle Patricia Tree (MPT) 邑贴。

默克爾證明(Merkle Proof)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末席里,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拢驾,更是在濱河造成了極大的恐慌奖磁,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件繁疤,死亡現(xiàn)場離奇詭異署穗,居然都是意外死亡,警方通過查閱死者的電腦和手機嵌洼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門案疲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人麻养,你說我怎么就攤上這事褐啡。” “怎么了鳖昌?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵备畦,是天一觀的道長。 經(jīng)常有香客問我许昨,道長懂盐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任糕档,我火速辦了婚禮莉恼,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘速那。我一直安慰自己俐银,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布端仰。 她就那樣靜靜地躺著捶惜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪荔烧。 梳的紋絲不亂的頭發(fā)上吱七,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天,我揣著相機與錄音鹤竭,去河邊找鬼踊餐。 笑死,一個胖子當(dāng)著我的面吹牛诺擅,可吹牛的內(nèi)容都是我干的市袖。 我是一名探鬼主播,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苍碟!你這毒婦竟也來了酒觅?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤微峰,失蹤者是張志新(化名)和其女友劉穎舷丹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜓肆,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年仗扬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片早芭。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡彼城,死狀恐怖退个,靈堂內(nèi)的尸體忽然破棺而出募壕,到底是詐尸還是另有隱情语盈,我是刑警寧澤舱馅,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響蛉艾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜资溃,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一武翎、第九天 我趴在偏房一處隱蔽的房頂上張望烈炭。 院中可真熱鬧,春花似錦宝恶、人聲如沸符隙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霹疫。三九已至,卻和暖如春综芥,著一層夾襖步出監(jiān)牢的瞬間丽蝎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留屠阻,地道東北人红省。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像国觉,于是被迫代替她去往敵國和親吧恃。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355