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

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

作者: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,表示是否相信陈述?。一个证明系统需要满足两个性质:

Sam Altman:开源GPT-3、降低GPT-4的成本、翻倍模型规模:6月1日消息,AI 开发平台 HumanLoop 创始人 Raza Habib 与 OpenAI 首席执行官 Sam Altman 等 20 多位开发者开展了一次闭门讨论会,Sam Altman 透露了很多关于 OpenAI 的未来规划与目前遇到的情况。具体有:

1. OpenAI 目前严重受限于 GPU,导致他们推迟了许多短期计划,大部分关于 ChatGPT 可靠性和速度的问题都是由于 GPU 资源短缺造成。

2. 给 GPT-4 降本提效是 OpenAI 当前的首要任务。

3. 更长的 ChatGPT 上下文窗口 (最高可达 100 万个 tokens)。将来会有一个记住对话历史记录的 API 版本。

4. GPT-4 的多模态功能要到 2024 年才会公开,在获取更多 GPU 资源前不能将 GPT-4 的视觉版本扩展到所有人。

5. OpenAI 正在考虑开源 GPT-3,他们之所以还没有开源的部分原因是因为他们觉得没多少人和公司有能力妥善管理如此大型的大语言模型。

6. 最近很多文章声称的“巨型 AI 模型的时代已经结束”并不正确,OpenAI 内部数据表明,规模与性能成正比的定律仍成立,OpenAI 的模型规模每年可能会增加一倍或三倍 (多方信息表明 GPT-4 参数规模 10000 亿),而不是增加许多数量级。[2023/6/1 11:52:59]

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

数字银行平台TymeBank完成7700万美元pre-C轮融资,腾讯参投:金色财经报道,南非数字银行平台 TymeBank 宣布已完成 7700 万美元 pre-C 轮融资,成长阶段基金 Norrsken22 和瑞士投资公司 Blue Earth Capital 领投,知名科技集团腾讯参投并成为了 TymeBank 的第三大股东,此前腾讯是 TymeBank 在 2021 年 12 月进行的 7000 万美元 B 轮 + 融资的主要投资者。据悉,TymeBank 已将“部分”总部设在新加坡,拟专注于新兴市场开发和数字银行运营,推动其客户从传统现金存款向数字支付方式进行转变。(bitcoinke)[2023/6/1 11:52:13]

证明系统的其他性质

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

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语言的,并且证明系统的通信量比证据??还要小,那么这个证明系统就具有简洁性

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

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的正确性外,没有任何额外知识

美国银行:币安将从BUSD供应量的增加中受益:金色财经报道,Binance决定将三种稳定币USDC、TUSD和USDP的所有现有余额和未来存款转换为BUSD可能在短期内产生有限的额外收入,但美国银行(BAC)周四在一份研究报告中表示,从长远来看,这可能会产生更大的影响。报告称,自动转换可能会使BUSD的供应量增加多达9.08亿美元,因为USDC供应量的2%(8.98亿美元)和USDP供应量的1%(1000万美元)在币安上。美国银行认为,随着交易所用户对比特币越来越熟悉,以及跨应用程序增加对它的更多支持以试图吸引用户,BUSD供应量在长期内有可能大幅增加。Binance将从其供应量的增加中受益,因为它能够将支持稳定币的额外储备投资于现金等价物,如美国国债和由国债担保的隔夜贷款,以获得利息收入。[2022/9/9 13:19:56]

重要性

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

零知识性

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

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

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

比特币矿企Hut 8将与计算设备提供商US Bitcoin Corp合并:金色财经报道,比特币矿企Hut 8 Mining Corp.宣布与美国矿企和高性能计算基础设施提供商US Bitcoin Corp(USBTC)的董事会各自宣布同意批准一项最终的企业合并协议,合并后的公司为Hut 8 Corp.。Hut 8 Corp将成为一家在美国注册的实体,将通过自挖和托管基础设施运营,在所有六个地点达到大约825 MW的总能量。(PRN)[2023/2/7 11:52:58]

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

知识证明

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

加密货币支付应用Strike推出新Visa卡,将提供消费奖励:金色财经报道,基于闪电网络的加密货币支付应用Strike宣布推出一张新的Visa卡。该公司在其推特上宣布了这一消息,并表示其用户现在可以“把Strike带到任何地方,并在日常消费中获得奖励”。推广工作将从等待名单开始。在推文中,Strike称,用户将能够使用新卡直接存款,以比特币支付,购买比特币,发送和接收资金,使用Apple Pay和Google Pay消费,并在消费时获得奖励。(The Block)[2022/8/12 12:20:47]

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

简洁性

用??表示一个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:15ms0-6:998ms