带你一文了解零知识证明_VER:NAR

原标题:干货|零知识证明引论

作者:Cyte

继上一次?Shor发出了对支付网络中路由问题的全面研究之后,又有一位热爱研究的Nervos小伙伴Cyte对零知识证明做了详细的研究。

在这篇文章中,Cyte?会和大家介绍零知识证明(ZKP)?的定义,并将零知识证明与SNARK和STARK这两个概念进行辨析。

ZKP、SNARK和STARK等这些密码学概念随着最近区块链的兴起变得热?起来。但是,它们经常会被误解和混用。其实,所有这些概念都属于一个更广义的范畴,叫做证明系统(ProofSystem),或者叫做密码学证明。零知识证明和SNARK、STARK之间都有交叉的部分,但并不相互包含。它们之间的关系可以用一张图来表示。

本文将首先介绍证明系统的定义,并讨论证明系统的各类性质,重点讨论「零知识性」、「知识证明」、「简洁性」和「非交互性」。特别的,如果一个证明系统具有「零知识性」,那么它就被称为一个「零知识证明」。最后,文章会讨论?SNARK?和?STARK的定义并将其进行比较。

证明系统

一个证明系统(ProofSystem)?是一个交互式协议,包含两个参与方Prover和Verifier,以及一个算法Setup。证明系统的作用是让Prover说服Verifier相信一件事,我们把这件事叫做一个陈述(Statement)。

协议开始前,需要由某人调用Setup算法。Setup算法接受一些公共参数作为输入,并输出Prover和Verifier所需的Setup信息,其中Verifier获知的信息记为?,Prover获知的信息记为?。?和??的公共部分称为公共参考字符串(CommonReferenceString,CRS)。具体由谁、在什么时候调用Setup算法,取决于证明系统的设计。协议一开始,Prover和Verifier同时得到输入陈述?。Prover相对于Verifier必然要有一些额外的优势,例如更强大的计算能力,或者得到了一些额外的输入?。除此之外,Prover和Verifier还分别获知了??和?。Setup信息获取的时间取决于证明系统的设计。例如,有可能是Prover和Verifier早就下载好存在各自硬盘里可以反复使用的,也可能是协议开始前当场输入的。然后Prover和Verifier开始执行证明系统规定的协议。如果Prover和Verifier都是诚实的,那么它们都严格遵守协议执行。不过,也有可能某一方是恶意的,没有按照协议规定来执行,此时会发生什么事情,取决于证明系统的安全性。如果两方都是恶意的,它们都不遵守协议,那就和这个证明系统没关系了。最后,Verifier输出accept或reject,表示是否相信陈述?。一个证明系统需要满足两个性质:

刘峰:从源头治理防范币圈资金盘乱象 要考虑多个维度进行:6月9日报道,上海对外经贸大学人工智能变革与管理学院区块链技术研究与应用研究中心主任刘峰表示,要从源头治理防范币圈资金盘乱象,主要还是要考虑人、财、事三个维度来进行。从人的角度而言,需要对区块链市场参与者进行足够的风险警示,帮助参与者最大限度进行风险识别和投资决策;从财的角度来看,对于相关非法项目投融资活动,需要监管层进行必要监管、定期报告,实行监管常态化;另从事的角度来看,项目的募资和运营模式需要能够被识别,一旦分析到有资金盘或盘模式的,相关监管部门可根据实际情况,第一时间相应处置。(北京商报)[2020/6/9]

完整性(Completeness):如果陈述??是正确的,而Prover和Verifier都遵守这个协议,那么Verifier以至少??的概率输出accept,这里??被称为证明系统的完整性误差(Completenesserror)可靠性(Soundness):如果陈述??是不正确的,此时Prover必然是不诚实的,而Verifier遵守协议,那么任何Prover都不能让Verifier输出accept的概率超过?,这个??被称为证明系统的可靠性误差(Soundnesserror)这两个要求是使得一个证明系统成立的最基本的要求。少了哪个要求,我们都可以得到符合条件但完全没用的证明系统。例如,如果我们只要求完整性,那就无论Prover做什么,Verifier永远只输出accept就好了;如果只要求可靠性,那就让Verifier永远只输出reject。此外,一般希望??和??都不超过?,并且加起来小于?,否则这个证明系统误差太大,也近乎无用。如果将一个证明系统的可靠性只对任何计算能力受限的?Prover成立,也就是说,计算能力无限的敌手是有可能Verifier的,此时这个证明系统只有计算可靠性(ComputationalSoundness),这样的系统又称为?论证系统(ArgumentSystem)。相比之下,对任何Prover都安全的可靠性被称为统计可靠性(StatisticalSoundness)。

