GitHub
深入技术
区块时间

区块时间

区块结构
字段大小格式描述
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