通俗易懂,揭秘比特幣區(qū)塊的內(nèi)部結(jié)構(gòu)

3 評論 33521 瀏覽 15 收藏 10 分鐘

我們通過前面幾期的學(xué)習(xí),基本對區(qū)塊鏈網(wǎng)絡(luò)中各節(jié)點的外部協(xié)作有了一個宏觀認識,接下來將從更加微觀的角度開始學(xué)習(xí)區(qū)塊鏈。

你有沒有思考過區(qū)塊鏈中每個區(qū)塊內(nèi)部是什么樣的呢?全網(wǎng)如此復(fù)雜的數(shù)據(jù)它會怎么去存儲的呢?

本期就帶你一探究竟!

一、區(qū)塊鏈的總體結(jié)構(gòu)

區(qū)塊鏈之所以叫做區(qū)塊鏈,是因為它真的就是一堆由包含交易信息的區(qū)塊,通過前后首位相接起來的鏈?zhǔn)浇Y(jié)構(gòu),每個區(qū)塊都是鏈?zhǔn)浇Y(jié)構(gòu)中的一節(jié)。

為什么區(qū)塊之間能夠?qū)崿F(xiàn)前后連接的呢?

因為每個區(qū)塊都通過一個數(shù)值(父哈希值,下節(jié)即將解釋)指向前一個區(qū)塊,以此類推,區(qū)塊與區(qū)塊連成一個鏈條,可以一直追溯到創(chuàng)始區(qū)塊。

這又是一個大規(guī)模協(xié)作的例子,每個區(qū)塊只需執(zhí)行自己的簡單的規(guī)則,就能形成一個復(fù)雜的系統(tǒng)。

二、一個區(qū)塊的整體結(jié)構(gòu)

每個區(qū)塊主要包含了兩部分,區(qū)塊頭和區(qū)塊體。區(qū)塊頭主要用來存儲本區(qū)塊的一些相關(guān)屬性,區(qū)塊體則用來存儲真實的交易數(shù)據(jù)記錄。

一個區(qū)塊前后分別連接了父區(qū)塊和子區(qū)塊,如下圖:

三、區(qū)塊體

我們先從區(qū)塊體說起,看看它是如何將交易數(shù)據(jù)進行存儲的。

下面是一個區(qū)塊體的結(jié)構(gòu)圖:

區(qū)塊體包括當(dāng)前區(qū)塊經(jīng)過驗證的、 區(qū)塊創(chuàng)建過程中生成的所有交易記錄。這些記錄通過默克爾( Merkle)樹的哈希過程生成唯一的默克爾,根并記入?yún)^(qū)塊頭。

什么是默克爾根呢?

首先了解一下默克爾(merkle)樹,默克爾樹是一種哈希二叉樹,它是一種用作快速歸納和校驗大規(guī)模數(shù)據(jù)完整性的數(shù)據(jù)結(jié)構(gòu)。這種二叉樹包含加密哈希值,術(shù)語“樹”在計算機學(xué)科中常被用來描述一種具有分支的數(shù)據(jù)結(jié)構(gòu)。

在比特幣網(wǎng)絡(luò)中,默克爾樹被用來歸納一個區(qū)塊中的所有交易,同時生成整個交易集合的數(shù)字指紋,且提供了一種校驗區(qū)塊是否存在某交易的高效途徑。

生成一棵完整的默克爾樹需要遞歸地對哈希節(jié)點對進行哈希,并將新生成的哈希節(jié)點插入到默克爾樹中,直到只剩一個哈希節(jié)點,該節(jié)點就是默克爾樹的根。

說人話,默克爾樹可以理解為一顆倒立的樹,這棵樹每個樹杈只能分兩個樹枝出來,最終每個最小樹枝上都會掛兩片葉子。

這里的每片葉子就是一筆交易記錄,每個樹杈的分叉點就是一個哈希值,每個哈希值都是根據(jù)樹杈分出的兩個樹枝的分叉點或者葉子的哈希值計算出來的。

這些這些分叉節(jié)點的哈希值向上一級分叉點匯聚,再進行哈希計算生成一個哈希值。以此類推,最終匯聚到樹根上,這個樹根計算出來的哈希值就是根哈希值。通過這種結(jié)構(gòu)能夠快速對其中的某筆交易進行定位。

默克爾樹的特點是:底層數(shù)據(jù)的任何變動,都會傳遞到其父親節(jié)點,一直到樹根。

理解了默克爾樹,相信你會對上圖的區(qū)塊體結(jié)構(gòu)圖有一個更加深刻的認識。

?四、區(qū)塊頭

區(qū)塊頭主要由三組數(shù)據(jù)組成,第一組是父區(qū)塊的哈希值,父哈希值用來將該區(qū)塊與它的前一區(qū)塊相連接;第二組數(shù)據(jù)和礦工競爭挖礦有關(guān),即難度、時間戳和Nonce(隨機數(shù));第三組是由剛才我們講到的區(qū)塊體中計算出來的根哈希值,即默克爾樹根。

這里要著重了解一個概念,什么是父哈希值?

對區(qū)塊中的區(qū)塊頭的數(shù)據(jù)進行哈希運算會生成一個哈希值,區(qū)塊頭中的任何數(shù)據(jù)改變都會導(dǎo)致這個哈希值改變,所以這個哈希值可以作為這個區(qū)塊獨一無二的標(biāo)志。