证明系统的其他性质

一个证明系统还可以满足一些其他(并非必需的)性质

CRS模型(CRSmodel):如果Setup信息是对所有人公开可见的,即Setup=Setup=Setup,称这个证明系统是在CRS模型下的交互(Interactive)/非交互(Non-interactive):如果整个交互过程只有Prover向Verifier发送一条信息,就称这个系统是非交互证明系统;否则这个系统就是交互式证明系统可迁移(Transferable)/可抵赖(Deniable):如果陈述??是正确的,并且把交互过程发送给其他Verifier,也能够让其他Verifier相信陈述??的正确性,这个证明系统就是可迁移的;否则这个证明系统就是可抵赖的公开可验证(PublicVerifiable)/特定验证者(DesignatedVerifier):如果Setup?是对所有人公开可见的,即任何人都可以成为Verifier,这个零知识证明系统就是公开可验证的。否则这个系统就是针对特定验证者的公开随机(Publiccoin):如果Verifier的所有消息的选取都均匀随机且独立于Prover的消息,就称这个系统是公开随机的零知识(Zero-Knowledge):在陈述??是正确的情况下,如果除了??的正确性,Verifier无法从交互中获取任何其他“知识”,就称这个系统是零知识的简洁性(Succinctness):如果这个证明系统是用来证明NP语言的,并且证明系统的通信量比证据??还要小,那么这个证明系统就具有简洁性

币圈推特欺诈账户@Cryptanzee伪装传奇基金经理Paul Tudor Jones:币圈推特欺诈账户@Cryptanzee再一次进行自我伪装,这次他将自己塑造成传奇基金经理、知名操盘手保罗·都铎·琼斯(Paul Tudor Jones)。@Cryptanzee已经用保罗·都铎·琼斯身份在推特上发布三条推文,声称比特币已经完成V型反弹,自己也购买一些比特币来对冲通货膨胀,但结果是多头仓位被清算。事实上,真正的保罗·都铎·琼斯此前的确通过芝商所比特币期货做多,但周末芝商所休市,因此不可能清算多头仓位。@Crypttanzee还曾伪装过BitMEX交易所首席执行官,并用其身份发布了一条在我看来,现在的比特币价格太高了的推文,结果多家媒体上当并报道这一消息。[2020/5/10]

例:证明两个球的颜色不同

Setup信息:有两个球

陈述?:这两个球颜色不同Verifier计算能力受限(蒙上双眼),Prover具有正常的视力

Verifier左右手各持一个球,展示给Prover看。Verifier把双手放到背后,接着(在心里)随机抛硬币,如果是正面朝上,就交换左右手里的球,否则不交换。Verifier把球拿出来给Prover看。Prover告诉Verifier两个球有没有交换。结果:如果Prover猜对了,Verifier输出accept,否则Verifier输出reject。性质讨论完整性如果两球颜色不同,显然Prover一定能以百分之百的概率猜中Verifier有没有交换球可靠性如果两球颜色相同,那么Prover只能盲目猜测,只有1/2的概率猜中。这个系统的可靠性误差为1/2CRS这个证明系统是在CRS模型下的,因为Setup信息是公开的交互性这是个交互系统,因为Prover和Verifier互相发送的信息超过一条可迁移性这个系统是不可迁移的,即可抵赖的。即使Verifier把交互过程记录下来展示给其他蒙住眼的人,他们也不能确信两个球颜色不同公开可验证性这个系统是公开可验证的,任何Verifier都可以和Prover进行这个协议公开随机性这个系统不是公开随机的,因为Verifier发送给Prover的信息不是均匀随机的零知识性这个系统是零知识的,因为在两个球颜色确实不同的情况下,Prover的猜测是Verifier意料之中的,除了表示陈述x的正确性外,没有任何额外知识

