文章共8000字,预计阅读时间30-35分钟。
这篇博客的灵感来源于我的好朋友Kokii(Joey),感谢他通俗、详尽且充满趣味的介绍!
在谈论「零知识证明」之前,首先需要明确其定义:证明(Prover)向验证者(Verifier)证明一个命题成立,同时「不泄露其他任何知识」,这种就被称为「零知识证明」。鉴于「零知识证明」这个词太长,简称「zk」。文章是个人对于zk的理解,欢迎讨论。
为什么要zk
隐私
一个用户如果用过加密货币,就会发现,它并不像传说中的那么「保密」。「不保密」的原因显然,加密货币的信息都在区块链上,任何人都查询的到。虽然比特币等一部分加密货币出于隐私考虑,会给用户分配一个随机的地址,但这更像是「假名」,而不是号称的「匿名」,一旦用户到交易所将加密货币换成了法币,「假名」就和现实中的人对应上了。「假名」就像「风清扬」,初看无意义,但如果某次偶然,你发现「风清扬」对应着马云,之后再看到署名「风清扬」的邮件你就能想到那张大脸。「匿名」像大专院校的「校园墙」,墙上所有消息都是不署名的,对隐私的保护也更强。如果我们需要证明自己在「校园墙」上发过消息,但不想透露发的是什么消息,这时候该怎么办?如果还记得上面zk的定义,会发现zk完美地契合这种需求。
这就揭露了zk在区块链领域的第一个主要用途——隐私,如果需要证明自己拥有某类账户的私钥但不想透露具体的账户地址,如果需要证明自己持有某种NFT一定时间但不想透露持有哪个NFT,这时就需要用到zk。
扩容
以太坊的开发者和用户常常抱怨主链过慢的交易速度和过高的gas fee,为了解决这些问题,以太坊发展出了Layer 2,当前主流的Layer 2有两种:Optimism roll-up和ZK roll-up。
Optimism roll-up目前最为常用,它默认对交易不执行任何计算,但为了防止欺诈,如果有人能够发现交易中的欺诈,可以进行证明并提出异议,如果异议被核实,欺诈者会受到惩罚,证明者会收获奖励。因为可能需要等待异议,Optimism roll-up中交易的等待时间会比较长。
ZK roll-up顾名思义,是使用到zk的扩容方式。ZK roll-up会打包数百个交易生成SNARK(简洁的非交互式知识论证)或 STARK(可扩展的透明知识论证)形式的有效性证明。ZK roll-up Layer 2的状态转移只需要提供有效性证明,不像Optimism roll-up需要交易的全部信息,需要的空间更小;同时Layer 2的数据转移到主链时不需要等待异议(因为都已经被证明有效了),完成的速度也更快。值得一提的是,有效性证明需要的计算量很大,同时因为改变了世界状态转移的方式,一些ZK roll-up没有EVM的支持,但总的来说「Optimism roll-up 是现在,ZK roll-up是未来」已成为一种区块链扩容的共识。
童话世界
在深入历史、数学和计算机世界之前,不妨先看一眼童话世界。「zk」和它的表兄弟「多方安全计算」从诞生伊始就被各种童话故事所包围,这些故事极大地降低了「zk」的理解门槛,我选取了其中流传最广的一些故事,希望能有助于后续的理解。
两个百万富翁
「两个百万富翁」的故事由姚期智院士在1982年发表的论文「Protocols for secure computations」中提出。
有两个百万富翁,他们的资产有1百万-9百万,共9种可能。某一天,这两个百万富翁想比一比谁更有钱,但他们不希望透露自己的资产,既不想向对方,也不想向围观的群众透露。有没有一种既不透露他们的资产,又能比较谁更有钱的方法呢?
姚期智老师给出了以下的方法:
先造9个一模一样的箱子,放在房子里,箱子的钥匙只有富翁A拥有。先让富翁A进入房子,假设富翁A的资产是7百万,那么他在前7个箱子里放上1,在后2个箱子里放上0,将箱子锁好;之后让富翁B进入房子,假设富翁B的资产是5百万,那么富翁B就将第5个箱子拿出来,将其他箱子全烧了;最后富翁A使用钥匙打开富翁B拿出来的箱子,如果箱子中是1,代表A比B有钱,如果箱子中是0,代表B比A有钱。