区块结构
| 字段 | 大小 | 格式 | 描述 | 
|---|---|---|---|
| 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 | 节点的本地时间与网络时间的偏差 |