跳转至主要内容

页面最后更新: 2025年12月17日

什么是零知识证明?

零知识证明是能够在不披露声明本身的情况下,验证声明有效性的一种方法。 “证明者”是试图证明声明的一方,而“验证者”则负责验证声明。

零知识证明首次出现于 1985 年的论文《The knowledge complexity of interactive proof systemsopens in a new tab》中,该论文为当今广泛使用的零知识证明提供了定义:

零知识协议是一种方法,一方(证明者)可以通过该方法向另一方(验证者)证明某事为真,但除了该特定声明为真之外,不透露任何信息

多年来,零知识证明一直在发展,目前已经在现实世界中得到应用。

我们为什么需要零知识证明?

零知识证明是应用密码学领域的一项突破,它有望提高个人信息的安全性。 想一想你如何向另一方(例如,一个服务提供商)证明一项声明(例如,“我是 X 国的公民”)。 你需要提供“证据”来支持你的声明,例如国民护照或驾驶证。

但这种方法存在问题,主要是缺乏隐私。 与第三方服务商共享的个人身份信息 (PII) 储存在中心化数据库中,这些数据库很容易受到黑客攻击。 随着身份盗用成为一个严峻问题,人们呼吁采用更能保护隐私的方式来分享敏感信息。

零知识证明通过消除为证明声明有效性而透露信息的需求来解决这个问题。 零知识协议使用声明(称为“证人”)作为输入,然后生成一个其有效性的简要证明。 这种证明有力地保证一项声明是真实的,且不透露创建声明时所使用的信息。

回到我们前面的例子,你只需要提供零知识证明即可证明你的公民身份声明。 验证者只需要检查证明中的一些属性是否属实,从而确认背后声明的真实性。

零知识证明的用例

匿名支付

信用卡支付通常对多方可见,包括支付服务提供商、银行和其他相关方(比如政府部门)。 金融监管有助于识别非法活动,但同时也会损害普通民众的隐私。

加密货币旨在为用户提供一种私密的、点对点的交易手段。 但是大部分加密货币的交易在区块链上是公开可见的。 用户身份通常是假名的,可以通过在 Twitter 或 GitHub 个人资料中包含 ETH 地址等方式有意地与真实世界身份相关联,也可以使用基本的链上和脱链数据分析与真实世界身份相关联。

有一些专门为完全匿名交易设计的“隐私币”。 注重隐私的区块链,例如 Zcash 和 Monero,它们会屏蔽交易细节,包括发送人和接收人的地址、资产类型、数量和交易时间线。

通过在协议中内置零知识技术,注重隐私的网络允许验证交易,而无需访问交易数据。 EIP-7503opens in a new tab 是一个提案设计示例,它将支持在以太坊区块链上进行原生隐私价值转移。 然而,由于安全、监管和用户体验等方面的考虑,这些提议难以实现。

零知识证明也被应用于公有区块链上的交易匿名化。 其中一个例子是 Tornado Cash,它是一个去中心化的非托管服务,允许用户在以太坊上进行私密交易。 Tornado Cash 使用零知识证明来模糊化交易细节和保证金融隐私。 不幸的是,由于这些是“主动选择加入”的隐私工具,它们与非法活动有关。 为了克服这个问题,隐私最终也必须要成为公开区块链的默认项。 了解更多关于以太坊上的隐私

身份保护

目前的身份管理系统让个人信息面临风险。 零知识证明能帮助个人验证身份,同时保护敏感细节。

去中心化身份的背景下,零知识证明尤其有用。 去中心化身份(又称为“自主身份”)让个人可以控制私人身份信息的访问。 在不透露税号或护照细节的情况下,证明你的公民身份就是一个用零知识技术实现去中心化身份的好例子。

人性证明

当今实际应用的零知识证明最广泛的例子之一是 World ID 协议opens in a new tab,它可以被认为是“人工智能时代的全球数字护照”。 人们证明自己是独特的个体,而无需透露个人信息。 这是通过一种Orb的设备而实现的, 该设备可以扫描人的虹膜并生成虹膜代码。 通过检查和验证虹膜编码来确认此人是独一无二的人类个体 验证完成后,在用户设备上生成的身份承诺(承诺本身不包含可识别的个人生物信息 )会被添加到区块链上的安全列表中 之后,每当用户想要证明自己是经过验证的人类——无论是登录、投票还是执行其他操作——他们都可以生成一个零知识证明,以确认自己在该安全列表中的成员身份。 使用零知识证明的优势在于,只揭示一个信息:被验证人的唯一性。 其余一切都保持私密

