投票前先押钱:Cosmos SDK 治理模块的押金、弃权与三分之一否决 图 1
投票前先押钱:Cosmos SDK 治理模块的押金、弃权与三分之一否决 · 图 1

多数链上治理把”发起提案”当作零成本动作,Cosmos Hub 使用的 Cosmos SDK x/gov 模块反其道而行:先把钱押上,再谈投票。押金能不能退回来,由投票结果决定;投票里还藏着一种比反对更狠的票。把这套模块的链条走一遍,就能看懂 Cosmos 系公链的治理为什么既以慢著称、又自带几道防闹剧的闸门。

押金期:凑不够钱,提案连投票都进不去

任何人带一笔押金提交提案后,提案先处于收集阶段。押金不设”一人缴齐”的义务:其他代币持有者可以随时补存款,只要截至存款期限累计达到 MinDeposit 门槛,提案就移入活跃队列、投票期立即开始——哪怕提案刚提交几天。反过来,如果期限到了还没凑够最低押金,提案直接从链上状态中删除,押金被销毁。这笔钱在收集与投票期间由治理模块账户托管,直到投票结算才处置。门槛的用意很直白:让”随口一提”至少要先证明有人愿意为它押上真金白银。

四种票:弃权不是没投票

说明图

投票阶段有四个选项:Yes、No、NoWithVeto、Abstain。Abstain 的特殊之处在于它算参与——法定人数(quorum)统计的是总投票比例,弃权同样计入分母,所以”我弃权”也是能推动表决有效的一票。但在算通过率时,弃权又被剔除在外:通过与否看的是 Yes 在与它对立的有效票中的占比。到了否决线,弃权重新被算进分母:一旦 NoWithVeto 的票数超过含弃权在内总票数的三分之一,提案被直接否决。

这三套口径叠在一起的效果是:弃权可以帮忙凑够法定人数,却几乎不助推任何一侧的通过线;而 NoWithVeto 不只是反对票,它携带”销毁押金”的效力——被否决的提案,全部押金从治理模块账户烧掉,提案连同押金记录移出状态。通过或被正常否决(非否决式)的提案,押金则原路退还每位存款人。

阈值参数:默认值都写在链上

SDK 的默认规则是:Yes(剔除弃权)超过一半、NoWithVeto 低于三分之一、达到法定人数、且网络存在有效绑定代币,提案才算通过。这些数字都不是写死在代码注释里的常量,而是来自链上参数 TallyParams,它们本身也要靠治理提案才能修改——规则改不改、怎么改,同样要走一遍上面这套流程。

加速提案:更短的窗口换更高的门槛

急事有专用通道。标记为加速(expedited)的提案默认使用更短的投票期和更高的通过线,默认阈值是 66.7%。关键设计在退路:如果加速提案在缩短的窗口内没有达到高门槛,它不会被否决,而是自动转回常规提案、按常规条件重新开始投票。想快就要拿更广泛的共识来换;换不来共识,流程只是退回慢车道重来。

谁在替谁投票

还有一条继承规则:委托者不亲自投票时,自动跟随其验证者的投票。README 把时序也写清了——委托者抢在验证者之前投出选票,就不再继承;在验证者之后投,则用自己的票覆盖验证者的票。加上验证者本身可能再委托,一张票的归属链值得先查清楚再决定动不动自己的币。README 同时提醒,由于任何超过三分之一的联盟都可能合谋审查交易,这套规则事实上已经假设了三分之一以上权益不串谋,委托集中是治理模型默认接受的前提;验证者不投票目前也不受罚。

另一处容易混淆的分界:提案通过后触发的参数与模块更新,走的不是普通交易通道——按 README 的说法,是治理在 quorum 达成后授权相应模块执行这些消息。也因此”参数改了没有”要回链上看模块参数本身,而不是只看提案页面显示已通过。对普通持币者,最后是三句实操提醒:查任何 Cosmos 系链的具体押金与阈值数值,要读那条链自己的链上参数而非 SDK 默认值;没起投线的提案押金谁去凑都打水漂,围观补款前先想清楚;押金烧与退都发生在投票结算的当下,参与前先看结算规则。以上是模块机制说明,不构成投资建议。