0%

【译】什么是零知识证明?

原文链接: https://ethereum.org/zh/zero-knowledge-proofs/

什么是零知识证证明(Zero-Knowledge Proofs, ZKP)?

零知识证明是一种无需揭示声明本身即可证明其有效性的方法。“证明者”(prover)是试图证明主张的一方,而“验证者”则负责验证主张。

零知识证明最早出现在1985年的一篇论文《交互证明系统的知识复杂性》中,该论文提供了当今普遍使用的零知识证明的定义:

零知识协议是一种方法,其中一方(证明者)可以向另一方(验证者)证明某事是真实的,同时不暴露除了该特定声明为真实之外的任何信息。

零知识证明已经在近几年得到了改进,现在它们正被用于几个现实世界的应用中。

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

零知识证明代表了应用密码学的一个突破,它承诺可以提高个人信息的安全性。考虑一下你如何向另一方(如服务提供商)证明一个主张(例如“我是X国公民”)。您需要提供“证据”以支持您的主张,例如国家护照或驾驶执照。

但是,这种方法存在问题,主要是缺乏隐私性。与第三方服务共享的个人识别信息(Personally Identifiable Information, PII)存储在中央数据库中,易受到黑客攻击。由于身份盗窃已成为一个严重问题,有人呼吁采取更具有隐私保护性的共享敏感信息的方法。

零知识证明通过消除证明声明有效性所需要的信息披露可以解决此问题。零知识协议将语句(称为“见证”)作为输入,生成其有效性的简洁证明。该证明提供了强有力的保证,即声明为真,而不暴露创建它所使用的信息。

回到我们之前的示例,您证明公民身份的唯一证据就是零知识证明。验证者只需检查证明的某些属性是否为真,以确信基础声明也为真。

零知识证明是如何运作的?

零知识证明允许您在不共享陈述内容或揭示您如何发现真相的情况下,证明陈述的真实性。为了使此可能,零知识协议依赖于将一些数据作为输入并返回“真”或“假”的算法。

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

  1. 完备性(Completeness):如果输入有效,零知识协议始终返回“真”。因此,如果潜在的陈述是真实的,并且证明人和验证者表现诚实,则可以接受证明。

  2. 可靠性(Soundness):如果输入无效,从理论上讲,不可能欺骗零知识协议返回“真”。因此,撒谎者不能诱使诚实的验证者相信无效声明是有效的(除了很小的概率)。

  3. 零知识:验证者除了了解声明的有效性或虚假性以外,不了解任何其他信息(他们对声明“零知识”)。这个要求还阻止验证者从证明中推导出原始输入(陈述的内容)。

基本上,零知识证明由三个要素组成 witness、challenge 和 response。

  • Witness: 在零知识证明中,证明者想要证明某一隐藏信息。这个秘密信息就是证明的“witness”,并且证明者假定:基于对witness的某些了解,能确保解一组问题,这些问题只能由了解信息的一方回答。因此,证明者开始证明流程,通过随机选择一个问题,计算回答,并将其发送给验证者。

  • Challenge: 验证者从该系列中随机挑选另外一个问题,并要求证明回答。

  • Response: 证明者接受该问题,计算答案,并将其返回给验证者。证明者的回应允许验证者检查前者是否真的了解 Witness。为了确保凭证者不是在盲目猜测而得到正确答案,验证者会选择更多的问题来问。通过重复这种互动很多次,证明者伪装了解 witness 的可能性显著降低,直到验证者满意为止。

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

一个很好的例子可以说明交互式证明如何运作,就是Jean-Jacques Quisquater的著名的阿里巴巴洞穴故事。在故事中,佩姬(证明者)想要向维克托(验证者)证明她知道开启魔法门的秘密短语,但又不把这个短语暴露出来。

非交互式零知识证明

虽然具有革命性,但交互式证明的用处有限,因为它需要两方随时可用并反复交互。 即使验证者确信证明者是诚实的,该证明也无法用于独立验证(计算新证明需要证明者和验证者之间的一组新消息)。

为了解决这个问题,Manuel Blum、Paul Feldman 和 Silvio Micali 提出了第一个非交互式零知识证明,其中证明者和验证者拥有共享密钥。 这允许证明者在不提供信息本身的情况下证明他们对某些信息的了解(即 witness)。

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

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

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

零知识证明的类型

ZK-SNARKs

ZK-SNARK 是 Zero-Knowledge Succinct Non-Interactive Argument of Knowledge 的缩写。 ZK-SNARK 协议具有以下特点:

  • Zero-Knowledge: 验证者可以在不知道语句的任何其他信息的情况下验证语句的完整性。 验证者对声明的唯一了解是它是真还是假。

  • Succinct: 零知识证明比witness小,可以快速验证。

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

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

(Of) Knowledge:如果不访问秘密信息(witness),则无法构建零知识证明。 对于没有见证人的证明者来说,即使不是不可能,也很难计算出有效的零知识证明。

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

多方计算(MPC)是一种降低生成公共参数风险的方法。 多方参与可信设置仪式(Trust Setup Ceremonies),其中每个人贡献一些随机值来生成 CRS。 只要一个诚实的一方破坏了他们的那部分熵,ZK-SNARK 协议就会保持计算稳健性。

