1. 程式人生 > >比特幣區塊結構解析

比特幣區塊結構解析

前言

本文主要具體分析一個區塊的值,通過逐位元組分析,找出與比特幣區塊欄位對應的部分,我們就可以加深對比特幣區塊的瞭解。

準備工作

json格式資訊:

{
  "hash": "00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee",
  "ver": 1,
  "prev_block": "000000002a22cfee1f2c846adbd12b3e183d4f97683f85dad08a79780a84bd55",
  "mrkl_root": "7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ff"
, "time": 1231731025, "bits": 486604799, "nonce": 1889418792, "n_tx": 2, "size": 490, "tx": [ { "hash": "b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082", "ver": 1, "vin_sz": 1, "vout_sz": 1, "lock_time": 0, "size": 134, "in": [ { "prev_out
": { "hash": "0000000000000000000000000000000000000000000000000000000000000000", "n": 4294967295 }, "coinbase": "04ffff001d0102" } ]
, "out": [ { "value": "50.00000000", "scriptPubKey": "04d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725b OP_CHECKSIG"
} ]
, "nid": "c56705435de47674259d6c92125907645d4fb512fa8e7f31457f5f29ba983d80" }, { "hash": "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16", "ver": 1, "vin_sz": 1, "vout_sz": 2, "lock_time": 0, "size": 275, "in": [ { "prev_out": { "hash": "0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9", "n": 0 }, "scriptSig": "304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901" } ], "out": [ { "value": "10.00000000", "scriptPubKey": "04ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84c OP_CHECKSIG", "next_in": { "hash": "ea44e97271691990157559d0bdd9959e02790c34db6c006d779e82fa5aee708e", "n": 0 } }, { "value": "40.00000000", "scriptPubKey": "0411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3 OP_CHECKSIG", "next_in": { "hash": "a16f3ce4dd5deb92d98ef5cf8afeaf0775ebca408f708b2146c4fb42b41e14be", "n": 0 } } ], "nid": "a1629e004eb3d703ecf3807f976e402a626d84c559f8eab1450adf207619f319" } ]
, "mrkl_tree": [ "b1fea52486ce0c62bb442b530a3f0132b826c74e473d1f2c220bfa78111c5082", "f4184fc596403b9d638783cf57adfe4c75c605f6356fbc91338530e9831e9e16", "7dac2c5666815c17a3b36427de37bb9d2e2c5ccec3f8633eb91a4205cb4c10ff" ], "next_block": "00000000c9ec538cab7f38ef9c67a95742f56ab07b0a37c5be6b02808dbfb4e0" }

十六進位制格式資訊:

0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e700201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

區塊整體結構

一個完整的區塊結構主要由以下幾部分構成:

位元組 欄位 說明
4 區塊大小 用位元組表示的該欄位之後的區塊大小
80 區塊頭 組成區塊頭的幾個欄位
1-9 交易計數器 該區塊包含的交易數量,包含coinbase交易
不定 交易 記錄在區塊裡的交易資訊,使用原生的交易資訊格式,並且交易在資料流中的位置必須與Merkle樹的葉子節點順序一致

比特幣的區塊大小目前被嚴格限制在1MB以內。4位元組的區塊大小欄位不包含在此內。

區塊頭資訊分析

我們首先分析前80位元組的區塊頭資訊:

0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e70

區塊頭結構1

位元組 欄位 說明
4 版本 區塊版本號,表示本區塊遵守的驗證規則
32 父區塊頭雜湊值 前一區塊的雜湊值,使用SHA256(SHA256(父區塊頭))計算
32 Merkle根 該區塊中交易的Merkle樹根的雜湊值,同樣採用SHA256(SHA256())計算
4 時間戳 該區塊產生的近似時間,精確到秒的UNIX時間戳,必須嚴格大於前11個區塊時間的中值,同時全節點也會拒絕那些超出自己2個小時時間戳的區塊
4 難度目標 該區塊工作量證明演算法的難度目標,已經使用特定演算法編碼
4 Nonce 為了找到滿足難度目標所設定的隨機數,為了解決32位隨機數在算力飛昇的情況下不夠用的問題,規定時間戳和coinbase交易資訊均可更改,以此擴充套件nonce的位數

區塊頭資訊與實際資訊對照

說明

  • 版本、父區塊頭雜湊值和Merkle根採用的是小端格式編碼,即低有效位放在前面。
  • 時間戳表示的是自1970年1月1日0時0分0秒以來的秒數,1231731025秒轉為十六進位制值為0x496AB951,然後採用小端格式編碼表示為0x51b96a49。
  • 難度目標486604799轉化為十六進位制值為0x1d00ffff,該值採用小端格式編碼。而當前區塊的難度值0x1d00ffff需要採用一種特殊的編碼方式才能正確轉化為目標雜湊值。
  • 隨機數nonce表示的隨機數值轉化為十六進位制為0x709E3E28,然後採用小端格式編碼表示為0x283e9e70。

交易整體結構

接下來我們分析交易資訊:

0201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

交易資訊前面幾個位元組表示的是該區塊包含的交易數量,coinbase交易也計入在內。交易數量型別採用的是一種壓縮尺寸的變長整型。我們可以看出第一個位元組是0x02,這就說明本區塊只有2個交易:一個Coinbase交易和一個普通交易。接下來我們將分別分析Coinbase交易和普通交易資訊。

Coinbase交易資訊分析

一個區塊第一個交易規定為coinbase交易。

Coinbase交易結構為

位元組 欄位 描述
4 版本 這筆交易參照的規則
1-9 輸入計數器 包含的交易輸入數量
32 交易雜湊 不引用任何一個交易,值全部為0
4 交易輸出索引 固定為0xFFFFFFFF
1-9 Coinbase資料長度 coinbase資料長度
不定 Coinbase資料 在V2版本的區塊中,除了需要以區塊高度開始外,其它資料可以任意填寫,用於extra nonce和挖礦標籤
4 順序號 值全部為1,0xFFFFFFFF
1-9 輸出計數器 包含的交易輸出數量
8 總量 用聰表示的比特幣值
1-9 鎖定指令碼大小 用位元組表示的後面的鎖定指令碼長度
不定 鎖定指令碼 一個定義了支付輸出所需條件的指令碼
4 鎖定時間 一個區塊號或UNIX時間戳

Coinbase交易資訊與實際資訊對照

說明

  • 版本採用小端格式編碼。
  • Coinbase交易沒有交易輸入,也就是說它不引用任何一個UTXO,它所引用的交易雜湊只是一個256位的0,表示引用為空。
  • 交易輸出索引也是固定值,為0xffffffff,轉化為十進位制值為4294967295。
  • Coinbase資料採用大端格式編碼。
  • Coinbase交易只有一個特殊的“交易輸入”和一個交易輸出,均採用變長整型來表示。
  • 輸出總量為50億聰的比特幣,轉化為十六進位制為0x12A05F200,將其擴充為8位元組,變為0x000000012A05F200,之後採用小端格式表示。
  • 鎖定指令碼共有67個位元組。開頭的41含義,表示要將接下來的65個位元組壓入堆疊。最後一個位元組的16進位制數值,ac,表示的是OP_CHECKSIG。
  • 最後的鎖定時間為0,表示立即執行。

普通交易資訊分析

剩餘的資訊就是一個普通交易資訊:

0100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

普通交易結構為

位元組 欄位 描述
4 版本 明確這筆交易參照的規則
1-9 輸入計數器 包含的交易輸入數量
不定 輸入 一個或多個交易輸入
1-9 輸出計數器 包含的交易輸出數量
不定 輸出 一個或多個交易輸出
4 鎖定時間 一個區塊號或UNIX時間戳

普通交易輸入為

位元組 欄位 描述
32 交易雜湊值 指向被花費的UTXO所在的交易的雜湊指標
4 輸出索引 被花費的UTXO的索引號,第一個是0
1-9 解鎖指令碼大小 用位元組表示的後面的解鎖指令碼長度
不定 解鎖指令碼 滿足UTXO解鎖指令碼條件的指令碼
4 序列號 目前未被使用的交易替換功能,設為0xFFFFFFFF

普通交易輸出為

位元組 欄位 描述
8 總量 用聰表示的比特幣值
1-9 鎖定指令碼大小 用位元組表示的後面的鎖定指令碼長度
不定 鎖定指令碼 一個定義了支付輸出所需條件的指令碼

普通交易資訊與實際資訊對照

說明

  • 版本號、交易雜湊值採用小端格式編碼。
  • 輸入計數器、輸出計數器、解鎖指令碼大小和鎖定交易大小均採用變長整型值。
  • 輸出索引為0,這表明該輸入引用的UTXO是交易0437cd7f8525ceed2324359c2d0ba26006d92d856a9c20fa0241106ee5a597c9的第一個輸出。
  • 解鎖指令碼大小為0x48,則說明後面有72位元組的解鎖指令碼。
  • 解鎖指令碼開頭的0x47表示現將後面的71個位元組壓入堆疊。
  • 本交易共有兩個輸出,第一個輸出總量為10億聰,轉化為十六進位制值為0x000000003B9ACA00,最後採用小端格式編碼。同理可得第二個輸出總量為40億聰,轉化為十六進位制值為0x00000000EE6B2800,最後採用小端格式編碼。
  • 第一個交易的鎖定指令碼大小十六進位制值為0x43,這說明後面有67個位元組的鎖定指令碼。
  • 第一個鎖定指令碼開頭的0x41表示將接下來的65個位元組壓入堆疊。而結尾的0xac表示OP_CHECKSIG。
  • 第二個交易與第一個交易同理分析。
  • 最後鎖定時間為0,表示立即執行。
  1. Block Headers:比特幣開發者參考裡對區塊頭的描述。