1. 程式人生 > >【資料結構】Merkle tree學習

【資料結構】Merkle tree學習

描述

學習比特幣的資料結構看到的,原來以為是一種剛出來的資料結構,閱讀了一些文件後才發現這個資料結構是蠻經典的。比如在下小電影的時候也會用到這個東西。

學習

hash

用到這個首先要先知道hash,關於hash的原理和生成我不清楚,這個太底層了。一般可以理解是某一些特定的演算法可以為某個檔案生成指定長度的唯一字串,而這個字串可以代表這個檔案。如果兩個檔案的hash值一致,可以認為這兩個檔案是一樣的。

比如有這麼一個場景,要從網站下載某一個檔案,網路傳輸不太穩定,那麼可以通過檢查hash的方式進行判斷。網站的檔案處提供了一個MD5加密的hash值,下載下來的檔案也進行MD5的加密,如果hash值一樣,說明兩個檔案是一樣的,可以放心使用。如果不一樣,說明在傳輸過程中丟包了,檔案不完整,或者是中途有人攔截篡改了檔案,都會導致檔案的無法使用。

應用場景

P2P下載

P2P下載就是點對點下載,不一定是從伺服器中獲取資源,而是從別的使用者處獲取到資源進行傳輸。這就會出現下載的使用者越多,這個資源的下載速度越快。因為其中會有演算法從較近的使用者處獲取。

P2P下載一個檔案,它會從多個使用者處獲取到這個檔案的一部分資料,然後同時進行下載,這樣可以加快速度。這樣有一個問題需要解決,怎麼知道各個部分的資料都是對的。這時就需要Merkle tree。

P2P下載示意
圖中A分成了B和C兩個部分,在分的時候算出B和C的hash值,傳輸結束檢查接收到的資料的hash值是否一致,一致說明傳輸的包是對的。接下來就是要進行資料合併。A的hash值可以通過B+C的hash值相加(字串的相加就是拼接,如 “g7jd” + “6qi8” = “g7jd7qi8”)再進行hash計算得到hash值,然後再進行比較,可以得到資料是否一致。檔案的包可以無限分,Merkle tree也可以通過這樣的計算進行處理。

bitcoin

比特幣的區塊中儲存交易記錄就是通過這樣的處理方式。
比特幣結構示意
這裡的處理方法是先把實際的交易資訊如轉賬人、收錢人、轉賬金額等交易資訊進行hash加密計算,然後得到交易的hash值。然後將相鄰的兩個交易hash值進行相加,然後再進行hash加密計算得到下一級的hash值。如此這般向上,最終得到一個根節點hash,這個就是區塊的所有交易資訊彙總。

實現

這個資料結構說到底還是一種樹的實現,只要熟悉樹結構,實現還是蠻簡單的,但是這個頁面有限,我就不寫了。