通過這個哈希值就能在區(qū)塊鏈中找到對應(yīng)的區(qū)塊,而這個哈希值對于連在后面的一個新的區(qū)塊來說就是父哈希值。

這里需要注意的一點是:本區(qū)塊不會存儲自身的哈希值,只存儲它的父區(qū)塊的哈希值,自身的哈希值將會存儲在子區(qū)塊中,作為子區(qū)塊的父哈希值。

因為每個區(qū)塊的區(qū)塊頭中都包含了它的父哈希值,并且只有一個父哈希值(因為區(qū)塊鏈只有一條最長鏈),所以每個區(qū)塊通過它的父哈希值就能一直追溯到創(chuàng)世區(qū)塊(第一個區(qū)塊)。

引入了父哈希的概念不僅將區(qū)塊與區(qū)塊連接到一起,而且還能保證區(qū)塊鏈的不可篡改性。

由于區(qū)塊頭里面包含父區(qū)塊哈希值,所以當(dāng)前區(qū)塊的哈希值也受到該數(shù)值的影響。如果父區(qū)塊中的數(shù)據(jù)發(fā)生改變,那它的哈希值必然也會改變,導(dǎo)致子區(qū)塊就無法再通過原始父哈希值連接到上一個區(qū)塊。

所以,如果想要改變一個區(qū)塊的數(shù)據(jù),那就要將它后面的所有區(qū)塊再重新運算一遍。正是因為這樣的重新計算需要耗費巨大的計算量幾乎是無法實現(xiàn)的,進一步保證了區(qū)塊鏈網(wǎng)絡(luò)的安全性。

區(qū)塊頭中的第二組數(shù)據(jù),難度、時間戳和Nonce我會在后面講解挖礦的時候詳細介紹,這里我們只需要知道區(qū)塊頭中包含這些東西就行,方便前期建立整體概念。

五、為什么區(qū)塊要設(shè)計成這種結(jié)構(gòu)

對于區(qū)塊的內(nèi)部結(jié)構(gòu)基本剖析完了,但你有沒有想過區(qū)塊設(shè)計成這種結(jié)構(gòu)有什么好處嗎?

首先我們要知道區(qū)塊頭是80字節(jié),而平均每個交易至少是250字節(jié),而且平均每個區(qū)塊至少包含超過500個交易。因此,一個包含所有交易的完整區(qū)塊體比區(qū)塊頭的1000倍還要大。

區(qū)塊鏈?zhǔn)且粋€分布式網(wǎng)絡(luò),所以數(shù)據(jù)需要存儲在各個節(jié)點當(dāng)中,但是比特幣網(wǎng)絡(luò)的完整數(shù)據(jù)加起來可能有幾十上百個G,這不是一個普通的終端能夠承受的起的,許多比特幣客戶端被設(shè)計成運行在空間和功率受限的設(shè)備上。

如:智能電話、平板電腦、嵌入式系統(tǒng)等,它們是沒有辦法存儲比特幣網(wǎng)絡(luò)的所有數(shù)據(jù)的,該怎么辦呢?

這個時候就能看到區(qū)塊結(jié)構(gòu)的高明之處了,比特幣網(wǎng)絡(luò)中的很多節(jié)點主要是用來驗證交易的,它們只需要下載區(qū)塊頭,不需要下載包含在每個區(qū)塊中的交易信息就能完成交易驗證。

這樣的不含交易信息的區(qū)塊鏈,大小只有完整區(qū)塊鏈的幾千分之1,大大節(jié)約了終端的使用空間。

正是因為區(qū)塊的內(nèi)部結(jié)構(gòu)才可以實現(xiàn)一個終端,只需要通過區(qū)塊頭的數(shù)據(jù)就能對某筆交易進行驗證,這就是簡單支付驗證(SPV),這樣的節(jié)點就叫做SPV節(jié)點,具體實現(xiàn)原理將會在下期講解。

六、總結(jié)

區(qū)塊體和區(qū)塊頭的緊密連接,區(qū)塊頭和父子區(qū)塊的前后配合,各個節(jié)點環(huán)環(huán)相扣,實現(xiàn)了一個堅不可摧的鏈條,對比特幣研究的越深,越能體會到它的強大之處,各種巧妙的思想讓人嘆為觀止。

我們不研究代碼,只是從整體設(shè)計思想來觀察比特幣區(qū)塊的內(nèi)部結(jié)構(gòu),希望這篇文章能讓你看明白。

 

版權(quán)聲明:數(shù)字簽名:Press.one

作者:liheng,區(qū)塊鏈探索者、互聯(lián)網(wǎng)產(chǎn)品經(jīng)理,超級個體修煉中,只創(chuàng)作對用戶有價值的內(nèi)容

本文由 @liheng 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。未經(jīng)許可,禁止轉(zhuǎn)載

題圖來自Pixabay,基于 CC0 協(xié)議

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. 大牛,點贊

    來自河北 回復(fù)
  2. 高..牛..我這種小白也是能看得懂的文章

    回復(fù)
  3. 很不錯的文章。
    提個問題,使用加密貨幣時,是不是需要把整個網(wǎng)絡(luò)全部區(qū)塊都下載下來計算才知道我的錢包余額?(好像之前看到的文章這樣說的)

    來自廣東 回復(fù)