《精通比特幣》第七章「區塊鏈」解讀——區塊鏈基礎知識篇

本章,我將深入淺出的介紹區塊鏈如何首尾相連、區塊的結構、Merkle樹的原理以及Merkle如何驗證交易存在等常用知識,可幫助你清晰的瞭解區塊鏈的內部結構。

建議閱讀時長:8分鐘

第1節 簡介

區塊鏈是將包含交易信息的區塊由後向前有序鏈接起來的數據結構。形象的來講,區塊鏈類似於一個垂直堆砌的棧,創世區塊作為棧底的第1個區塊,後面新生成的區塊依次在上面堆砌。所以,在區塊鏈裡面,用“高度”表示某區塊與首區塊之間的距離;用“頂端”或“頂部”表示最新添加的區塊

每個區塊,由區塊頭和交易信息兩部分組成(這兩部分的具體信息,後文會有闡述)。區塊頭中包含連接上一區塊的“父區塊哈希值”,每個區塊的唯一性標識是對區塊頭中的信息進行SHA256計算得到的哈希值,所以當“父區塊哈希值”發生變化時,“子區塊的哈希值”也會發生變化,對應的“孫區塊哈希值”也會有連鎖的變化,而每產生一個區塊需要花費很大的計算。所以一旦一個區塊有很多代以後,這種瀑布效應將保證該區塊不會被改變,除非強制重新計算該區塊後續的所有區塊,這樣的重新計算需要花費巨大的計算量。所以一個長區塊鏈的存在可以讓區塊鏈的歷史不可改變,這也是比特幣系統安全性的一個關鍵特徵。

第2節 區塊結構

區塊是區塊鏈中聚合了交易信息的容器數據結構,它由一個包含描述數據屬性的區塊頭和緊跟其後的構成區塊主體的交易組成。每個區塊的區塊頭大小為80字節,每個區塊至少包含500筆交易,每筆交易平均至少250字節,所以一個區塊中的交易數據大小至少為125000字節,比區塊頭的1000倍還要大,這也是簡易支付驗證(SPV)客戶端只存儲區塊頭來完成交易驗證的原因,能節省很大空間。

關於簡易支付驗證的過程,可以參考“ ”中的介紹。

第3節 區塊頭

區塊頭中包含3類數據。第1類數據是“父區塊哈希值”,用來連接上一區塊;第2類數據是時間戳、難度和隨機數,記錄創建該區塊時的挖礦信息;第3類數據是交易數據的Merkle根哈希值,該字段是對本區塊所有交易數據的總結。具體字段描述如下:

《精通比特幣》第七章“區塊鏈”解讀——區塊鏈基礎知識篇

區塊頭字段

時間戳、難度目標和隨機數,會在下一章中詳細介紹。

第4節 區塊標識符

區塊標識符,指可以定位到是哪個區塊的代號。每個區塊的標識符,有2種:區塊哈希值和區塊高度。

區塊哈希值,是對區塊頭的所有數據信息進行二次哈希計算得到的,該哈希值依賴於區塊頭中的數據,只要區塊頭中的值發生變化,區塊哈希值即會變化。區塊哈希值可唯一定位到一個區塊,是區塊的唯一性標識。就像根據身份證號能對應唯一的公民一樣。

仔細核對區塊中的字段可以發現:區塊中只記錄了父區塊的哈希值,並沒有存儲當前區塊的區塊哈希值。區塊哈希值沒有存儲在區塊鏈完整數據庫中,而是當該區塊從網絡被接收時由每個節點計算出來的,由節點存儲在一個單獨的數據庫表中,以便後續快速的搜索區塊。

區塊高度

,是區塊離創世區塊的距離,如區塊高度為30000,則代表其為區塊鏈中的第30001個區塊(創世區塊的區塊高度為0)。通過區塊高度可以確定區塊在區塊鏈中的位置,但是區塊高度不是區塊的唯一性標識,這是因為同一時間可能會有多個礦工產生同一高度的區塊,導致出現區塊鏈分叉,雖然分叉是暫時的,但需要等到後續至少產生6個新區塊時,才能確定對應高度的區塊。就像姓名,可以用來稱呼對方,但是可能會出現很多人是相同的名字,所以姓名可能會對應到很多人。

第5節 Merkle樹

在區塊的區塊頭中,有一個字段Merkle樹根,該字段用來彙總區塊內的所有交易並用於快速校驗區塊內是否存在某筆交易。

Merkle 樹的原理:

簡單的說,Merkle樹就是一個哈希二叉樹,父節點是2個子節點SHA256之後的結果,葉子節點是對交易數據SHA256之後的結果。

《精通比特幣》第七章“區塊鏈”解讀——區塊鏈基礎知識篇

Merkle樹結構

如上圖所示,葉子節點為交易1—交易8,先對交易1—交易8分別進行哈希計算,得到每個交易的哈希值,如Hash1—Hash8,得到葉子節點。再對交易哈希值兩兩進行SHA256計算,如果葉子節點是奇數個,會將最後一個節點複製一份,再進行哈希計算後得到其父節點,如Hash12——Hash78。逐層向上遞歸,依次兩兩哈希,直到只有一個根節點,即Merkle樹根。

如何使用Merkle樹驗證交易是否存在?

使用Merkle樹,可以很快捷的驗證交易是否存在。比如,驗證交易4是否存在,只需要知道從交易4的哈希值到計算根節點的路徑上需要參與計算的最少個數哈希值即可,所以只需要提供Hash3、Hash12、Hash5678,即可構建從交易4到跟節點的驗證路徑。

當全節點檢測到待驗證交易存在於某個區塊中時,會給SPV請求方返回區塊頭和Merkle路徑,這裡的Merkle路徑不會包含該區塊的所有交易,只會返回包含所請求的交易到計算Merkle根節點的最少個數哈希值,如上面所述,如果需要驗證交易4,只需要知道3個哈希值即可,這樣可以大大提高驗證的效率、同時節省本地空間。下圖所示為SPV節點根據所返回的Merkle路徑,計算根節點,通過和區塊頭的Merkle根值做比對,來證明交易是否存在:

《精通比特幣》第七章“區塊鏈”解讀——區塊鏈基礎知識篇

Merkle驗證路徑

如果根據Merkle路徑計算出的根節點與區塊頭中的Merkle樹根一致,則代表交易存在於該區塊,反之,則交易不存在於該區塊。

我們知道,不同字符串碰撞到同一個sha256的概率極小,那麼double sha256的概率就是它的平方,而merkle root是經過一層一層計算上來的,如果一個區塊只有一個(或2個)交易,那麼就是double^(2+1) sha256,而如果是4個交易,就有double^(4 + 2 + 1) sha256,更何況一個區塊有那麼多交易,要經過merkle運算得到一個相同的hash,幾乎是不可能的,因此,在merkle驗證中用一個偽造的交易hash來得到一個已知來merkle root是不可能的。

另外,Merkle樹還可應用於所下載文件的完整性驗證,感興趣的朋友可以查閱學習下。

第6節 總結

通過本章的學習,相信你對區塊鏈如何首尾相連、區塊的結構、Merkle樹的原理以及Merkle如何驗證交易存在等知識,有了清晰具體的認識。

若有疑問或文中有表述不嚴謹的地方,歡迎大家來交流指正,一起精通比特幣。

本文首發於公號“Tina 說”:從0到1建議區塊鏈認知,並分享我的心路歷程。


分享到:


相關文章: