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