改写投票窗口:vbparams 与 testactivationheight 的 regtest 演练 图 1
改写投票窗口:vbparams 与 testactivationheight 的 regtest 演练 · 图 1

想知道一项软分叉的投票窗口怎么改、失败剧本怎么演,比特币核心留了两个成对的调试开关:v31.0 源码 src/chainparamsbase.cpp 里,-testactivationheight=name@height 的说明写着设置指定名称的激活高度、仅限 regtest;-vbparams=deployment:start:end[:min_activation_height] 则用给定的起止时间覆盖某个版本位部署的窗口,同样仅限 regtest。它们是一对拨动 BIP9 状态机的时间旋钮。

一、先回忆状态机管什么

BIP9 把一次软分叉信号分成 defined、started、locked_in、active、failed 几档,跳转取决于三样东西:窗口起止时间、观察周期长度、达标门槛比例。主网和测试网里这三样都写死在各链的共识参数中,用户碰不到;而 regtest 把前两个旋钮交了出来——-vbparams 改的是”某个部署什么时间开始计票、什么时间作废”,-testactivationheight 改的是更早年代以固定高度生效的那批历史部署(说明文字点名的名字就是 segwit、bip34、dersig、cltv、csv)在 regtest 里的生效高度。两者都通过启动参数注入。参数解析的容错口径也统一:段数、名称、时间戳任何一处不合格式,节点在链参数构造阶段就抛错退出——这类”启动即失败”的设计比”运行中静默忽略”友好得多,配错了半小时内必然发现,而不是在演练进行到一半时才发现旋钮根本没接上。

二、一次完整的剧本排练

在 regtest 上把时间旋钮拨动一遍最有收获。第一步,用 -vbparams 把 testdummy 这个专用演习槽的窗口设成已经开启的样子,观察 getdeploymentinfo 里状态从 started 跳到达标线附近;第二步,让窗口在若干块内超时,看状态落入 failed,再用下一次窗口重新计票——这正是把”超时作废、下轮重来”的抽象文字变成日志里的实感;第三步,换一台节点用 -testactivationheight 把某个历史部署的高度设到未来,对照 getblockchaininfo 的软分叉清单,体会”高度生效”与”投票生效”两种激活方式在字段上的不同呈现。两个旋钮都能叠加时间旅行式脚本(配合 mocktime 类测试手段),是功能测试套件里反复出现的组合。

排练时值得顺手记录三样读数:getdeploymentinfo 里每个部署的 since_height 与起止时间戳,用来验证旋钮确实生效;getblockchaininfo 的软分叉数组,看同一部署在”高度派”与”投票派”清单里各怎么标注;造块前后的 getblock 版本字段,确认状态跳转发生在预期的块高。三个读数各自独立于状态字符串,能互相证伪——演练的价值恰恰在练”用读数判断”,而不是盯着一行中文状态名猜。

三、读出来的三条纪律

第一,这类参数只影响你这台节点的链参数解释,与主网毫无关系:改不动任何公共网络的窗口,也不产生任何”提前看票”的能力。第二,位段与部署名的权威来源永远是所用版本的源码与 BIP9 分配表——演习槽 testdummy 用 bit 28,正式部署各有编号,混淆名与位是二手教程里最常见的错误。第三,看到”可以改窗口”不要滑向”投票可以操纵”的结论:regtest 的时间由你自己造,主网的票由全网算力投,两者的变量表根本不重合。

格式错误的反馈也值得一看:vbparams 字符串按冒号切分,段数不在三到四段之间时,解析直接抛出 Version bits parameters malformed, expecting deployment:start:end[:min_activation_height];起始时间不是整数时报 Invalid nStartTime。这些报错发生在链参数构造期,配错会立刻挡在启动路上而不是静默忽略。观察效果的窗口也现成:getdeploymentinfo 会按部署列出状态、起止时间与门槛参数,regtest 上拨动旋钮后逐字段对照,BIP9 状态机就从概念变成读数表。testdummy 是各链参数源码里写死的演习槽,正式部署各有编号,别把演习槽的位拿去当主网语义读。顺带一条实用推论:想验证某个钱包或工具对新信号字段的兼容性,与其等新部署在主网开始计票,不如在 regtest 用这两个旋钮复现它的生命周期——started 时它是否报错、locked_in 时它是否提示升级、failed 后它能否恢复静默。能用私有链排练的兼容性,都不该留到主网事故里检验。本文只说明参数与机制,不构成任何投资或操作建议。