可信设置要求用户信任参数生成的参与者。 然而,ZK-STARKs 的开发使得证明协议能够在不受信任的设置下工作。

ZK-STARKs

ZK-STARK 是 Zero-Knowledge Scalable Transparent Argument of Knowledge 的缩写。 ZK-STARKs 类似于 ZK-SNARKs,除了:

  • Scalable: 当见证规模较大时,ZK-STARK 在生成和验证证明方面比 ZK-SNARK 更快。 使用 STARK 证明,证明者和验证者的时间只会随着见证的增长而略有增加(SNARK 证明者和验证者的时间随着见证者的规模线性增加)。

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

ZK-STARKs 产生比 ZK-SNARKs 更大的证明,这意味着它们通常具有更高的验证开销。 但是,在某些情况下(例如证明大型数据集),ZK-STARK 可能比 ZK-SNARK 更具成本效益。

零知识证明的用例

匿名支付

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

加密货币旨在为用户提供一种进行私人、点对点交易的方式。 但大多数加密货币交易在公共区块链上都是公开可见的。 用户身份通常是假名的,并且要么故意链接到真实世界的身份(例如,通过在 Twitter 或 GitHub 个人资料中包含 ETH 地址),要么可以使用基本的链上和链下数据分析与真实世界的身份相关联。

有专为完全匿名交易而设计的特定“隐私币”。 Zcash 和 Monero 等注重隐私的区块链会屏蔽交易细节,包括发送方/接收方地址、资产类型、数量和交易时间表。

通过将零知识技术融入协议,以隐私为中心的区块链网络允许节点在无需访问交易数据的情况下验证交易。

零知识证明也被应用于公共区块链上的匿名交易。 一个例子是 Tornado Cash,这是一种去中心化的非托管服务,允许用户在以太坊上进行私人交易。 Tornado Cash 使用零知识证明来混淆交易细节并保证财务隐私。 不幸的是,因为这些是“选择加入”的隐私工具,所以它们与非法活动有关。 为了克服这个问题,隐私最终必须成为公共区块链的默认设置。

身份保护

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

零知识证明在去中心化身份的背景下特别有用。 去中心化身份(也称为“自我主权身份”)使个人能够控制对个人标识符的访问。 在不透露您的税号或护照详细信息的情况下证明您的公民身份是零知识技术如何实现去中心化身份的一个很好的例子。

验证

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

然而,零知识证明可以简化平台和用户的身份验证。 一旦使用公共输入(例如,证明用户是平台成员的数据)和私人输入(例如,用户的详细信息)生成零知识证明,用户可以在需要访问时简单地出示它以验证其身份。 这改善了用户体验,并使组织无需存储大量用户信息。

可验证计算

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

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

分片等链上扩展解决方案需要对区块链的基础层进行大量修改。 然而,这种方法非常复杂,实施中的错误可能会破坏以太坊的安全模型。

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

这是它在实践中的工作原理:

  • 以太坊不是处理每笔交易,而是将执行卸载到一个单独的链上。
  • 处理交易后,另一条链返回结果以应用于以太坊的状态。

这里的好处是以太坊不需要执行任何操作,只需要将外包计算的结果应用到它的状态。 这减少了网络拥塞并提高了交易速度(链下协议优化以加快执行速度)。

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

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

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

使用零知识证明的缺点

硬件成本

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

证明验证费用

验证证明还需要复杂的计算,并增加了在应用程序中实施零知识技术的成本。 这个成本在证明计算的上下文中特别相关。 例如,ZK-rollups 支付约 500,000 gas 来验证以太坊上的单个 ZK-SNARK 证明,而 ZK-STARKs 需要更高的费用。

信任假设

在 ZK-SNARK 中,公共参考字符串(公共参数)生成一次,可供希望参与零知识协议的各方重复使用。 公共参数是通过可信的设置仪式创建的,参与者被认为是诚实的。

但用户确实没有办法评估参与者的诚实度,用户必须相信开发人员的话。 ZK-STARK 没有信任假设,因为生成字符串时使用的随机性是可公开验证的。 与此同时,研究人员正在为 ZK-SNARKs 进行非可信设置,以提高证明机制的安全性。

量子计算威胁

ZK-SNARK 使用椭圆曲线密码学 (ECDSA) 进行加密。 虽然 ECDSA 算法目前是安全的,但未来量子计算机的发展可能会打破其安全模型。

ZK-STARK 被认为不受量子计算的威胁,因为它使用抗碰撞哈希进行加密。 与椭圆曲线密码学中使用的公私密钥对不同,抗碰撞散列更难被量子计算算法破解。

更多

Computer Scientist Explains One Concept in 5 Levels of Difficulty | WIRED> - Wired YouTube channel

SNARKs vs. STARKS vs. Recursive SNARKs — Alchemy Overviews

A Zero-Knowledge Proof: Improving Privacy on a Blockchain — Dmitry Lavrenov

zk-SNARKs — A Realistic Zero-Knowledge Example and Deep Dive — Adam Luciano

ZK-STARKs — Create Verifiable Trust, even against Quantum Computers — Adam Luciano

An approximate introduction to how zk-SNARKs are possible — Vitalik Buterin

What is Zero-Knowledge Proof and Its Role in Blockchain? — LeewayHertz