区块结构
字段 | 大小 | 格式 | 描述 |
---|---|---|---|
Version | 4 字节 | 小端序 | 区块版本号 |
Previous Block | 32 字节 | 自然字节序 | 前一个区块的区块哈希 |
Merkle Root | 32 字节 | 自然字节序 | 区块中包含的所有交易ID的默克尔根 |
Time | 4 字节 | 小端序 | 当前时间的 Unix 时间戳 |
Bits | 4 字节 | 小端序 | 目标值的紧凑表示 |
Nonce | 4 字节 | 小端序 | 随机数,用于尝试找到有效哈希 |
Transaction Count | 动态 | compact size | 区块中包含的交易数量 |
Transactions | 动态 | 交易数据 | 区块中包含的所有原始交易数据 |
时间字段大致反映了区块被矿工创建的时间,但不是精确的创建时间。
区块 860586 区块头数据是
00e01620a8a6b40dc8fea13c790eeb9bf1aed7c063bdd01d5273000000000000000000008314916a323e71dfc194c7f6f6532f507761e83404a68d77aca3aaaed5169b80b6bfde665b2503179ddff440
时间字段的16进制值为 b6bfde66
, 为小端序显示。转成正常字节序为 66debfb6
, 再转换为十进制为 1725874102
秒级时间戳, 表示的时间为 2024-09-09 17:28:22
时间字段有两个限制:
- 区块的时间戳不能超过网络调整时间的2小时以上
- 新区块的时间戳必须大于过去11个区块的中位数时间(简称 MTP, Median Time Past)
网络调整时间
网络调整时间是比特币网络中用来同步时间的一种机制。节点会在连接到其他节点时, 交换彼此的时间戳。节点在获取到所有连接到的节点的时间戳后, 会将时间戳进行排序, 并计算这些时间戳的中位数作为网络时间。
计算本地时间与网络时间的偏移量。在某一刻的网络调整时间就等于本地时间加上这个偏移量。
在节点收到新区块时, 会检查新区块的时间戳是否在当前网络调整时间的范围内。如果不在范围内, 节点会拒绝接受这个区块。
区块时间的作用
区块时间主要被用于:
- 计算目标值 - 每 2016 个区块周期内, 会重新调整目标值, 以确保区块的平均挖掘时间为 10 分钟。
- 实际时间: 2016 个区块的时间间隔(区块的时间戳 - 前一个区块的时间戳)总和
- 期望时间: 2016 * 10 分钟 = 1209600秒
若实际时间大于期望时间, 说明出块的速度慢, 实际时间除以期望时间结果会大于1, 新目标值会增大, 意味着挖矿难度降低。
- 交易锁定时间 - 比特币交易的
Locktime
字段可以包含一个具体的时间, 在该时间之前交易不会被打包。这个时间相对的是区块时间, 也就是说, 交易的Locktime
字段必须大于区块的时间戳。
相关 RPC
获取节点的网络信息
相关返回值
名称 | 类型 | 描述 |
---|---|---|
timeoffset | string | 节点的本地时间与网络时间的偏差 |