World ID 依赖于由以太坊基金会的 PSE 团队opens in a new tab开发的 Semaphore 协议opens in a new tab。 Semaphore 是一个设计轻盈但功能强大的生成和验证零知识证明的方法。 它允许用户证明自己属于某个群体(在此例中为经过验证的人类),而无需透露自己在群体中的具体身份。 Semaphore 还具有高度的灵活性,允许基于各种标准创建群体,例如身份验证、参与活动或拥有特定凭证。

身份验证

使用在线服务需要证明你的身份和访问这些平台的权利。 这通常需要提供个人信息,比如姓名、邮箱地址、出生日期等等。 你可能需要记住长长的密码,也需要承担无法访问的风险。

然而,零知识证明可以简化平台和用户的认证。 一旦通过公开输入(例如,证明用户是平台成员的数据)和私密输入(例如,用户详细信息)来生成零知识证明,用户就能在需要访问服务的时候,使用它来认证身份。 这改善了用户体验,同时组织也无需存储大量的用户信息。

可验证计算

可验证计算是零知识技术用于改进区块链设计的另一种应用。 可验证计算允许我们将计算外包给另一个实体,同时保留可验证的计算结果。 该实体将计算结果和验证程序被正确执行的证据一起提交。

在不降低安全性的前提下,可验证计算对于提高区块链的处理速度至关重要。 要明白这一点,需要知道拟议的以太坊扩容解决方案之间的差异。

链上扩容方案(例如分片)需要对区块链的基础层进行大量修改。 然而,这种方法非常复杂,如果在实现过程中出错,则会危害以太坊的安全模型。

脱链扩容方案不需要重新设计核心以太坊协议。 相反,它们依靠外包计算模型来提高以太坊基础层的吞吐量。

以下是实际运作过程:

  • 以太坊不处理每一个交易,而是把执行放到一个单独的链上。

  • 在处理完交易后,另一条链返回结果,然后被应用在以太坊的状态上。

这样做的好处是,以太坊不需要做任何执行,只需要将外包计算的结果应用到其状态中。 这减少了网络拥堵,也提高了交易速度(脱链协议为快速执行进行了优化)。

链上需要一种方法来验证脱链交易,而无需重新执行它们,不然脱链执行就失去它的价值。

这就是可验证计算发挥作用的地方。 当一个节点在以太坊外执行交易时,它提交一个零知识证明来证明脱链执行的正确性。 这个证明(称为)保证了交易的有效性,允许以太坊将其结果应用到其状态中,而无需等待任何人提出异议。

零知识卷叠validiums 是两种使用有效性证明来提供安全可扩展性的脱链扩容解决方案。 这些协议执行了数以千计的脱链交易,并提交了用于以太坊验证的证明。 一旦证明被验证,这些结果就会被立即应用,它允许以太坊在不增加基础层计算量的情况下处理更多的交易。

减少链上投票中的贿赂和串通

区块链投票方案有很多有利的特点:它们是完全可审计的、安全抗攻击、抗审查以及不受地域限制。 但即使是链上投票方案也无法避免串通问题。

串通的定义是"通过欺骗、诈骗和误导他人来协调,达到限制公开竞争的目的",串通的形式可能是恶意行为者通过行贿来影响投票。 例如,Alice 可能会收受 Bob 的贿赂,在选票上投票给 option B,即使她更喜欢 option A

贿赂和串通限制了任何以投票作为信号机制的过程的有效性(特别是在用户可以证明他们如何投票的情况下)。 这可能会产生重大影响,特别是在通过投票来分配稀缺资源的情况下。

例如,二次方募资机制opens in a new tab依靠捐赠来衡量不同公益项目中某些选项的偏好。 每笔捐款都算作对某一特定项目的“投票”,获得更多投票的项目将从匹配资金池中获得更多资金。

使用链上投票使得二次融资容易受到串通的影响:区块链交易是公开的,所以行贿者可以检查受贿者的链上活动,看他们是如何“投票”的。 这种方式使得二次融资不再是一个根据社区的集体偏好来分配资金的有效手段。

幸运的是,诸如 MACI(最低反串通基础设施)等较新的解决方案正在使用零知识证明,使链上投票(例如,二次方募资机制)能够抵制贿赂和串通。 MACI 是一套智能合约和脚本,允许中央管理员(称为“协调员”)汇总投票和统计结果,_而无需_透露每个人的具体投票方式。 即便如此,仍然可以验证投票是否被正确计数,或确认某个人参加了该轮的投票。

MACI 是如何与零知识证明协作的?

一开始,协调员在以太坊部署 MACI 合约,之后用户就可以注册投票(通过把它们的公钥注册到智能合约上)。 用户通过发送经公钥加密后的信息给智能合约来完成投票(一个有效投票必须使用与用户身份关联的最新公钥来签名,另外还有其他标准)。 然后,协调员在投票期结束后处理所有的信息,统计票数,在链上验证结果。

