最新消息:本站技术交流 QQ 群:28124927

解读比特币区块链的数据结构

区块链/比特币 exchen 473浏览 0评论

解读比特币区块链的数据结构

比特币是基于区块链技术开发的加密数字货币,那么区块链到底是一个什么样的东西呢?上面有些什么内容呢?简单地说区块链是一个很大的账本,上面的主要内容记录了 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 网站的接口获取这个区块的十六进制原始数据,内容如下:

区块头是前面 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

区块头的十六进制数据如下:

将区块头整体数据进行两次 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

第一笔交易的十六进制如下:

将这笔交易的整体数据进行两次 sha256 即可得出该笔交易的 Hash,第一次 sha256 计算的 Hash 是 27362e66e032c731c1c8519f43063fe0e5d070db1c0c3552bb04afa18a31c6bf,第二次 shah256 计算的 Hash 是 3ba3edfd7a7b12b27ac72c3e67768f617fc81bc3888a51323a9fb8aa4b1e5e4a,然后再做一次大小端反转,最终这笔交易的 Hash 就是 4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b

也可以通过区块链浏览器解析成 json 文件,有助于更直观的理解,https://blockchain.info/rawblock/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f, 内容如下,可以看到 tx 里的第一笔交易 Hash,就是上面我们两次 sha256 计算出来的结果,也称为 txid。

转载请注明:exchen's blog » 解读比特币区块链的数据结构

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址