术语表 /协议与升级
中位时间
又称 MTP。
- 中位时间是什么?
- 中位时间(median time past)是比特币的共识时钟:即前十一个区块时间戳的中位数,也是所有基于时间的 locktime 所比对的数值。
规定于 BIP-113。
节点取其正在验证的区块之前十一个区块的时间戳,将其排序,并以中间值作为当前时间。该中位数大约位于六个区块之前,因此比实际时钟大约滞后一小时。所以,您锁定到中午的一笔币,会在接近下午一点时才变为可花费。
运作方式
中位时间由一个名为 GetMedianTimePast 的函数得出:它向前回溯十一个区块条目,把每个时间戳复制到数组中,排序后返回中间的元素。
BIP-113定义的常量是 nMedianTimeSpan = 11,因此结果始终是十一个数中第六小的那一个。排序使结果值得信赖。单个区块的时间戳可以早于其父区块的时间戳,但共识规则已经强制每个新的时间戳必须高于其之前十一个区块的中位数,因此中位数只能向前推进。所以,扭曲单个时间戳几乎无法让矿工获益。
BIP-113修复的问题是一种激励,而不是一个漏洞。按照旧规则,交易是否符合条件是根据包含它的区块的时间戳来判断的,而这个数字由矿工填写,BIP 的动机部分将其称为 "a perverse incentive for miners to lie about the time of their blocks in order to collect more fees"(促使矿工谎报区块时间以收取更多手续费的不良激励)。修复方法只是一处替换:共识中对 IsFinalTx 的调用改为使用前一个区块的 GetMedianTimePast,而不是区块自身的时间,并且该规则适用于所有交易,包括 coinbase 交易。
它以 BIP9 versionbits 软分叉的方式上线,使用第0位,主网信号于2016年5月1日 UTC 午夜开启,并在一年后超时,同时与 BIP68 和 BIP112 一并部署,使这三项时间锁规则作为一个整体生效。
在哪里会遇到它
中位时间出现在 Bitcoin Core 的 RPC 输出中,是一个名为 mediantime 的字段,紧挨着原始的 time 字段。
getblock 会返回任意区块的这两个值,getblockchaininfo 会在报告链顶时间戳的同时报告链顶的中位时间,这是在运行中的节点上观察这一小时滞后的最快方式。getchaintxstats 则更进一步,以两个区块的中位时间之差而不是其区块头时间来衡量其窗口的跨度,因此任意一端的单个被扭曲的时间戳几乎不会改变结果。
它真正起作用的地方是内存池。Bitcoin Core 的 CheckFinalTxAtTip 会用当前链顶的中位时间和比链顶高一个区块的高度来评估候选交易,因此在截止时间一过就立即广播的钱包会遭到拒绝而不是被转发,并且必须不断重试,直到中位时间追上您墙上的时钟。
相对时间锁在两端继承同一个时钟。BIP-68衡量基于时间的序列锁(以512秒为单位计数),起点是挖出该币的区块的前一个区块的中位时间,终点是花费交易所在区块的前一个区块的中位时间,因此滞后出现两次,并且大部分相互抵消。
中位时间 vs 区块头时间戳
中位时间由十一个区块头时间戳计算得出,但不存储在任何区块中;而区块头时间戳是由矿工写入的字段,每个节点都会永久保存。
比特币对两者都有使用,用途不同。locktime 使用中位数,因为它单调推进,无法为获取手续费收入而被强行向前拉动。难度调整仍然读取原始的区块头时间:Bitcoin Core 取14天窗口中最后一个区块的区块时间,减去第一个区块的区块时间,并据此差值重新调整目标值。同一条链上有两个时钟看起来不够整齐,但这是有意为之。难度调整需要的是两周区块之间真实经过的时间,而 locktime 需要的是任何单个矿工都无法移动的数字。