深入技术
区块时间

区块时间

区块结构
字段大小格式描述
Version4 字节小端序区块版本号
Previous Block32 字节自然字节序前一个区块的区块哈希
Merkle Root32 字节自然字节序区块中包含的所有交易ID的默克尔根
Time4 字节小端序当前时间的 Unix 时间戳
Bits4 字节小端序目标值的紧凑表示
Nonce4 字节小端序随机数,用于尝试找到有效哈希
Transaction Count动态compact size区块中包含的交易数量
Transactions动态交易数据区块中包含的所有原始交易数据

时间字段大致反映了区块被矿工创建的时间,但不是精确的创建时间。

区块 860586 区块头数据是

00e01620a8a6b40dc8fea13c790eeb9bf1aed7c063bdd01d5273000000000000000000008314916a323e71dfc194c7f6f6532f507761e83404a68d77aca3aaaed5169b80b6bfde665b2503179ddff440

时间字段的16进制值为 b6bfde66, 为小端序显示。转成正常字节序为 66debfb6, 再转换为十进制为 1725874102 秒级时间戳, 表示的时间为 2024-09-09 17:28:22

时间字段有两个限制:

  • 区块的时间戳不能超过网络调整时间的2小时以上
  • 新区块的时间戳必须大于过去11个区块的中位数时间(简称 MTP, Median Time Past)

网络调整时间

网络调整时间是比特币网络中用来同步时间的一种机制。节点会在连接到其他节点时, 交换彼此的时间戳。节点在获取到所有连接到的节点的时间戳后, 会将时间戳进行排序, 并计算这些时间戳的中位数作为网络时间。

计算本地时间与网络时间的偏移量。在某一刻的网络调整时间就等于本地时间加上这个偏移量。

网络调整时间 = 本地系统时间 + 偏移量

在节点收到新区块时, 会检查新区块的时间戳是否在当前网络调整时间的范围内。如果不在范围内, 节点会拒绝接受这个区块。

区块时间的作用

区块时间主要被用于:

  1. 计算目标值 - 每 2016 个区块周期内, 会重新调整目标值, 以确保区块的平均挖掘时间为 10 分钟。
新目标值 = 旧目标值 * (实际时间 / 期望时间)
  • 实际时间: 2016 个区块的时间间隔(区块的时间戳 - 前一个区块的时间戳)总和
  • 期望时间: 2016 * 10 分钟 = 1209600秒

若实际时间大于期望时间, 说明出块的速度慢, 实际时间除以期望时间结果会大于1, 新目标值会增大, 意味着挖矿难度降低。

  1. 交易锁定时间 - 比特币交易的 Locktime 字段可以包含一个具体的时间, 在该时间之前交易不会被打包。这个时间相对的是区块时间, 也就是说, 交易的 Locktime 字段必须大于区块的时间戳。

相关 RPC

获取节点的网络信息
相关返回值
名称类型描述
timeoffsetstring节点的本地时间与网络时间的偏差
Copyright © 2024 HeapUp