解读比特币区块链的数据结构
比特币是基于区块链技术开发的加密数字货币,那么区块链到底是一个什么样的东西呢?上面有些什么内容呢?简单地说区块链是一个很大的账本,上面的主要内容记录了 A 转给 B 多少币,B 转给 C 多少币等等。
区块链是由很多个区块组成,每一个区块是由区块头、区块体组成。区块头里放着必要的信息,这些必要信息通过两次 sha256 计算出一个 Hash 放入下一个区块头里的 PreviousBlockHash 字段,比如第一个区块头的 Hash 会放入第二个区块头的 PreviousBlockHash,第二个区块头的 Hash 会放入第三个区块头的 PreviousBlockHash,依此类推,一层一层嵌套,这样如果有人篡改了某一个区块的区块头信息,那么下一个区块的区块头里的信息就变了,这样导致之后所有区块头都发生变化,所以区块头是可以防篡改的。
区块体里放着每一条交易记录,每一个交易记录会生成一个 Hash ,然后通过特定的方法组合起来再计算出一个 Hash 放到区块头里的 MerkleRoot 字段,如果有人篡改了某一条交易记录,那么 MerkleRoot 字段就会变,导致区块头也会变化,这样区块体也能做到了防篡改。区块链大体的结构如下图所示:
区块头
比如我们用 blockchair 区块链浏览器查询高度为 0 的区块,也就是第一个区块,https://blockchair.com/bitcoin/block/0?_type=block&_search=header,可以看到这个区块的 Hash 值是 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f,区块里的信息如下图所示,时间是2009年1月3日是创建的,只有一笔交易记录,金额是 50 个BTC。
然后调用 https://blockchain.info/rawblock/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f?format=hex 网站的接口获取这个区块的十六进制原始数据,内容如下:
1 2 |
0100000000000000000000000000000000000000000000000000000000000000000000003ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a29ab5f49ffff001d1dac2b7c0101000000010000000000000000000000000000000000000000000000000000000000000000ffffffff4d04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73ffffffff0100f2052a01000000434104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac00000000 |
区块头是前面 80 个字节,最开始第一个字节是版本号,往后 32 个字节是前一个区块的哈希值,由于这是第一个区块,它的前面没有区块,所以 32 个字节都是 0,再往后 32 个字节是交易列表的哈希树,再往后 4 个字节是时间,内容是 29 AB 5F 49,转换成后的时间戳是 1231006505,再往后是当前难度,最后 4 个字节是随机数,如下表:
字段 | 含义 | 长度 | 内容 |
---|---|---|---|
Version | 版本号 | 4 | 01 |
PreviousBlockHash | 前一个区块头的哈希值 | 32 | 0000000000000000000000000000000000000000000000000000000000000000000000 |
MerkleRoot | 交易列表的哈希树 | 32 | 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a |
Time | 时间戳 | 4 | 29ab5f49 |
Bits | 挖矿难度 | 4 | ffff001d |
Nonce | 随机数 | 4 | 1dac2b7c |
区块头的十六进制数据如下:
1 2 3 4 5 6 |
01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 3B A3 ED FD 7A 7B 12 B2 7A C7 2C 3E 67 76 8F 61 7F C8 1B C3 88 8A 51 32 3A 9F B8 AA 4B 1E 5E 4A 29 AB 5F 49 FF FF 00 1D 1D AC 2B 7C |
将区块头整体数据进行两次 sha256 即可得出该区块的 Hash,第一次 sha256 计算出的 Hash 是 a76dd73790def7b57776f22fa211d19cf43121a709a37eaeda17230eaac258f5,第二次 sha256 计算出的 Hash 是 6fe28c0ab6f1b372c1a6a246ae63f74f931e8365e15a089c68d6190000000000,再做一次大小端反转,得出的该区块的 Hash 是 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
区块体
第 81 个字节开始是区块体,区块体第一个字节是交易的数量,内容是 01,说明只有一笔交易。往后的字节是交易体,交易体字段如下表,有一个需要注意的地方,Value 字段是 BTC 的数据,这里是小端格式,内容是十六进制值 0x00f2052a01000000 转化为大端格式十六进制值0x000000012a05f200,再转化为十进制值为 5000000000,比特币最小单位是聪,表示该交易输出比特币是 50 亿聪,也就是挖出该区块得到的 50 个比特币奖励。
字段 | 含义 | 长度 | 内容 |
---|---|---|---|
Version | 版本号 | 4 | 01000000 |
InputCount | 输入的条数 | 1 | 01 |
UTXOHash | UTXO交易哈希值 | 32 | 0000000000000000000000000000000000000000000000000000000000000000 |
outputIndex | 输出索引 | 4 | ffffffff |
ScriptLen | 脚本长度 | 1 | 十六进制 4D,十进制 77 |
Script | 脚本内容 | 不定 | ��EThe Times 03/Jan/2009 Chancellor on brink of second bailout for banks |
Sequence | 字节序列号 | 4 | ffffffff |
outputCount | 输出索引 | 1 | 01 |
Value | BTC数值 | 8 | 00f2052a01000000,转换为 5000000000 |
lockScriptLen | 锁定脚本长度 | 1 | 十六进制 43,十进制 67 |
lockScriptBody | 锁定脚本长度 | 不定 | |
lockScriptTime | 锁定时间 | 4 | 00000000 |
第一笔交易的十六进制如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
01 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF FF FF 4D 04 FF FF 00 1D 01 04 45 54 68 65 20 54 69 6D 65 73 20 30 33 2F 4A 61 6E 2F 32 30 30 39 20 43 68 61 6E 63 65 6C 6C 6F 72 20 6F 6E 20 62 72 69 6E 6B 20 6F 66 20 73 65 63 6F 6E 64 20 62 61 69 6C 6F 75 74 20 66 6F 72 20 62 61 6E 6B 73 FF FF FF FF 01 00 F2 05 2A 01 00 00 00 43 41 04 67 8A FD B0 FE 55 48 27 19 67 F1 A6 71 30 B7 10 5C D6 A8 28 E0 39 09 A6 79 62 E0 EA 1F 61 DE B6 49 F6 BC 3F 4C EF 38 C4 F3 55 04 E5 1E C1 12 DE 5C 38 4D F7 BA 0B 8D 57 8A 4C 70 2B 6B F1 1D 5F AC 00 00 00 00 |
将这笔交易的整体数据进行两次 sha256 即可得出该笔交易的 Hash,第一次 sha256 计算的 Hash 是 27362e66e032c731c1c8519f43063fe0e5d070db1c0c3552bb04afa18a31c6bf,第二次 shah256 计算的 Hash 是 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a,然后再做一次大小端反转,最终这笔交易的 Hash 就是 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b
也可以通过区块链浏览器解析成 json 文件,有助于更直观的理解,https://blockchain.info/rawblock/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f, 内容如下,可以看到 tx 里的第一笔交易 Hash,就是上面我们两次 sha256 计算出来的结果,也称为 txid。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
{ "ver": 1, "next_block": [], "time": 1231006505, "bits": 486604799, "fee": 0, "nonce": 2083236893, "n_tx": 1, "size": 285, "block_index": 0, "main_chain": true, "height": 0, "weight": 1140, "tx": [{ "hash": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b", "ver": 1, "vin_sz": 1, "vout_sz": 1, "size": 204, "weight": 816, "fee": 0, "relayed_by": "127.0.0.1", "lock_time": 0, "tx_index": 0, "double_spend": false, "result": 0, "balance": 0, "time": 1231006505, "block_index": 0, "block_height": 0, "inputs": [{ "sequence": 4294967295, "witness": "", "script": "04ffff001d0104455468652054696d65732030332f4a616e2f32303039204368616e63656c6c6f72206f6e206272696e6b206f66207365636f6e64206261696c6f757420666f722062616e6b73", "index": 0 }], "out": [{ "type": 0, "spent": false, "value": 5000000000, "spending_outpoints": [], "n": 0, "addr": "1A1zP1eP5QGefi2DMPTfTL5SLmv7DivfNa", "tx_index": 0, "script": "4104678afdb0fe5548271967f1a67130b7105cd6a828e03909a67962e0ea1f61deb649f6bc3f4cef38c4f35504e51ec112de5c384df7ba0b8d578a4c702b6bf11d5fac" }] }], "hash": "000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f", "prev_block": "0000000000000000000000000000000000000000000000000000000000000000", "mrkl_root": "4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b" } |
转载请注明:exchen's blog » 解读比特币区块链的数据结构