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