Manta Network

Posted on Oct 24, 2022Read on Mirror.xyz

如何用一个魔方故事理解 zkSNARK |ZKP101

Kenny(Manta Network 核心贡献者):

大家好,欢迎大家,这是 Manta Tech 系列讲座的第二期。上周 Adam 和我们聊了共识协议。今天 Todd 将跟我们分享零知识证明的知识。

Todd(Manta Network 密码学工程师):

感谢大家来听今天的讲座。我是 Todd,Manta Network 的密码学工程师,在加入 Manta 之前,我拿到了数学的 PHD,然后对 Web3 以及其与数学的融合产生了浓厚的兴趣,而零知识证明正是数学可以在 Web3领域能做的最酷的事之一。请大家不要担心,我今天讲的内容不需要有数学方面的背景。我认为你只要保持好奇,认真听讲,就完全可以理解。我今天要讲的话题是《SNARKs, ZKPs 以及那些国家安全局(NSA)不想你知道的事》。

今天讲座的目的是向大家解释什么是 zkSNARKs,它大概是什么以及我们可以用它来做什么,Manta 又用它在做什么。zkSNARK 是一个英文缩写,我们先来看看它代表了什么。ZK 代表了零知识。S 代表简洁性,N 代表非交互性,ARK 是指知识论证。所以,zkSNARK 的全称是简洁非交互式零知识证明。这个词听起来很复杂也绕口,而且也没能解释它到底是什么。你的第一反应可能是会去查找字典,看看书里关于 zkSNARK 是怎么说的。如果这样,你很可能会发现一大堆没有什么帮助而且晦涩难懂的公式术语。而我今天想要做的是通过一个小故事来对 zkSNARK 进行基本的解释。我这里有个小故事,我会用它来演示到底什么是 zkSNARK。

演示本身不会很长,所以我会留足够的时间来回答大家的问题,如果你有问题,请尽管留言,我会在后面给大家解答。

这是发生在新冠毅清疫情封控期间的一个故事。大家都很崩溃,我也不例外,于是我找到了一种在家自我消解的方式——三阶魔方。我记得小时候非常想要破解三阶魔方,但是一直没有找到正确的方法。于是,疫情期间我在家又重新拾起了魔方,想要再次尝试找到破解的办法,甚至都无心工作了。因为这对我来说已经成了一种执念:我一定要找到破解它的方法!而最好的办法是找一个人来教我。

于是,我在网上发布了一条帖子,寻找三阶魔方教练。只要有人可以教我正确解开魔方的方法,我就会付给他100美元。很快,也就是几分钟后,我的信箱里就收到了各种人的回复说他们肯定可以教会我。于是我从中挑选了一个看起来最厉害的人。因为是在疫情期间,我们不能线下见面,只能通过 zoom 来进行线上教学。于是对方说,你先付给我钱,我们就可以开始教学了。我当时有些天真,直接就把100美元转给了对方。而当我们开始 zoom 会议的时候我才发现他们根本就不懂怎么玩三阶魔方。但是又能怪谁呢?这其实是我自己的问题,我不应该在没有确定他们有解决方法的时候就贸然把100美金转过去。事已至此我也没有办法,只能接受事实。这对于我来说是很重要的一课,接下来我要继续寻找魔方教练,但在付款前需要确认他们真的知道破解方法。

问题是,并没有什么政府机构来对魔方教练进行监管,也没有大学会颁发解决魔方的证书。我自己必须想到一个办法可以验证他们真正懂得如何破解魔方。再次之前,我们先来介绍一些零知识证明术语,可以方便大家更好地理解这个故事。

我现在需要的是找到一种方法,让人们说服我相信他们有能力解决三阶魔方。这也是每个 zkSNARK 中都存在的——一段需要被证明的声明。在这个例子中,这个声明是“我可以破解三阶魔方”。

zkSNARK 中存在两方——证明者和验证者。证明者就是那个想要证明一段声明的人,在这个例子中,也就是要说服我相信他可以破解三阶魔方的那个人。而我就是验证者,需要被说服或者验证这个证明是否可信的人。然后有一个协议,协议中包括证明者来创建他们的证明以及验证者来验证该证明是否有效的一系列步骤。我刚刚讲这些名词,是因为不管什么时候你听到 zkSNARKs,总会有这四个组成部分——声明、证明者、验证者以及协议。

