a16z :Cicada 利用时间锁谜题和零知识证明实现链上投票
编译:Lynn,MarsBit
所有无论以何种有意义的方式运作的投票系统都依赖于完整性和透明度。从表面上看,这使得区块链成为构建这些系统的理想平台——事实上,许多去中心化的组织已经接受了无许可投票来表达集体意图,通常是在挥舞大量财富或调整关键协议参数的情况下。但是链上投票也有缺点,隐私仍未被探索和开发,对 Web3 投票系统不利——在目前使用的大多数链上投票协议中,选票和投票结果是完全公开的。如果没有隐私,投票结果很容易被操纵和选民激励错位,可能会导致不民主的结果。
在这篇文章中,我们调查了投票隐私的情况,并提供了关于 Cicada 如何工作的高层次描述(正式的证明即将到来)。我们还鼓励开发者查看GitHub 仓库——Cicada 可以通过许多方式进行调整和扩展,以支持不同的投票方案和功能,我们希望与社区合作,探索这些可能性。
在任何投票系统(链上或其他)中,有许多不同层次的隐私需要考虑。个别选票的披露、运行中的计票和选民身份都会以不同方式影响选民的积极性。哪些隐私属性是必要的,取决于投票的背景。在密码学和社会科学文献中经常出现的几个:
Cicada 专注于正在进行中计票隐私,但(正如我们在后面讨论的)它可以与零知识组成员证明联合,以达成选民的匿名性和选票隐私。
为了实现正在进行中计票的隐私,Cicada 利用了(据我们所知)以前从未在链上使用过的密码学基元。
其次,一个同构的时间锁谜题(Malavolta Thyagarajan, 2019)具有额外的属性,即在知道秘密密钥、解密谜题或使用后门的情况下,对加密值的一些计算是可能的。特别是,一个线性同态的时间锁谜题允许我们将谜题组合在一起,产生一个新的谜题,封装了原始谜题的秘密值的总和。
要使投票方案在链上实用,还需要考虑几个问题。首先,攻击者可能会试图通过投一个不正确的编码的选票来操纵投票。例如,我们可能希望每张选票的时间锁谜题都编码为一个布尔值:“1”表示支持被投票的提案,“0”表示反对。一个热心的提案支持者可能会试图编码,例如“100”来扩大他们的有效投票权。
为了使证明尽可能高效,我们使用了定制的sigma协议——为特定代数关系设计的零知识证明,而不是通用的证明系统。这使得证明者的时间非常快:用 Python 生成一个选票有效性证明,在一台现成的笔记本电脑上需要 14ms.
使用 ElGamal 的一个缺点是解密计数的最后一步需要暴力破解离散日志(请注意,这是在链下完成并在链上有效验证)。因此,它仅适用于预期的最终票数相当小的情况(例如小于 2^32,或大约 430 万票)。在最初的基于 Paillier 的方案中,无论其大小如何,计数都可以被有效地解密。
如上所述,Cicada 提供了运行计票隐私——时间锁定谜题属性在投票期间保持计票的私密性。然而,每个单独的选票也是一个时间锁难题,在相同的公共参数下加密。这意味着就像可以解密计数(通过执行必要的计算)一样,每张选票也可以。换句话说,Cicada 仅在投票期间保证选票隐私——如果好奇的观察者希望解密特定选民的选票,他们可以这样做。解密任何个人选票与解密最终计票一样昂贵,因此天真地需要 O(n) 的工作来完全解密有 n 名选民的选票。但是所有这些选票都可以并行解密(假设有足够多的机器),花费的挂钟时间与解密最终计票所需的时间相同。
在我们的存储库中,我们包含一个使用Semaphore进行选民匿名的示例合约。但是请注意,Cicada 合约本身没有对如何确定或执行选民资格做出任何假设。特别是,您可以将 Semaphore 替换为例如 Semacaulk 或 ZK 状态证明(如此处和此处所建议的)。
我们在设计 Cicada 时的首要任务之一是避免需要统计机构:许多私人投票结构需要一个半信任的统计机构(或授权委员会,通过安全的多方计算进行协调)接收和汇总选票。在区块链环境中,这意味着这些方案不能仅由智能合约执行,需要一些人为干预和信任。
尽管在许多现实世界的场景中,统计当局是一个合理(且必要)的假设,但它们在区块链环境中并不理想,我们的目标是最大限度地减少信任并确保审查阻力。
还有机会调整 Cicada 以支持不同的投票方案(例如代币加权投票、二次投票)——更复杂的方案对于以太坊主网来说可能计算成本太高,但它们在 L2 上可能是实用的。考虑到这一点,我们欢迎您就下一步将 Cicada 带到哪里做出贡献、分叉和建议。