今天看了很多关于零知识证明的博客推文,觉得这个理论发明有多有趣,多实用,就写篇文章记录下来,顺便做点硬科普。
零知识证明的定义无论是在百度百科还是MBA智库,官方对该理论的解释都是一样的,即零知识证明是由S.Goldwasser、S.Micali和C.Rackoff在20世纪80年代初提出的。这意味着证明者可以让验证者相信某个断言是正确的,而无需向验证者提供任何有用的信息。零知识证明本质上是涉及两方或多方的协议,即两方或多方完成一项任务需要采取的一系列步骤。证明者向验证者证明,并使其相信自己知道或拥有某个消息,但证明过程不能向验证者透露任何关于被验证消息的信息。大量事实证明,零知识证明在密码学中非常有用。如果能使用零知识证明进行验证,很多问题都会得到有效解决。
把上面的官方解释转换成通俗解释,就是证明者在没有向验证者透露任何信息的情况下,证明了他想要证明的东西。
比如网上有很多零知识证明的例子。我在这里综合几个经典易懂的例子。
阿里巴巴和强盗阿里巴巴知道打开藏宝洞穴的咒语。强盗抓住他,让他念咒语。如果阿里巴巴念了咒语,他会因为没用而被杀死。如果阿里巴巴坚持不说,强盗不会相信他真的有法术,会杀了他。但是阿里巴巴想到了一个好办法。他对强盗说:“你离我只有一箭之遥。把你的弓箭指向我。当你举起你的右手,我会念一个咒语来打开石门。当你举起你的左手,我会念一个咒语来关闭石门。如果我做不到或者逃跑了,你就用弓箭射我。”在这个过程中,证明者阿里巴巴可以在不提供任何有用信息的情况下,让验证者强盗相信他知道咒语(石门的咒语)。
房间钥匙A必须向B证明他有房间的钥匙。假设房间只能用钥匙开锁,其他任何方法都不能开锁,B确定房间里有物体。这时A用自己的钥匙打开房间的门,然后拿出物件给B看,从而证明自己真的有房间的钥匙。在这个过程中,证明者A可以让验证者B相信他有打开门的钥匙,而不用给他看钥匙。
非对称加密A有B的公钥,A没见过B,B见过A的照片。偶尔两个人相遇,B认出了A,但是A不确定眼前的人是不是B,这时B要向A证明自己是B,这时A给出一个随机数,B用自己的私钥加密,然后把加密的数据给A,A用B的公钥解密。如果能得到原始随机数,就证明对方是B,在这个过程中,证明者B在不给验证者A任何关于自己的信息的情况下,说服A自己是B。
楼道钥匙有一个圆形的楼道,有一个缺口,出口和入口的距离很近(眼睛距离内),但是楼道中间有一个门,只能用钥匙打开。a必须向B证明他有这门的钥匙。这时,B看着A从入口进入楼道,然后从出口走出楼道。此时B没有得到任何关于钥匙的信息,但完全可以证明A有钥匙。
数独解的证明者和验证者都有一个数独问题。证明者知道一个解决方案,他可以这样展示给验证者:首先,他找出81张纸,在每张纸上写下从1到9的数字,这样正好有9张纸,上面写着从1到9的数字。然后,因为他知道答案,他可以根据解把所有的纸片放在一个9乘9的格子里,这样就满足了数独的要求(每一列,每一行,每九个方格都正好有1到9)。放好后,他把所有的纸片都翻过来,使没有数字的一面朝上,这样核对者就看不到纸片上的数字了。接下来,验证者验证是否满足数独的条件。例如,如果他选择了一列,证明者将收集这一列中的纸片,随意打乱顺序,然后将纸片翻转过来,以便验证者可以看到从1到9的所有纸片都出现了。在整个过程中,验证者无法知道每张纸的位置,但他可以验证1到9都出现过。
三个性质的正确性。P不可能骗V,换句话说,如果P不知道如何证明一个定理,P让V相信他会证明这个定理的概率很低。完整性。V骗不了P,如果P知道如何证明一个定理,那么P就让V相信他能以绝对优势证明。零知识。v得不到任何额外的知识。零知识证明不是数学意义上的严格证明,因为它的错误概率很小,欺骗者可能通过虚假陈述欺骗证明者。换句话说,零知识证明是概率证明而不是确定性证明,但也有技术可以将误差降低到可以忽略的值。
零知识证明的具体分类可以分为交互式证明和非交互式证明。
基础零知识证明是互动的。验证者B需要问证明者A一系列关于他所拥有的数据的问题。如果他们都能给出正确答案,证明者A确实有相关数据。例如,在解决上面提到的数独问题时,验证者B必须多次筛选这些列,并确保每个选中的列都包含从1到9的纸片。只要验证次数足够多,就可以大概率相信验证者A真的知道数独问题的解。但是,这么简单的方式并不能让人相信证明者A和验证者B没有作弊,他们可能事先串通好,让证明者A在不知道答案的情况下通过验证。如果他们想说服第三方,验证者B还必须证明每个检测方案都是随机的,并且他没有与验证者a串通。
非交互式零知识证明,顾名思义,不需要交互过程,避免了合谋的可能,但可能需要一些额外的机器和程序来确定测试顺序。在上面的数独求解问题中,是通过程序的方式来决定哪一个要按行测试,哪一个要按列测试,但这个测试顺序必须保密,否则验证者可能会利用这些信息提前准备,在不知情的情况下通过验证。
比如我没有心脏病,但是保险公司需要知道这个,但是我不想让保险公司知道我的私人信息。然后我可以向保险公司证明我没有心脏病,但是所有的病历都不需要曝光。我是企业,想向银行贷款。我只是想向银行证明我有健康的业务和还款能力,但我不希望银行知道我们的一些商业秘密。
计算压缩和区块链展开在众多的区块链展开技术中,以太坊的发明者Vitalik采用zkSNARK技术,可以为现有的以太坊框架带来数十倍的性能提升。因为计算的证明,不需要多次重复同样的计算。在传统的区块链架构中,同样的计算要重复很多次,比如签名验证、交易合法性验证、智能合约执行等。这些计算过程可以通过零知识证明技术进行压缩。
端到端的通信加密用户可以互相发送消息,但不用担心服务器获取所有的消息记录。同时,消息还可以根据服务器的要求显示相应的零知识证书,比如消息的来源,发送的目的地等。
经过认证的用户可以向网站证明自己有私钥,或者知道只有该用户知道的秘密答案,但网站不需要知道,但网站可以通过验证这个零知识证书来确认用户的身份。
分散式存储服务器可以向用户证明他们的数据得到了妥善保存,并且不会泄露任何数据内容。
信用记录信用记录是另一个可以充分发挥零知识证明优势的领域。用户可以选择性地向对方展示自己的信用记录,一方面可以选择性地展示符合对方要求的记录分数,同时证明信用记录的真实性。
zk-SNARK技术的全称zk-SNARK是零知识成功的知识的非交互论证。它是一种非常适合区块链的零知识验证技术,允许他人在不知道具体交易内容的情况下验证交易(或智能合约函数调用)的有效性。通过zk-SNARK,我们不仅保留了在区块链中相互不信任的个人之间达成共识的问题,还保护了交易的隐私。
Zcash是第一个使用zk-SNARK技术的区块链,可以提供完全私有和加密的虚拟货币转移。
本文最后零知识证明在区块链领域已经大放异彩,包括第一个匿名加密货币Zcash (ZEC)实现zkSNARK,Layer2的主要解决方案,zk Rollup,MantaSwap,DeGate等等。MantaSwap是DeFi world中第一个使用zk-SNARK密码技术保护用户链隐私的去中心化交易协议,而DeGate则是基于以太坊Rollup的二层网络的去中心化交易协议,旨在构建第三层隐藏订购的关键信息,有效降低第二层的煤气费消耗。
然而,零知识证明的应用仍然存在障碍,如缺乏专用硬件导致的硬件成本过高。因此,当以太坊共识机制改为PoS(即ETH2.0正式上线),不需要很多挖矿硬件时,Vitalik打算将这些计算能力转化后投入到支持零知识证明中,可能会有效降低零知识证明的运行成本。