什么是零知识证明?
零知识证明是能够在不披露声明本身的情况下,验证声明有效性的一种方法。 “证明者”是试图证明声明的一方,而“验证者”则负责验证声明。
零知识证明在 1985 年的一篇论文“交互式证明系统的知识复杂度(opens in a new tab)”中被首次提出,它给出了至今仍被广泛使用的零知识证明的定义:
零知识协议是一种方法,通过这种方法,一方(证明者)可以向另一方(验证者)证明某个声明是真实的,并且除了该声明是真实的外,不会透露任何额外信息。
多年来,零知识证明一直在发展,目前已经在现实世界中得到应用。
我们为什么需要零知识证明?
零知识证明是应用密码学领域的一项突破,它有望提高个人信息的安全性。 想一想你如何向另一方(例如,一个服务提供商)证明一项声明(例如,“我是 X 国的公民”)。 你需要提供“证据”来支持你的声明,例如国民护照或驾驶证。
但这种方法存在问题,主要是缺乏隐私。 与第三方服务商共享的个人身份信息 (PII) 储存在中心化数据库中,这些数据库很容易受到黑客攻击。 随着身份盗用成为一个严峻问题,人们呼吁采用更能保护隐私的方式来分享敏感信息。
通过在不透露相关信息的情况下证明声明的有效性,零知识证明解决了这个问题。 零知识协议使用声明(称为“证人”)作为输入,然后生成一个其有效性的简要证明。 这种证明有力地保证一项声明是真实的,且不透露创建声明时所使用的信息。
回到我们前面的例子,你只需要提供零知识证明即可证明你的公民身份声明。 验证者只需要检查证明中的一些属性是否属实,从而确认背后声明的真实性。
零知识证明的用例
匿名支付
信用卡支付通常对多方可见,包括支付服务提供商、银行和其他相关方(比如政府部门)。 金融监管有助于识别非法活动,但同时也会损害普通民众的隐私。
加密货币旨在为用户提供一种私密的、点对点的交易手段。 但是大部分加密货币的交易在区块链上是公开可见的。 用户身份通常是匿名的,但也可以主动跟现实世界的身份相关联(例如在 Twitter 或 GitHub 的个人资料上包含以太坊地址),又或者能够利用一些基本的链上或脱链数据分析来与现实世界的身份进行关联。
有一些专门为完全匿名交易设计的“隐私币”。 注重隐私的区块链,例如 Zcash 和 Monero,它们会屏蔽交易细节,包括发送人和接收人的地址、资产类型、数量和交易时间线。
通过在协议中加入零知识技术,注重隐私的网络允许在无需访问交易数据的情况下验证交易。
零知识证明也用于在公共区块链上对交易进行匿名处理。 其中一个例子是 Tornado Cash,它是一个去中心化的非托管服务,允许用户在以太坊上进行私密交易。 Tornado Cash 使用零知识证明来模糊化交易细节和保证金融隐私。 不幸的是,由于这些是“主动选择加入”的隐私工具,它们与非法活动有关。 为了克服这个问题,隐私最终也必须要成为公开区块链的默认项。
身份保护
目前的身份管理系统让个人信息面临风险。 零知识证明能帮助个人验证身份,同时保护敏感细节。
零知识证明在去中心化身份中特别有用。 去中心化身份(又称为“自主身份”)让个人可以控制私人身份信息的访问。 在不透露税号或护照细节的情况下,证明你的公民身份就是一个用零知识技术实现去中心化身份的好例子。
认证
使用在线服务需要证明你的身份和访问这些平台的权利。 这通常需要提供个人信息,比如姓名、邮箱地址、出生日期等等。 你可能需要记住长长的密码,也需要承担无法访问的风险。
然而,零知识证明可以简化平台和用户的认证。 一旦通过公开输入(例如,证明用户是平台成员的数据)和私密输入(例如,用户详细信息)来生成零知识证明,用户就能在需要访问服务的时候,使用它来认证身份。 这改善了用户体验,同时组织也无需存储大量的用户信息。
可验证计算
可验证计算是零知识技术用于改进区块链设计的另一种应用。 可验证计算允许我们将计算外包给另一个实体,同时保留可验证的计算结果。 该实体将计算结果和验证程序被正确执行的证据一起提交。
可验证计算对于在不降低安全性的前提下提高区块链上的处理速度非常重要。 要明白这一点,需要知道拟议的以太坊扩容解决方案之间的差异。
链上扩容方案,例如分片,需要对区块链的基础层进行大量修改。 然而,这种方法非常复杂,如果在实现过程中出错,则会危害以太坊的安全模型。
脱链扩容解决方案无需重新设计以太坊的核心协议。 相反,它们依靠外包计算模型来提高以太坊基础层的吞吐量。
以下是实际运作过程:
以太坊不处理每一个交易,而是把执行放到一个单独的链上。
在处理完交易后,另一条链返回结果,然后被应用在以太坊的状态上。
这样做的好处是,以太坊不需要做任何执行,只需要将外包计算的结果应用到其状态中。 这减少了网络拥堵,也提高了交易速度(脱链协议为快速执行进行了优化)。
链上需要一种方法来验证脱链交易,而无需重新执行它们,不然脱链执行就失去它的价值。
这就是可验证计算发挥作用的地方。 当一个节点在以太坊外执行交易时,它提交一个零知识证明来证明脱链执行的正确性。 这个证明(称为)保证了一个交易是有效的,允许以太坊把结果应用到状态中 — 无需等待任何人提出异议。
零知识卷叠和 Validium 是两个脱链扩容的解决方案,它们使用有效性证明来提供安全的可扩容性。 这些协议执行了数以千计的脱链交易,并提交了用于以太坊验证的证明。 一旦证明被验证,这些结果就会被立即应用,它允许以太坊在不增加基础层计算量的情况下处理更多的交易。
减少链上投票中的贿赂和串通
区块链投票方案有很多有利的特点:它们是完全可审计的、安全抗攻击、抗审查以及不受地域限制。 但即使是链上投票方案也难以避免串通问题。
串通的定义是"通过欺骗、诈骗和误导他人来协调,达到限制公开竞争的目的",串通的形式可能是恶意行为者通过行贿来影响投票。 例如,Alice 可能收到 Bob 的贿赂,让她在选票上投给选项 B
,即使她更倾向于选项 A
。
贿赂和串通限制了任何以投票作为信号机制的过程的有效性(特别是在用户可以证明他们如何投票的情况下)。 这可能会产生重大影响,特别是在通过投票来分配稀缺资源的情况下。
例如,二次融资机制(opens in a new tab)根据捐款来衡量对不同公益项目中某些选项的偏好。 每笔捐款都算作对某一特定项目的“投票”,获得更多投票的项目将从匹配资金池中获得更多资金。
使用链上投票使得二次融资容易受到串通的影响:区块链交易是公开的,所以行贿者可以检查受贿者的链上活动,看他们是如何“投票”的。 这种方式使得二次融资不再是一个根据社区的集体偏好来分配资金的有效手段。
幸运的是,更新的解决方案,例如 MACI(最低限度的反串通基础设施),正在使用零知识证明来让链上投票(例如二次融资机制)能够抵制贿赂和串通。 MACI 是一个智能合约和脚本的集合,它允许中央管理员(称为“协调员”)汇总票数和统计结果,无需暴露每个人是如何投票的。 即便如此,仍然可以验证投票是否被正确计数,或确认某个人参加了该轮的投票。
MACI 是如何与零知识证明协作的?
一开始,协调员在以太坊部署 MACI 合约,之后用户就可以注册投票(通过把它们的公钥注册到智能合约上)。 用户通过发送经公钥加密后的信息给智能合约来完成投票(一个有效投票必须使用与用户身份关联的最新公钥来签名,另外还有其他标准)。 然后,协调员在投票期结束后处理所有的信息,统计票数,在链上验证结果。
在 MACI 中,零知识证明用来确保计算的正确性,避免协调员错误地处理投票和汇总结果。 这是通过要求协调员生成零知识简洁非交互式知识论证证明来实现的,验证 a) 所有的信息都被正确处理 b) 最后的结果与所有有效投票总和对应。
因此,即便没有分享每个用户的投票明细(通常是这样的),MACI 也能保证计算过程中计算结果的完整性。 这一特点有助于减少基本的串通方案的有效性。 通过之前 Bob 贿赂 Alice 来给某个选项投票的例子,我们可以探索这种可能性:
- Alice 通过发送她的公钥到智能合约来注册投票。
- Alice 同意投票给
选项 B
,以此来换取 Bob 的贿赂。 - Alice 投票给
选项 B
。 - Alice 偷偷发送一个加密交易来更改与她身份关联的公钥。
- Alice 发送另一个(加密的)消息到智能合约,使用新的公钥给
选项 A
投票。 - Alice 向 Bob 展示交易,显示她已经投票给了
选项 B
(投票是无效的,因为最初的那个公钥在系统中已经不再跟 Alice 的身份关联)。 - 在处理消息时,协调员跳过 Alice 投给
选项 B
的选票,只把选项 A
的投票纳入计数。 因此,Bob 串通 Alice 和操纵链上投票的意图失败了。
使用最低限度的反串通基础设施时,确实需要相信协调员不会与行贿者串通或者试图自己来贿赂投票者。 协调员可以解密用户消息(创建证明的时候需要),以确保它们可以准确验证每个人是如何投票的。
在协调员保持诚实的情况下,MACI 代表了一个强大的工具,保证了链上投票的神圣性。 这解释了它为何在二次融资应用中如此受欢迎(例如 clr.fund(opens in a new tab)),二次融资严重依赖于每个人投票选择的完整性。
了解更多关于最小反串谋基础设施的信息(opens in a new tab)。
零知识证明如何运作?
零知识证明允许你证实一个声明是否真实,无需分享声明的内容以及你是如何发现其真实性的。 为了做到这点,零知识证明依靠算法获取一些数据作为输入,然后输出“真”或“假”。
零证明协议需要满足以下标准:
完备性:如果输入是有效的,那么零知识协议应该始终返回"真"。 因此,如果所依据的声明是真的,同时证明者和验证者都诚实,那么证明就能被接受。
可靠性:如果输入是无效的,那么理论上不可能欺骗零知识协议输出“真”。 因此,一个说谎的证明者无法忽悠一个诚实的验证者相信一个无效的声明是有效的(小概率事件除外)。
零知识:验证者除了知道声明的有效性或虚假性之外,其余一概不知(他们对声明内容“一无所知”)。 这项要求也阻止了验证者从证明中推导出原始输入(声明的内容)。
零知识证明的基本形式由三个要素组成:证人、挑战和回复。
证人:通过零知识证明,证明者想要证明对一些隐藏信息的了解。 这些秘密信息就是证明的“证人”,证明者基于对证人的了解设立了一组问题,这些问题只有了解信息的一方才能回答出来。 因此,证明者随机选择一个问题来发起证明,计算问题答案,然后发送给验证者。
挑战:验证者从问题集里随机挑选另外一个问题,然后让证明者来回答。
回复:证明者接收问题,计算答案,然后把答案发送给验证者。 证明者的回复让验证者可以检验证明者是否真的可以接触到证人。 为了确保证明者并不是偶然盲目猜对答案的,验证者会再选择一个问题来提问。 通过多次重复这个过程,证明者造假的可能性会极大的降低,直到最终验证者满意。
以上描述了“交互式零知识证明”的结构。 早期的零知识协议使用交互式证明,验证一个声明的有效性需要证明者和验证者之间来回多次沟通。
一个比较好的展示交互式证明是如何运转的例子是 Jean-Jacques Quisquater 非常有名的阿里巴巴山洞故事(opens in a new tab)。 在故事里,Peggy(证明者)想要向Victor(验证者)证明她知道打开魔法之门的暗号,但她又没有透露暗号是什么。
非交互式零知识证明
虽然是革命性的,但互动式证明的作用有限,因为它要求双方同时在线,反复互动。 即使验证者相信证明者是诚实的,该证明也不能用于独立验证(计算一个新的证明需要证明者和验证者之间一个新的信息集)。
为了解决这个问题,Manuel Blum、Paul Feldman 和 Silvio Micali 提出了第一个非交互式零知识证明(opens in a new tab),证明者和验证者将有一个共享的密钥。 这能让证明者表明他们对某些信息(即证人)的了解,而不提供信息本身。
与交互式证明不同的是,非互动式证明只需要参与者(证明者和验证者)之间进行一轮沟通。 证明者把秘密信息输入到一个特殊的算法中,然后计算出一个零知识证明。 这个证明会被发送给验证者,验证者使用另一个算法来检验证明者是否知道秘密信息。
非交互式证明减少了证明者和验证者之间的沟通,让零知识证明更高效。 另外,一旦生成了证明,任何人(可访问共享密钥和验证算法)都可以对其进行验证。
非交互式证明代表了零知识技术的突破,促进了今天所使用的证明系统的发展。 下面我们将讨论这些证明类型:
零知识证明的类型
零知识简洁非交互式知识论证 (ZK-SNARK)
ZK-SNARK是零知识简洁非交互式知识论证的缩写。 零知识简洁非交互式知识论证协议具有以下特点:
零知识:验证者可以验证声明的完整性,而不需要知道关于该声明的任何其他信息。 验证者对声明的唯一了解就是它是真还是假。
简洁:零知识证明比证人小,可以快速验证。
非交互式:该证明是非交互式的,因为证明者和验证者之间只需要交互一次,不像交互式证明需要多轮的沟通。
论证:该证明满足“可靠性”要求,因此基本不可能作弊。
(的)知识:如果不能获取秘密信息(证人),就无法构建零知识证明。 证明者在没有证人的情况下计算一个有效的零知识证明是非常困难的,即便不是不可能。
前面提到的“共享密钥”是指证明者和验证者同意在生成和验证证明时使用的公共参数。 生成公共参数(统称为通用参考编码 (CRS))是一个敏感的操作,因为它在协议安全性方面非常重要。 如果用于生成通用参考编码的熵(随机数)落入到不诚实的证明者手上,他们就能计算虚假证明。
多方计算 (MPC)(opens in a new tab) 是一种在生成公共参数时降低风险的方法。 多个参与方参与到信任设置仪式(opens in a new tab),每个人提供一些随机数值来生成通用参考编码。 只要有一个诚实的参与方销毁了他们那部分的熵,零知识简洁非交互式知识论证协议就能保持计算的可靠性。
信任设置要求用户信任参数生成的参与者。 然而,ZK-STARK 的发展使其能在非信任的设置下证明协议。
零知识可扩容透明知识论证 (ZK-STARK)
ZK-STARK 是零知识可扩容透明知识论证的缩写。 ZK-STARK 类似于ZK-SNARK,除了它是:
可扩容:当证人的规模比较大时,ZK-STARK 生成和验证证明比零知识简洁非交互式知识论证要快。 随着证人规模的增加,简洁的非交互式知识论证证明的证明和验证时间只会略微增加(简洁的非交互式知识论证证明和验证时间与证人规模呈线性增长)。
透明:ZK-STARK 依赖于可公开验证的随机数来生成用于证明和验证的公共参数,而不是信任设置。 因此,它比零知识简洁非交互式知识论证更加透明。
ZK-STARK 会产生比零知识简洁非交互式知识论证更大的证明,这意味着它通常具有更高的验证开销。 然而,在有些情况下(如证明大型数据集),ZK-STARK 可能比零知识简洁非交互式知识论证更具成本效益。
使用零知识证明的缺点
硬件成本
生成零知识证明涉及到非常复杂的计算,最好在专用机器上运行。 由于这类机器价格昂贵,普通人通常买不起。 此外,想要使用零知识技术的应用必须考虑硬件成本 — 这可能会增加终端用户的费用。
证明验证费用
验证证明也需要复杂的计算,这增加了在应用中实施零知识技术的成本。 这种成本在证明计算方面尤其突出。 例如,零知识卷叠在以太坊上支付约 500,000 单位燃料来验证一个零知识简洁非交互式知识论证证明,零知识可扩容透明知识论证则需要更高的费用。
信任假设
在零知识简洁非交互式知识论证中,公共参考字符串(公共参数)只生成一次,然后可供零知识协议的参与方重复使用。 公共参数由可信设置仪式创建,其参与者假定是诚实的。
但是并没有什么方法能让用户评估参与者是否诚实,用户必须相信开发者的话。 零知识可扩容透明知识论证不存在信任假设,因为生成字符串所使用的随机数是可公开验证的。 与此同时,研究人员正在研究零知识简洁非交互式知识论证的非可信设置,以增加证明机制的安全性。
量子计算的威胁
零知识简洁非交互式知识论证使用椭圆曲线加密法进行加密。 虽然椭圆曲线离散对数问题目前被认为是难以破解的,但在未来,量子计算机的发展可能会打破这种安全模式。
由于仅使用抗碰撞的哈希函数确保安全性,零知识可扩容透明知识论证被认为不会受到量子计算的威胁。 与椭圆曲线加密法中使用的公私密钥对不同,抗碰撞哈希算法更难被量子计算算法破解。
延伸阅读
- 零知识证明用例概述(opens in a new tab) — Privacy and Scaling Explorations Team
- SNARKs 与 STARKS 与 递归 SNARK(opens in a new tab) — Alchemy Overviews
- 零知识证明:改善区块链上的隐私(opens in a new tab) — Dmitry Lavrenov
- zk-SNARK — 一个现实的零知识例子和深入研究(opens in a new tab) — Adam Luciano
- ZK-STARK — 创建可验证的信任,即使面对量子计算机(opens in a new tab) — Adam Luciano
- 关于如何让 zk-SNARK 成为可能的大致介绍(opens in a new tab) — Vitalik Buterin
- 为什么零知识证明 (ZKP) 是自主主权身份的颠覆者(opens in a new tab) — Franklin Ohaegbulam