在 MACI 中,零知识证明用来确保计算的正确性,避免协调员错误地处理投票和汇总结果。 这是通过要求协调员生成 ZK-SNARK 证明来验证 a) 所有消息都已正确处理 b) 最终结果与所有_有效_投票的总和相对应来实现的。

因此,即便没有分享每个用户的投票明细(通常是这样的),MACI 也能保证计算过程中计算结果的完整性。 这一特点有助于减少基本的串通方案的有效性。 通过之前 Bob 贿赂 Alice 来给某个选项投票的例子,我们可以探索这种可能性:

  • Alice 通过发送她的公钥到智能合约来注册投票。
  • Alice 同意投票给 option B,以换取 Bob 的贿赂。
  • Alice 投票给 option B
  • Alice 偷偷发送一个加密交易来更改与她身份关联的公钥。
  • Alice 使用新的公钥向智能合约发送另一条(加密)消息,投票给 option A
  • Alice 向 Bob 展示了一笔交易,表明她投票给了 option B(该投票无效,因为该公钥在系统中已不再与 Alice 的身份相关联)
  • 在处理消息时,协调员会跳过 Alice 给 option B 的投票,只计算给 option A 的投票。 因此,Bob 串通 Alice 和操纵链上投票的意图失败了。

使用 MACI _确实_需要信任协调员不会与行贿者串通,或试图亲自贿赂投票者。 协调员可以解密用户消息(创建证明的时候需要),以确保它们可以准确验证每个人是如何投票的。

在协调员保持诚实的情况下,MACI 代表了一个强大的工具,保证了链上投票的神圣性。 这就解释了为什么它在二次方募资应用(例如,clr.fundopens in a new tab)中如此受欢迎,这些应用严重依赖每个个人投票选择的完整性。

了解有关 MACI 的更多信息opens in a new tab

零知识证明如何运作?

零知识证明允许你证实一个声明是否真实,无需分享声明的内容以及你是如何发现其真实性的。 为了做到这点,零知识证明依靠算法获取一些数据作为输入,然后输出“真”或“假”。

零证明协议需要满足以下标准:

  1. 完整性:如果输入有效,零知识协议总是返回“真”。 因此,如果所依据的声明是真的,同时证明者和验证者都诚实,那么证明就能被接受。

  2. 可靠性:如果输入无效,理论上不可能欺骗零知识协议返回“真”。 因此,一个说谎的证明者无法忽悠一个诚实的验证者相信一个无效的声明是有效的(小概率事件除外)。

  3. 零知识:验证者除了知道声明的有效性或虚假性之外,其余一概不知(他们对声明内容“一无所知”)。 这项要求也阻止了验证者从证明中推导出原始输入(声明的内容)。

一个零知识证明基本上由三个要素组成:见证挑战响应

  • 见证:通过零知识证明,证明者希望证明自己知道某些隐藏信息。 这些秘密信息就是证明的“证人”,证明者基于对证人的了解设立了一组问题,这些问题只有了解信息的一方才能回答出来。 因此,证明者随机选择一个问题来发起证明,计算问题答案,然后发送给验证者。

  • 挑战:验证者从问题集中随机挑选另一个问题,并要求证明者回答。

  • 响应:证明者接受问题,计算答案,并将其返回给验证者。 证明者的回复让验证者可以检验证明者是否真的可以接触到证人。 为了确保证明者并不是偶然盲目猜对答案的,验证者会再选择一个问题来提问。 通过多次重复这个过程,证明者造假的可能性会极大的降低,直到最终验证者满意。

以上描述了“交互式零知识证明”的结构。 早期的零知识协议使用交互式证明,验证一个声明的有效性需要证明者和验证者之间来回多次沟通。

Jean-Jacques Quisquater 著名的阿里巴巴洞穴故事opens in a new tab是说明交互式证明如何运作的一个很好的例子。 在故事里,Peggy(证明者)想要向Victor(验证者)证明她知道打开魔法之门的暗号,但她又没有透露暗号是什么。

非交互式零知识证明

虽然是革命性的,但互动式证明的作用有限,因为它要求双方同时在线,反复互动。 即使验证者相信证明者是诚实的,该证明也不能用于独立验证(计算一个新的证明需要证明者和验证者之间一个新的信息集)。

为了解决这个问题,Manuel Blum、Paul Feldman 和 Silvio Micali 提出了第一个非交互式零知识证明opens in a new tab,其中证明者和验证者拥有一个共享密钥。 这能让证明者表明他们对某些信息(即证人)的了解,而不提供信息本身。

与交互式证明不同的是,非互动式证明只需要参与者(证明者和验证者)之间进行一轮沟通。 证明者把秘密信息输入到一个特殊的算法中,然后计算出一个零知识证明。 这个证明会被发送给验证者,验证者使用另一个算法来检验证明者是否知道秘密信息。

