比特币核心客户端使用Google的LevelDB数据库存储区块链元数据。区块链经常被视为一个垂直的栈,创世区块作为栈底的首区块,此时采用“高度”来表示某区块与首区块的距离,以及“顶部”或“顶端”来表示最新添加的区块。
区块结构图
区块结构
区块是一种聚合了交易信息的容器数据结构。
由两部分组成:
- 包含元数据的区块头,固定80字节
- 构成区块主体的交易集合,平均每个交易至少是250字节,平均每个区块至少包含超过500个交易。
大小 | 字段 | 描述 |
---|---|---|
4字节 | 区块大小 | 表示该字段之后的区块大小 |
80字节 | 区块头 | 组成区块头的字段 |
1-9(可变整数) | 交易计数器 | 交易的数量 |
可变的 | 交易集合 | 记录在该区块中的交易集合信息 |
区块头结构
大小 | 字段 | 描述 |
---|---|---|
4字节 | 版本 | 版本号,用于跟踪软件/协议的更新,当前区块结构版本为2 |
32字节 | 父区块哈希值 | 引用区块链中父区块的哈希值 |
32字节 | Merkle根 | 该区块中交易的merkle树根的哈希值 |
4字节 | 时间戳 | 该区块产生的近似时间(精确到秒的Unix时间戳) |
4字节 | 难度目标 | 该区块工作量证明算法的难度目标 |
4字节 | Nonce | 能生成目标难度hash的幸运值 |
区块哈希值
区块哈希值是一个区块的主标识符,通过对区块头进行二次哈希得到的32字节的哈希值。
实际上,区块哈希值并不包含在区块的数据结构中,不管是该区块在网络上传输时,或是它作为区块链的一部分被存储在某节点的永久存储设备上时。相反,区块哈希值是当该区块从网络被接收时由每个节点计算出来的,然后可能会作为区块元数据的一部分被存储在一个独立的数据库表中,以便索引和更快地从磁盘检索区块此外,也可以通过区块高度索引区块。
创世区块
创始区块被编入到比特币客户端代码中,所以每个节点都始于此,其哈希值为:
0000000000
19d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
可以使用区块浏览网站查看该块的信息:
https://blockchain.info/block/000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f
在命令行使用比特币核心客户端:
1 | $ bitcoind getblock 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f |
创世区块包含一个隐藏的信息。在其Coinbase交易的输入中包含这样一句话“The Times 03/Jan/2009 Chancellor on brink of second bailout forbanks.”这句话是泰晤士报当天的头版文章标题,引用这句话,既是对该区块产生时间的说明,也可视为半开玩笑地提醒人们一个独立的货币制度的重要性,同时告诉人们随着比特币的发展,一场前所未有的世界性货币革命将要发生。该消息是由比特币的创立者中本聪嵌入创世区块中。
区块的连接
比特币完整节点保存了区块链从创始区块起的一个本地副本,需不断接收更新以扩展链。当节点从网络接收到传入的区块时,它会验证这些区块,然后添加到现有链上。
为建立连接,节点会找到传入区块头中的“父区块哈希值”,如果为该节点区块链副本尾部的最新区块的哈希值,则添加到链尾部。