区块结构
字段 | 大小 | 格式 | 描述 |
---|
Version | 4 字节 | 小端序 | 区块版本号 |
Previous Block | 32 字节 | 自然字节序 | 前一个区块的区块哈希 |
Merkle Root | 32 字节 | 自然字节序 | 区块中包含的所有交易ID的默克尔根 |
Time | 4 字节 | 小端序 | 当前时间的 Unix 时间戳 |
Bits | 4 字节 | 小端序 | 目标值的紧凑表示 |
Nonce | 4 字节 | 小端序 | 随机数,用于尝试找到有效哈希 |
Transaction Count | 动态 | compact size | 区块中包含的交易数量 |
Transactions | 动态 | 交易数据 | 区块中包含的所有原始交易数据 |
Merkle Root
是区块内包含的所有交易ID构成默克尔树的根节点。用于确保区块内包含交易的唯一性和完整性, 以防止区块内容被篡改。
默克尔树
默克尔树是一种自底向上构建的二叉树。通过对每一个原始数据进行哈希计算(比特币采用的是 Hash256
算法), 然后将哈希结果两两配对, 再对配对结果进行哈希计算, 重复这个过程, 直到最终得到一个树形结构, 这个树就是默克尔树
默克尔根
默克尔树根节点的哈希值就是默克尔根。
交易ID 已经 Hash256
的结果了, 所以在构建默克尔树时, 交易ID 会直接作为叶子节点。
在区块 400627 的区块头数据中
040000000150896d7a8cd13cd0bf3ee0eaf0a449beb7434ea3aaf70000000000000000002d3d02c97057f403386a1fb151e4bbb2cd20c34065741a96bdedbecd0678ed1a340cd5569fb9061863b03c4d
能够清晰的知道 Merkle Root
的值为 2d3d02c97057f403386a1fb151e4bbb2cd20c34065741a96bdedbecd0678ed1a
区块 400627 包含的交易ID(小端序) 如下:
转换为正常字节序为:
由正常字节序的交易ID计算默克尔根:
得到的结果与区块头中的 Merkle Root
一致。
默克尔根是在矿工构建候选区块时, 从内存池选取交易, 并在选取的交易之上添加了 coinbase
交易, 这些交易的交易ID统一被用来计算默克尔树的根节点。