我们现在回到三阶魔方的故事上来,我会举两个坏协议的例子。第一个:我把在网上的寻募启示改了一下,我说要花100美元来寻找一名魔方教练,但在付款之前,你必须要先发给我一段你玩魔方并能完整拼好的视频,这个视频就成了证明,我观看视频就是验证的过程,通过视频来判断是否真实。

我自我感觉这个协议相当不错。后来就收到了一封邮件,那个人说他自己可以做我的魔方教练,但是并不能发给我视频,因为他认为我一旦看完了视频就可以从中学习到如何拼魔方。确实,如果有个人发给我视频,我会从视频里学到一些拼魔方的技巧,甚至会学会如何完全破解魔方问题。如果你是那个想要出售知识的教练,他的话确实是有道理的。能够证明你拥有某项知识的证明不能透露你想要出售的知识本身。如果我已经掌握了一部分知识,为什么还要再付钱给你呢?是的,他说的确实有道理,而且指出了这个协议中的一个漏洞——这个证明本身泄露了很多知识,因此不具有我们所说的“零知识”的特性。

于是我跟那个人说,那你有何建议呢?你怎么能在证明自己可以破解魔方同时又不透露太多关于过程的信息呢?他回答说,自己可以在视频前打乱魔方,然后将手从镜头上拿开,直到解开魔方,最后向你展示最终拼好的魔方。这样我既知道他懂如何破解魔方,也看不到具体是怎么做到的。

我说ok,这看起来挺有道理的。于是他发给我一个视频,我看过后觉得没问题就转给了他100美金,并开始了我们的魔方培训。但不幸的是,我又一次上当了,这个人也根本不懂如何破解魔方。我思考了一下,他是在视频前打乱了魔方,但当他把手从镜头中移开的时候,只是换了一个已经被拼好的魔方而已,然后给我展示了出来。

尽管这个证明是零知识的,实际上并不可信。我真是太蠢了,竟然会上当。在我们谈论证明或知识论证时存在一个基本的矛盾,那就是它必须是可信的。论证本身必须给出很多可信的信息,比如他演示从开始破解魔方到结束的整个过程,但这又透露太多信息了。另外一个极端的例子是对方一点信息都不透露,但是这又一点不具有可信性。

这就是现在我们所面临的两难困境,我们想要找到一项协议既具有零知识特性——通过观看视频,我从中不会得到破解魔方的任何信息,但这个证明同时又具有可信性——一个不懂如何破解魔方的人给不出这样的证明。这样就更加困难了,很长一段时间里,我都担心自己永远学不会怎么破解魔方了,因为这看起来无解,我只会不断被骗。

直到有一天,我忽然想到一个解决办法。什么人才能称得上一个真正的魔方达人呢?我意识到,一个真正的魔方达人并不是那个可以把打乱的魔方按照经典的方式来拼成每面同色样子的人,而是可以拼成我指定的任何样子的人。

意识到这点后,我想到了一个新的协议。首先,我先把魔方打乱,将6面都拍照发帖。在帖子中我提出,必须要把魔方拼成图中的这个样子,如果你可以做到并发给我照片,那我就会付你100美元来做我的魔方教练。

在这个协议中,被我打乱的魔方就是一个挑战。如果有人能把魔方拼成一样并拍照发我,这就是一个证明。验证的过程是自己通过检查他们的图片是否符合条件。如果你想想我打乱魔方有多少可能性,那么就知道这样是具有可信性的。

因为打乱魔方的方法可能会有百亿亿种,因此如果对方并不是真的知道如何解决魔方,那么他将魔方拼成我想要的样子的可能性就非常低,仅仅靠运气是很难的。

所以,如果你能把魔方拼成和我一样,那一定是因为你真的很懂魔方。这就是我最后想出的办法,我准备把它发到网上,如果这次还不成功就算了,毕竟之前我已经浪费了200美元。

幸运的是,这次一切都很顺利,我收到的回复很恨少,毕竟这种方式要比传统的拼魔方要更难。从一个随机的样子拼成另外一个随机的样子要比单纯的拼魔方难多了。

