我們通過(guò)前面幾期的學(xué)習(xí),基本對(duì)區(qū)塊鏈網(wǎng)絡(luò)中各節(jié)點(diǎn)的外部協(xié)作有了一個(gè)宏觀認(rèn)識(shí),接下來(lái)將從更加微觀的角度開(kā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)樗娴木褪且欢延砂灰?a class="channel_keylink" href="/search.asp">信息的區(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é)即將解釋?zhuān)┲赶蚯耙粋(gè)區(qū)塊,以此類(lèi)推,區(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ǔ)的。
區(qū)塊體包括當(dāng)前區(qū)塊經(jīng)過(guò)驗(yàn)證的、 區(qū)塊創(chuàng)建過(guò)程中生成的所有交易記錄。這些記錄通過(guò)默克爾( Merkle)樹(shù)的哈希過(guò)程生成唯一的默克爾,根并記入?yún)^(qū)塊頭。
什么是默克爾根呢?
首先了解一下默克爾(merkle)樹(shù),默克爾樹(shù)是一種哈希二叉樹(shù),它是一種用作快速歸納和校驗(yàn)大規(guī)模數(shù)據(jù)完整性的數(shù)據(jù)結(jié)構(gòu)。這種二叉樹(shù)包含加密哈希值,術(shù)語(yǔ)“樹(shù)”在計(jì)算機(jī)學(xué)科中常被用來(lái)描述一種具有分支的數(shù)據(jù)結(jié)構(gòu)。
在比特幣網(wǎng)絡(luò)中,默克爾樹(shù)被用來(lái)歸納一個(gè)區(qū)塊中的所有交易,同時(shí)生成整個(gè)交易集合的數(shù)字指紋,且提供了一種校驗(yàn)區(qū)塊是否存在某交易的高效途徑。
生成一棵完整的默克爾樹(shù)需要遞歸地對(duì)哈希節(jié)點(diǎn)對(duì)進(jìn)行哈希,并將新生成的哈希節(jié)點(diǎn)插入到默克爾樹(shù)中,直到只剩一個(gè)哈希節(jié)點(diǎn),該節(jié)點(diǎn)就是默克爾樹(shù)的根。
說(shuō)人話(huà),默克爾樹(shù)可以理解為一顆倒立的樹(shù),這棵樹(shù)每個(gè)樹(shù)杈只能分兩個(gè)樹(shù)枝出來(lái),最終每個(gè)最小樹(shù)枝上都會(huì)掛兩片葉子。
這里的每片葉子就是一筆交易記錄,每個(gè)樹(shù)杈的分叉點(diǎn)就是一個(gè)哈希值,每個(gè)哈希值都是根據(jù)樹(shù)杈分出的兩個(gè)樹(shù)枝的分叉點(diǎn)或者葉子的哈希值計(jì)算出來(lái)的。
這些這些分叉節(jié)點(diǎn)的哈希值向上一級(jí)分叉點(diǎn)匯聚,再進(jìn)行哈希計(jì)算生成一個(gè)哈希值。以此類(lèi)推,最終匯聚到樹(shù)根上,這個(gè)樹(shù)根計(jì)算出來(lái)的哈希值就是根哈希值。通過(guò)這種結(jié)構(gòu)能夠快速對(duì)其中的某筆交易進(jìn)行定位。
默克爾樹(shù)的特點(diǎn)是:底層數(shù)據(jù)的任何變動(dòng),都會(huì)傳遞到其父親節(jié)點(diǎn),一直到樹(shù)根。
理解了默克爾樹(shù),相信你會(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)的根哈希值,即默克爾樹(shù)根。
這里要著重了解一個(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)?a class="channel_keylink" href="/search.asp">區(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ū)塊鏈是一個(gè)分布式網(wǎng)絡(luò),所以數(shù)據(jù)需要存儲(chǔ)在各個(gè)節(jié)點(diǎn)當(dāng)中,但是比特幣網(wǎng)絡(luò)的完整數(shù)據(jù)加起來(lái)可能有幾十上百個(gè)G,這不是一個(gè)普通的終端能夠承受的起的,許多比特幣客戶(hù)端被設(shè)計(jì)成運(yùn)行在空間和功率受限的設(shè)備上。
如:智能電話(huà)、平板電腦、嵌入式系統(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),希望這篇文章能讓你看明白。
作者:liheng,區(qū)塊鏈探索者、互聯(lián)網(wǎng)產(chǎn)品經(jīng)理,超級(jí)個(gè)體修煉中,只創(chuàng)作對(duì)用戶(hù)有價(jià)值的內(nèi)容
本文由 @liheng 原創(chuàng)發(fā)布于人人都是產(chǎn)品經(jīng)理。