《精通比特幣》第七章“區(qū)塊鏈”解讀——區(qū)塊鏈基礎(chǔ)知識篇

本章,我將深入淺出的介紹區(qū)塊鏈如何首尾相連、區(qū)塊的結(jié)構(gòu)、Merkle樹的原理以及Merkle如何驗證交易存在等常用知識,可幫助你清晰的了解區(qū)塊鏈的內(nèi)部結(jié)構(gòu)。

建議閱讀時長:8分鐘

第1節(jié) 簡介

區(qū)塊鏈?zhǔn)菍灰仔畔⒌膮^(qū)塊由后向前有序鏈接起來的數(shù)據(jù)結(jié)構(gòu)。形象的來講,區(qū)塊鏈類似于一個垂直堆砌的棧,創(chuàng)世區(qū)塊作為棧底的第1個區(qū)塊,后面新生成的區(qū)塊依次在上面堆砌。所以,在區(qū)塊鏈里面,用“高度”表示某區(qū)塊與首區(qū)塊之間的距離;用“頂端”或“頂部”表示最新添加的區(qū)塊。

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

第2節(jié) 區(qū)塊結(jié)構(gòu)

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

關(guān)于簡易支付驗證的過程,可以參考“第六章 比特幣網(wǎng)絡(luò)解讀”中的介紹。

第3節(jié) 區(qū)塊頭

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

區(qū)塊頭字段

時間戳、難度目標(biāo)和隨機(jī)數(shù),會在下一章中詳細(xì)介紹。

第4節(jié) 區(qū)塊標(biāo)識符

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

區(qū)塊哈希值,是對區(qū)塊頭的所有數(shù)據(jù)信息進(jìn)行二次哈希計算得到的,該哈希值依賴于區(qū)塊頭中的數(shù)據(jù),只要區(qū)塊頭中的值發(fā)生變化,區(qū)塊哈希值即會變化。區(qū)塊哈希值可唯一定位到一個區(qū)塊,是區(qū)塊的唯一性標(biāo)識。就像根據(jù)身份證號能對應(yīng)唯一的公民一樣。

仔細(xì)核對區(qū)塊中的字段可以發(fā)現(xiàn):區(qū)塊中只記錄了父區(qū)塊的哈希值,并沒有存儲當(dāng)前區(qū)塊的區(qū)塊哈希值。區(qū)塊哈希值沒有存儲在區(qū)塊鏈完整數(shù)據(jù)庫中,而是當(dāng)該區(qū)塊從網(wǎng)絡(luò)被接收時由每個節(jié)點計算出來的,由節(jié)點存儲在一個單獨的數(shù)據(jù)庫表中,以便后續(xù)快速的搜索區(qū)塊。

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

第5節(jié) Merkle樹

在區(qū)塊的區(qū)塊頭中,有一個字段Merkle樹根,該字段用來匯總區(qū)塊內(nèi)的所有交易并用于快速校驗區(qū)塊內(nèi)是否存在某筆交易。

Merkle 樹的原理:

簡單的說,Merkle樹就是一個哈希二叉樹,父節(jié)點是2個子節(jié)點SHA256之后的結(jié)果,葉子節(jié)點是對交易數(shù)據(jù)SHA256之后的結(jié)果。

Merkle樹結(jié)構(gòu)

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

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

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

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

Merkle驗證路徑

如果根據(jù)Merkle路徑計算出的根節(jié)點與區(qū)塊頭中的Merkle樹根一致,則代表交易存在于該區(qū)塊,反之,則交易不存在于該區(qū)塊。

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

另外,Merkle樹還可應(yīng)用于所下載文件的完整性驗證,感興趣的朋友可以查閱學(xué)習(xí)下。

第6節(jié) 總結(jié)

通過本章的學(xué)習(xí),相信你對區(qū)塊鏈如何首尾相連、區(qū)塊的結(jié)構(gòu)、Merkle樹的原理以及Merkle如何驗證交易存在等知識,有了清晰具體的認(rèn)識。

如果對文中的表述有疑義或者存在表述有誤的地方,歡迎在留言區(qū)討論交流,一起精通比特幣。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容