HF16 / 4.2.0 版本
激活与升级
HF16 计划在 2026 年 10 月 31 日 00:00:00 UTC(1793404800)激活,版本为 4.2.0。生产网络还需要达到硬分叉投票门槛;安装新程序不会提前激活。请验证者提前升级。使用经过验证的 production 镜像,不能使用 BUILD_TESTNET 镜像:测试配置的链标识和法定人数不同。
master 镜像构建后,分发前应核对具体镜像的版本、提交、启动、同步和出块。保留验证者密钥配置及数据备份。升级不要求删除数据目录。
检查就绪状态
激活需要 CHAIN_HARDFORK_REQUIRED_VALIDATORS = 17 个调度槽位投票支持 4.2.0(时间 2026-10-31T00:00:00)。只有设置了签名密钥的验证者才会进入调度,因此槽位可能少于 21 个;少于 17 个时,无论多少验证者已经升级,分叉都无法激活。已升级但使用空密钥的验证者,发送设置签名密钥的 validator_update 后,会在下一次洗牌时回到调度中。链每 21 个区块重新计票一次。如果在 2026-10-31 00:00 UTC 之后才达到门槛,分叉会在该次计票的区块中直接激活,没有预先公布的时刻。
按链的方式重新计票:
python3 scripts/hardfork_readiness.py --url https://api.viz.world脚本输出槽位数量、每种投票占用的槽位数、投票不同的调度验证者,以及投票支持 4.2.0 但因空密钥不在调度中的验证者(仅限票数 > 0 的验证者,见下文)。退出码 0 表示已达到门槛,1 表示尚未达到,2 表示计票结果与链不一致或 API 响应不可用。
手动检查:
{ "method": "database_api.get_next_scheduled_hardfork", "params": [] }
{ "method": "validator_api.get_active_validators", "params": [] }- 投票锁定后,
get_next_scheduled_hardfork返回hf_version4.2.0 和live_time2026-10-31T00:00:00;在此之前它与当前版本相同。 get_active_validators返回调度槽位,正是计票统计的集合。紧急共识激活时去掉committee,用validator_api.get_validator_by_account逐个查询,统计hardfork_version_vote为 4.2.0 且hardfork_time_vote为 2026-10-31T00:00:00 的验证者。名单少于 17 个时,分叉暂时无法激活。get_validators_by_vote不是计票统计的集合:它包含使用空密钥、不在调度中的验证者,并且在第一个零票验证者处停止,因此会遗漏占用支持槽位的零票验证者。
时隙、QC、TC 与最终性
- HF16 激活时,运行时时隙从 3 秒改为 1 秒。读取节点当前
get_config和区块时间;旧编译常量CHAIN_BLOCK_INTERVAL不能代表分叉后的时隙。 - QC 收集当前调度验证者的签名。实现公式为
max(floor(2N/3)+1, floor(0.75N)),即 21 人中需要 15 人,不能沿用旧后验证流程的 14 个确认。 - 将出块权交给其他生产者时,区块携带父区块 QC。超时证书 TC 支持在跳过轮次后继续推进。LIB 使用 2-chain 规则:本地主链上相邻高度、连续轮次的父子区块均已认证。单个 QC 不足以提交最终性。
- 每个验证者每轮只为一个区块投票,最高投票轮次在广播之前持久化;允许重复广播同一票。冲突投票证据可放入区块头,并产生虚拟操作
validator_equivocation(ID 106)。 - 新区块头扩展标签按顺序追加:3 QC、4 TC、5 双重投票证据。交易扩展和现有操作 ID 不变。
- 激活时会缩放需要保持原有实际时间含义的按区块计量治理参数。不能机械修改所有 3 秒定时器;重试和停机定时器属于独立配置。
自动恢复与紧急模式
临时网络故障恢复后,普通恢复不需要重启或紧急密钥。21 个验证者的测试覆盖:6 个验证者暂时不可达、20% 丢包和 150±50 毫秒延迟、241 秒全网断连,以及 10/11 分区。网络恢复后,全部 21 个节点对同一被检查区块达成最终性。这是测试范围,不是对任意攻击下恢复时间的保证。
延迟链追赶现在保留 fork_db 超前于已应用状态时所需的 LIB 祖先。紧急共识是独立路径,其超时仍为 1200 秒(20 分钟);短时故障测试没有把这个阈值改为五分钟。参见紧急共识。
DAO 与市场
创建申请时,DAO 上限为最小单位中的 floor(current_supply.amount / 100):当前 VIZ 总供应量的 1%,向下取整到 0.001 VIZ。每次申请重新计算,不依据初始发行量或委员会资金余额。HF16 之前的历史重放保留 500,000 VIZ 旧上限,不重写已存在申请的金额。参见委员会操作。
HF16 激活后声明的 no-contest 在声明时冻结名义费用,结算时仍以保险余额封顶;旧声明沿用旧算法。冻结为零与从未冻结是不同状态。参见no-contest 费用冻结。
操作员 UI 与 MCP
可选 node_admin 插件在独立管理监听器上提供内置浏览器 UI /ui/ 和 HTTP MCP。支持健康、诊断、插件、日志、审计、P2P、快照、验证者操作及配置计划。Bearer 令牌按 scope 限制权限,配置和插件变更使用可检查的 plan / apply。默认仅监听回环地址;远程操作使用隧道,不要把管理端口当作公共链 API。参见节点管理。
客户端库
JS 0.18.5 支持新头部格式,已发布到 npm。PHP 保持交易格式并透传区块头 JSON。Python 1.4.0 源码和依赖已通过 Python 3.10–3.14 CI;PyPI 发布是独立步骤。客户端不能保留旧的固定 DAO 金额上限。
增发与证据窗口
HF16 有意保留每个实际产生的区块 1.000 VIZ(所有者决定 Q3105=C)。连续出块时,每年总增发量约从 1050 万增至 3150 万 VIZ;空缺时隙没有区块奖励。
投票及双重投票证据窗口保留一小时:3600 / block_interval() 轮,HF16 后为 3600 轮。这与紧急计时器及恢复 SLA 不同。漏块导致清空签名密钥的区块阈值在 HF16 增加三倍,保持普通模式约 10 分钟、紧急模式约 5 分钟。新参数投票的最小分配周期也保持原有时长,HF16 前重放保留旧下限。
重新投票区块参数
按已选 HF16 策略,存储和投票单位仍为实际区块数。一次性迁移将现有投票及中位数乘三,但无法识别旧脚本随后提交的旧值。验证者须将硬编码的 inflation_recalc_period、distribution_epoch_length、pm_batch_epoch_blocks、pm_reveal_window_blocks 乘三以保留时长。投默认值时使用实时 get_config.CHAIN_DEFAULT_CHAIN_PROPERTIES;修改无关字段时保留其他当前链上值,勿重发旧结构默认值。
get_config 返回一致的实时每小时/天/年区块数、undo 容量、漏块阈值及默认参数。reserve ratio 调整仍每 60 秒执行。CHAIN_EMERGENCY_EXIT_NORMAL_BLOCKS 为未使用的旧常量;实际紧急退出依据活跃验证者法定人数,而不是 21 区块计时器。