重要性

上文中我们给出了证明系统的定义,样例和性质。接下来我们讨论证明系统的几个重要的性质。

零知识性

零知识性用来保护诚实的Prover不被恶意的Verifier而泄露证明所需的秘密证据。

上文中已经提到了证明系统的零知识性,将其简单描述为Verifier无法从交互中获取任何“知识”。这个描述是不确切的,因为它并没有给出一个严格的判断标准。零知识性的定义本身是违直觉的:Prover明明发送了一些比特数据给Verifier,为什么这个系统会是“零知识”的呢?实际上,“信息”并不等同于“知识”。如果Verifier获取了信息,但获得这些信息并不能让Verifier计算出更多结果,或者说这些信息是Verifier自己就能够计算出来的,那么Verifier就没有获取任何“知识”。在一个证明系统的执行过程中,Verifier获得的所有信息包括:;Verifier自己的随机数;Prover发送给Verifier的所有信息(记为?)。我们把这些信息称为Verifier的“视野”,记为?。这些信息是Verifier计算过程中的所有不确定性的来源。确定了这些信息后,其他的一切都可以确定性地计算出来。注意到,?是一个随机变量。当Verifier与Prover执行了证明系统之后,Verifier会获得这个随机变量的一个样本。如果Verifier能在没有Prover参与的情况下独自采样?,那么这个系统就是零知识的。我们把采样??这个随机变量的算法叫做模拟器(Simulator)。根据模拟器工作方式的不同,有如下不同的定义方式:

点付大头成立“区块链反独裁联盟”剑指吴忌寒 并称“江卓尔是币圈郎咸平”:5月20日晚,点付大头在“区块链反独裁联盟”群中,与江卓尔进行了言辞激烈的骂战,骂战的根源是针对区块链领域的独裁和矿霸问题。点付大头质问吴忌寒分叉门罗币的原因,认为这样会出现矿霸的问题,并认为支持小韩分叉门罗币的人是独裁者和利己主义者。江卓尔回应称,分叉是自由,同意小韩分叉门罗币,以及同意任何形式的分叉。点付大头认为,DPOS可以将记账权和投票权进行分离,任何人都可以当矿池,如果有人作恶,矿工就会把他投下去。点付大头称江卓尔是币圈郎咸平,认为莱比特矿池江卓尔与比特大陆吴忌寒是比特币生态系统的癌细胞,并痛斥他们在损害比特币的去中心化共识和信誉。由于江卓尔同意小韩分叉门罗币,以及同意任何形式的分叉,所以点付大头一再强调:江卓尔的特点就是颠倒黑白、搬弄是否、指鹿为马,专门小白用户。目前群内讨论言辞激烈,有些失控。[2018/5/21]

非黑盒模拟器,相对应的零知识性叫做非黑盒零知识。这个零知识的定义允许每个Verifier都存在一个“独家定制”的模拟器,这种定义允许模拟器针对不同的Verifier的实现细节来定制不同的采样过程。黑盒模拟器,对应的就是黑盒零知识。这个零知识的定义要求存在唯一的模拟器,使得对所有的Verifier,它都能够采样出?。这个唯一的模拟器不可能知道所有Verifier的具体实现细节,所以它只能通过黑盒调用的方式来访问Verifier。不过,模拟器对Verifier具有完全的控制权。模拟器可以决定Verifier的随机数?,并给Verifier输入任何的Prover消息或?。所以,在模拟器的眼里,Verifier是一个黑盒的确定性算法。如果模拟器只针对诚实Verifier,对应的是诚实Verifier零知识(HonestVerifierZK)。因为诚实Verifier的行为是完全在预期中的,模拟器自然可以利用这些信息,因此这个模拟器对Verifier的访问是非黑盒的。非黑盒模拟器访问到的信息更多,所以非黑盒零知识性比黑盒零知识性更容易成立。而诚实Verifier零知识是最容易实现的。关于诚实Verifier零知识,这里的诚实Verifier更准确地说是半诚实(Semi-Honest)的,或者说“诚实但好奇的”。这样的Verifier表面上会遵守协议,但有可能私下里试图从消息中提取知识。相比之下,恶意Verifier的行为是完全不受限制的。Verifier可能宕机、发送不符合格式的消息、不按协议规定的分布采样,等等。要证明一个系统对恶意的Verifier满足零知识性,就要把所有这些情况都覆盖到。模拟器是一个随机算法,它的输出值也是一个随机变量,记为?。零知识性要求??和??这两个随机变量难以区分。不过,“难以区分”这个词也有很多种版本,由此可以推出零知识证明的多种定义:

