术语表 /协议与升级
版本位
- 版本位是什么?
- 版本位(version bits)将区块头中32位的版本字段视为一排相互独立的开关,使矿工能够同时为多个软分叉发出支持信号。
规定于 BIP-9。
一个版本位对应一个待定的软分叉,并在固定的区块窗口内统计。BIP-9提供第0位至第28位,当2,016个区块的周期内有1,916个区块设置了某个部署对应的位时,该部署即被锁定;否则在超时后失败,建议的超时时间为一年。读取这些信号,您就能提前数月得知钱包所需的某项功能是否正在成为网络规则。
运作方式
版本位以五状态机的方式运行,每个节点针对其已知的每个部署,在每个难度调整周期自行计算一次。
这些状态为 DEFINED、STARTED、LOCKED_IN、ACTIVE 和 FAILED。2,016个区块的难度调整周期内,所有区块共享同一状态,因此状态转换只能发生在2,016的整数倍高度上。当前一区块的中位时间(median time past)超过配置的起始时间时,部署由 DEFINED 转为 STARTED;中位时间是指一个区块及其前十个区块的时间戳的中位数。
进入 STARTED 后,节点向前回溯恰好2,016个祖先区块,统计版本字段最高三位为001且该部署对应位已设置的区块。其他情况均计为零,因此采用其他版本方案的矿工不会意外发出信号。主网需要其中的1,916个,测试网需要1,512个。若在中位时间超过超时时间之前未达到该门槛,部署将永久转为 FAILED。BIP-9建议将该超时时间设在起始时间之后31,536,000秒(即一年),这样停滞的提案会释放其占用的位,而不是永远堵塞队列。
有一个细节容易让人误解。一个区块的状态从不取决于其自身的版本字段,只取决于其祖先区块的版本字段,因此矿工无法为某项规则投票并让这一票约束投出该票的区块本身。将最高三位固定为001,也使发出信号的区块版本落在0x20000000 至0x3FFFFFFF 的范围内,而将模式010和011留给日后取代版本位的任何机制。
版本位是循环使用的,而不是用完即弃。部署激活或超时后,其占用的位可以用于之后的提案,BIP-9建议在此之前先经过一段休耕期,以便先发现有缺陷的软件。该规范还要求节点跟踪自己不认识的位,并在未知部署被锁定时发出醒目警告,未升级的软件正是借此提醒您:一项它无法执行的规则即将到来。
在哪里会遇到它
比特币主网上已按 BIP-9自身的参数运行过两次部署,该 BIP 的部署列表以表格形式列出了这两次部署。
第一次名为 csv,占用第0位,起始时间为2016-05-01,到期时间为2017-05-01,在区块419,328处激活。它合并了 BIP-68、BIP-112和 BIP-113,这是 BIP-9列为会使原本有效的交易变为无效的变更中的三项。第二次名为 segwit,占用第1位,窗口自2016-11-15至2017-11-15,在区块481,824处激活,赶在了它本可能错过的截止期限之内。
这一机制在挖矿的底层环节中同样可见。BIP-9为 getblocktemplate 调用扩展了一个 rules 数组(列出已激活的部署)、一个 vbavailable 对象(将每个待定部署的名称映射到其对应的位)以及一个可选的 vbrequired 掩码(服务器要求设置的位)。矿池读取这些键来决定发出何种信号,已发布的版本也由此体现为追踪网站上的一个百分比。
版本位 vs 版本2区块
版本2区块在版本字段中携带一个计数器;版本位则在同样的四个字节中携带一个位向量。在 BIP-34之下,该字段按整数比较,因此同一时间只能有一次升级在进行,且每次成功都会永久耗尽一个有效区块本可使用的取值。BIP-9算了这笔账:在 BIP-34、BIP-66和 BIP-65之后,只剩下0x7FFFFFFB 个版本取值,这将任何位向量方案限制在30个独立部署。改为固定最高三位后,剩余的取值变成了29条可并行运行且可重复使用的通道。