---
title: "什么是零知识证明？"
metaTitle: "零知识证明"
description: "面向初学者的零知识证明非技术性介绍。"
lang: zh
---

零知识证明是一种在不泄露陈述本身的情况下证明该陈述有效性的方法。“证明者”是试图证明某项主张的一方，而“验证者”负责验证该主张。

零知识证明首次出现在 1985 年的一篇论文《[交互式证明系统的知识复杂性](http://people.csail.mit.edu/silvio/Selected%20Scientific%20Papers/Proof%20Systems/The_Knowledge_Complexity_Of_Interactive_Proof_Systems.pdf)》中，该论文提供了当今广泛使用的零知识证明定义：

> 零知识协议是一种方法，通过该方法，一方（证明者）**可以向**另一方（验证者）**证明某件事是真实的，除了该特定陈述是真实的这一事实之外，不泄露任何信息**。

多年来，零知识证明不断改进，现在正被用于多种实际应用中。

<VideoWatch slug="zero-knowledge-proofs-5-levels" />

## 为什么我们需要零知识证明？ {#why-zero-knowledge-proofs-are-important}

零知识证明代表了应用密码学的一项突破，因为它们有望提高个人信息的安全性。想象一下你如何向另一方（例如服务提供商）证明一项主张（例如“我是 X 国的公民”）。你需要提供“证据”来支持你的主张，例如国家护照或驾驶执照。

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

零知识证明通过**消除为了证明主张的有效性而泄露信息的需要**来解决这个问题。零知识协议使用该陈述（称为“见证数据”）作为输入，以生成其有效性的简洁证明。该证明提供了强有力的保证，证明陈述是真实的，而不会暴露用于创建该证明的信息。

回到我们之前的例子，证明你的公民身份主张所需的唯一证据就是零知识证明。验证者只需检查证明的某些属性是否成立，即可确信潜在的陈述也成立。

## 零知识证明的用例 {#use-cases-for-zero-knowledge-proofs}

### 匿名支付 {#anonymous-payments}

信用卡支付通常对多方可见，包括支付提供商、银行和其他利益相关方（例如政府机构）。虽然金融监控有助于识别非法活动，但它也破坏了普通公民的隐私。

加密货币旨在为用户提供一种进行私密、点对点交易的手段。但大多数加密货币交易在公共区块链上都是公开可见的。用户身份通常是伪匿名的，要么有意与现实世界的身份相关联（例如，在推特或 GitHub 个人资料中包含 ETH 地址），要么可以使用基本的链上和链下数据分析与现实世界的身份相关联。

有专门为完全匿名交易设计的“隐私币”。专注于隐私的区块链（如 Zcash 和 Monero）会屏蔽交易细节，包括发送者/接收者地址、资产类型、数量和交易时间线。

通过将零知识技术融入协议中，专注于隐私的[区块链](/glossary/#blockchain)网络允许[节点](/glossary/#node)在无需访问交易数据的情况下验证交易。[EIP-7503](https://eips.ethereum.org/EIPS/eip-7503) 是一个提议设计的例子，它将实现[以太坊](/)区块链上原生的私密价值转移。然而，由于安全性、监管和用户体验等综合因素的考虑，此类提议很难实施。

**零知识证明也被应用于公共区块链上的匿名交易**。一个例子是 Tornado Cash，这是一种去中心化的非托管服务，允许用户在以太坊上进行私密交易。Tornado Cash 使用零知识证明来混淆交易细节并保证财务隐私。不幸的是，由于这些是“选择加入”的隐私工具，它们往往与非法活动联系在一起。为了克服这个问题，隐私最终必须成为公共区块链上的默认设置。了解更多关于[以太坊上的隐私](/privacy/)的信息。

### 身份保护 {#identity-protection}

当前的身份管理系统将个人信息置于风险之中。零知识证明可以帮助个人在保护敏感细节的同时验证身份。

零知识证明在[去中心化身份](/decentralized-identity/)的背景下特别有用。去中心化身份（也称为“自我主权身份”）赋予个人控制个人标识符访问权限的能力。在不泄露你的税号或护照详细信息的情况下证明你的公民身份，是零知识技术如何实现去中心化身份的一个很好的例子。

<Alert variant="info">
  <AlertEmoji text="💡" />
  <AlertContent>
    <AlertTitle className="mb-2">
      零知识证明 + 身份的实际应用：以太坊上的不丹国家数字身份 (NDI)
    </AlertTitle>
    <AlertDescription>
      <p>
        将零知识证明用于身份管理系统的一个现实世界例子是建立在以太坊上的不丹王国国家数字身份 (NDI) 系统。不丹的 NDI 使用零知识证明允许公民通过密码学证明关于他们自己的事实，例如“我是公民”或“我已年满 18 岁”，而无需泄露其身份证件上的敏感个人数据。
      </p>
      <p>
        在<a href="/decentralized-identity/#national-and-government-id">去中心化身份案例研究</a>中了解有关不丹 NDI 的更多信息。
      </p>
 
</AlertDescription>
 
</AlertContent>
</Alert>

### 人类证明 {#proof-of-humanity}

当今零知识证明最广泛使用的实际例子之一是 [World ID 协议](https://world.org/blog/world/world-id-faqs)，它可以被认为是“人工智能时代的全球数字护照”。它允许人们证明自己是独一无二的个体，而无需泄露个人信息。这是通过一种名为 Orb 的设备实现的，该设备扫描人的虹膜并生成虹膜代码。检查并验证虹膜代码，以确认该人是生物学上独一无二的人类。验证后，在用户设备上生成的身份承诺（不与生物识别数据链接或从中派生）将被添加到区块链上的安全列表中。然后，每当用户想要证明他们是经过验证的人类时——无论是为了登录、投票还是采取其他行动——他们都可以生成一个零知识证明，确认他们在该列表中的成员身份。使用零知识证明的妙处在于只揭示了一个陈述：这个人是独一无二的。其他一切都保持私密。

World ID 依赖于以太坊基金会 [PSE 团队](https://pse.dev/)开发的 [Semaphore 协议](https://docs.semaphore.pse.dev/)。Semaphore 旨在成为一种轻量级但功能强大的生成和验证零知识证明的方法。它让用户证明他们是某个群体（在这种情况下，是经过验证的人类）的一部分，而无需显示他们是该群体的哪个成员。Semaphore 也非常灵活，允许根据各种标准（如身份验证、参与事件或拥有凭证）创建群体。

### 身份验证 {#authentication}

使用在线服务需要证明你的身份和访问这些平台的权利。这通常需要提供个人信息，如姓名、电子邮件地址、出生日期等。你可能还需要记住长密码，否则就有失去访问权限的风险。

然而，零知识证明可以简化平台和用户的身份验证。一旦使用公共输入（例如，证明用户是平台成员的数据）和私有输入（例如，用户的详细信息）生成了零知识证明，用户在需要访问服务时只需出示它即可验证其身份。这改善了用户体验，并使组织免于存储大量用户信息的需要。

### 可验证计算 {#verifiable-computation}

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

可验证计算对于**在不降低安全性的情况下提高区块链上的处理速度至关重要**。要理解这一点，需要了解提议的以太坊扩容解决方案之间的差异。

[链上扩容解决方案](/developers/docs/scaling/#onchain-scaling)（如分片）需要对区块链的基础层进行大量修改。然而，这种方法非常复杂，实施中的错误可能会破坏以太坊的安全模型。

[链下扩容解决方案](/developers/docs/scaling/#offchain-scaling)不需要重新设计核心以太坊协议。相反，它们依赖于外包计算模型来提高以太坊基础层的吞吐量。

以下是它在实践中的工作原理：

- 以太坊不处理每笔交易，而是将执行卸载到一条单独的链上。

- 处理交易后，另一条链返回结果以应用于以太坊的状态。

这样做的好处是，以太坊不必进行任何执行，只需将外包计算的结果应用于其状态即可。这减少了网络拥堵，也提高了交易速度（链下协议针对更快的执行进行了优化）。

链需要一种方法来验证链下交易而无需重新执行它们，否则链下执行的价值就会丧失。

这就是可验证计算发挥作用的地方。当节点在以太坊之外执行交易时，它会提交一个零知识证明来证明链下执行的正确性。该证明（称为[有效性证明](/glossary/#validity-proof)）保证交易是有效的，允许以太坊将结果应用于其状态——而无需等待任何人对其提出异议。

[零知识汇总](/developers/docs/scaling/zk-rollups)和 [validium](/developers/docs/scaling/validium/) 是两种使用有效性证明提供安全可扩展性的链下扩容解决方案。这些协议在链下执行数千笔交易，并提交证明以在以太坊上进行验证。一旦证明得到验证，这些结果就可以立即应用，从而允许以太坊处理更多交易，而无需增加基础层上的计算。

除了二层网络 (l2) 扩容之外，零知识证明还可以验证以太坊一层网络 (l1) 区块执行本身。[用于一层网络 (l1) 验证的 zkEVM](/roadmap/zkevm/) 将允许验证者通过检查证明而不是重新执行所有交易来验证区块——从而在不提高验证者硬件要求的情况下实现更高的 Gas 上限。

### 减少链上投票中的贿赂和串谋 {#secure-blockchain-voting}

区块链投票方案具有许多有利特征：它们完全可审计、安全防范攻击、抗审查且不受地理限制。但即使是链上投票方案也无法幸免于**串谋**问题。

串谋被定义为“通过欺骗、诈骗和误导他人来协调限制公开竞争”，它可能采取恶意行为者通过提供贿赂来影响投票的形式。例如，Alice 可能会收到 Bob 的贿赂，在选票上投票给 `option B`，即使她更喜欢 `option A`。

贿赂和串谋限制了任何使用投票作为信号机制的过程的有效性（特别是当用户可以证明他们是如何投票的时候）。这可能会产生重大后果，特别是在投票负责分配稀缺资源的情况下。

例如，[二次方融资机制](https://www.radicalxchange.org/wiki/plural-funding/)依赖捐款来衡量不同公共物品项目中对某些选项的偏好。每笔捐款都算作对特定项目的“投票”，获得更多选票的项目将从匹配池中获得更多资金。

使用链上投票使二次方融资容易受到串谋的影响：区块链交易是公开的，因此行贿者可以检查受贿者的链上活动，以查看他们是如何“投票”的。这样，二次方融资就不再是根据社区的总体偏好分配资金的有效手段。

幸运的是，MACI（最小抗串谋基础设施）等较新的解决方案正在使用零知识证明，使链上投票（例如二次方融资机制）能够抵抗贿赂和串谋。MACI 是一组智能合约和脚本，允许中央管理员（称为“协调员”）汇总选票并统计结果，而_无需_透露每个人如何投票的具体细节。即使如此，仍然可以验证选票是否被正确计算，或者确认特定个人参与了该轮投票。

#### MACI 如何与零知识证明协同工作？ {#how-maci-works-with-zk-proofs}

一开始，协调员在以太坊上部署 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 <em>确实</em>需要信任协调员不会与行贿者串谋或试图亲自贿赂选民。协调员可以解密用户消息（创建证明所必需的），因此他们可以准确验证每个人的投票情况。

但在协调员保持诚实的情况下，MACI 是保证链上投票神圣性的强大工具。这解释了它在严重依赖每个人投票选择完整性的二次方融资应用程序（例如 [clr.fund](https://clr.fund/#/about/maci)）中受欢迎的原因。

[了解有关 MACI 的更多信息](https://maci.pse.dev/)。

## 零知识证明是如何工作的？ {#how-do-zero-knowledge-proofs-work}

零知识证明允许你证明陈述的真实性，而无需共享陈述的内容或透露你是如何发现真相的。为了实现这一点，零知识协议依赖于将某些数据作为输入并返回“真”或“假”作为输出的算法。

零知识协议必须满足以下标准：

1. **完备性**：如果输入有效，零知识协议始终返回“真”。因此，如果潜在的陈述是真实的，并且证明者和验证者诚实地行事，则该证明可以被接受。

2. **可靠性**：如果输入无效，理论上不可能欺骗零知识协议返回“真”。因此，说谎的证明者无法欺骗诚实的验证者相信无效的陈述是有效的（除了极小的概率范围）。

3. **零知识**：除了陈述的有效性或虚假性之外，验证者对陈述一无所知（他们对陈述具有“零知识”）。此要求还防止验证者从证明中推导出原始输入（陈述的内容）。

在基本形式中，零知识证明由三个要素组成：**见证数据**、**挑战**和**响应**。

- **见证数据**：通过零知识证明，证明者希望证明对某些隐藏信息的了解。秘密信息是证明的“见证数据”，证明者对见证数据的假定了解建立了一组只能由了解该信息的一方回答的问题。因此，证明者通过随机选择一个问题、计算答案并将其发送给验证者来开始证明过程。

- **挑战**：验证者从集合中随机挑选另一个问题，并要求证明者回答。

- **响应**：证明者接受问题，计算答案，并将其返回给验证者。证明者的响应允许验证者检查前者是否真的可以访问见证数据。为了确保证明者不是盲目猜测并偶然得到正确答案，验证者会挑选更多问题来提问。通过多次重复这种交互，证明者伪造见证数据知识的可能性显著下降，直到验证者满意为止。

上文描述了“交互式零知识证明”的结构。早期的零知识协议使用交互式证明，其中验证陈述的有效性需要证明者和验证者之间进行来回通信。

说明交互式证明如何工作的一个好例子是 Jean-Jacques Quisquater 著名的[阿里巴巴山洞故事](https://en.wikipedia.org/wiki/Zero-knowledge_proof#The_Ali_Baba_cave)。在故事中，Peggy（证明者）想向 Victor（验证者）证明她知道打开一扇魔法门的秘密咒语，而无需透露该咒语。

### 非交互式零知识证明 {#non-interactive-zero-knowledge-proofs}

虽然具有革命性，但交互式证明的实用性有限，因为它需要双方都在场并反复交互。即使验证者确信证明者的诚实，该证明也无法用于独立验证（计算新证明需要证明者和验证者之间的一组新消息）。

为了解决这个问题，Manuel Blum、Paul Feldman 和 Silvio Micali 提出了第一个[非交互式零知识证明](https://dl.acm.org/doi/10.1145/62212.62222)，其中证明者和验证者拥有一个共享密钥。这允许证明者展示他们对某些信息（即见证数据）的了解，而无需提供信息本身。

与交互式证明不同，非交互式证明只需要参与者（证明者和验证者）之间进行一轮通信。证明者将秘密信息传递给一种特殊算法以计算零知识证明。该证明被发送给验证者，验证者使用另一种算法检查证明者是否知道秘密信息。

非交互式证明减少了证明者和验证者之间的通信，使零知识证明更加高效。此外，一旦生成证明，任何其他人（只要有权访问共享密钥和验证算法）都可以对其进行验证。

非交互式证明代表了零知识技术的突破，并刺激了当今使用的证明系统的发展。我们在下面讨论这些证明类型：

### 零知识证明的类型 {#types-of-zero-knowledge-proofs}

#### zk-SNARK {#zk-snarks}

zk-SNARK 是 **Zero-Knowledge Succinct Non-Interactive Argument of Knowledge**（零知识简洁非交互式知识论证）的缩写。zk-SNARK 协议具有以下特征：

- **零知识**：验证者可以验证陈述的完整性，而无需了解有关该陈述的任何其他信息。验证者对该陈述的唯一了解是它是真是假。

- **简洁**：零知识证明比见证数据小，并且可以快速验证。

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

- **论证**：该证明满足“可靠性”要求，因此作弊的可能性极小。

- **知识**：如果没有访问秘密信息（见证数据）的权限，就无法构建零知识证明。对于没有见证数据的证明者来说，计算出有效的零知识证明即使不是不可能，也是非常困难的。

前面提到的“共享密钥”是指证明者和验证者同意在生成和验证证明时使用的公共参数。生成公共参数（统称为公共参考字符串 (CRS)）是一项敏感操作，因为它在协议安全性中具有重要意义。如果用于生成 CRS 的熵（随机性）落入不诚实的证明者手中，他们就可以计算出虚假的证明。

[多方计算 (MPC)](https://en.wikipedia.org/wiki/Secure_multi-party_computation) 是一种降低生成公共参数风险的方法。多方参与[可信设置仪式](https://zkproof.org/2021/06/30/setup-ceremonies/amp/)，每个人贡献一些随机值来生成 CRS。只要有一方诚实地销毁了他们那部分熵，zk-SNARK 协议就能保持计算上的可靠性。

可信设置要求用户信任参数生成中的参与者。然而，ZK-STARK 的发展使得使用非可信设置的证明协议成为可能。

#### ZK-STARK {#zk-starks}

ZK-STARK 是 **Zero-Knowledge Scalable Transparent Argument of Knowledge**（零知识可扩展透明知识论证）的缩写。ZK-STARK 与 zk-SNARK 类似，不同之处在于它们是：

- **可扩展的**：当见证数据的大小较大时，ZK-STARK 在生成和验证证明方面比 zk-SNARK 更快。使用 STARK 证明，证明者和验证时间仅随着见证数据的增长而略有增加（SNARK 证明者和验证者时间随见证数据大小呈线性增加）。

- **透明的**：ZK-STARK 依赖于公开可验证的随机性来生成用于证明和验证的公共参数，而不是可信设置。因此，与 zk-SNARK 相比，它们更加透明。

ZK-STARK 产生的证明比 zk-SNARK 大，这意味着它们通常具有更高的验证开销。然而，在某些情况下（例如证明大型数据集），ZK-STARK 可能比 zk-SNARK 更具成本效益。

## 使用零知识证明的缺点 {#drawbacks-of-using-zero-knowledge-proofs}

### 硬件成本 {#hardware-costs}

生成零知识证明涉及非常复杂的计算，最好在专用机器上执行。由于这些机器很昂贵，普通人通常无法企及。此外，想要使用零知识技术的应用程序必须考虑硬件成本——这可能会增加最终用户的成本。

### 证明验证成本 {#proof-verification-costs}

验证证明也需要复杂的计算，并增加了在应用程序中实施零知识技术的成本。这种成本在证明计算的背景下尤为相关。例如，零知识汇总 (ZK-rollup) 在以太坊上验证单个 zk-SNARK 证明需要支付约 500,000 Gas，而 ZK-STARK 需要更高的费用。

### 信任假设 {#trust-assumptions}

在 zk-SNARK 中，公共参考字符串（公共参数）生成一次，并可供希望参与零知识协议的各方重复使用。公共参数是通过可信设置仪式创建的，其中假定参与者是诚实的。

但用户实际上无法评估参与者的诚实度，用户只能相信开发人员的话。ZK-STARK 没有信任假设，因为用于生成字符串的随机性是公开可验证的。与此同时，研究人员正在研究 zk-SNARK 的非可信设置，以提高证明机制的安全性。

### 量子计算威胁 {#quantum-computing-threats}

zk-SNARK 使用椭圆曲线密码学进行加密。虽然目前假设椭圆曲线离散对数问题是难以解决的，但量子计算机的发展可能会在未来打破这种安全模型。

ZK-STARK 被认为不受量子计算威胁的影响，因为它仅依赖抗碰撞哈希函数来保证其安全性。与椭圆曲线密码学中使用的公私钥对不同，抗碰撞哈希处理更难被量子计算算法破解。

## 延伸阅读 {#further-reading}

- [零知识证明用例概述](https://pse.dev/projects) — _隐私和扩容探索团队_
- [SNARK、STARK 与递归 SNARK 的比较](https://www.alchemy.com/overviews/snarks-vs-starks) — _Alchemy 概述_
- [零知识证明：改善区块链上的隐私](https://www.altoros.com/blog/zero-knowledge-proof-improving-privacy-for-a-blockchain/) — _Dmitry Lavrenov_
- [zk-SNARK — 现实的零知识示例和深入探讨](https://medium.com/coinmonks/zk-snarks-a-realistic-zero-knowledge-example-and-deep-dive-c5e6eaa7131c) — _Adam Luciano_
- [ZK-STARK — 建立可验证的信任，甚至抵御量子计算机](https://medium.com/coinmonks/zk-starks-create-verifiable-trust-even-against-quantum-computers-dd9c6a2bb13d) — _Adam Luciano_
- [关于 zk-SNARK 如何成为可能的近似介绍](https://vitalik.eth.limo/general/2021/01/26/snarks.html) — _Vitalik Buterin_
- [为什么零知识证明 (ZKP) 是自我主权身份的游戏规则改变者](https://frankiefab.hashnode.dev/why-zero-knowledge-proofs-zkps-is-a-game-changer-for-self-sovereign-identity) — _Franklin Ohaegbulam_
- [EIP-7503 解释：使用零知识证明在以太坊上实现私密转账](https://web.archive.org/web/20251116093505/https://research.2077.xyz/eip-7503-zero-knowledge-wormholes-for-private-ethereum-transactions/) — _Emmanuel Awosika_
- [ZK 纸牌游戏：学习零知识基础知识和现实生活用例的游戏](https://github.com/ZK-card/zk-cards) - _ZK-Cards_

<Divider />

<QuizWidget quizKey="zero-knowledge-proofs" />