如果两个随机变量的分布是统计不可区分的,也就是它们的统计距离(StatisticalDistance)可忽略,就称这个证明系统是统计零知识(StatisticallyZero-Knowledge)?的;如果统计距离就是0,又叫做完美零知识(PerfectZero-Knowledge)?的;如果两个随机变量的分布是计算不可区分的,也就是任何多项式时间的随机敌手都无法区分这两个分布,就称这个证明系统是计算零知识(ComputationallyZero-Knowledge)的。注意到,零知识的定义中,只要求对于正确的陈述?,?和??的分布难以区分。对于错误的陈述,我们并不关心Verifier能够获取什么知识,因为这种情况下Prover本身就是不诚实的,没有必要去保护它,或者说,Prover既然不遵守协议,那我们的协议设计得再好也保护不到它。不过,虽然??是错误的情况下,零知识性对??的分布不做任何假定,但如果输入错误的?采样得到的??被Verifier验证通过的概率和??正确的情况下有显著差别的话,我们就可以借此判断??的正确性。这就意味着??只能来自一个平凡的NP语言。所以,对于困难的NP问题,把错误的??输入给模拟器,得到的??也能够以一样的概率被验证通过。这么一来,零知识性和可靠性岂不是矛盾的?换句话说,对于错误的?,Prover为什么不能调用模拟器来Verifier?实际上,Prover不能控制Verifier,它也就不能为模拟器提供采样??所需要的资源。的确,一个恶意的Prover可以去调用模拟器,但是这对它来说没用,因为模拟器输出的??中的??并不是正在与Prover交互的Verifier的随机数。此外,模拟器输出的??也可能和Verifier收到的??不同而导致验证不通过。不过,Prover调起的模拟器无法获取Verifier的随机数,这已经足够保证安全性了,所以交互式证明中??即使是固定常量也没问题。

Web3药物发现初创公司Druglike完成300万美元融资:10月22日消息,Web3药物发现初创公司Druglike宣布完成300万美元融资,但目前尚未公开投资方信息。据悉,Druglike公司致力于构建一个任何人都可以参与的个人交易计算分布式网络,类似于比特币挖矿,尽管目前其平台通过AWS提供支持。(bizjournals)[2022/10/22 16:35:14]

知识证明

如果要求Prover必须“知道”一些信息才能让Verifier验证通过,这个系统就被称为知识证明(ProofofKnowledge)。知识证明可以看做可靠性的加强版。知识证明也有计算意义下的版本,叫做知识论证(ArgumentofKnowledge)。

