{"content":{"title":"友好的零知识证明介绍","body":"> * 原文链接： https://zkintro.com/articles/friendly-introduction-to-zero-knowledge\r\n> * 译文出自：[登链翻译计划](https://github.com/lbc-team/Pioneer)\r\n> * 译者：[翻译小组](https://learnblockchain.cn/people/412)  校对：[Tiny 熊](https://learnblockchain.cn/people/15)\r\n> * 本文永久链接：[learnblockchain.cn/article…](https://learnblockchain.cn/article/6184)\r\n\r\n\r\n\r\n## 零知识证明是魔法\r\n\r\n零知识证明是一种魔法。它能让我们做到以前想都不敢想的事情。\r\n\r\n首先，让我引用几句名言来刺激你的大脑。有些可能是你耳熟能详的，有些可能是你第一次听说。\r\n\r\n> 任何足够先进的技术都与魔法无异 - 来自阿瑟-C-克拉克\r\n\r\n> 人类文明的进步是通过增加我们不假思索就能完成的操作数量来实现的。- 来自阿尔弗雷德-诺斯-怀特海\r\n\r\n> 我把这篇文章写得比平时长，只是因为我没有时间把它缩短。- 来自布莱斯-帕斯卡尔\r\n\r\n> 隐私是一种有选择地向世界展示自己的能力。- 来自赛博朋克宣言\r\n\r\n> 未来已来。只是分布还不均匀。- 来自威廉-吉布森\r\n\r\n神奇的技术、不断进步的文明、简短的文字、隐私以及已经到来的未来。这就是零知识证明（ZKP）。这是怎么回事？\r\n\r\n上个世纪，计算机和互联网席卷了整个世界。这些技术无处不在，我们所做的一切都离不开它们，无论好坏。在此基础上，我们建立了平台、公司和巨头。这些就像你的 MAMAA（微软、苹果、Meta、Alphabet、亚马逊）。然后是巨头的腹部 --支付网络、政府服务和大量的 B2B 应用程序，它们默默地运行着这个世界。最后，还有一条长尾应用 -- 可爱的滤镜图片应用、语言学习平台或在线社区。\r\n\r\n当你向另一个在线服务输入数据时，你期望实现一个特定小目标，比如联系朋友，或者是申请抵押贷款这样的大目标。但所有这些数据会发生什么变化呢？还有你不知道的冰山一角的隐藏数据。\r\n\r\n谁真正了解这些系统以及我们如何使用它们的后果？反过来，它们又是如何利用我们的？虽然有些人可能比其他人更了解某些系统，但没有人了解所有系统，更不可能了解它们是如何相互作用产生不可预见的后果的。\r\n\r\n人类该怎么办？信任, 但你相信谁呢？\r\n\r\n这是一个难题。我们人类的大脑还没有进化到可以思考这个问题的程度。互联网虽然能把我们联系在一起，让事情变得更简单，但也在这方面却造成了一些混乱。过去，当你与人私下交谈时，风会吹走你发出的声音。当你被锁在屋外时，你可以找锁匠，也可以自己撬锁。当你被锁在谷歌账户外，盯着 \"拒绝访问 \"的屏幕时，你能怎么办，你正站在一座无形而坚不可摧的城堡前。\r\n\r\nZKP 可以帮助你。也许不是任何事情都可以搬到你，也不是此刻。但它可适用于许多事情、许多地方，而且越来越多。在本文的其余部分，我将尝试说服你为什么以及如何做到。让我们跟随魔法的脚步。\r\n\r\n## 什么是零知识证明？\r\n\r\n*本节将介绍零知识证明的概念*。\r\n\r\n这是关于零知识证明及其应用系列文章的第一篇。我们将介绍什么是零知识证明、为什么你应该关注它、它是如何工作的，以及它的应用场合。\r\n\r\n想象一下，你去酒吧，可以证明自己年满 18 岁，而无需透露任何其他信息，包括带有个人信息的身份证。或者，你可以证明自己正确缴税，而无需向任何人透露你的收入或资产详情。这些都是零知识证明（ZKP）可以实现的。所谓 \"零知识\"，简单地说就是我们不会透露任何超出预期的信息。\r\n\r\nZKP 可以让你在不透露任何信息的情况下证明某件事情，只需证明该声明是真实的即可。\r\n\r\n这意味着什么呢？让我们以经典的 \"沃尔多在哪里 \"为例。这个游戏是关于在一幅大图中找到沃尔多。我可以向你证明我知道沃尔多在哪里，而不透露沃尔多的位置。怎么证明？\r\n\r\n想象一下，我有一张 \"沃尔多在哪里 \"的图片和一张比图片大四倍的大纸。我在纸上开一个小洞，然后把这张纸放在 \"沃尔多在哪里 \"图片的前面，小心地摆好位置，这样沃尔多就可以通过小洞看到了。这意味着你可以看到瓦尔多，但只能看到瓦尔多，看不到其他东西。这样，你就知道我知道沃尔多在哪里，但我并没有透露沃尔多在图片中的具体位置。\r\n\r\n![沃尔多在哪里](https://img.learnblockchain.cn/2023/07/21/61379.jpeg)\r\n\r\n\r\n\r\n这显然只是一个例子，但希望它能给我们一些直观的印象，让我们知道这样的证明是如何实现的。但这意味着我们要更精确地要证明什么？我们接下来会深入探讨这个问题，但现在让我们看看 ZKP 给我们带来了什么。\r\n\r\n有了 ZKP，你就能以通用的方式证明任意语句。更具体地说，ZKP 能让我们以一种私密而简洁的方式证明一些东西。\r\n\r\n这一点非常强大，我们接下来就会看到。\r\n\r\n## 你为什么要关注 ZKP？\r\n\r\n本节将解释为什么有人会关注 ZKP，包括详细介绍隐私、压缩和 ZKP 的通用性。\r\n\r\n读了上面的内容，你可能会想：\"好吧，我想这还挺不错的，但我为什么要关心呢？这种想法完全合理。事实上，你可能不应该关心！就像你不应该关心计算机的工作原理、人工智能的发展方向或其他任何事情一样。\r\n\r\n为什么*你会关心*？因为你很好奇，想了解 ZKP 是如何工作的，以及它能开启哪种类型的交互。这种机制非常普遍，许多在这一领域工作的人的直觉是，从根本上说，它是一种新的范式，可以释放出许多新的东西。我们已经看到了这一点，而且似乎我们才刚刚开始。在本节的其余部分，我将向你介绍一些直观的原因和方法。\r\n\r\n在深入探讨之前，让我们先从更高的层面了解一下 ZKP 给我们带来了什么。ZKP 主要具有以下一种或两种特性：\r\n\r\n1. 隐私（更正式的说法是零知识性 zero-knowledge）\r\n\r\n2. 压缩（更正式的说法是简洁性 succinctness）\r\n\r\n这两个概念是什么意思？下面是一些思考这些特性的方法。\r\n\r\n## 隐私（Privacy）\r\n\r\n有很多事情我们都想保持隐私。下面是《牛津词典》中 \"隐私\"的定义：\r\n\r\n> 只属于一个人或一群人，或仅供他们使用。\r\n\r\n我们有私人谈话、私人浴室、隐私部位。商业秘密、敏感的个人信息，在自己家中的隐私：钥匙、门和锁。\r\n\r\n隐私是正常的，它就在我们身边。它与自我主权、自决和独立的概念密切相关。这些概念对我们来说是如此自然，以至于许多重要文件，如《美国权利法案》*和《联合国宪章》*分别将其视为个人和国家的基本权利。[隐私是自由的前提](https://en.wikipedia.org/wiki/Right_to_privacy)。\r\n\r\n更正式地说，ZKP 的隐私属性通常被称为[*零知识*或*数据隐藏*](https://docs.zkproof.org/reference.pdf)。ZKP 隐藏了与某些应用功能无关的数据，然后将被隐藏过这些数据与相关应用数据绑定在一起。这些概念比较正式，可以实现隐私保护。隐私是一个更广泛、更普遍适用的概念，所以我们现在将继续关注这个概念。\r\n\r\n在数字世界（也称网络空间，与肉体空间相对）中，隐私也是至关重要的，但却常常被忽视。以下是《赛博朋克宣言》（*A Cypherpunk's Manifesto* ）中对隐私的定义：\r\n\r\n> 隐私是有选择地向世界展示自己的能力 by [《赛博朋克宣言》](https://nakamotoinstitute.org/static/docs/cypherpunk-manifesto.txt)\r\n\r\n对话、密码、信用卡信息。这些都是我们希望在网上保持隐私的例子。互联网是连接我们所有人的奇妙工具，但它也是一个开放而狂野的海洋。这里有很多陌生人和掠夺者，因此保持某些信息的私密性至关重要。\r\n\r\n你可能会想，\"我们已经可以将密码等信息保密了，有什么大不了的？在有限的意义上，就这些具体例子而言，你是对的。我们必须发挥更多的想象力，才能真正理解通用的可编程隐私功能。\r\n\r\n\r\n\r\n举个例子，想一想奥古斯丁在他的《忏悔录》(公元400年)中是如何发现主教圣安布罗斯的“[默念](https://en.wikipedia.org/wiki/Silent_reading#History_of_silent_reading)”行为与众不同的。当时，大多数人都大声朗读。\r\n\r\n> 当（奥古斯丁）朗读时，他的眼睛扫视着书页，他的心在寻找其中的含义，但他的声音是沉默的，他的舌头是静止的。任何人都可以自由地接近他，而客人来访也通常不会事先通知，因此，当我们去拜访他时，经常会发现他就这样静静地读书，因为他从不大声朗读。\r\n\r\n![默读](https://img.learnblockchain.cn/2023/07/21/46122.jpeg)\r\n\r\n\r\n\r\n如今，每个人都认为默念是理所当然的。我们甚至很难想象，默念是怎样被发明出来的。以前，只为眼睛阅读的想法是陌生的。\r\n\r\n在我们的现代，还有哪些类似的发明是可能的？这些都是我们大多数人当前是无法想象的。\r\n\r\n在未来的章节中，我们将看到使用 ZKP 的现有和即将出现的此类发明的模样。\r\n\r\n## 压缩\r\n\r\n> 我把这篇文章写得比平时长，只是因为我没有时间把它缩短， 来自 [布莱斯-帕斯卡](https://quoteinvestigator.com/2012/04/28/shorter-letter) \r\n\r\n压缩（compress）是指 “把东西压缩到更小的空间”\r\n\r\n同样，简洁（succinctness）的定义是 “用几个词清楚地表达某事的行为”\r\n\r\n具有压缩特性的 ZKP 意味着，我们可以用非常简短的语句来证明某事为真。例如，某个计算的所有步骤都已正确执行。这在某些资源需求量大、价格昂贵的情况下最为实用。以太坊区块链就是如此，但在其他情况下，这也是一个非常有用的特性。更难能可贵的是，无论我们要证明的事情有多复杂，这个证明的大小都是一样的！\r\n\r\n我们所说的 \"证明 \"和 \"证明的大小 \"是什么意思？这些都是数学上的精确概念，其中有很多细微差别。在以后的章节中，我们将结合 ZKP 深入探讨证明的概念。现在，我们可以把它看作是一个我们知道是真的，或者可以通过某种方式验证是真实的简短陈述。\r\n\r\n![福尔摩斯](https://img.learnblockchain.cn/2023/07/21/94214.jpeg)\r\n\r\n在典型的侦探小说（如福尔摩斯探案集）中，侦探要收集证据，直到能够证明凶手犯下了谋杀罪。然后，他们会在最后的大结局中证明他们是如何知道这一点的。我们可以把最后这句话看作证据。\r\n\r\n更正式地说，我们将这一属性称为*[简洁性（*succinctness*）](https://docs.zkproof.org/reference.pdf)* 。无论我们要证明什么，证明的大小都是一样的。就公共区块链而言，这也与*可扩展性*的概念有关。对于以太坊这样的公共区块链来说，区块空间有限且昂贵，ZKP 可以让交易更便宜、更快速。如何做到这一点？我们创建一个证明，证明某些交易已经发生，并将这个微小的证明放在链上，而不是让所有交易占用区块链的空间。有了 ZKP，这可以变得非常安全。\r\n\r\n简洁性是一种通用属性，与 \"区块链\"无关 -- 只是出于多种原因，它们恰好非常适合。一般来说，简短地证明某事属实是非常有用的。有几种方法可以说明原因。\r\n\r\n一种方法是考虑*[交易成本](https://en.wikipedia.org/wiki/Transaction_cost)*。一般来说，交易成本越低，创造的价值和财富就越多。如果需要验证的事情减少了，或者验证变得更容易了，那么我们就可以更自由、更轻松地做事。\r\n\r\n有时，当我们填写表格时，会被要求写两次电子邮件地址，以确认是否正确。这样做的目的是防止人为错误，使数据转账更加稳健。还有像校验和这样的东西，在你的 UPS 包裹代码、信用卡号或书籍的 ISBN 代码中多加一个数字，就可以简单地检查所有数字是否正确。显然，所有这些都不是为了防止恶意使用，而只是为了防止[无意的错误](https://en.wikipedia.org/wiki/Checksum)。\r\n\r\n在计算机文件系统中，*哈希*通常用于确保文件的完整性。如果文件的一小部分发生损坏，哈希值就会完全改变。由于哈希值简洁明了（例如一个 64 个字符的字符串），即使底层文件非常庞大，也很容易保存和检查。在此案例中，哈希函数能以安全的方式确保完整性。如果我们只通过保留文件的副本来检查文件的完整性，那就太不切实际了。大文件、小文件都无所谓，哈希值的大小保持不变。哈希值的简洁性使得这种应用成为可能。\r\n\r\n## 你知道什么？\r\n\r\n让我们从压缩、简洁和证明中抽离出来。我们将绕道知识、精神开销和信任。然后，我们将在本节末尾将其与 ZKP 联系起来。\r\n\r\n\r\n\r\n在日常生活中，你知道什么是真的，为什么？如果你每天都看到太阳升起，那么你很可能会期待它明天再次升起。在现代社会，我们在很大程度上可以免受自然界恶劣环境的影响，但另一方面，我们也有很多其他更现代的担忧。其中许多都与我们日常打交道的各种机构有关。\r\n\r\n如果你每天都能从银行提取现金，你是否希望第二天还能再次提取？大多数人可能会说是的，但并不是每个人都能一直这样做。这取决于很多因素：银行是否值得信赖，你是否生活在一个安全的司法管辖区，最近世界经济是否发生了重大事件，你的个人情况如何等等。所有这些因素加在一起构成了一些数据判断点，你可以据此做出判断。\r\n\r\n这显然是一个很小的例子，但生活中充满了这样的交互。所有这些都可以看作是一种精神开销。这在多大程度上会引起关注，取决于你的个人情况和日常交易的复杂程度。例如，企业在与另一方签订合约时可能会更多地考虑这些因素。\r\n\r\n我们建立了一些机制和规则来应对这种不确定性，比如使用声誉服务、独立审计、罚款以阻止不良行为、寻求一些可信机构的认证等。所有这些措施基本上都是胶带，试图找到问题的关键。某些东西是否如其所言？它是否遵循我们制定的规则？它是否值得信赖和可用？\r\n\r\n当你要与多个机构、辖区、公司和人员打交道时，所有这些精神负担都会变得更加沉重。你可能会受到连带影响，比如你的银行倒闭，你无法支付员工工资，从而导致你的企业无法为客户提供服务。需要更多的控制措施。需要更多的停顿来考虑事情是否正确，以及哪些地方会出错。\r\n\r\n我引用一段话来结束本节：\r\n\r\n> 文明的进步是通过增加我们不假思索就能完成的操作数量来实现的。 来自 阿尔弗雷德-诺斯-怀特海\r\n\r\n例如，当你点燃炉子做晚饭时，你甚至不用考虑生火的问题。这与拾柴、保持干燥、生火、持续生火这一非常耗时的过程截然不同。在数学方面，如果没有微积分，我们就无法登上月球。\r\n\r\n![阿波罗 11 号奥尔德林](https://img.learnblockchain.cn/2023/07/21/25907.jpeg)\r\n\r\n有了 ZKP 和简洁的证明，我们就能为不透明的系统引入更多确定性和清晰度。当我们考虑*组合*ZKP时，这一点变得更加强大。即以某种方式将多个证明合二为一，如聚合或递归。\r\n\r\n所有这一切都假定我们可以将上面提到的一些机制或规则（通常是混乱和不一致的）转化为 ZKP 可以理解的形式。我们如何才能做到这一点呢？\r\n\r\n## 通用(General-purpose)\r\n\r\n回想一下，ZKP 允许我们以通用方式证明任意语句。为什么这很重要？\r\n\r\n现有的类似工具和 ZKP 之间的区别就像计算器和计算机之间的区别。一个是用于非常特殊的任务，而另一个则是通用的。这就是计算器和现代计算机之间的区别：\r\n\r\n![帕斯卡计算器](https://img.learnblockchain.cn/2023/07/21/27102.jpeg)\r\n\r\n回顾我们上面举过的具体例子，可以更具体地说明隐私和简洁性。密码是允许你登录某些服务的隐私信息。对于某些输入数据（如文件）的哈希值来说，它为我们提供了一个简洁的东西来检查相等性。\r\n\r\n我们可以将哈希函数形象化如下：\r\n\r\n![哈希函数](https://img.learnblockchain.cn/2023/07/21/25215.png)\r\n\r\n我们在一些已知输入数据上应用特定的哈希函数，如 [SHA256](https://en.wikipedia.org/wiki/SHA-2)  。例如，使用句子 `敏捷的棕狐狸会跳过懒惰的狗`（不带引号）作为输入，并应用 SHA256 哈希函数，结果是哈希值`d7a8fbb307d7809469ca9abcb0082e4f8d5651e46d3cdb762d02d0bf37c9e592`。在句末添加一个`.`，就会得到完全不同的哈希值：`敏捷的棕狐狸会跳过懒惰的狗.`散列值为 `ef537f25c895bfa782526529a9b63d97aa631564d5d789c2b765448c8635fb6c`。\r\n\r\n\r\n\r\n尽管句子只改变了一点点，但得到的哈希值却大相径庭。安全的哈希函数很难被 \"破解\"，而且具有一些很好的特性。例如，如果掌握了哈希值，就无法创建新的初始输入。此外，你也无法轻易构造出一个散列为特定、预定散列值的信息。这些哈希函数被称为*[加密哈希函数](https://en.wikipedia.org/wiki/Cryptographic_hash_function)*。\r\n\r\n我们上面使用的 SHA256 哈希函数是一种特定的加密哈希函数，它的安全需要大量时间和许多人的努力。哈希值本身并不能证明什么。它只有在与其他东西（如直接访问信息或文件）进行比较时才有意义。\r\n\r\n非正式地讲，我们可以把哈希函数看作是证明某些特定信息对应于特定哈希值的证据。我们只能用原始信息来验证这一点。有时，人们会用哈希函数来证明自己写了什么并进行预测--他们写道：\"2040 年 4 月 1 日，外星人将降落在伦敦大本钟顶端，彩票号码 25742069 将中大奖。\"然后提前公开发布这条信息的哈希值，比如在 Twitter 上。当事实证明他们是对的时候，他们就可以公开原始信息，让人们相信他们确实预测了未来，是下一个诺斯特拉达穆斯。\r\n\r\n\r\n\r\n相比之下，我们可以将 ZKP 形象化如下：\r\n\r\n![ZKP](https://img.learnblockchain.cn/2023/07/21/56348.png)\r\n\r\n与上面的哈希函数不同，ZKP 有几个很大的不同点：\r\n\r\n- 我们有多个隐私和公共输入，而不是只有一个（公共）输入\r\n- 我们可以使用任何程序，而不仅仅是加密哈希函数\r\n- 我们能生成可验证及自足（self-contained）证明\r\n\r\n在上面的哈希函数示例中，我们需要公共输入，以便验证信息是否与散列一致。\r\n\r\n对于 ZKP，我们也可以使用*隐私输入*。隐私输入是指只有你能看到的输入。也就是说，你不需要把它透露给任何人，就能生成证明。\r\n\r\n例如，在本文开头的 \"沃尔多在哪里\"案例中，公共输入是 \"沃尔多在哪里\" 的图片。隐私输入则是 Waldo 的实际位置。我可以证明我知道沃尔多在哪里，而无需向你透露隐私输入，即沃尔多的位置。\r\n\r\n同样，如果我有一个数独谜题（一种流行的逻辑谜题），我可以向你证明我知道谜题的解法，而不向你透露解法。在此案例中，公共输入是初始谜题，隐私输入是谜题的解答。\r\n\r\n你可能已经注意到，\"沃尔多在哪里\" 和解数独谜题是两个完全不同的问题。然而，我们可以编写一个简单的程序来表达这两个问题的工作原理，并使用 ZKP 进行证明。这是因为这个特殊程序中的逻辑是通用的，可以计算计算机所能计算的任何东西。\r\n\r\n我们把原本属于密码学或数学的问题--定义加密哈希函数并使其安全--变成了编程问题。要想知道这为什么如此强大，请看下面的一些例子。\r\n\r\n我们现在可以证明，我们知道产生某个哈希值的隐私数据。这就意味着，你可以在不泄露信息本身的情况下，证明你掌握了某条信息，比如一份重要文件。\r\n\r\n为了更好地理解通用计算的强大功能，让我们来详细了解一下群签名（group signature）。群签名是一群人共同签署一份文件的方式，但不会暴露他们的身份。例如，《联邦党人文集》就是由代表多个个人的化名 Publius 签署的。就像 SHA256 哈希函数一样，有一种方法可以用密码学和数学来表达群签名。这非常了不起，需要大量的密码工程技术才能开发出来。但有了通用 ZKP，任何人都可以用几十行 Circom（一种 ZKP 编程语言）代码来表达同样的内容。\r\n\r\n由于其通用性，我们可以很容易地进行特别构造。例如，你可能有一张身份证，上面有你的全名、地址和其他个人信息。要参加某个活动，你可能需要年满 18 岁并持有有效门票。你可能不希望随便一个人或在线系统看到你的地址，或冒着身份证被盗的风险。有了 ZKP，你就可以证明这一点：\r\n\r\n- 你持有有效身份证件\r\n\r\n\r\n- 该身份证在过去 5 年内由认可机构签发\r\n- 身份证最近未被吊销或报失\r\n- 年满 18 周岁\r\n- 你已购买有效的活动门票\r\n- 门票之前未被使用过\r\n\r\n除上述情况外，不透露你的任何其他信息。\r\n\r\n有了 ZKP，我们现在就有了一个好的工具，可以让人们以各种方式进行协调，尤其是在需要隐私和简洁的系统中。我们将在应用部分看到更多的例子。\r\n\r\n很多时候，你的想象力才是你所能表达的极限。\r\n\r\n## 为什么是现在？\r\n\r\n为什么现在开始流行 ZKP？这既有技术原因，也有社会原因。\r\n\r\n从技术上讲，[ZKP 相当新](https://en.wikipedia.org/wiki/Zero-knowledge_proof#History)。从数学上讲，它们只存在了几十年。与计算本身类似，即使在理论上，它也需要一段时间才能变得高性能和实用。\r\n\r\n在此之后，必须有人将这些论文和密码协议转化为实用的东西。第一个值得注意的例子是 2016 年的隐私保护加密货币 [Zcash](https://eprint.iacr.org/2014/349.pdf)。它最初是由密码朋克和研究人员撰写的一篇论文)。第一个版本是将研究和工程应用于最终产品和系统的一项令人印象深刻的壮举。虽然该系统存在许多问题，而且远非最佳，但它是在现实世界中使用 ZKP 的第一个真正实用的例子。这向人们表明，在现实世界中使用 ZKP 是可能的，也是切实可行的。这导致了 ZKP 研究和工程工作的爆炸式增长，尤其是在最近几年。\r\n\r\n以太坊和 Zcash（一种保护隐私的加密货币）等公共区块链在其中发挥了重要作用。区块链最擅长的是抗审查和透明度。这是以缺乏隐私和可扩展性为代价的，而这正是 ZKP 所擅长的。从这个意义上说，它们是天然的契合点。再加上区块链社区对高级加密技术的需求，难怪很多创新都发生在区块链和 ZKP 的交叉点上。由于许多资本雄厚的区块链项目，这也让传统上学术性较强的研究和工程领域有了更多投资。\r\n\r\n考虑到所涉及的复杂性，包括应用数学、密码学、关于特定 ZKP 系统的论文、新型证明系统的实施、工具以及涉及其他复杂领域的应用，事情发展得非常快。每年，甚至每个月，都会有新的研究论文，其中包括新技术、改进的工具和应用。新研究成果与实施和应用之间的反馈环越来越紧密。虽然难度依然很大，但入门却越来越容易。随着工具的改进，开发人员需要了解 ZKP 背后的数学知识也越来越少。\r\n\r\n\r\n\r\n就 ZKP 的性能而言，摩尔定律的形式正在发生。摩尔定律是指晶体管的数量大约每两年翻一番。这就是计算机革命的起因。在 ZKPs 中，几年前还只是白日梦、被视为完全不切实际的项目，现在已经开始实施，比如 zkVM 和 zkML。根据经验，在 ZKP 领域，每隔一年左右就会有一个数量级的进步。这是因为它是一项新技术，可以在堆栈的多个层面（从我们编写的程序到我们使用的系统，再到硬件本身）进行积极优化。我们没有理由相信这种趋势会很快停止。\r\n\r\n\r\n\r\n![摩尔定律](https://img.learnblockchain.cn/2023/07/21/3327.png)\r\n\r\n## ZKP 是如何工作的？\r\n\r\n本节从高层次解释了零知识证明的工作原理*。\r\n\r\n本节从高层次概述了零知识证明的工作原理。其中不包括任何数学或代码。\r\n\r\n### 基础知识\r\n\r\n我们首先介绍一些术语。会有一些新的术语需要学习，但随着学习的深入，你会慢慢掌握的。\r\n\r\n- **协议（Protocol）**：解释应遵循的正确行为的规则体系\r\n- **证明（Proof）**：确定陈述真实性的论据\r\n- **证明者（Prover）**：证明或演示某事的人\r\n\r\n\r\n- **验证者（Verifier）**：保证陈述正确的人\r\n- **隐私输入（Private input）**：只有证明者能看到的输入，通常称为**见证（witness）**\r\n- **公共输入（Public input）**：证明者和验证者都能看到的输入，通常称为**实例（instance）**。\r\n\r\n虽然学习该领域的术语很有帮助，但一些比喻也有助于更好地理解其中的含义。我们将陆续介绍更多术语。\r\n\r\n协议无处不在，可以是隐性的，也可以是显性的。在国际象棋游戏中，约定俗成的规则是两位棋手轮流按照游戏规则走一步棋，直到游戏结束，其中一人获胜，或者双方和棋。从理论上讲，下一步棋所需的时间并不重要，但在实际操作中，我们会尽量减少互动双方之间的通信成本。因此，我们可以将其视为一盘真正的快棋。\r\n\r\n我们可以把夏洛克-福尔摩斯想象成证明者，在他的最后陈述中，他提出了一系列优雅的论据，即证明（proof），证明某人是凶手。然后，这必须由验证者（例如法官或陪审团）验证为真，排除合理怀疑。证明者指的是一个实体，这里是福尔摩斯，他提出证明，然后必须进行验证。因为证明是自足的（self-contained），所以任何人都可以成为验证者，包括作为读者的你，你必须相信所提供的推理，使故事可信。\r\n\r\n隐私输入是一些只有福尔摩斯知道的知识，例如有人在他耳边说的一些秘密信息。这通常被混淆地称为见证（witness），大概是因为法庭上的证人拥有一些隐私信息，而这些信息会被添加到证据堆中。而在 ZKP ，这些隐私信息不会与验证者共享，在这个例子中也不会与法官和陪审团共享。\r\n\r\nZKP 在证明者（Prover）和验证者（Verifier）之间建立了一个协议（Protocol）。如果证明者和验证者不需要像下棋或跳舞那样直接互动或交流，那么这个协议就是非交互式的。取而代之的是，证明者提出一个独立的证明，并在稍后的某个时刻得到验证。大多数ZKP一开始都是*交互式*的--即需要多次来回--然后我们使用一些数学技巧使其成为[非交互式](https://en.wikipedia.org/wiki/Fiat%E2%80%93Shamir_heuristic)。你可以把 \"非交互式\" 想象成两个棋手，他们在说了几句话之后，就知道了对方要走的每一步棋，所以他们甚至都不用开始下棋，因为他们已经知道了棋局的结局。\r\n\r\nZKP 有很多种。我们经常谈论zk-SNARKs，它代表零知识简洁非交互式知识论证（Zero Knowledge Succinct Non-Interactive ARguments of Knowledge）。零知识和简洁分别对应于上述的隐私和压缩。提到了非交互式。\"知识论据\"与证明基本上是一回事。zk-SNARKs 也有许多不同的类型。\r\n\r\n一个好的思维模型是把 ZKP 想象成一个动物园。那里有很多动物，我们可以用不同的方式对它们进行分类：这些动物有四条腿，这些动物有条纹，鲍勃去年带来的动物，等等。有些类别比其他类别更有用。事实上，有些系统甚至没有 \"零知识\"（Zero Knowledge）！这些系统通常只被称为 SNARK。作为一个社区，我们通常称这种不同动物的动物园为 ZK，即使有许多系统实际上并不使用零知识属性。\r\n\r\n### 协议（Protocol）\r\n\r\n回到我们的协议，我们有一个证明者和验证者。证明者使用证明者密钥（prover key,）、隐私输入和公共输入创建一个证明。验证者使用验证密钥（*verification key* ）和公共输入验证证明，并输出真或假。\r\n\r\n我们有了两个新东西：证明者密钥和验证者密钥。这就是证明者和验证者施展魔法的地方。你可以把它们想象成一把普通的钥匙，让你进入某个地方并做某些事情，也可以把它们想象成一根魔法棒，让你做某些事情。我们从一个叫做*setup*的特殊仪式中获得这些密钥，这是一个初始准备阶段，本文不再详述。\r\n\r\n请注意，只有证明者才能访问隐私输入。证明者如何使用证明者密钥、隐私输入和公共输入将其转化为证明呢？\r\n\r\n回想一下之前的 ZKP 插图：\r\n\r\n\r\n\r\n![ZKP](https://img.learnblockchain.cn/2023/07/21/32584.png)\r\n\r\n我们有一个特殊的程序（正式名称为*电路 - circuit*），可以编码用户关心的逻辑。例如，证明他们知道得出某个哈希值的数据。与普通的计算机程序不同，这个程序是由*约束（constraints）*组成的。我们要证明的是，所有约束条件都与隐私和公共输入保持一致。\r\n\r\n最后，验证器将这个简短的证明与验证密钥、公共输入和包含所有约束条件的特殊程序结合起来，并在排除合理怀疑的情况下确信证明是正确的，然后输出 \"true\"。如果不正确，则输出 \"假\"。\r\n\r\n以上观点略显简单，但却抓住了事情的本质。\r\n\r\n#### 约束（constraints）\r\n\r\n构成上述特殊程序的约束条件是什么？约束是一种限制或制约。例如，\"1 到 9 之间的数字 \"就是一个约束。数字 7 满足这个约束，而数字 11 不满足。如何将程序写成一组约束？这本身就是一门艺术，让我们先看一个简单的例子：数独\r\n\r\n在数独游戏中，我们的目标是在棋盘上找到满足某些约束条件的解。每一行都必须包含数字 1 到 9，但只能包含一次。每列和每个 3x3 子方格也是如此。我们会得到一些初始的起始位置，然后我们的任务就是以满足所有这些约束条件的方式填入其余的位置。最棘手的部分是找到同时满足所有限制条件的数字。\r\n\r\n![数独](https://img.learnblockchain.cn/2023/07/21/74126.png)\r\n\r\n通过 ZKP，证明者可以构建一个证明，证明他们知道某个谜题的解。在此案例中，证明包括使用一些公共输入（初始棋盘位置）和一些隐私输入（谜题的解法）以及一个电路。**电路由表达谜题的所有约束条件组成**。\r\n\r\n之所以称其为电路，是因为这些约束条件彼此相关，我们将这些约束条件连接起来，有点像电路。在此案例中，电路处理的不是电流，而是数值。例如，我们不能把任何类似 \"香蕉 \"的值添加到我们的行约束中，它必须是一个数字，而且这个数字必须介于 1 和 9 之间，以此类推。\r\n\r\n验证者拥有相同的电路和公共输入，可以验证证明者发送给他们的证明。如果证明是有效的，验证者就会确信证明者已经找到了该谜题的解。\r\n\r\n事实证明，很多问题都可以用一组约束来表示。事实上，我们能用计算机解决的任何问题都可以用一组约束来表示。\r\n\r\n### 数独示例\r\n\r\n让我们把学到的有关 ZKP 各部分的知识应用到上面的数独例子中。\r\n\r\n在数独游戏中，我们的特殊程序电路需要两个输入：\r\n\r\n- 作为公共输入的数独谜题\r\n- 数独谜题的解作为隐私输入\r\n\r\n电路由一系列约束条件组成。所有这些约束条件都必须为真。这些约束条件是这样的\r\n\r\n- 谜题和谜底中的所有数字必须介于1和9之间\r\n- 解决方案必须是谜题中所有位置均放置了数字\r\n- 所有行中必须包含从1到9的数字，且每个数字只出现一次\r\n- 所有列中必须包含从1到9的数字，且每个数字只出现一次\r\n- 所有子方格中必须包含从1到9的数字，且每个数字只出现一次\r\n\r\n如果一道谜题及其解法的所有这些限制条件都为真，那么我们就知道它是一个有效的解法。\r\n\r\n证明者 Peggy 使用她的神奇证明者密钥、谜题和解法，将其与特殊程序结合，创建一个证明。证明非常简短，不到 1000 个字符。证明是自足的（self-contained），验证者可以通过它获得验证证明所需的所有信息。你可以把它想象成一个魔法咒语，它能实现你的愿望，而你无需了解其中的细节。\r\n\r\n下面是 19 世纪一位威尔士医生写的一本魔法书中的咒语：\r\n\r\n![魔法咒语](https://img.learnblockchain.cn/2023/07/21/91893.png)\r\n\r\n下面是一个由 Circom/snarkjs 库生成的零知识证明示例：\r\n\r\n![Circom 证明](https://img.learnblockchain.cn/2023/07/21/93073.png)\r\n\r\n在此案例中，魔法确实起作用了。\r\n\r\n验证者 Victor 使用他的验证密钥、原始谜题输入，验证 Peggy 发送的证明是否正确。如果正确，则输出 \"真\"；如果不正确，则输出 \"假\"。咒语要么有效，要么无效。这样，Victor 就确信 Peggy 知道那个特定谜题的解法，而实际上并没有看到解法。就是这样。\r\n\r\n\r\n\r\n#### 一些特性\r\n\r\n我们说 ZKP 具有某些技术特性：\r\n\r\n- 完备性（Completeness） -- 如果声明为真，那么验证者将被证明所说服\r\n- 可靠性（Soundness） -- 如果语句为假，验证者将不会被证明所说服\r\n- 零知识（Zero Knowledge） -- 如果语句为真，除了它为真这一事实外，不会透露任何其他信息\r\n\r\n此外，对于 zk-SNARKs 来说，证明是简洁的，这意味着它基本上不会随着程序变得越来越复杂而变大。\r\n\r\n在实际的 ZKP 中，我们还关心许多其他特性：\r\n\r\n- 系统做了哪些数学假设？\r\n- 安全性如何？\r\n- 是否需要可信的设置？\r\n- 生成证明有多难？时间和其他资源\r\n- 验证证明有多难？时间和其他资源\r\n- ZKP 系统是否允许将多个证明聚合在一起？\r\n- 是否有可供程序员使用的 ZKP 系统库？\r\n- 用于编写特定 ZKP 系统程序的语言的表现力如何？\r\n- 等等。\r\n\r\n正如你所看到的，ZKP 有很多考虑因素和不同的变体。不过不用担心，要点基本上都是一样的，而且根据你的兴趣所在，你可以对其中涉及的许多技术细节一无所知。回到动物园的比喻，就像对待动物一样，你可能并不想成为一名生物学家。相反，你可能想和一些动物打交道，或者你只是想养一只宠物，甚至只是想摸摸你朋友的狗。\r\n\r\n## 应用\r\n\r\n*本节将举例说明 ZK 当前和未来的应用*。\r\n\r\nZKP 有许多应用。一般来说，我们仍处于早期阶段。很多焦点仍然集中在底层协议和基础设施，以及区块链的特定应用上。要想更好地理解区块链的具体例子，最好对公共区块链的工作原理及其面临的挑战有一定的了解。不过，这并不是必要条件。在本节中，我们将介绍一些更有趣的应用。我们将先看看现在已经上线的应用，然后再看看即将上线的应用。\r\n\r\n> 未来已来。只是分布还不均匀。来自 威廉-吉布森\r\n\r\n![ZKP魔法](https://img.learnblockchain.cn/2023/07/21/1261.png)\r\n\r\n### 当前已应用\r\n\r\n**电子现金**：要在网上建立类似现金的支付系统，就必须像实物现金一样具有可替代性和私密性。可替代性是指一种商品可被另一种相同商品替代的特性。也就是说，你的钱和我的钱没有区别，它们都是同样有效的支付形式。与比特币或以太坊不同，我们可以使用 ZK 使交易历史隐私化。这样，你的交易历史就不会被公开，从而确保电子现金的可替代性。目前，Zcash 等系统以及[Tornado Cash](https://learnblockchain.cn/tags/Tornado.cash)等相关系统都采用了这种方式。\r\n\r\n**匿名信号** ：通常，我们可能需要在不暴露身份的情况下证明自己隶属于一个具有某些特征的群体。其中一个例子是证明自己是某个群体的一员；另一个例子是投票。这意味着你不会把自己的身份与敏感的行为联系在一起，比如你投票给哪个政党，或者泄露其他不必要的信息。目前，[Semaphore](https://semaphore.appliedzkp.org/)等系统中就有类似的机制，而且还有很多变种。\r\n\r\n**ZK Rollup**： 允许更多、更便宜、更快速的交易。以太坊区块链空间有限，价格昂贵，需求量大。我们使用所谓的第二层（L2） [Rollup](https://learnblockchain.cn/tags/Rollup) ，与主区块链（L1）分开进行交易。一旦有一定数量的交易进入 L2 层，它就会将其 \"打包\"到 L1 层。ZKP 在这方面非常有用，因为我们可以（i）证明交易执行正确，（ii）创建一个简洁的证明，只占用 L1 上的少量空间。这就使得交易对用户来说更便宜、更快捷，同时具有近乎同等的安全性。由于证明整个以太坊虚拟机（EVM）执行的复杂性，许多 ZK Rollup 解决方案从关注简单商资产的交换开始。目前在 Loopring、zkSync Lite、dYdX 和 Starknet 等系统中都有应用。\r\n\r\n\r\n\r\n**ZK-EVM:** 与 ZK Rollup 类似，但具有通用性，因为可以执行任何类型的交易或程序。以太坊有一个 EVM，它就像一台全球共享的通用计算机（任何人都可以写入）。通过使用 ZKP 编写该机器的逻辑，我们可以证明在以太坊上编写的任何程序的正确执行，并构建一个简洁的证明，证明该程序被正确执行。这有多种使用场景，但最直接的使用场景是扩展和允许更便宜、更快速的交易。目前已在 Polygon zkEVM、zkSync Era 等系统中使用，其他一些[ZKEVM](https://learnblockchain.cn/article/5024)系统也即将使用 。\r\n\r\n**ZK-VM**: 部分原因是针对像 EVM 这样的 \"SNARK不友好\" 平台的复杂性，许多项目选择做一个独立于以太坊的新区块链。这意味着他们可以首先优化虚拟机，以便更好地与 ZK 协同工作。根据具体系统的不同，这可以实现区块链状态的隐私和简洁验证。Mina 已经上线，Aleo 等系统正在积极开发中。\r\n\r\n> 对snark不友好的平台或函数指的是大多数现代计算机原语都是为特定的计算机体系结构设计的。这种架构与编写约束时的架构非常不同。例如，SHA256哈希函数就是一个典型的snark不友好哈希。有些人创建了SNARK或zk友好的函数，例如Poseidon哈希函数，专门设计用于zkp。这些在zkp中更容易实现，并且效率可以提高100倍或更多\r\n\r\n**黑暗森林**: 黑暗森林是一款不完全信息实时策略游戏。基于 ZK 的不完全信息游戏有一个 \"加密战争迷雾\"，玩家只能看到世界的一部分，这是 ZK 强制实施的。与《星际争霸》等传统游戏相比，即使是中心化服务器也无法获得所有信息。由于其程序化的特性，这使得新颖的游戏方式成为可能。 \r\n\r\n**ZK 跨链桥** - 跨链桥允许你在不同的区块链和系统之间移动资产。这些跨链桥很难保证安全，而且经常被黑客攻击。有了 ZK，我们可以更安全、更快速地连接资产，而无需依赖可信的第三方或容易出错的方法。目前，zkBridge 已投入使用，Succinct Labs 等项目也正在进行相关工作。\r\n\r\n**隐私身份** : 随着越来越多的独立系统需要并托管我们的在线身份，个人最好能够拥有、整合并保持这些去中心化的在线身份的私密性。目前，Sismo 等项目已经实现了这一点，其他项目也在开发类似的系统。\r\n\r\n以上只是几个例子，绝不完整。我们还没有谈到隐私不可抵赖声誉、导出 Web2 声誉、抗sybil 拒绝服务保护、抗胁迫证明、复制证明、匿名空投、分离度证明等。\r\n\r\n## 即将来临的\r\n\r\n**ZK-EVM（以太坊等价性）**： [ZK-EVM](https://learnblockchain.cn/article/5024) 有不同的类型，实现起来更具挑战性的是那些完全等同于以太坊的 ZK-EVM。其他 ZK-EVM 会采取一些捷径，让生成证明变得更容易。完全等同于以太坊的 ZK-EVM 与当前的以太坊系统没有区别。这意味着我们可以用简洁的证明来证明存在的每一个区块的正确执行。你可以用手机验证整个链的完整性，完全依靠数学，而无需信任第三方或使用昂贵的机器。目前 ZK-EVM 社区团队正在开发中。\r\n\r\n**通用可证明计算**：世界上大多数计算都不在 EVM 中进行，而是在其他系统中进行。基于 WASM 和 LLVM 的程序非常常见。我们可以利用 ZK-EVM 中的相同方法，进行通用的隐私可证明计算。例如，我们可以在不透露任何其他信息的情况下证明数据库包含特定记录。目前，许多不同的团队，例如 Delphinus Labs、RISC Zero、Orochi Network 和 nil.foundation，都在研究这一技术。\r\n\r\n\r\n\r\n**ZK 机器学习（ZK ML）**：我们可以在链外私下证明某些计算是正确完成的，然后公布计算正确的证明。这意味着，我们可以使用隐私数据来训练更好的模型，而不会泄露这些数据。例如，敏感文件、语音，甚至 DNA 等用于发现健康问题的数据。这既提高了可扩展性，又保护了用户隐私。目前已有一些概念验证（PoC），如 MNIST（机器学习中用于识别手写数字的常用测试），人们正在研究更复杂的东西，如 ZKP 内部的神经网络。 \r\n\r\n**照片真实性**：证明照片和视频等内容的出处，包括标准的后期处理编辑。也就是说，证明照片是在特定时间和地点拍摄的，并且只进行了基本的大小调整、裁剪和灰度使用（美联社认可的操作列表）。已经有一些概念证明工作。\r\n\r\n**合规性**：证明隐私交易符合某些规定，或某项资产不在特定的黑名单上。在不泄露资产的情况下证明交易所有偿付能力。Espresso Labs 等系统已经做了一些工作，有些系统已经有了简单的版本。\r\n\r\n**隐藏意图** ：公共区块链的用户有他们想要实现的特定目标，这些目标可以用*意图*来表达。例如，用户可能想用一种代币兑换另一种代币。用户可以将自己的意图告诉其他用户，并与合适的对手方进行匹配。最好能对这些意图进行屏蔽（隐藏 \"谁 \"而不是 \"什么\"，类似于 Zcash 中的屏蔽交易）或完全保密。目前，Anoma 正在从屏蔽意向匹配开始研究。要使意图匹配完全保密，可能需要在密码学方面取得突破性进展，这与本节最后一个例子类似。\r\n\r\n**自主世界**：这是《黑暗森林》等作品的延续。世界可以是物理的，也可以是概念的，如纳尼亚世界、基督教、美元世界、比特币或英联邦法律。根据这些世界的运行情况，如果任何人都可以在不破坏其客观性的情况下改变规则，那么这些世界就可以是自主的。目前，0xPARC 基金会正在游戏和创建这些世界的背景下进行探索。\r\n\r\n**数据真实性证明**：从网络应用程序中导出数据，并以非公开方式证明相关事实。使用 TLS 协议，这意味着它可以在任何现代网站上运行。目前由 TLSNotary 负责开发。\r\n\r\n**核裁军**：  允许检查核设施的人在不检查任何敏感的内部工作原理的情况下，确认某个物体是否是核武器。已有物理模拟工作的论文。\r\n\r\n**和谈与高风险谈判**： 在谈判中，人们通常会有一些硬性限制，他们不希望向对方透露这些限制，以削弱自己的谈判能力。通过对这些限制进行明确编码，双方可以就一些高度复杂的领域进行谈判，并在不透露其精确参数和限制细节的情况下达成协议。这样，互不信任的双方也能达成某种协议。这可能需要在多方计算（MPC）方面取得一些突破，它允许我们在共享秘密的基础上进行计算。\r\n\r\n同样，这里并没有提到人们正在研究或思考的所有类型的问题。未来肯定还会有更多的东西。正如你所看到的，我们可以用 ZK 做很多事情。\r\n\r\n你可能会问，为什么这些应用中有很多涉及区块链。上一节 \"为什么是现在？\"已经部分回答了这个问题。ZK 是一种与以太坊等区块链正交的技术，我们可以不使用区块链，但在很多情况下，它只是一种可以利用的好工具。\r\n\r\n同样，从事这些工作的人群和他们关心的直接问题往往是重叠的。随着这个领域的成熟，我们可以预见，ZK 应用中的 \"区块链 \"部分将不再仅仅是一个实施细节，而这在某种程度上已经发生了。再进一步看，\"ZK\"部分也很可能会消失，它将只是一个碰巧使用 ZKP 的应用程序。\r\n\r\n\r\n\r\n最后，当在线信息和类似的加密技术被开发出来时，它是由军方和互联网公司使用和开发的。这不是邮局或某些从事实物安全运输的公司的创新成果，即使理论上有这种可能性。\r\n\r\n在本节的最后，我想引用巴里-怀特哈特（Barry Whitehat）在被问及对 ZK 未来的预测时的一段话作为结束语，他是一位著名的 ZK 研究员，在以太坊基金会的隐私和可扩展性探索（PSE）团队工作：\r\n\r\n> \"到 2040 年，会有人因为使用零知识证明而获得诺贝尔和平奖\"。\r\n\r\n离奇而大胆？当然。结果会是真的吗？也许不会。但可能吗？绝对有可能。这是一个耐人寻味的前景。将其视为真实可能的心智模式与立即将其一笔勾销的心智模式之间有什么区别？要让这样的事件成为现实的结果，必须发生什么？\r\n\r\nZKP 是一种全新的、非常有效的工具。限制我们的往往是我们对其潜在应用的想象力。\r\n\r\n## 结论\r\n\r\n*本节对文章进行了总结，并提出了下一步的计划*。\r\n\r\n在本文中，我们了解了什么是 ZKP、为什么要关注它们以及它们何时有用。我们还了解了它们的工作原理，以及它们为我们提供了哪些属性。最后，我们探讨了一些应用，包括当前和未来的应用。\r\n\r\n我希望这能让你更好地理解 ZKP 的本质，或许还能让你产生一些 \"啊哈\"时刻，并启发你以新的方式思考问题。也许它还能帮助你在未来追随 ZKP 的魔力。\r\n\r\n在今后的文章中，我们将更深入地探讨其中的一些方面，我们还将研究更多技术方面的问题，以便更好地理解 ZKP 的工作原理以及它们的用途。\r\n\r\n如果某些具体内容引起了你的兴趣，或者你希望在今后的文章中看到某些具体内容，请随时通过 [Twitter](https://twitter.com/oskarth) 或电子邮件与我联系。\r\n\r\n## 致谢\r\n\r\n感谢 Michelle Lai、Chih-Cheng Liang、Jenny Lin、Anna Lindegren 和 Eve Ko 阅读初稿并提供反馈。\r\n\r\n\r\n\r\n本翻译由 [DeCert.me](https://decert.me/) 协助支持， 来DeCert码一个未来， 支持每一位开发者构建自己的可信履历。"},"author":{"user":"https://learnblockchain.cn/people/412","address":"0x9e64a306aB319811C5a1270F2CA9f6E1e4857c84"},"history":"bafkreiesuuvtcq42bbwqqv5ztctsr62eez75wh3yogsybc6busqho2h57u","timestamp":1725250395,"version":1}