block headers 以80字節(jié)的格式進(jìn)行序列化始衅,然后作為比特幣工作量驗(yàn)證算法的一部分進(jìn)行哈希處理,使序列化頭部格式成為共識規(guī)則的一部分缭保。
bytes | name | 數(shù)據(jù)類型 | 描述 |
---|---|---|---|
4 | version | int32_t | block version 指示要遵循哪一組塊驗(yàn)證規(guī)則 |
32 | previous block header hash | char[32] | SHA256(SHA256())hash,以前面 block 的 header 的內(nèi)部字節(jié)順序排列蝙茶。這確保在不改變該塊的頭部的情況下不能改變先前的塊艺骂。 |
32 | merkle root hash | char[32] | SHA256(SHA256())是按照內(nèi)部字節(jié)排序的hash。 merkle root 源自該塊中包含的所有交易的hash值隆夯,確保在不修改頭部的情況下不會修改這些交易钳恕。 |
4 | time | uint32_t | 塊時間是礦工開始散列頭部時的Unix紀(jì)元時間(根據(jù)礦工)。 必須嚴(yán)格大于前11個block的平均時間蹄衷。 根據(jù)其時鐘忧额,全節(jié)點(diǎn)將不會接受超過兩個小時的headers。 |
4 | nBits | uint32_t | 此塊的header hash 的目標(biāo)閾值的編碼版本必須小于或等于愧口。 |
4 | nonce | uint32_t | 任意數(shù)量的礦工都可以修改頭部 hash 來確保能夠產(chǎn)生小于或等于目標(biāo)閾值的hash睦番。 如果所有32位值都經(jīng)過測試,則可以更新時間或更改coinbase交易并更新merkle根。 |
哈希按內(nèi)部字節(jié)順序排列; 其他值都是小端順序托嚣。
block header的消息示例如下:
02000000 ........................... Block version: 2
b6ff0b1b1680a2862a30ca44d346d9e8
910d334beb48ca0c0000000000000000 ... Hash of previous block's header
9d10aa52ee949386ca9385695f04ede2
70dda20810decd12bc9b048aaab31471 ... Merkle root
24d95a54 ........................... Unix time: 1415239972
30c31b18 ........................... Target: 0x1bc330 * 256**(0x18-3)
fe9f0864 ........................... Nonce
Block Versions
- Version 1:在創(chuàng)世區(qū)塊中被引入(January 2009)
- Version 2:在Bitcoin Core 0.7.0(2012年9月)中通過軟分叉被引入巩检。如BIP34所述,有效的 version2 block 需要 block height parameter in the coinbase示启。 在BIP34中還描述了拒絕某些塊的規(guī)則; 根據(jù)這些規(guī)則兢哭,Bitcoin Core 0.7.0及更高版本在 block height 為224,412 處開始拒絕在 coinbase 中沒有 version2 的 block height,并在塊高度為224,412 的三周后夫嗓,也就是 227,930 開始拒絕新生成的 version1 的塊迟螺。
- version3:在Bitcoin Core 0.10.0(2015年2月)中通過軟分叉被引入。當(dāng) fork 達(dá)到全面執(zhí)行(2015年7月)時舍咖,它需要嚴(yán)格按照 BIP66 中所描述的對新塊中的所有ECDSA簽名進(jìn)行DER編碼矩父。 自從Bitcoin Core 0.8.0(2012年2月)以來,不使用嚴(yán)格DER編碼的交易是非標(biāo)準(zhǔn)的谎仲。
- version4:在 BIP65 中指定并在 Bitcoin Core 0.11.2(2015年11月)中引入的區(qū)塊浙垫,通過軟分叉開始啟動(2015年12月)。這些塊現(xiàn)在支持該BIP中描述的新
OP_CHECKLOCKTIMEVERIFY
操作碼郑诺。
用于 version2夹姥、3和4 升級的機(jī)制通常稱為IsSuperMajority(),該功能添加到Bitcoin Core 中以管理這些軟分支更改辙诞。有關(guān)此方法的完整說明辙售,請參閱BIP34。
Merkle Trees
merkle root 是使用此塊中所有交易的TXID構(gòu)建的飞涂,但首先需要按照共識規(guī)則的要求排列TXID:
- coinbase 交易的 TXID 總是排在第一位旦部。
- 此塊中的任何輸入都可以使用同時出現(xiàn)在此塊中的輸出(假設(shè)花費(fèi)是有效的)。但是较店,對應(yīng)于輸出的TXID必須放置在與輸入對應(yīng)的TXID之前的某個點(diǎn)士八。 這可以確保整個區(qū)塊鏈的交易在輸入之前都有與之對應(yīng)的輸出。
如果一個塊只有一個 coinbase 交易梁呈,coinbase TXID將會被用作merkle root 的hash婚度。
如果一個塊只有一個coinbase交易和一個其他交易,那么這兩個交易的TXID按順序排列官卡,連接成64個原始字節(jié)蝗茁,然后SHA256(SHA256())hash在一起最終形成 merkle root。
如果一個塊有三個或更多的交易寻咒,則會形成中間的Merkle樹行哮翘。 TXID按順序排列并配對,從coinbase交易的TXID開始毛秘。 每個對連接在一起作為64個原始字節(jié)和SHA256(SHA256())hash形成第二行hash饭寺。 如果有一個奇數(shù)(非偶數(shù))的TXID,則將最后一個TXID與其自身的副本連接并進(jìn)行hash。 如果第二行中有兩個以上的hash佩研,則重復(fù)該過程以創(chuàng)建第三行(并且柑肴,如有必要,可以進(jìn)一步重復(fù)以創(chuàng)建附加行)旬薯。 一旦獲得一行只有兩個hash值晰骑,這些hash值被連接并哈希來產(chǎn)生merkle root。
上面邏輯有點(diǎn)繞绊序,我們通過一張圖來直觀感受一下:
串聯(lián)時硕舆,TXID和中間hash總是以內(nèi)部字節(jié)順序排列,并且當(dāng)它放入block header時骤公,生成的merkle root也按照內(nèi)部字節(jié)順序排列抚官。
Target nBits
target threshold 是一個256位無符號整數(shù),header hash 必須等于或低于該header 才能成為塊鏈的有效部分阶捆。 然而凌节,header 字段 nBits僅提供32位空間,因此目標(biāo)號碼使用一些稱為“緊湊”的精確格式洒试,其工作方式類似于科學(xué)記數(shù)法的基本256版本:
作為一個 base-256 的數(shù)字倍奢,nBits可以像字節(jié)一樣快速地解析,這與解析10進(jìn)制科學(xué)記數(shù)法中的小數(shù)相同:
盡管 target threshold 應(yīng)該是一個無符號整數(shù)垒棋,但原始 nBits 實(shí)現(xiàn)繼承了已簽名數(shù)據(jù)類的屬性卒煞,如果設(shè)置了有效數(shù)的高位,則target threshold為負(fù)值叼架。 這是無用的 - header hash被視為無符號數(shù)畔裕,因此它永遠(yuǎn)不會等于或低于負(fù)目標(biāo)閾值。 Bitcoin Core以兩種方式處理這個問題:
- 在解析nBits時乖订,Bitcoin Core 將負(fù)目標(biāo)閾值轉(zhuǎn)換為零目標(biāo)扮饶,該header hash可以等于(理論上至少)。
- 當(dāng)為nBits創(chuàng)建一個值時乍构,Bitcoin Core 會檢查它是否會產(chǎn)生nBits贴届,這會被解釋為負(fù)值; 如果是這樣,它將有效位數(shù)除以256蜡吧,并將指數(shù)增加1以產(chǎn)生具有不同編碼的相同數(shù)字。
難度1占键,允許的最小難度昔善,在mainnet和當(dāng)前testnet上由nBits值0x1d00ffff表示。 Regtest模式使用不同的難度值1-0x207fffff畔乙,uint32_max以下可以編碼的最高值; 這允許在regtest模式下幾乎立即構(gòu)建塊君仆。
Serialized Blocks
根據(jù)當(dāng)前的共識規(guī)則,除非序列化大小小于或等于1 MB,否則塊無效返咱。下面介紹的所有字段均按序列化的大小計算
bytes | name | 數(shù)據(jù)類型 | 描述 |
---|---|---|---|
80 | block header | block_header | block header 部分中描述的格式钥庇。 |
Varies | txn_count | compactSize uint | 此區(qū)塊中的交易總數(shù),包括coinbase交易咖摹。 |
Varies | txns | raw transaction | 此塊中的每筆交易都是原始交易格式评姨。交易必須與他們的TXID出現(xiàn)在merkle樹的第一行中相同的順序出現(xiàn)在數(shù)據(jù)流中。 |
在一個區(qū)塊中的第一筆交易必須是一個coinbase交易萤晴,該交易應(yīng)收集并消費(fèi)本區(qū)塊交易支付的任何交易費(fèi)用吐句。
block height低于6,930,000的所有 block 都有權(quán)獲得新創(chuàng)建的比特幣價值的區(qū)塊補(bǔ)貼,這也應(yīng)該用于coinbase交易店读。 (區(qū)塊補(bǔ)貼從50比特幣開始嗦枢,每210,000塊減半 - 大約每四年一次,截至2017年11月屯断,為12.5比特幣文虏。)
交易費(fèi)和區(qū)塊補(bǔ)貼一起被稱為區(qū)塊獎勵。如果它試圖花費(fèi)比塊獎勵可用的更多價值殖演,則coinbase交易是無效的氧秘。
本文由copernicus 團(tuán)隊(duì) 冉小龍 翻譯,轉(zhuǎn)載無需授權(quán)剃氧!