知识证明系统通常是用来证明NP语言的。一个NP语言是指一个集合?,使得元素??属于?可以由一个证据??来证明,即存在一个多项式时间的算法能够判定??是否是??属于??的合法证据。普通的证明系统使得Prover可以向Verifier证明?。而知识证明系统使得Prover可以向Verifier证明的不仅是?,还可以证明Prover“知道”?。也就是说,即使?,如果Prover不知道对应的?,也难以验证通过。和上一节讨论的零知识性类似,“知识性”也需要严格的定义。一个程序P“知道”数据?,到底该怎样定义呢?想象一下把这个程序运行在一个虚拟机里,它的随机数是可以由我们随意指定的。它的整个运行过程中,CPU状态的完整历史记录,以及所有的内存读写操作,都可以由虚拟机记录下来。如果这个程序“知道”?,我们总该从这些记录中提取出??的信息吧。实际上,这就是提取器(Extractor)?的一种直观的理解方式。提取器就是一个算法,它能够和被提取的程序同时运行,并能够访问到被提取的程序的内部状态。最后,它可以输出提取的结果。上面描述的提取器是非黑盒提取器,因为它可以访问被提取程序的内部状态。非黑盒提取器的算法必然要随着被提取程序的不同而变化。所以,一个证明系统是一个知识证明,是这样定义的:“对于任意Prover?,存在一个提取器?,它和??同时执行,并能够访问到??的内部状态。如果??和??交互后??输出accept,那么??就会输出满足条件的?。”类似于零知识定义中的模拟器,提取器也可以用黑盒的方式定义。提取器无法访问程序的内部状态,但可以调用这个程序,控制这个程序的随机数,并读取这个程序的输出。我们引入这样一个记号?,表示提取器通过黑盒的方式访问一对Prover和Verifier的交互过程。黑盒提取器对所有的Prover只需要有一个就够了,所以知识性证明就可以如下定义:“存在一个提取器?,对于任意Prover?,如果??和??交互后??输出accept,那么??就会输出满足条件的?。”

简洁性

Lisk宣布启动区块链捐赠计划:金色财经报道,Lisk表示,Lisk为开发人员提供了将他们的区块链想法转化为数字对应物的工具。现在,Lisk通过Lisk赠款计划进一步承诺了对区块链可访问性的承诺,Lisk提供了高达130万美元的捐赠,可用于将开发团队从共享奖池中分离出来。[2022/8/12 12:21:15]

用??表示一个NP语言的实例,?表示??存在语言中的证据。简洁性(Succinctness)?是指一个证明系统所需的通信量低于??的线性函数。换句话说,Prover和Verifier执行这个证明系统,比Prover直接把??发送给Verifier,还要节省通信带宽。有时候,简洁性还可能要求Verifier在证明系统中的计算量要低于验证?。总之,简洁性要求证明系统在效率方面有优势。

我们可能会希望一个简洁证明系统的通信量达到对数级别或更低,即?。然而这样的简洁性要求会带来安全性的损失。因为如果通信量低达对数级别,那么Prover的消息组合??所在的整个空间是可以在??时间内穷举的。然而,系统的可靠性要求,对于错误的陈述?,Prover不能找到让Verifier验证通过的?。假如能够验证通过的??压根不存在,这样确实能够保证可靠性。但这样就可以通过穷举??来判断?的合法性,那么??就不是一个困难问题,这就排除了一般的NP语言。如果我们想要一般的NP语言的证明系统,我们必须允许即使对于错误的?,也存在少量的能够验证通过的?。这种情况下,我们只能额外引入一个安全参数?,将通信量的大小放宽为?,使得穷举??的复杂度达到?,这样至少实现了计算意义下的可靠性。同时,通信量相对于??仍然是对数级别的,所以满足了简洁性。综上,对于一般的NP语言,(对数级别的)简洁证明系统只能是论证系统。

非交互性

非交互性(Non-Interactivity)?是指证明系统的全部交互只有Prover向Verifier发送的一条消息,这个消息叫做一个证明,记为?。非交互性可以带来许多的便利,为证明系统带来更多的应用场景。例如,在区块链系统中,非交互性的零知识证明可以附在交易中,供任何人随时查验,而不需要交易的作者随时在线与验证者交互。