但是如果你真的想要做我的魔方教练,赚这100美元,我这样对魔方技能的要求其实也是合理的。当然最后,我确实找到了一位很出色的魔方教练,他教会了我所有拼魔方的技能。其实,这个故事挺傻的,当然不是真的。这个故事只是为了解释零知识证明,尤其是 zkSNARK。因此我描述的是对于寻找魔方教练难题的一个 zkSNARK,当然,这并不是一个真实存在的难题。

那么我们现在为何不来想想现实生活中真正存在哪些问题呢?比如在区块链上,我们想要用在区块链上的 SNARK 会有什么样的条件?哪种协议才是有用的?让我们暂且忘记寻找魔方教练这回事,来找点真正有用的场景吧。

要我说,首先第一个很明显的条件是简洁性,简洁性意味着证明本身应该很小,验证的过程应该很快。在我举的例子中,证明就是几张我随机选择的魔方六面图。几张图片来说数据并不大,而且验证的过程也比较快,我只需要肉眼检查一下魔方的每一面就可以。因此,这可以说是一个具有简洁性的协议。

为什么对于一个区块链应用来说,简洁性很重要呢?因为证明需要提交上链,而数据上链是很贵的,所以我们需要这个证明可以尽可能的小,我们提交上链的数据越少越好,这样验证时间就可以变快。区块链需要自己验证,而验证的成本也是高昂的,要么就需要花费更长的验证时间,要么就是花费更高的 gas 费。不管是那种形式的简洁性对于区块链来说都是很重要的。关于 zkSNARK 的另外一点是非交互性,我之前提到过 N 代表非交互性。首先,我来解释下什么是交互。

在魔方的例子里,实际上并不是 SNARK,因为它是具有交互性的,我自己拍下了打乱后魔方的样子,然后对外发送了一条关于挑战本身的信息。别人看到后也会把可以证明自己的信息回复给我。这样我们就做到了双向信息互通,也就是一个交互性的证明体系。但在区块链中,我们并不希望这样,因为验证者不是像我一样的人,而是区块链本身。所以我们只需要将信息发送给区块链,然后并不需要区块链再回复你。所以如果验证者是区块链的这种情况,我们需要一个非交互的系统。之前我举的例子是一个交互性的例子,但是没关系,我们继续来看区块链以及零知识区块链应用里会发生的各种情况。

我们现在来说说在你可能会感兴趣的链上应用中的各种声明。我刚刚举了几个例子。比如,你可能会想要证明是某些代币(1ETH等)的所有者,或者你可能需要证明自己是某些 DAO 的成员、某个国家的公民、某所大学的毕业生,等等,或者你还想证明自己验证过一批交易,而这也是 zkRollups 的第一步。

在 zkRollups 中,交易是由某些成员在链下进行的,产生一个 zkSNARK 证明来做验证,验证成功后将证明上链,这样区块链验证的就是证明本身,而非验证交易。这是一个非常简单的 zkRollup 的版本,这里我就不深入展开了,因为 Manta Network 并不是做 zkRollup 的,这里我希望更多聊下我们所做的事——隐私支付协议。

MantaPay 能够允许用户进行隐私支付。隐私支付这里指的是,你可以通过区块链发送代币,但是发送地址、接收地址、代币类型和代币数量都是隐私的。而其他人通过区块链的公开账本也看不到这笔交易的这些信息。我们是怎么做到的呢?这里有一幅卡通图可以大概演示一下,实际中要比这复杂很多,但是你看了这幅图后还是可以理解大部分。这里是一个很大的桶,桶里面装满了一些纸片,这些纸片就代表了我们所说的 UTXO,你可能听过这个词,它是指未花费的转账输出,也就是标明一种资产(比如1ETH)以及资产所有者(比如我)。而这一桶 UTXO 和另外一桶比特币的 UTXO 有什么区别呢?区别就在于这一桶中的所有 UTXO 都是加密的。如果你看这一桶比特币的 UTXO,你可以看到资产数额以及公共地址的所有者。但是对于隐私支付协议来说,你随便捡起一张纸条是看不到这些信息的,因为它们都是加密的,除非你自己就是所有者本人。你也不知道如何对其进行解密或者从这些 UTXO 中获得其它有用的信息。

现在有这样一桶纸条,而我们想要做的是向一位朋友进行转账。这意味着什么呢?意味着我在桶中放入一个属于他的 UTXO,只有这样我才能向他转账。假如我欠朋友1ETH, 我需要做的就是创建一个等值的 UTXO,所有者是我的朋友,资产就是我所欠他的金额。

