經過身份驗證的資料結構ADS 學前準備

2021-09-29 21:58:59 字數 1803 閱讀 9660

簡單介紹

默克爾樹(merkle trees)是一種二叉樹(在電腦科學中,二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」(right subtree)。二叉樹常被用於實現二叉查詢樹和二叉堆。[1]),它由乙個根節點,一組中間節點和一組葉子節點組成。

(默克爾樹的結構)merkle trees structure

merkle trees由乙個根節點,一組中間節點和一組葉子節點組成。根節點表示是最終的那個節點,且只有乙個。葉子節點可以有很多,但是不能再擴散也就是沒有子節點了。如下圖所示:

節點名稱

結構與作用

root

根節點,所有的子節點彙總到這裡,像一棵倒立的樹。

hash:

能將任意長度的二進位制明文對映為較短的二進位制串的演算法,也叫「雜湊」演算法,如md5,sha系列等,雜湊後的結果也稱雜湊值。

data0

…data3

這些代表的是具體的原始資料

b0,b1…b3

這些是把原始資料進行雜湊運算後得到對應的雜湊值

data0和是b0是對應的關係,也就是說b0的雜湊值對應的是data0這一條資料,唯一對應的。

3. 具體實現步驟

第一步:把最底層的data0…data3這四條資料,每一條單獨進行hash,得出4個雜湊值作為葉子節點。

第二步:把相鄰的兩個葉子節點的雜湊值拿出來再進行hash,如b0+b1 hash後得出b4。

第三步:遞迴執行這樣的hash操作,直到最終hash出乙個根節點,就結束了。

這就是默克爾樹的執行原理,在圖中展現是:b0+b1 hash得出b4,b2+b3 hash得出b5,b4+b5 hash得出root根節點。由於每個節點上的內容都是雜湊值,所以也叫「雜湊樹」。

4. 默克爾樹的特性

第一特性:任意乙個葉子節點的細微變動,都會導致root節點發生翻天覆地的變化,可以用來判斷兩個加密後的資料是否完全一樣

第二特性:快速定位修改,如果data1中資料被修改,會影響到b1,b4和root,當發現根節點root的雜湊值發生變化,沿著root - > b4 - > b1最多通過o(logn)時間即可快速定位到實際發生改變的資料塊data1.

第三特性:零知識證明,它指的是證明者能夠在不向驗證者提供任何有用的資訊的情況下,使驗證者相信某個論斷是正確的。

5.位元幣中的應用

默克爾路徑:上圖中root - > b4 - > b1 這就是一條路徑,表示從根節點到葉子節點所經過的節點組成的路徑。

位元幣中,默克爾樹被用作歸納乙個區塊中的所有交易,同時生成整個交易集合的數字簽名,且提供了一種校驗區塊是否存在某交易的高效途徑,就是默克爾路徑。生成默克爾樹需要遞迴地對各個子節點進行雜湊運算,將新生成的雜湊節點插入到默克爾樹中,直到只剩乙個雜湊節點,該節點就是默克爾樹的根節點。

默克爾樹查詢交易的高效性:

假設乙個區塊中有16筆交易,根據上文提到的公式o(logn) 可以算出16的對數是4,也就是要找到這個區塊中的任意一筆交易,只需要4次就可以了,它的默克爾路徑會儲存4個雜湊值:

6. 總結:

介紹了什麼是默克爾樹,以及它的三個特性和在位元幣中的應用。核心就是將大量資料進行雜湊運算後增加其分布式索引效能,通過維持乙個較小的高效索引(默克爾路徑)進而管理複雜的大量資料。

2.3.

資料結構實踐 Prim演算法的驗證

檔名稱 main.cpp,graph.h,graph.cpp 版本號 vc 6.0 問題描述 最小生成樹的普里姆演算法 輸入描述 無 程式輸出 見執行結果 include include define maxv 100 最大頂點個數 define inf 32767 inf表示 typedef in...

開始學C的資料結構啦

還有一些辣雞無聊的市井部落格推薦.不能忍啊.為保智商轉移來這裡了.是c 老師推薦的.希望以後多向這裡的學習.多多寫部落格總結.自己還是乙個小小的programmer seed.還是沒發芽的那種 不過準備啦.加油吧dity 這裡是cpy 昨天寫的文章 這幾個星期電腦抽了用不了vc 就用了更為便捷的vs...

1 補發 你的資料結構怎麼學的?

資料結構的概念 是相互之間存在一種或多種特定關係的資料元素的集合。有個人叫 小菜 學生時,其實根本就沒好好學資料結構,時常逃課,考試也是臨時突擊後勉強及格。畢業後,他幾經求職,算是找到了乙份程式設計師的工作。小菜嚇得一身冷汗,這臉丟得有些大了,自己試用期都沒結束,別因此失去工作。於是他當天加班加點,...