bitcoin-blk*.dat文件解析

参考1
参考2

除非特殊说明,否则字节序都是 Little-Endian 的。
文件是由多个 block 组成的,每个 block 结构如下:

77a7947c.png 94a1b129.png
字节数 内容 说明
4字节 0xF9 0xBE 0xB4 0xD9 Magic Number,用于确认block开始
4字节 Block Length unsigned int
Block Length CBlock类序列化后的数据 CBlock类定义在block.h文件中

CBlock 数据包括 CBlockHeader 以及一些列的 CTransaction 数据,
其中 CBlockHeader 80 bytes 包括:

a03b61a4.png
字节数 内容 说明
4字节 版本号 int32_t
32字节 前一个block的hash值 uint256
32字节 MerkleRoot uint256
4字节 时间戳 块生成时的网络时间
4字节 目标值 当前区块生成所达成目标值的特征
4字节 随机数 用于挖矿时生成符合要求的块哈希

在CBlockHerder之后,是交易数量及每个交易的记录
交易数量为紧缩格式(CompactSize)的无符号整数
紧缩格式整数的读取,在serialize.h的ReadCompactSize模板中,其规则为若第一个字节是255,则读取后续8字节作为uint64;若第一字节是254,则读取后续4字节作为uint32;若第一字节是253,则读取后续2字节作为uint16;否则将第一个字节作为uint8。
因此,这是一个可变长度的数据,最小占用1字节,最大占用9字节。

coinbase 交易

字节数 内容 说明
1-9字节 交易数量 CompactSize 的无符号整数
4字节 版本号 int32_t
1-9字节 交易输入数量 CompactSize 的无符号整数
32字节 引用交易的hash值 uint256
4字节 引用交易的输出index int32_t
1-9字节 Coinbase数据长度 CompactSize 的无符号整数
n字节 Coinbase数据 一些数据 采用大端格式编码
4字节 sequence int32_t
1-9字节 交易输出数量 CompactSize 的无符号整数
8字节 交易数量 单位聪
1-9字节 锁定脚本长度 CompactSize 的无符号整数
n字节 锁定脚本 scriptPubKey
4字节 锁定时间 一个区块号或UNIX时间戳

锁定脚本说明:开头的41含义,表示要将接下来的65个字节压入堆栈。
最后一个字节的16进制数值,ac,表示的是OP_CHECKSIG。

f42cb426.png

第一块 index 0 coinbase 交易
hex 数据

F9BEB4D91D0100000100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000

json 数据

{
"hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f",
"ver": 1,
"prev_block": "0000000000000000000000000000000000000000000000000000000000000000",
"mrkl_root": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"time": 1231006505,
"bits": 486604799,
"nonce": 2083236893,
"n_tx": 1,
"size": 285,
"tx": [
{
"hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
"ver": 1,
"vin_sz": 1,
"vout_sz": 1,
"lock_time": 0,
"size": 204,
"in": [
{
"prev_out": {
"hash": "0000000000000000000000000000000000000000000000000000000000000000",
"n": 4294967295
},
"coinbase": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73"
}
],
"out": [
{
"value": "50.00000000",
"scriptPubKey": "04678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5f OP_CHECKSIG"
}
],
"nid": "c2151f94f6ca6cecbe5d17cd12aaa40e5b1571ca10da82f2f5bcdb6205dcad6a"
}
],
"mrkl_tree": [
"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b"
],
"next_block": "00000000839a8e6886ab5951d76f411475428afc90947ee320161bbf18eb6048"
}

解析

F9BEB4D9 固定头 magic bytes
1D010000 区块长度 11D 小端表示 285
01000000 版本号
0000000000000000000000000000000000000000000000000000000000000000 引用 block 的hash值 32 bytes
3BA3EDFD7A7B12B27AC72C3E67768F617FC81BC3888A51323A9FB8AA4B1E5E4A MerkleRoot 32 bytes
29AB5F49 块生成时的网络时间 Unix time
FFFF001D 目标值 0x1D00FFFF
1DAC2B7C 随机数 2083236893
01 交易数量 长度可变 1-9
01000000 version uint32 交易版本号
01 varint tx_in_count uint 交易输入数量
0000000000000000000000000000000000000000000000000000000000000000 交易哈希 不引用任何一个交易,值全部为0
FFFFFFFF 交易输出索引
4D Coinbase数据长度 77,下面是Coinbase数据 在V2版本的区块中,除了需要以区块高度开始外,其它数据可以任意填写,用于extra nonce和挖矿标签
04FFFF001D 这个是难度值
0104 暂时未知
45 长度,下面是数据 The Times 03/Jan/2009 Chancellor on brink of second bailout for banks
5468652054696D65732030332F4A616E2F32303039204368616E63656C6C6F72206F6E206272696E6B206F66207365636F6E64206261696C6F757420666F722062616E6B73
FFFFFFFF sequence
01 交易输出数量
00F2052A01000000 8 交易总量 用聪表示的比特币值 50.00000000
43 1-9 锁定脚本大小 用字节表示的后面的锁定脚本长度 67,下面是锁定脚本 一个定义了支付输出所需条件的脚本
41 表示把1-75范围内的字节压栈 这里是65字节
04678AFDB0FE5548271967F1A67130B7105CD6A828E03909A67962E0EA1F61DEB649F6BC3F4CEF38C4F35504E51EC112DE5C384DF7BA0B8D578A4C702B6BF11D5F
AC OP_CHECKSIG 操作
00000000 锁定时间 一个区块号或UNIX时间戳

废弃的支付到公钥脚本:
早期的版本,OP_CHECKSIG 直接使用没有对公钥做 hash,
scriptPubKey: OP_CHECKSIG
scriptSig:

script参考

2笔交易 coinbase + 普通交易

height 170
00000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee
hex 数据

0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e700201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000

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"
}

解析

01000000  版本号
55bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000 前区块 hash 32bytes
ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d Merkle root hash 32bytes
51b96a49 Unix timestamp 4bytes
ffff001d Taget 4bytes
283e9e70 Nonce 4bytes
02 交易数量 1-9bytes
01000000 交易版本号 4bytes
01 交易输入数量 1-9bytes
0000000000000000000000000000000000000000000000000000000000000000 引用交易 hash 32bytes
ffffffff 交易输出索引 4bytes
07 Coinbase数据长度 1-9bytes
04ffff001d0102 Coinbase数据 nbytes
ffffffff sequence 4bytes
01 交易输出数量 1-9bytes
00f2052a01000000 交易数量 8bytes 单位聪
43 锁定脚本长度 1-9bytes
4104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac 锁定脚本
00000000 锁定时间 4bytes
01000000 交易版本号 4bytes
01 交易输出数量 1-9bytes
c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704 引用交易 hash 32bytes
00000000 交易输出索引 4bytes 被花费的UTXO的索引号,第一个是0
48 解锁脚本长度 1-9bytes 72bytes
47304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901 解锁脚本
ffffffff sequence 4bytes
02 输出数量
00ca9a3b00000000 交易数量 8bytes 10.00000000 聪
43 锁定脚本长度 1-9bytes 67bytes
4104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac 锁定脚本
00286bee00000000 交易数量 8bytes 40.00000000 聪
43 锁定脚本长度 1-9bytes 67bytes
410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac 锁定脚本
00000000 锁定时间 4bytes