HF16:no-contest 费用冻结
状态:已实现,计划在 2026-10-31 00:00:00 UTC 随 4.2.0 激活,还需硬分叉投票门槛。参见 HF16。
费用何时确定
HF16 之前,pm_no_contest 只声明无结果并开启争议宽限期,费用在结算时使用当时的中位数参数计算。参数在窗口内改变会追溯改变账单。
HF16 下,声明区块的中位数决定 floor(pm_dispute_fee × pm_no_contest_penalty_percent / 10000),保存到市场的 no_contest_fee。结算不重新读取当前中位数;实际罚款仍为 min(frozen_fee, oracle.insurance),不会超过保险余额。有无下注的处理不变;没有 stake 的市场记录冻结零费用且不收费。
两种状态
no_contest_fee_frozen=true:HF16 下声明,使用保存的金额,包括合法的零值。false:激活前声明,或来自旧快照;保留旧的结算时中位数算法。
不能用 fee == 0 代替标志。冻结为零必须保持零,不能因后来的投票涨价。激活时不扫描或回填宽限期中的旧市场,也不猜测历史费用。
统计与快照
no_contest_slashed_total 是预言机累计已收取的 no-contest 罚款,在增加 total_insurance_slashed 的同一次 modify 中累加。HF16 后结算的旧声明也计入;HF16 之前已经收取的罚款不回填。它仅用于展示/归因,不参与共识判定,不增加虚拟操作。
市场金额及冻结标志、预言机累计值必须由当前版本快照保存/恢复;旧数据默认未冻结。对象布局变化要求使用当前 schema 和匹配二进制,不手工修改 shared_memory。更新前保存数据备份。
验证要点
- 确认实际生效的 hardfork 为 16,而不只是二进制版本 4.2.0。
- 新声明记录
no_contest_fee_frozen=true;在宽限期改变参数后结算仍使用冻结金额。 - 验证冻结零费用、无下注、保险不足和激活前声明的旧路径。
- 快照往返后字段保持一致;累计值与实际保险扣除对应,不把冻结的名义费用当作已经收取的罚款。
回归入口:tests/consensus_sim/scenarios/test_pm_no_contest_fee.cpp。英文完整检查表包含底层字段和快照验证步骤。