任何NP语言都天然具有一个非交互证明协议,也就是Prover直接将证据发送给Verifier,而且这个证明是知识证明。所以,构造一个单纯具有非交互性的证明系统意义不大。非交互性只有和前面讨论的两个性质,即零知识性或简洁性组合起来才有意思。非交互性+零知识将零知识性和非交互性结合起来,就有了非交互零知识(Non-InteractiveZero-Knowledge,NIZK)。我们之前在讨论零知识性时讲到,零知识性之所以和可靠性不矛盾,是因为调用模拟器采样的??中的??大概率和与Prover交互的Verifier的随机数不同。但是,对于非交互零知识,我们要重新审视一下这个推理过程。在交互证明中,一个随机数为??的Verifier能够验证通过的Prover消息?,直接搬到随机数为??的Verifier那里就很可能验证不通过了。所以,在交互式证明中,?的正确性不是全局的,而是依赖??的。而在非交互证明中,Prover没有收到Verifier的任何消息,所以Prover的计算过程没有用到Verifier的随机数?。所以,为了达到证明系统的完整性,诚实的Prover输出的?,对于大部分Verifier随机数??都是能验证通过的。所以,非交互证明中的??的正确性是全局的,不依赖任何。零知识性要求,Verifier的视野??和模拟器的输出??不可区分。这意味着,如果单独观察这它们部分分量,它们也是不可区分的。即??和??中的??也是不可区分的。所以,一个恶意的Prover可以调用模拟器来输出?。这在交互式证明中不成问题,恶意的Prover仅仅是得到了关于某个??正确的??罢了。但在非交互证明中,?的正确性是不依赖??的,就会带来安全问题。这时候,就要轮到??发挥作用了。虽然??的正确性不再依赖于?,但还是依赖于?的。为了可靠性,我们希望,给定??和陈述??难以计算出能够通过验证的?。虽然模拟器在给定??时可以同时输出一对?,但是难以先计算前者再计算后者。具体是怎样做到这一点的,后续文章中介绍具体方案时会详细讲解。非交互性+简洁性上文提到,简洁性的证明系统必然是论证系统。结合非交互性,就有了简洁非交互式论证(SuccinctNon-interactiveARGument,SNARG)。实际上,满足SNARG定义的系统早在2000年就由Micali构造出来了,而这个名字是后来才出现的。如果一个SNARG同时是一个知识论证,它就被称为简洁非交互式知识性论证(SuccinctNon-interactiveARgumentofKnowledge,SNARK)。SNARK这个名称由论文BCCT12首创,现在已经成为零知识证明领域最热门的概念之一。其实SNARK只具有简洁性和非交互性,并不一定具有零知识性。如果有零知识性,应该叫zkSNARK。STARK和SNARK辨析另一个经常和SNARK一起提到的概念是STARK。它和SNARK只有一字之差,但有很多不同。下面我们比较一下这两个概念。共同点:

都是知识论证(ARK),即只有计算意义下的可靠性,且证明是知识性的区别:

SNARK的“S”是简洁性(Succintness),而STARK的“S”是可扩展性(Scalability),它在简洁性的基础上还要求Prover复杂度至多是拟线性(Quasi-linear)的,即?,而Setup的计算复杂度最多是对数的透明性(Transparent):STARK不需要可信第三方Setup;而SNARK没有这个限制非交互性(Non-Interactivity):SNARK一定是非交互的,而STARK没有这个限制可以看出,SNARK比STARK唯一多出的限制就是非交互性。尽管如此,通过后续文章将要介绍的Fiat-Shamir变换,STARK一般都可以转化为非交互证明,转化的结果必然是一个SNARK。在这种意义上,可以把STARK看做SNARK的子集。上述SNARK和STARK的定义是这两个名词的广义涵义。狭义上,它们分别指代两个具体的构造方案。其中SNARK指的是以Groth16方案为代表的一系列基于QAP和双线性对的zkSNARK构造方案。而STARK在狭义上就专门指代Ben-Sasson等人在2018年提出的基于AIR和FRI的那一个方案。

小结

本文介绍了证明系统的定义,并讨论了证明系统的各类性质,重点讨论了“零知识性”、“知识证明”、“简洁性”和“非交互性”,解释了如何用模拟器来定义零知识性,以及用提取器来定义知识性证明。最后,文章讨论并比较了SNARK和STARK。

参考资

Goldreich.?FoundationsofCryptography,Volume1.BasicTools.2001.ZKProofCommunity.?ZKProofCommunityReference.2019.https://docs.zkproof.org/reference.pdfYehudaLindell.?HowToSimulateIt–ATutorialontheSimulationProofTechnique.2018.EliBen-Sasson.?ACambrianExplosionofCryptoProofs.https://nakamoto.com/cambrian-explosion-of-crypto-proofs/

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

金智博客

[0:0ms0-3:316ms