现在你需要走近这个桶,把加密的 UTXO 放入桶中,但在这之前,我们需要向区块链提交一个证明,这里就用到 zkSNARK 了,可以用来证明以下的声明。

声明中有4点:你想证明的是我拥有这些 UTXO 中的一个;我还没花过这个 UTXO;这个 UTXO 和我所创建的新 UTXO有同样的价值;我创建这个新的 UTXO 是基于某些规则。用演示最初我展示的那些复杂的数学公式,这四则声明组成了一个声明。我们会有一些协议来帮你生成声明证明,这里我只是简化了。声明的生成过程会用到很多数学知识,但原理就是你创建一个证明,当你把 UTXO 放进桶中来向你朋友转账时,你同时需要向 Manta Network 区块链出示这个证明。然后区块链账本将就你的证明进行验证,只有证明在被验证为有效时才会接受这个 UTXO。

如果这个证明是有效的,你就可以把这个 UTXO 放进桶中,这个 UTXO 上有你朋友的名字以及一些资产,现在你朋友就是这个 UTXO 的所有者了,这部分资产尚未花费,未来他也用这个 UTXO 来给他人付款,他也可以创建一个证明来发生支付行为。

支付就是这样产生的,一个人来创建交易,提交该交易有效的证明,然后把 UTXO 放入“桶中”。单纯这样说可能很难理解,这里我想强调的是这其中所有的过程中都很好地保证了隐私。

这个声明的第一部分是我拥有桶中的其中一个 UTXO,“其中一个”是很重要的。因为在我的证明中,正如魔方教练不想向我展示如何破解魔方一样,我也不想告诉验证者哪一个 UTXO 属于我。如果我告诉他们哪个自己要花费的 UTXO,那么他们可以通过它追溯到我之前的交易,我就没有了隐私。

所以,聪明之处就在于我们不说哪个 UTXO 属于自己,只是证明桶里面有一个 UTXO 是属于我的。另外,你还需要证明你没有花费过,很明显这是为了防止双花,否则当人们从朋友那收到款后,他们可以把同样的钱转给两位朋友,这样会凭空创造出没有的钱。因此,证明这个 UTXO 没有被花费过就很重要。

关于不能无中生有这点,你必须要证明 UTXO 中的价值是匹配的,你并没有创造不属于你的价值。最后一点,根据某些规则来创建新的 UTXO,你需要证明你遵守了协议加密体系,因为这些 UTXO 是加密的,这就比较复杂了,总之是为了保证你的确进行了加密,这样 UTXO 才是可花费的。

如果我们都这样做,就可以实现隐私。我需要提醒的是,链上的信息是交易有效性的证明,而不是交易的隐私信息。因此,Manta Network 可以用 zkSNARK 来进行隐私交易。这么短的时间里讲了这么多,我希望以上内容能对大家有所启发。

关于 Manta Network

Manta Network 致力于通过隐私保护构建一个更好的 Web3 世界。Manta 的产品设计从第一性原理出发,通过 zkSNARK 等领先的密码学架构为区块链用户提供端对端的隐私保护。在保障隐私的同时,Manta 兼具互操作性、便捷性、高性能以及可审计性,允许用户进行任意平行链资产间的隐私转账和交易。Manta 的愿景是为整个区块链世界提供更便捷的隐私保护服务。

Manta 的创始团队由多位加密货币资深人士,教授和学者组成,他们的经验包括哈佛大学,麻省理工学院和 Algorand。Manta 的投资机构包括 Polychain、ParaFi、Binance Labs、Multicoin、CoinFund、 Alameda、DeFiance 以及 Hypersphere 等。Manta 也是波卡官方 Web3 基金会资助获得者,Substrate Builder Program 成员,伯克利大学区块链加速器成员。

We're Hiring! 访问查看开放职位:https://jobs.lever.co/MantaNetwork

关注官方频道了解有关 Manta/Calamari 的更多信息:

Website:https://manta.network/

Github:https://github.com/Manta-Network

Twitter:https://twitter.com/MantaNetwork

Medium:https://mantanetwork.medium.co

Telegram:https://t.me/mantanetwork

Discord:https://discord.gg/ZtSuSKRy8X

Telegram中文:https://t.me/mantanetwork_zh

Twitter中文:https://twitter.com/manta_china