非交互式证明减少了证明者和验证者之间的沟通,让零知识证明更高效。 另外,一旦生成了证明,任何人(可访问共享密钥和验证算法)都可以对其进行验证。

非交互式证明代表了零知识技术的突破,促进了今天所使用的证明系统的发展。 下面我们将讨论这些证明类型:

零知识证明的类型

ZK-SNARKs

ZK-SNARK 是 **Zero-Knowledge Succinct Non-Interactive Argument of Knowledge(零知识简洁非交互式知识论证)**的缩写。 零知识简洁非交互式知识论证协议具有以下特点:

  • 零知识:验证者可以验证一个陈述的完整性,而无需了解关于该陈述的任何其他信息。 验证者对声明的唯一了解就是它是真还是假。

  • 简洁:零知识证明比见证要小,并且可以快速验证。

  • 非交互式:该证明是“非交互式”的,因为证明者和验证者只交互一次,不像交互式证明需要多轮通信。

  • 论证:该证明满足“可靠性”要求,因此作弊的可能性极小。

  • 知识(Of Knowledge):如果没有秘密信息(见证),零知识证明就无法构建。 证明者在没有证人的情况下计算一个有效的零知识证明是非常困难的,即便不是不可能。

前面提到的“共享密钥”是指证明者和验证者同意在生成和验证证明时使用的公共参数。 生成公共参数(统称为通用参考编码 (CRS))是一个敏感的操作,因为它在协议安全性方面非常重要。 如果用于生成通用参考编码的熵(随机数)落入到不诚实的证明者手上,他们就能计算虚假证明。

多方计算 (MPC)opens in a new tab 是降低生成公共参数风险的一种方法。 多方参与可信设置仪式opens in a new tab,每个人都贡献一些随机值来生成 CRS (通用参考字符串)。 只要有一个诚实的参与方销毁了他们那部分的熵,零知识简洁非交互式知识论证协议就能保持计算的可靠性。

信任设置要求用户信任参数生成的参与者。 然而,ZK-STARK 的发展使其能在非信任的设置下证明协议。

ZK-STARKs

ZK-STARK 是 **Zero-Knowledge Scalable Transparent Argument of Knowledge(零知识可扩展透明知识论证)**的缩写。 ZK-STARK 类似于ZK-SNARK,除了它是:

  • 可扩展:当见证的规模较大时,ZK-STARK 在生成和验证证明方面比 ZK-SNARK 更快。 随着证人规模的增加,简洁的非交互式知识论证证明的证明和验证时间只会略微增加(简洁的非交互式知识论证证明和验证时间与证人规模呈线性增长)。

  • 透明:ZK-STARK 依靠可公开验证的随机性来生成用于证明和验证的公共参数,而不是可信设置。 因此,它比零知识简洁非交互式知识论证更加透明。

ZK-STARK 会产生比零知识简洁非交互式知识论证更大的证明,这意味着它通常具有更高的验证开销。 然而,在有些情况下(如证明大型数据集),ZK-STARK 可能比零知识简洁非交互式知识论证更具成本效益。

使用零知识证明的缺点

硬件成本

生成零知识证明涉及到非常复杂的计算,最好在专用机器上运行。 由于这类机器价格昂贵,普通人通常买不起。 此外,想要使用零知识技术的应用必须考虑硬件成本 — 这可能会增加终端用户的费用。

证明验证成本

验证证明也需要复杂的计算,这增加了在应用中实施零知识技术的成本。 这种成本在证明计算方面尤其突出。 例如,零知识卷叠在以太坊上支付约 500,000 单位燃料来验证一个零知识简洁非交互式知识论证证明,零知识可扩容透明知识论证则需要更高的费用。

信任假设

在零知识简洁非交互式知识论证中,公共参考字符串(公共参数)只生成一次,然后可供零知识协议的参与方重复使用。 公共参数由可信设置仪式创建,其参与者假定是诚实的。

但是并没有什么方法能让用户评估参与者是否诚实,用户必须相信开发者的话。 零知识可扩容透明知识论证不存在信任假设,因为生成字符串所使用的随机数是可公开验证的。 与此同时,研究人员正在研究零知识简洁非交互式知识论证的非可信设置,以增加证明机制的安全性。

量子计算威胁

零知识简洁非交互式知识论证使用椭圆曲线加密法进行加密。 虽然椭圆曲线离散对数问题目前被认为是难以破解的,但在未来,量子计算机的发展可能会打破这种安全模式。

由于仅使用抗碰撞的哈希函数确保安全性,零知识可扩容透明知识论证被认为不会受到量子计算的威胁。 与椭圆曲线加密法中使用的公私密钥对不同,抗碰撞哈希算法更难被量子计算算法破解。

扩展阅读{#further-reading}

页面最后更新: 2025年12月17日

本文对你有帮助吗?