原文标题:《BuildingCicada:Privateon-chainvotingusingtime-lockpuzzles》
作者:MichaelZhu,a16z?
编译:Lynn,MarsBit
所有无论以何种有意义的方式运作的投票系统都依赖于完整性和透明度。从表面上看,这使得区块链成为构建这些系统的理想平台——事实上,许多去中心化的组织已经接受了无许可投票来表达集体意图,通常是在挥舞大量财富或调整关键协议参数的情况下。但是链上投票也有缺点,隐私仍未被探索和开发,对Web3投票系统不利——在目前使用的大多数链上投票协议中,选票和投票结果是完全公开的。如果没有隐私,投票结果很容易被操纵和选民激励错位,可能会导致不民主的结果。
这就是为什么我们要发布Cicada:一个新的、开源的Solidity库,利用时间锁谜题和零知识证明来实现私人链上投票。与现有的系统相比,Cicada具有新颖的隐私属性,最大限度地减少了信任假设,并且足够高效,可以在以太坊主网上使用。
在这篇文章中,我们调查了投票隐私的情况,并提供了关于Cicada如何工作的高层次描述。我们还鼓励开发者查看?GitHub仓库——Cicada可以通过许多方式进行调整和扩展,以支持不同的投票方案和功能,我们希望与社区合作,探索这些可能性。
私人投票的简要调查
在任何投票系统中,有许多不同层次的隐私需要考虑。个别选票的披露、运行中的计票和选民身份都会以不同方式影响选民的积极性。哪些隐私属性是必要的,取决于投票的背景。在密码学和社会科学文献中经常出现的几个:
选票隐私:秘密选票,也被称为“澳大利亚选票”,是为现实世界的投票系统开发的,作为保持个人选民的偏好的一种方式,并减轻贿赂和胁迫。选票隐私还可以减轻社会期望偏差——某人基于他人对其选择的看法而投票的压力较小。
正在进行中计票的隐私:许多投票系统在选民仍在投票时隐藏正在进行中的计票,或每个选项已经投了多少票,以避免影响投票率和选民激励。我们已经在现实世界中看到了这种情况;例如,较晚投票的美国参议员比较早投票的参议员更有可能与他们的政党保持一致。而在链上:在代币加权投票中,鲸鱼可以通过让对手保持领先来哄他们的虚假安全感,然后在最后一刻投出自己的选票来左右结果。
选民的匿名性:在许多现实世界的投票系统中,你的投票是不公开的,但你投了票的事实往往是公开的。这对于防止选民欺诈很重要,因为公布投票者的记录可以让人们检查是否有其他人以他们的名义投票。然而,在链上,我们可以防止选民欺诈,同时使用加密基元保留匿名性——例如,通过?Semaphore,你可以在零知识中证明你是一个还没有投过票的合格的选民。
无收据性:个人选民提供其选票的“收据”,以证明他们是如何向第三方投票的,否则可能导致卖票。一个密切相关但更强大的属性是抗胁迫,它可以防止有人胁迫选民以某种方式投票。这些属性在去中心化的环境中特别有吸引力,因为投票权可以通过智能合约市场实现流动性。不幸的是,它们也很难实现——事实上,Juels等人指出,在没有可信硬件的情况下,这在无许可的环境下是不可能的。
Cicada专注于正在进行中计票隐私,但它可以与零知识组成员证明联合,以达成选民的匿名性和选票隐私。
介绍Cicada:来自同态时间锁难题的计票隐私
为了实现正在进行中计票的隐私,Cicada利用了以前从未在链上使用过的密码学基元。
首先,时间锁谜题是一个加密谜题,它封装了一个秘密,只有在一些预定的时间过后才能被揭示——更具体地说,这个谜题可以通过重复进行一些非平行计算来解密。时间锁定谜题在投票的背景下对于实现运行统计的隐私很有用:用户可以将他们的选票作为时间锁谜题提交,这样他们在投票过程中是保密的,但在投票后可以被揭露。与其他大多数私人投票结构不同的是,这使得运行统计隐私不需要依赖统计机构、阈值加密或任何其他受信任方:任何人都可以解决一个时间锁谜题,以确保投票后结果被揭示。
其次,一个同构的时间锁谜题具有额外的属性,即在知道秘密密钥、解密谜题或使用后门的情况下,对加密值的一些计算是可能的。特别是,一个线性同态的时间锁谜题允许我们将谜题组合在一起,产生一个新的谜题,封装了原始谜题的秘密值的总和。
正如论文作者所指出的,线性同态的时间锁谜题是一种特别适合于私人投票的基元:选票可以被编码为谜题,并且它们可以被同态地组合起来,以获得一个编码最终计票的谜题。这意味着只需要一次计算就可以揭示出最终结果,而不是为每张选票解决一个独特的谜题。
一个新的结构:效率和权衡
要使投票方案在链上实用,还需要考虑几个问题。首先,攻击者可能会试图通过投一个不正确的编码的选票来操纵投票。例如,我们可能希望每张选票的时间锁谜题都编码为一个布尔值:“1”表示支持被投票的提案,“0”表示反对。一个热心的提案支持者可能会试图编码,例如“100”来扩大他们的有效投票权。
我们可以通过让选民在提交选票本身的同时提交一份关于选票有效性的零知识证明来防止这种攻击。不过零知识证明的计算成本很高——为了尽可能降低选民参与的成本,证明应该是可有效计算的客户端和可有效验证的链上证明。
为了使证明尽可能高效,我们使用了定制的?sigma协议——为特定代数关系设计的零知识证明,而不是通用的证明系统。这使得证明者的时间非常快:用Python生成一个选票有效性证明,在一台现成的笔记本电脑上需要14ms.
虽然该sigma协议的验证器在概念上很简单,但它需要相当一部分大的模幂。Malavolta和Thyagarajan的线性同态方案使用?Paillier加密,因此这些求幂将对某些RSA模N以N^2为模执行。对于合理大小的N,在大多数EVM链上,取幂非常昂贵。为了降低成本,Cicada使用?指数ElGamal——指数ElGamal仍然提供加性同态,但在更小的模数上工作。
使用ElGamal的一个缺点是解密计数的最后一步需要暴力破解离散日志。因此,它仅适用于预期的最终票数相当小的情况。在最初的基于Paillier的方案中,无论其大小如何,计数都可以被有效地解密。
选择RSA模数N也涉及权衡。我们的实现使用1024位模数来提高gas效率。虽然这远高于有史以来公开分解的最大RSA模数,但低于通常推荐的大小为2048位,用于RSA加密或签名。但是,我们的应用程序不需要长期安全性:一旦选举结束,如果将来考虑N就没有风险。假定计票和选票在时间锁定期满后公开,因此使用相对较小的模数是合理的。
匿名和选民资格
如上所述,Cicada提供了运行计票隐私——时间锁定谜题属性在投票期间保持计票的私密性。然而,每个单独的选票也是一个时间锁难题,在相同的公共参数下加密。这意味着就像可以解密计数一样,每张选票也可以。换句话说,Cicada仅在投票期间保证选票隐私——如果好奇的观察者希望解密特定选民的选票,他们可以这样做。解密任何个人选票与解密最终计票一样昂贵,因此天真地需要O(n)的工作来完全解密有n名选民的选票。但是所有这些选票都可以并行解密,花费的挂钟时间与解密最终计票所需的时间相同。
对于某些选票,这可能是不可取的。虽然我们对临时运行计票隐私感到满意,但我们可能希望无限期投票隐私。为实现这一点,我们可以将Cicada与匿名选民资格协议结合起来,通过零知识组成员身份证明进行实例化。这样,即使选票被解密,它所揭示的只是某人以这种方式投票——我们已经从计票中知道了这一点。
在我们的存储库中,我们包含一个使用?Semaphore?进行选民匿名的示例合约。但是请注意,Cicada合约本身没有对如何确定或执行选民资格做出任何假设。特别是,您可以将Semaphore替换为例如Semacaulk或ZK状态证明。
统计当局
我们在设计Cicada时的首要任务之一是避免需要统计机构:许多私人投票结构需要一个半信任的统计机构接收和汇总选票。在区块链环境中,这意味着这些方案不能仅由智能合约执行,需要一些人为干预和信任。
在大多数结构中,计票当局在完整性方面不受信任,但在活性方面值得信任——如果他们离线,则无法计算最终结果,从而无限期地拖延投票结果。在某些结构中,他们也被信任维护隐私——也就是说,他们了解每个人如何投票,但预计会在不透露此信息的情况下公布投票结果。
尽管在许多现实世界的场景中,统计当局是一个合理的假设,但它们在区块链环境中并不理想,我们的目标是最大限度地减少信任并确保审查阻力。
Cicada探索了链上投票隐私领域的众多方向之一,并补充了其他团队正在进行的大部分研究。如上所述,Cicada与信号量、ZK存储证明和限速无效器等匿名组成员技术密切相关。Cicada还可以集成NounsVortex团队提出的?optimistic证明检查器,以减轻选民的gas负担。
还有机会调整Cicada以支持不同的投票方案——更复杂的方案对于以太坊主网来说可能计算成本太高,但它们在L2上可能是实用的。考虑到这一点,我们欢迎您就下一步将Cicada带到哪里做出贡献、分叉和建议。
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。