零知识证明应用于投票
即使你对投票没有热情,也请继续阅读。花30分钟研究零知识证明(ZKPs)在投票中的应用可能是你现在可以做的最好的时间投资,以建立你对ZKP技术及其应用的知识。
origin: https://www.o1labs.org/blog/zero-knowledge-proofs-for-voting-3c6a6d5d89db
作者:Florian Kluge (@zktrivo)和Phil Kelly,感谢tallie的Dennison和Raf在合作对话中提出的许多想法.
ZK 投票:
使用基础架构模式。令人惊讶的是,设计和架构是一项艰巨的工作,您稍后会看到。如果您掌握了下面列出的模式,您将为许多其他 zk 用例奠定基础。
展示了如何构建多链服务。虽然还有其他投票方法和基于零知识证明的链下智能合约,但除了其他缺点之外,它们无法完全服务于多链世界,无法重用代码、基础设施和证明以及组合。而这种方法可以。
在用例概念中很容易掌握。投票用例的基本机制很简单,我们所有人都很熟悉。
说明了 zk 的好处,而不仅仅是隐私。虽然隐私主导着许多 zk 对话,但投票还展示了交易成本节省和数据灵活性。
涉及重要的增强技术和技巧。同态加密、排序和数据可用性服务都发挥着作用。
提出了有关未来行业结构的问题。在这个投票示例中,您可以轻松地讨论 Web3 的未来。例如,选民资格是投票应用程序内的一项功能,还是将由为许多 Dapp 服务的独立身份实用程序提供?每次投票的每个元素都是从头开始创建的,还是会存储和重复使用证明?
为什么链下方法具有高价值,并且安全、高效和灵活?
我们的方法涉及尽可能多地将投票过程移到链下(尽管您也可以将这种方法归类为使用带有Embed Rollup的应用程序)。对于许多 Web3 原生用户来说,程序在链下运行的想法乍一听可能与区块链所代表的一切背道而驰(即使 Vitalik 反复宣称这是 Web3 和 Web2 未来的一个非常强大的元素)。然而,当链下流程被包裹在 zk 电路中时,它们变得与链上活动一样值得信赖,同时摆脱了链上所施加的隐私、成本和计算限制。此外,链下流程可以设计为不可审查的。将链下 zk 电路与专为 zk 构建并旨在增强其他 L1 的 Mina 链结合使用,是扩展链上流程和摆脱迄今为止限制区块链进展的限制的完美方式。
在我们的方法中,通过引用链上数据(例如 NFT 持有量),投票者可以在链下证明他们有资格投票以及他们被允许投票多少票。投票者可以被分配选票、投票并进行计票,所有这些都在链下进行。这种链下活动的证明使用递归汇总为 Mina 上的单个小证明以供验证(如果需要中期结果,则为一系列小证明),交易成本非常低。然后可以将该验证结果桥接回以太坊(或未来的其他链)以执行投票结果,例如释放资金。除了基本方案之外,验证还可以桥接到多个其他链,也可以存储并重新用作后续决策的输入。
其他投票方法传统上是在链上进行的,无论是 L1 还是 L2,并且在规模、隐私和数据约束挑战方面处于不利地位。有人尝试通过将投票分配为代币来引入部分隐私,这些代币可以在投票之前通过混合器放入新钱包中,但这种方法很麻烦。
然而,我们的方法虽然需要(在基本情况下)从以太坊到 Mina 再返回,但具有以下非常显著的好处:
能够使用 Typescript 库编写和运行链下 zk 电路,无需任何可信设置,具有递归功能和 WASM,可以在浏览器中高效运行
Mina 的gasless 交易模型
根据 Mina 中永久的验证记录,可以重复使用和编写证明。
链上投票的挑战是什么,而链下投票可以帮助解决?
链上投票面临的挑战有哪些,链下投票可以解决?
节省成本
允许投票主要在链下进行,可以避免设置投票的交易成本,以及分配和委托、投票和计票所需的任何交易。使用 ZKP 和递归,唯一的链上成本是验证每个主要活动组的proof,以及将结果桥接回执行合约的潜在成本。
隐私
链下投票可以保护个人资格(您持有哪些代币以及这赋予您投票权)、行动(您或给定代币的持有者如何投票)和投票进度(前 10% 的人口如何投票)的隐私。反过来,私人投票可以实现:
基本隐私(通过不透露与投票地址相关的加密货币持有量)
防止投票中的社会压力
避免投票中的从众心理、基于投票势头的冷漠以及投票中的博弈
避免贿选(因为潜在买家无法看到选民如何投票)
数据灵活性
避免链数据格式的限制(允许投票可以有无限数量的格式,例如“对这 20 个选项进行排名并为每个选项分配资金”)
互操作性
随着 Web3 世界的成熟,投票很可能基于 DAO 的多链存在,并且结果有可能在多条链上执行。ZKP 是一种呈现跨链状态的有效方式。
这种方法如何支持多链投票?
非常简单:在其底层证明系统中支持Custom Gates后,o1js 将能够与大多数或所有链的 ECDSA 和其他加密方案配合使用。Custom Gates是近期的路线图。递归可用于根据来自多个链的状态来组装多个证明,并通过大幅减少链上验证的数量来提高效率。Mina 可以有效地验证并持久化验证结果。将来,数据和任意消息桥可以将此状态表示回任何链上。
投票流程和高级设计
我们都直观地了解投票,但流程步骤是什么?
隐私设计要点是什么?
投票用例的优点之一是,它说明了有多种方法可以实现隐私,以及多种隐私“设置”。例如,我们可以决定:
隐藏支持资格的选民详细信息,例如代币持有量
隐藏选民在投票或社区讨论中的身份
隐藏选民的投票方式
隐藏全部或部分中期结果(例如,不显示任何内容,或显示投票百分比但不显示投票方式)
隐藏部分最终结果(例如,未在投票中选中的候选人的投票分数)
隐藏部分社区成员的所有最终结果(不太可能,但存在一些极端情况,例如,谁获得了开发项目的资助)
当然,对于部署哪种选项没有普遍正确的答案,组织可能会根据情况需要广泛的选项。因此,ZK 投票系统的可配置性和灵活性非常重要。所提出的架构假设选民详细信息、投票所有权和投票方式完全隐藏,直到最终结果公布。
我们提出的链下投票流程在此处更详细地展示:
投票始于中央权威机构(例如,DAO 成员代表团)定义投票并宣布投票。
这将发生在 Web2 应用程序中,投票将包括定义投票结构(例如,是/否、排序选择、选择 3、在 4 个选项之间分配 100 分等)、投票资格的基础和每个投票者的投票数(例如,基于代币数量、DAO 成员资格期限、社交图因素等)。
然后,投票设置将在证明聚合器(proof aggregator)和投票合约(voting contract)中处理:
证明聚合器 — 允许链下证明和投票聚合的递归证明
投票合约 — 验证链下证明、指定投票相关参数、持有计票序列器股份并管理分布式密钥生成 (DKG) 程序的链上合约
资格证明器将允许选民证明他们拥有投票资格(例如,代币所有权)。
这可以通过允许选民证明这一点而不泄露他们的持股来实现。他们将投票应用程序(在浏览器中下载)连接到他们拥有的钱包,并签名以显示所有权。然后,zkApp 将计算投票资格和投票数,并创建支持证据的证明。由于存在许多可能的资格证据来源,并且具有多种加密方案,O1js将拥有Custom Gates,可编程以有效地将方案纳入其基于 Plonk 的证明系统。
分配选票后,选民现在可以通过在选民应用程序的 Web2 部分中进行选择来投票,然后对其进行同态加密并与资格证明一起发送到证明聚合器(仍在链下)。
证明聚合器验证证明并将投票纳入计票机制,该机制将投票添加到运行总数中而无需解密。
投票结束后,将公布总计结果,然后由一定数量的密钥持有者解密。然后证明该结果。
事实上,这证明:
底层证明的总和 已被证明。
底层证明的验证 已被证明。
同态密码的解密已正确完成,证明已发送到 Mina 链进行验证。
验证在 Mina 上完成并存储在下一个区块更新中。然后,更新将反映在 Mina Ethereum zkBridge 的下一次运行中,然后反映以太坊智能合约中的 Mina 状态根更新。相同的更新可以在多个不同的链上复制,以多链方式使用结果。最后,结果可以导致以太坊(或另一条链)上智能合约应用程序的执行,该应用程序被触发以检查以太坊上存储的 Mina 状态根中的证明验证。找到证明验证后,执行智能合约并完成流程。
架构原则
设计一个理想的投票系统是一门艺术,确定什么是理想的解决方案同样具有挑战性,因为每个用例都有独特的要求。
例如,政府选举必须容纳数百万选民,而全公司投票需要与区块链上的去中心化公共 DAO 不同的信任假设。
虽然投票系统的要素取决于具体用例和预期的操作环境,但我们可以研究各种技术解决方案和方法,并深入探索其中一种。
还要注意,鉴于投票系统的需求非常不同,它们必须尽可能可配置和可扩展,这也是我们构建 SnarkyJS 以便非密码学家可以使用的原因之一。
然而,大多数系统的目标可能包括以下设计:
去中心化,这样设计就不依赖于单个参与者来发起行动,也不会受到审查(参见图中的计票序列器)
私密,这样选民的身份就不会被公开
完全匿名,这样个人投票就不会被追溯到任何身份,并且在结果被计算并且选举期结束之前一直处于隐藏状态
去中心化和抗审查性
在区块链世界中,主要目标之一是最大限度地提高抗审查性,同时减少信任假设和中心化权威的影响。
对于可靠的投票系统来说,这一目标也不例外。
个人投票和选举结果塑造了我们所居住的世界,因此所采用的决策系统必须尽可能安全和抗审查。
虽然链下投票有优势,但仅依靠一个或几个排序器来统计结果仍然存在一定风险。
幸运的是,基于 SnarkyJS 代码的系统允许选民绕过任何第三方(例如被阻止的排序器)并直接与结算层 Mina 通信,以无需信任的方式投票,这要归功于 SnarkyJS 能够直接在 Web 浏览器中生成证明的能力。
用户无需依赖计数排序器网络,而是可以生成相同的递归证明,从而有效地成为计数排序器。
此外,Mina 智能合约可用于直接提交和验证用户的投票,从而消除任何审查风险。
去中心化(和隐私)的另一个重要元素是控制同态加密的解密密钥,这将在下面的隐私部分中介绍。
隐私(包括同态加密隐私)
在此用例中,与投票权相关的隐私通过允许投票者在本地运行可信的权利证明而不泄露其数据,然后将该证明与投票一起包含来处理。
投票本身的隐私更加困难,因为它可能包含复杂的数据(例如,排名选择和写入响应),需要在计票中读取和整理这些数据,但随后隐藏起来直到投票期结束。幸运的是,同态加密可以实现这种级别的隐私!本节简要概述了同态加密的含义。
如果您想查看有关同态加密的更长帖子,请评论并点赞此帖子,我们会将其添加到我们的计划中。
加密是一个简单的概念 - 它涉及向第三方隐藏消息内容。假设您想在课堂上与朋友分享笑话,但您不想让老师看到它们。
为了保护您的笑话,您可以对它们进行加密并将加密消息发送给您的朋友。然后,您的朋友就可以解密消息并享受笑话了。
另一方面,同态加密稍微复杂一些。它描述了一种属性,使我们能够在保留底层数据结构的同时对加密数据(密文)执行操作。本质上,您可以加密数据,对加密数据执行操作(如加法或乘法),并在解密后获得镜像纯文本空间的结果。
虽然同态加密可能看起来很吓人,但理解起来相当简单。
“同态”一词来自古希腊,意思是“相同形式”。此属性允许两组之间进行结构保留映射。
好消息是,SnarkyJS 使您能够实现各种加密方案,包括同态加密库。
随着 SnarkyJS 生态系统的不断扩展,您将可以访问更多此类库和更多工具,以利用零知识实现私密和匿名的未来。
通过使用 SnarkyJS 的同态加密,您可以证明所有投票的加密、解密和计数,而无需透露任何信息。这难道不神奇吗?
值得注意的是,同态加密有多种类型,但此示例投票系统仅需要部分同态加密。
这意味着您只能执行一种特定运算,例如加法或乘法。但是,这对于投票示例来说已经足够了。
首先,我们将分解语言并解释此投票系统的实际好处。它允许选民投票,同时对任何第三方隐藏他们的选择。
这种隐私是使用加密技术实现的,该技术可确保投票内容得到保留,直到计算出最终结果并投票期结束。
为了确保只有授权个人才能访问投票内容,我们使用两个密钥:用于解密的私钥和用于加密投票的公钥。
这可以防止任何人自由访问投票内容,但我们还需要确保没有任何单个实体持有私钥并滥用其权力。
为了实现这些目标,您可以使用分布式密钥生成 (DKG)。这项技术允许多方参与创建密钥,同时确保没有任何单个实体知道整个密钥。在区块链上进行投票、验证和汇总后,生成私钥的初始参与方中一定数量的参与方会聚在一起计算解密最终结果所需的密钥(可能使用质押资金来激励良好行为)。这种方法可确保解密密钥在投票期结束前保持私密,而无需中央权威。
总之,该投票系统使用同态加密和 DKG 来保护投票的隐私,防止权力滥用,并确保抗审查和去中心化的投票过程。
效率
效率有两个关键方面:
单个选举中的投票递归(在计票序列器中)
投票工件的重复使用,包括单个链上的结果或通过使用 Mina 作为持久性并为多个链提供服务的地方在多个链上广播投票结果。
递归
从开发人员的角度来看,递归是可扩展性、效率、可扩展性、可配置性和易用性的基础之一。
我们的解决方案通过利用递归和链下计算来确保用户体验的无缝衔接。
用户无需为验证每个证明而支付交易费或 gas,投票的聚合发生在链下。
使用递归,您基本上可以汇总证明,并在链上验证最终的递归证明,而不是验证数千个底层证明/投票。
这种验证方法可以显著降低交易费用,同时保持高质量的用户体验。
SnarkyJS 证明系统中使用的 Pasta 曲线在高效递归方面具有独特优势,并允许您在应用程序中构建无限级别的递归。
使用 WASM,用户可以轻松地在浏览器中生成投票证明,而无需运行其他软件。
作为结算和持久层的作用
Mina 的设计(除其他事项外)旨在成为快速、低成本地验证证明和持久性验证的绝佳场所,特别是基于 Pasta 曲线对的 SnarkyJS 发出的递归证明。
因此,它不仅可以成为投票系统,还可以成为其他 zk 应用程序的自然通用结算层。
由于 Mina 生态系统的部分重点是将 Mina 状态桥接到其他链,我们预计未来 Mina 将成为所有类型 zk 应用程序的跨链结算层,由 zk 桥提供便利。这可以让项目编写一次 zkApp,并在链间使用它。它还可以实现跨链、EVM 和非 EVM 的证明的可组合性和重用性。
评估
我们使用四个主要维度来评估解决方案:
构建成本
运营成本,特别是交易成本
延迟和用户体验
解决方案寿命
构建成本
总体而言,我们在这个维度上将我们的解决方案评为非常好,至少对于基本构建而言。
这里的大部分专用功能都是简单的 Web2 代码构建,可能在 20 小时内构建到 POC 级别。
使用 SnarkyJS,非密码学家也可以快速构建 ZKP 元素,包括递归(同样,快速构建到 POC 级别)。
同态加密基于现有的开源库,实现时间应少于 5 小时。Mina 上的验证、存储和将状态桥接回以太坊都是开箱即用的(Mina 的智能合约层和 Mina-Ethereum 桥目前处于后期测试阶段)。
请注意,存在二阶功能,例如对链下架构部分进行广泛去中心化的排序(例如,设置投票、计票),以及永久存储投票元素的潜力,这可能会大大增加构建成本和时间。
运营成本
我们将我们的解决方案评为非常好。根据您对成本的定义,所有 ZKP 在计算上都有些昂贵,但这在用户体验中已经得到考虑。
同时,在 SnarkyJS 中递归之后,在当前条件下,Mina 上整个投票的交易/证明验证成本将只有几美分,如果打算在另一条链上执行,最终还需要一笔桥接成本。
用户体验
我们将用户体验评为良好。得益于 SnarkyJS,可以通过 Web 浏览器验证资格并进行投票。目前,生成证明可能需要数十秒的时间,但对于长时间运行的投票,这种延迟是完全可以接受的,并且可以作为后台进程。随着我们都将注意力从功能转向性能,尤其是借助硬件加速,整个行业的证明速度正在突飞猛进。
解决方案寿命
我们将解决方案寿命评为优秀。虽然使用 zk 和区块链管理投票可能有更简单的方法,但采用这种方法是对未来专业级多链解决方案的投资。
交易成本被永久抑制。
未来,Mina 可以将结果桥接到多个链上。
作为 Mina 路线图的一部分,证明验证将在 Mina 上保留,因此允许重复使用和编写证明。
最后的话
我们已经构建了一个开源解决方案作为有限的 POC,我们将在进一步审查后在 O(1) GitHub 存储库中提供该解决方案。我们很高兴收到反馈并欢迎您的评论。
您可以在 O(1) Labs 开源存储库中访问 SnarkyJS。当您在那里时,请给存储库一个星号以帮助其他人发现该项目!
您可以在 Mina 文档的 zkApps 部分了解 SnarkyJS。
加入 Mina Protocol Discord 上的 zkApp 开发人员和 SnarkyJS 对话。
我们希望您喜欢使用 SnarkyJS 构建 zkApps,即由零知识证明支持的智能合约。
加入Mina社区并探索我们的开发者资源,用Mina的一切证明来帮助构建一个更好的未来。