bitcoin-blk*.dat文件解析
除非特殊说明,否则字节序都是 Little-Endian 的。
文件是由多个 block 组成的,每个 block 结构如下:
| 字节数 | 内容 | 说明 |
|---|---|---|
| 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 包括:
| 字节数 | 内容 | 说明 |
|---|---|---|
| 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。
第一块 index 0 coinbase 交易
hex 数据
F9BEB4D91D0100000100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000 |
json 数据
{ |
解析
F9BEB4D9 固定头 magic bytes |
废弃的支付到公钥脚本:
早期的版本,OP_CHECKSIG 直接使用没有对公钥做 hash,
scriptPubKey:
scriptSig:
2笔交易 coinbase + 普通交易
height 17000000000d1145790a8694403d4063f323d499e655c83426834d4ce2f8dd4a2ee
hex 数据
0100000055bd840a78798ad0da853f68974f3d183e2bd1db6a842c1feecf222a00000000ff104ccb05421ab93e63f8c3ce5c2c2e9dbb37de2764b3a3175c8166562cac7d51b96a49ffff001d283e9e700201000000010000000000000000000000000000000000000000000000000000000000000000ffffffff0704ffff001d0102ffffffff0100f2052a01000000434104d46c4968bde02899d2aa0963367c7a6ce34eec332b32e42e5f3407e052d64ac625da6f0718e7b302140434bd725706957c092db53805b821a85b23a7ac61725bac000000000100000001c997a5e56e104102fa209c6a852dd90660a20b2d9c352423edce25857fcd3704000000004847304402204e45e16932b8af514961a1d3a1a25fdf3f4f7732e9d624c6c61548ab5fb8cd410220181522ec8eca07de4860a4acdd12909d831cc56cbbac4622082221a8768d1d0901ffffffff0200ca9a3b00000000434104ae1a62fe09c5f51b13905f07f06b99a2f7159b2225f374cd378d71302fa28414e7aab37397f554a7df5f142c21c1b7303b8a0626f1baded5c72a704f7e6cd84cac00286bee0000000043410411db93e1dcdb8a016b49840f8c53bc1eb68a382e97b1482ecad7b148a6909a5cb2e0eaddfb84ccf9744464f82e160bfa9b8b64f9d4c03f999b8643f656b412a3ac00000000 |
json 数据
{ |
解析
01000000 版本号 |