比特幣區塊結構Merkle樹及簡單支付驗證分析

本文首發於深刻淺出區塊鏈社區
原文連接:比特幣區塊結構Merkle樹及簡單支付驗證分析原文已更新,請讀者前往原文閱讀算法

在比特幣網絡中,不是每一個節點都有能力儲存完整的區塊鏈數據,受限於存儲空間的的限制,不少節點是以SPV(Simplified Payment Verification簡單支付驗證)錢包接入比特幣網絡,經過簡單支付驗證能夠在沒必要存儲完整區塊鏈下對交易進行驗證,本文將分析區塊結構Merkle樹及如何進行交易驗證。網絡

區塊結構

工做量證實中出現過一個區塊信息截圖:
區塊#493050數據結構

細心的同窗必定已經在裏面發現了不少未講的其餘信息,如:時間戳,版本號,交易次數,二進制哈希樹根(Merkle根)等。函數

咱們來看看一個區塊結構究竟是怎樣的:學習

區塊結構圖

如上圖(下文稱:區塊結構圖)所示:每一個數據區塊包含區塊頭和區塊體。
區塊頭封裝了當前版本號、前一區塊哈希值、當前區塊PoW要求的隨機數(Nonce)、時間戳、以及Merkle根信息。
區塊體則包括當前區塊通過驗證的、 區塊建立過程當中生成的全部交易記錄。這些記錄經過 Merkle樹的哈希過程生成惟一的Merkle根並記入區塊頭.區塊鏈

區塊哈希值實際上並不包含在區塊的數據結構裏,其實區塊打包時只有區塊頭被用於計算哈希(從網絡被接收時由每一個節點計算出來),常說的區塊哈希值實際是區塊頭哈希值,它能夠用來惟1、明確地標識一個區塊。

區塊頭是80字節,而平均每一個交易至少是250字節,並且平均每一個區塊包含2000個交易。所以,包含完整交易的區塊比區塊頭的4千倍還要大。
SPV節點只下載區塊頭,不下載包含在每一個區塊中的交易信息。這樣的不含交易信息的區塊鏈,大小隻有完整區塊鏈的幾千分之1,那SPV節點是如何驗證交易的呢?spa

哈希驗證

上面先留一個引子,先來回顧下哈希函數,記帳原理咱們知道原始信息任何微小的變化都會哈希徹底不一樣的哈希值。3d

簡單文件驗證

咱們一般用哈希來檢驗下載的文件是否完整,我常常看到這樣的下載頁面:
下載hash
能夠看到下載連接後面提供了一個MD5(MD5也是一種Hash算法),這樣咱們能夠在下載以後對文件計算MD5,若是MD5與提供的MD5相等,說明文件有沒有被損壞,這個驗證過程相信你們都能理解。code

多點文件驗證(哈希列表)

如今複雜度提升一點,在P2P網絡中下載時,會把大文件切成小文件,同時從多個機器上下載數據,這個時候怎麼驗證數據呢?blog

以BT下載爲例,在下載真正的數據以前,咱們會先下載一個哈希列表的(每一個下小塊計算出一個哈希),若是有一個小塊數據在傳輸過程當中損壞了,那我只要從新下載這一個數據塊就好了,這時有一個問題就出現了,那麼多的哈希,怎麼保證它們自己(哈希列表中的哈希值)都是正確地呢?

答案是把每一個小塊數據的哈希值拼到一塊兒,而後對這個長字符串在做一次哈希運算,獲得哈希列表的根哈希。只要根哈希校對比同樣就說明驗哈希列表是正確的,再經過哈希列表校驗小數據塊,若是全部的小數據塊驗證經過則說明大文件沒有被損壞。

Merkle樹

驗證交易的過程和文件驗證很類似,能夠人爲每一個交易是一個小數據塊,但比特幣使用Merkle樹的方式進行驗證,相對於哈希列表,Merkle樹是一種哈希二叉樹,它的明顯的一個好處是能夠單獨拿出一個分支來(做爲一個小樹)對部分數據進行校驗,更加高效。

咱們回看下上面的區塊結構圖,區塊體就包含這樣一個Merkle樹,Merkle樹被用來概括一個區塊中的全部交易。

每一個葉子節點是每一個交易信息的哈希,往上對相鄰的兩個哈希合併成字符串再哈希,繼續相似的操做直到只剩下頂部的一個節點,即Merkle根,存入區塊頭。

由於Merkle樹是二叉樹,因此它須要偶數個葉子節點。若是僅有奇數個交易須要概括,那最後的交易就會被複制一份以構成偶數個葉子節點,這種偶數個葉子節點的樹也被稱爲平衡樹。

簡化支付驗證

SPV節點不保存全部交易也不會下載整個區塊,僅僅保存區塊頭,咱們來看看它是如何對交易數據進行驗證的。

假如要驗證區塊結構圖中交易6,SPV節點會經過向相鄰節點索要(經過Merkleblock消息)包括從交易6哈希值沿Merkle樹上溯至區塊頭根哈希處的哈希序列 (即哈希節點6, 5, 56, 78, 5678, 1234 1~8 - 稱爲認證路徑) 來確認交易的存在性和正確性。(在N個交易組成的區塊中確認任一交易只須要計算log2(N)個字節的哈希值,很是快速高效)

你們明白了嗎?

深刻淺出區塊鏈 - 系統學習區塊鏈,打造最好的區塊鏈技術博客。

☛ 個人知識星球爲各位解答區塊鏈技術問題,歡迎加入討論。

☛ 關注公衆號「深刻淺出區塊鏈技術」第一時間獲取區塊鏈技術信息。

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息