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