投票前把选择藏起来:密封投标式治理的运作与攻击面 图 1
投票前把选择藏起来:密封投标式治理的运作与攻击面 · 图 1

链上投票默认是公开的:票一投出去,谁投了什么全网可见。这对透明度是好事,对贿选也是好事——买票的人可以随时查验票有没有兑现。为了堵上这个查验环节,一部分治理和拍卖场景借用了密码学里的老工具:承诺揭示(commit-reveal),也叫密封投标。投票者先提交一个看不出门向的承诺,投票期结束后再揭示明文。本文拆解这个两阶段流程的运作方式、它能防住什么、又会引入哪些新的攻击面。

流程分三段。第一段是承诺:投票者把自己的选择和自己的随机数拼在一起算出哈希,只把哈希写上链。哈希单向函数保证别人看到承诺也推不出内容——除非运气极好地猜中随机数。第二段是投票期:所有承诺陆续上链,期间贿选者无法验证任何一位投票者的真实意向,“投了就退钱”式合约贿选失去了自动查验条件。第三段是揭示:投票期截止后,投票者提交原始选择与随机数,合约重算哈希、与链上承诺比对,对得上才计票。没揭示的承诺等于弃权。

它的防贿逻辑要说得精确:它防的不是”给你打钱请你投票”这种事后兑现型贿选——双方可以线下口头约定,链上看不出异常。它防的是可编程贿选:一个自动化工具,投票者交出明文后立刻自动放款。这类产品让贿选从信任问题变成工程问题,规模化了灰色市场。承诺揭示把放款前的”验货”环节拿掉,贿选的资金托管就难以自动化。同时它也削弱抢跑:大户和 bots 无法在投票中途读取票型再决定自己的投向,因为票型要到揭示期才开始浮现。

代价和攻击面集中在揭示环节。第一是最后时刻问题:揭示期尾部,部分理性投票者会等别人先揭示、看清票型再决定是否揭示自己的——如果弃权对自己更有利,就让承诺烂在水里。这会诱发一场”谁先揭示”的博弈,把投票的重心从议题本身挪到计时博弈上,部分实现因此把随机数与投票权绑定并对不揭示施加惩罚(锁定期或没收押金)。第二是延迟揭示攻击的变体:大户可以揭示一半、观望一半,用剩余的”薛定谔票”施压。第三是成本转移:多一次上链交互意味着双倍 gas 成本,小投票者的负担比例更高,可能反而压低参与率——这与隐私保护的初衷相悖。第四是身份环节:如果协议用某种准入名单限定投票者,名单本身可能破坏匿名性,承诺揭示防的外部观察者又从头目处进来。

从场景看,承诺揭示更适合两类治理:代币高度集中、少数大户票型足以左右结果的协议,以及贿选已有现实的投票权租赁市场(租票平台公开报价)的协议。对大户分散、议题复杂的社区,双阶段交互的成本和对参与率的压制可能大于收益。实现细节上还有几个常见变体:有的把承诺做成零知识证明,验证资格而不暴露地址;有的只把”快照期之后的意向征集”做成密封,正式投票仍然公开——那更接近意向调查而不是决策环节。

普通人参与这类投票时的操作要点:承诺与揭示必须用同一地址和同一份随机数,本地保存好明文记录,揭示期开始前把它当成一个到期任务设提醒;忘记揭示等于弃权,多数实现不补救;参与聚合投票服务时确认代投方如何处理你的承诺数据——它有没有能力替你决定投向。机制本身有理论保障,风险出在流程和个人操作上。密封投票改变的是信息可见的时点,不改变谁有票、票值多少。它不构成对贿选的完全防御,也不改变治理权力分布。本文只讨论机制与攻防,不构成投资建议。

投票前把选择藏起来:密封投标式治理的运作与攻击面 图 2
投票前把选择藏起来:密封投标式治理的运作与攻击面 · 图 2