我們通過前面幾期的學習,基本對區塊鏈網絡中各節點的外部協作有了一個宏觀認識,接下來將從更加微觀的角度開始學習區塊鏈。
你有沒有思考過區塊鏈中每個區塊內部是什么樣的呢?全網如此復雜的數據它會怎么去存儲的呢?
本期就帶你一探究竟!
一、區塊鏈的總體結構
區塊鏈之所以叫做區塊鏈,是因為它真的就是一堆由包含交易信息的區塊,通過前后首位相接起來的鏈式結構,每個區塊都是鏈式結構中的一節。
為什么區塊之間能夠實現前后連接的呢?
因為每個區塊都通過一個數值(父哈希值,下節即將解釋)指向前一個區塊,以此類推,區塊與區塊連成一個鏈條,可以一直追溯到創始區塊。
這又是一個大規模協作的例子,每個區塊只需執行自己的簡單的規則,就能形成一個復雜的系統。
二、一個區塊的整體結構
每個區塊主要包含了兩部分,區塊頭和區塊體。區塊頭主要用來存儲本區塊的一些相關屬性,區塊體則用來存儲真實的交易數據記錄。
一個區塊前后分別連接了父區塊和子區塊。
三、區塊體
我們先從區塊體說起,看看它是如何將交易數據進行存儲的。
區塊體包括當前區塊經過驗證的、 區塊創建過程中生成的所有交易記錄。這些記錄通過默克爾( Merkle)樹的哈希過程生成唯一的默克爾,根并記入區塊頭。
什么是默克爾根呢?
首先了解一下默克爾(merkle)樹,默克爾樹是一種哈希二叉樹,它是一種用作快速歸納和校驗大規模數據完整性的數據結構。這種二叉樹包含加密哈希值,術語“樹”在計算機學科中常被用來描述一種具有分支的數據結構。
在比特幣網絡中,默克爾樹被用來歸納一個區塊中的所有交易,同時生成整個交易集合的數字指紋,且提供了一種校驗區塊是否存在某交易的高效途徑。
生成一棵完整的默克爾樹需要遞歸地對哈希節點對進行哈希,并將新生成的哈希節點插入到默克爾樹中,直到只剩一個哈希節點,該節點就是默克爾樹的根。
說人話,默克爾樹可以理解為一顆倒立的樹,這棵樹每個樹杈只能分兩個樹枝出來,最終每個最小樹枝上都會掛兩片葉子。
這里的每片葉子就是一筆交易記錄,每個樹杈的分叉點就是一個哈希值,每個哈希值都是根據樹杈分出的兩個樹枝的分叉點或者葉子的哈希值計算出來的。
這些這些分叉節點的哈希值向上一級分叉點匯聚,再進行哈希計算生成一個哈希值。以此類推,最終匯聚到樹根上,這個樹根計算出來的哈希值就是根哈希值。通過這種結構能夠快速對其中的某筆交易進行定位。
默克爾樹的特點是:底層數據的任何變動,都會傳遞到其父親節點,一直到樹根。
理解了默克爾樹,相信你會對上圖的區塊體結構圖有一個更加深刻的認識。
四、區塊頭
區塊頭主要由三組數據組成,第一組是父區塊的哈希值,父哈希值用來將該區塊與它的前一區塊相連接;第二組數據和礦工競爭挖礦有關,即難度、時間戳和Nonce(隨機數);第三組是由剛才我們講到的區塊體中計算出來的根哈希值,即默克爾樹根。
這里要著重了解一個概念,什么是父哈希值?
對區塊中的區塊頭的數據進行哈希運算會生成一個哈希值,區塊頭中的任何數據改變都會導致這個哈希值改變,所以這個哈希值可以作為這個區塊獨一無二的標志。
通過這個哈希值就能在區塊鏈中找到對應的區塊,而這個哈希值對于連在后面的一個新的區塊來說就是父哈希值。
這里需要注意的一點是:本區塊不會存儲自身的哈希值,只存儲它的父區塊的哈希值,自身的哈希值將會存儲在子區塊中,作為子區塊的父哈希值。
因為每個區塊的區塊頭中都包含了它的父哈希值,并且只有一個父哈希值(因為區塊鏈只有一條最長鏈),所以每個區塊通過它的父哈希值就能一直追溯到創世區塊(第一個區塊)。
引入了父哈希的概念不僅將區塊與區塊連接到一起,而且還能保證區塊鏈的不可篡改性。
由于區塊頭里面包含父區塊哈希值,所以當前區塊的哈希值也受到該數值的影響。如果父區塊中的數據發生改變,那它的哈希值必然也會改變,導致子區塊就無法再通過原始父哈希值連接到上一個區塊。
所以,如果想要改變一個區塊的數據,那就要將它后面的所有區塊再重新運算一遍。正是因為這樣的重新計算需要耗費巨大的計算量幾乎是無法實現的,進一步保證了區塊鏈網絡的安全性。
區塊頭中的第二組數據,難度、時間戳和Nonce我會在后面講解挖礦的時候詳細介紹,這里我們只需要知道區塊頭中包含這些東西就行,方便前期建立整體概念。
五、為什么區塊要設計成這種結構
對于區塊的內部結構基本剖析完了,但你有沒有想過區塊設計成這種結構有什么好處嗎?
首先我們要知道區塊頭是80字節,而平均每個交易至少是250字節,而且平均每個區塊至少包含超過500個交易。因此,一個包含所有交易的完整區塊體比區塊頭的1000倍還要大。
區塊鏈是一個分布式網絡,所以數據需要存儲在各個節點當中,但是比特幣網絡的完整數據加起來可能有幾十上百個G,這不是一個普通的終端能夠承受的起的,許多比特幣客戶端被設計成運行在空間和功率受限的設備上。
如:智能電話、平板電腦、嵌入式系統等,它們是沒有辦法存儲比特幣網絡的所有數據的,該怎么辦呢?
這個時候就能看到區塊結構的高明之處了,比特幣網絡中的很多節點主要是用來驗證交易的,它們只需要下載區塊頭,不需要下載包含在每個區塊中的交易信息就能完成交易驗證。
這樣的不含交易信息的區塊鏈,大小只有完整區塊鏈的幾千分之1,大大節約了終端的使用空間。
正是因為區塊的內部結構才可以實現一個終端,只需要通過區塊頭的數據就能對某筆交易進行驗證,這就是簡單支付驗證(SPV),這樣的節點就叫做SPV節點,具體實現原理將會在下期講解。
六、總結
區塊體和區塊頭的緊密連接,區塊頭和父子區塊的前后配合,各個節點環環相扣,實現了一個堅不可摧的鏈條,對比特幣研究的越深,越能體會到它的強大之處,各種巧妙的思想讓人嘆為觀止。
我們不研究代碼,只是從整體設計思想來觀察比特幣區塊的內部結構,希望這篇文章能讓你看明白。
作者:liheng,區塊鏈探索者、互聯網產品經理,超級個體修煉中,只創作對用戶有價值的內容
本文由 @liheng 原創發布于人人都是產品經理。