區(qū)塊鏈的組成
首先我們來(lái)說說區(qū)塊鏈的組成。區(qū)塊鏈,顧名思義,是一個(gè)個(gè)區(qū)塊以鏈?zhǔn)浇Y(jié)構(gòu)組成的。具體來(lái)說,每個(gè)區(qū)塊都有一個(gè)唯一的區(qū)塊哈希,區(qū)塊頭中有一個(gè)字段來(lái)存放父區(qū)塊的哈希。第二個(gè)區(qū)塊的父哈希為第一個(gè)區(qū)塊的哈希,第三個(gè)區(qū)塊的父哈希為第二個(gè)區(qū)塊的哈希,這樣類推,就把一個(gè)個(gè)區(qū)塊鏈接起來(lái)了,形成了一個(gè)前向的鏈表,一句話,區(qū)塊組成的區(qū)塊鏈表就是區(qū)塊鏈。
每個(gè)區(qū)塊的頭信息中都要存父區(qū)塊的哈希,那么,區(qū)塊哈希是怎么來(lái)的呢,區(qū)塊哈希其實(shí)是對(duì)區(qū)塊頭信息做一個(gè)算法名為SHA256的算法得到的值。我們可以把SHA256想象為一個(gè)裝置,姑且稱之為翻譯黑箱吧,你丟給他一句話,他會(huì)立馬吐出另外一句翻譯好的話,也就是哈希。要得到哈希就得知道翻譯前包括哪里內(nèi)容,具體到比特幣里,就涉及到了區(qū)塊具體的數(shù)據(jù)結(jié)構(gòu)。
區(qū)塊的結(jié)構(gòu)
區(qū)塊是一種聚合了交易信息的容器數(shù)據(jù)結(jié)構(gòu)。區(qū)塊由以下幾部分來(lái)組成:
1) 區(qū)塊大?。ㄕ?字節(jié))
2) 區(qū)塊頭 (占80字節(jié))
3) 交易計(jì)數(shù)器(記錄本區(qū)塊中的交易數(shù)量)
4) 交易實(shí)體
在這個(gè)數(shù)據(jù)結(jié)構(gòu)中,區(qū)塊大小代表了本區(qū)塊除了自己這4個(gè)字節(jié)以外的其他數(shù)據(jù)量的大小,區(qū)塊的具體數(shù)據(jù)寫完以后才能得到這個(gè)數(shù)值;交易計(jì)數(shù)器就更簡(jiǎn)單了,他表達(dá)了一個(gè)區(qū)塊中交易的個(gè)數(shù),僅僅是一個(gè)計(jì)數(shù)而已。交易實(shí)體就是真正的交易數(shù)據(jù),代表著比特幣個(gè)體與個(gè)體之間的價(jià)值轉(zhuǎn)移。
在區(qū)塊里,區(qū)塊頭起著至關(guān)重要的作用,之前的章節(jié)中我們講過,并不是每一個(gè)賬戶都要記錄所有的交易信息,只有那些全節(jié)點(diǎn)或者礦工才需要記錄所有的數(shù)據(jù),而普通的比特幣參與者只需要將每個(gè)區(qū)塊的區(qū)塊頭下載到本地就可以進(jìn)行簡(jiǎn)單支付驗(yàn)證(Simplified Payment Verification 簡(jiǎn)寫為SPV),每個(gè)區(qū)塊的區(qū)塊頭只有80字節(jié),一年也才4.2M而已,把這些數(shù)據(jù)完全放進(jìn)內(nèi)存都是可以的。
那么區(qū)塊頭是什么樣的結(jié)構(gòu)呢?區(qū)塊頭主要由三組數(shù)據(jù)組成:
1) 父區(qū)塊哈希值
2) 難度、時(shí)間戳和nonce值
3) Merkle樹的根hash
其中父區(qū)塊哈希前面已經(jīng)說過了,是用來(lái)鏈接區(qū)塊用的,可以保證區(qū)塊的順序;難度、時(shí)間戳和nonce值與挖礦競(jìng)爭(zhēng)相關(guān);而Merkle樹的根hash,借助Merkle樹算法,可以確保收錄于驗(yàn)證區(qū)塊中所有交易的真實(shí)性。