一个平行链块被撕成两派之后:Polkadot 争议裁决的投票、时限与罚没 图 1
一个平行链块被撕成两派之后:Polkadot 争议裁决的投票、时限与罚没 · 图 1

两道闸门,一个负责挡、一个负责算账

Polkadot 的中继链要保证进入终局的每个平行链块都是有效的。官方实现者指南把这道防线拆成两个部件:批准检查负责挡住坏块——只要坏块被尝试纳入的次数有限,它大概率进不了终局;争议协议负责算账——保证每一次”把坏块塞进来”的尝试都会被抓住,相关验证者被清算。两者最容易被混淆的差别在这里:批准检查跟着分叉走,另一条分支被终局后它可以收工;争议不分叉。哪怕对手的坏块没能在任何一条历史里活下来,只要有人为它投过有效票、也有人指出它无效,裁决照样发生、罚没照样执行。指南的解释是,如果没被纳入就能免罚,攻击者等于白送地抽奖——而这套安全模型依赖”坏块被终局的概率极低、攻击者在反复尝试中先破产”的假设,免罚会拆掉这个前提。

争议如何开始、谁必须参加

示意图:板上方两团对立球簇与中缝细线(图片由本地 SDXL 生成,非投票数据图)

争议不需要任何宣告:只要一个验证者对某候选块给出负面陈述,而场上已经存在针对同一块的正面陈述(背书票或批准票都算),争议就被点亮。发起是纯链下动作——签一条与后续参与投票同类型的消息,把自己知道的该块全部陈述广播给其他验证者;谁发起不需要共识,链上只承认”有争议在进行”。实践里发起者几乎总是背作者或批准检查者:背书阶段还要由发起者负责把数据做可用,批准阶段数据已经齐了。

之后是每个验证者的义务清单。指南的规定是不重复表态者人人下场:转述自己已知的该块全部陈述;取回候选块的可用数据(先找已投票的对端要,拿不到再从全体验证者走纠删码恢复);从任意最近的中继链块提取当时生效的验证代码——代码保证在链上可得,不必追某一条分支;然后用这份代码重放执行,核对包括 erasure root 在内的输出,签下自己立场的陈述并广播。参与投票的资格集合锁定为该块背书时段的值班验证者,他们的背书票自动计入结论的票箱。

三分之二、缺席票与移植

任意一方凑满(含背书票在内的)超过三分之二超级多数,争议就得出结论;链上部分由区块生产者在区块内在数据里发起,只需要一对相互矛盾的票,且同一分支上同一个平行链块只争议一次;争议未决期间该平行链的纳入暂停。输掉的一方,以及到点没投票的缺席者,一并被清算;链上通道在结论后还会开放一段固定时间继续接收迟到票,迟到票照样记入状态、只是报酬更低。

最独特的一条规则是移植:争议不跟着某一条链走。如果出现了新的活跃分支而该争议尚未写进这条链,裁决(或未决争议)必须被搬过去。作恶者在旧分支上被判无效、被清算,不会因为网络换了一条历史就全身而退;被判无效的块同时被拉黑,防止节点把它重新同步回来继续往上盖楼。

拖不死的协议,写不死的参数

时间边界同样有预案:一个争议超期未决——多数验证者因故没投票是唯一能让它悬而不决的情形——所有验证者先各吃一小笔罚没,随后进入治理模式人工裁决,没人能靠拖延把争议拖进遗忘曲线。验证者在裁决区块终局之后,还要把相关代码、PoV 与持久验证数据多保留 24 小时,给慢半拍的节点留取数窗口;同一把密钥在对立方向各投一票,按双重投票处理。

需要注意这份文本的体裁:实现者指南是给开发者看的活文档,阈值口径(三分之二)与流程结构在文中是协议语义,具体罚没金额、时间窗口的数值会随实现演进,状态与参数以官方仓库运行时为准。对普通观察者,这套协议的可验证信号在链上:争议票与裁决记录由区块生产者写进中继链,裁决落在哪条分支、谁被罚没,理论上都能从运行时数据里追。本文为机制解释,不构成投资建议。