pdf版本
作为一个非常简短的总结,zkSNARKs目前已经实现,有4个主要成分(不用担心,我们将在后面的章节中解释所有术语):
A)编码为多项式问题
要检查的程序被编译成多项式的二次方程:t(x)h(x)= w(x)v(x),其中当且仅当程序正确计算时等式成立。 证明者想说服验证者这种平等。
B)通过随机抽样的简洁性
验证者选择一个秘密评估点s来减少乘以多项式和验证多项式函数等式的问题到简单的乘法和等式检查数字:t(s)h(s)= w(s)v(s)
这极大地减少了验证尺寸和验证时间。
C)同态编码/加密
使用编码/加密函数E,它具有一些同态特性(但不完全同态,但还不实际)。 这允许证明者在不知道s的情况下计算E(t(s)),E(h(s)),E(w(s)),E(v(s)),她只知道E其他有用的加密值。
D)零知识
证明者通过与数值相乘来置换值E(t(s)),E(h(s)),E(w(s)),E(v(s)),以便验证者仍然可以检查他们的正确结构而不知道实际的编码值。
非常粗略的想法是检查t(s)h(s)= w(s)v(s)与检查t(s)h(s)k = w(s)v秘密数k(不为零),区别在于如果仅发送数字(t(s)h(s)k)和(w(s)v(s)k),则不可能推导出t(s)h(s)或w(s)v(s)。
这是挥手致意的部分,以便您可以了解zkSNARK的本质,现在我们将详细介绍。
让我们先快速提醒一下RSA的工作方式,留下一些挑剔的细节。 请记住,我们经常使用模数来代替其他数字,而不是完整整数。 这里的符号是“a +b≡c(mod n)”,意思是“(a + b)%n = c%n”。 请注意,“(mod n)”部分不适用于右侧的“c”,但实际上适用于“≡”和所有其他的“≡”。 这使得它很难阅读,但我保证谨慎使用它。 现在回到RSA:
证明者提出以下数字:
公钥是(e,n),私钥是d。 素数p和q可以丢弃,但不应该显示。
消息m通过加密
和c = E(m)通过解密
由于c d≡(m e %n)d≡m ed (mod n)和m的指数中的乘法表现如同模(p-1)(q-1)中的乘法一样,我们得到m ed≡m(mod n)。 此外,RSA的安全性依赖于n不能有效地进行因式分解,因此d不能从e计算(如果我们知道p和q,这很容易)。
RSA的一个显着特点是它是乘法同态的 。 一般而言,如果可以交换顺序而不影响结果,则两个操作是同态的。 在同态加密的情况下,这是您可以对加密数据执行计算的属性。 完全同态加密 ,存在但是不实用的东西,将允许评估加密数据上的任意程序。 在这里,对于RSA,我们只是在谈论组乘法。 更正式地说:E(x)E(y)≡x e y e≡(xy)e≡E(xy)(mod n)或者用文字表示:两条消息的加密乘积等于消息的产品。
这种同态性已经允许某种乘法的零知识证明:证明者知道一些秘密数字x和y并计算它们的乘积,但只发送加密版本a = E(x),b = E(y)和c = E(xy)给验证者。 验证者现在检查(ab)%n≡c%n并且验证者学习的唯一东西是产品的加密版本以及产品是否正确计算,但她既不知道这两个因素,也不知道实际产品。 如果您通过添加替换产品,这已经进入区块链的方向,主要操作是添加余额。
关于零知识方面,让我们现在关注zkSNARK的另一个主要特点,即简洁性。 正如你将会看到的那样,简洁性是zkSNARKs中非常重要的部分,因为零知识部分将由于允许有限形式的同态编码的某种编码而被“免费”给出。
SNARKs是简洁的非交互式知识论的简称。 在这种所谓的交互协议的一般设置中,存在证明者和验证者 ,证明者想通过交换消息来说服验证者说明一个陈述(例如f(x)= y)。 通常所需的属性是没有证明者可以说服验证者说明一个错误的语句( 健全性 ),并且证明者有一定的策略来说服验证者说明任何真实的陈述( 完整性 )。 首字母缩略词的各个部分具有以下含义:
如果添加零知识前缀,则还需要该属性(粗略地说)在交互期间,验证者除了语句的有效性之外什么都不学习。 验证者尤其不了解证人字符串 - 我们稍后会看到那是什么。
作为一个例子,让我们考虑下面的事务验证计算:当且仅当σ1和σ2是根哈希值时,f(σ1,σ2,s,r,v,p s ,p r ,v)= 1 Merkle-trees(前置状态和后置状态),s和r是发送者和接收者账户,p是Merkle树证明,证明s的平衡在σ1中至少为v,如果v从s的平衡移动到r的平衡,他们就散列到σ2而不是σ1。
如果所有输入已知,验证f的计算相对容易。 因此,我们可以把f变成zkSNARK,其中只有σ1和σ2是公知的,(s,r,v,p s ,p r ,v)是证人字符串。 零知识属性现在导致验证者能够检查证明者是否知道某个证人将根哈希从σ1变为σ2,这样做并不违反任何正确事务的要求,但她不知道谁发给谁多少钱。
零知识的正式定义(仍然省略一些细节)是有一个模拟器 ,它也生成了安装字符串,但不知道秘密证人,可以与验证器交互 - 但外部观察者不能将这种互动与真正的证明者的互动区分开来。
为了看到zkSNARKs可以用于哪些问题和计算,我们必须从复杂性理论中定义一些概念。 如果你不关心什么是“证人”,在“阅读”零知识证明之后你不会知道什么,或者为什么只有针对关于多项式的特定问题才有zkSNARK,那么你可以跳过本节。
首先,让我们限制只输出0或1的函数,并调用这些函数问题 。 因为你可以单独查询每一个较长结果的位,所以这不是一个真正的限制,但它使理论变得更容易。 现在我们要测量解决给定问题的“复杂”(计算函数)。 对于数学函数f的特定机器实现M,我们总是可以计算在特定输入x上计算f所需的步骤数 - 这称为M on x的运行时间 。 到底什么是“步骤”,在这方面并不太重要。 由于程序对于较大的输入通常需要更长的时间,因此此运行时间总是以输入的大小或长度(以位数为单位)进行度量。 这就是例如“n 2算法”的概念来自哪里 - 它是一个算法,在大小为n的输入上最多需要n 2个步骤。 “算法”和“程序”的概念在这里大致相同。
对于某些k,运行时最多为n k的程序也称为“多项式时间程序”。
复杂性理论中的两类主要问题是P和NP:
尽管指数k对于某些问题可能相当大,但P被认为是“可行”问题的类别,事实上,对于非人为问题,k通常不大于4.验证比特币交易在P中是个问题,正如评估一个多项式(并将该值限制为0或1)。 粗略地说,如果你只需要计算一些值而不是“搜索”某些东西,那么问题几乎总是在P中。如果你必须搜索某些东西,那么你最终会在一个名为NP的类中结束。
对于NP中的所有问题,有zkSNARKs,实际上,今天存在的实用的zkSNARKs可以以通用的方式应用于NP中的所有问题。 目前尚不清楚在NP之外是否有任何问题存在zkSNARK。
NP中的所有问题总是具有一定的结构,源于NP的定义:
作为NP中问题的一个例子,让我们考虑布尔公式可满足性(SAT)的问题。 为此,我们使用归纳定义来定义一个布尔公式:
字符串“((x 1∧x 2 )∧¬x2)”将是一个布尔公式。
如果有一种方法可以将真值分配给变量,以便公式计算为真(其中,真假,真假真,真假假等等,常规规则),则布尔公式是可满足的 。 可满足性问题SAT是所有可满足的布尔公式的集合。
上面的例子“((x 1∧x 2 )∧¬x 2 )”是不可满足的,因此不在SAT中。 给定公式的见证是它令人满意的分配,并验证变量赋值是令人满意的是一个可以在多项式时间内求解的任务。
如果将NP的定义限制为见证长度为零的字符串,则可以捕获与P中相同的问题。因此,P中的每个问题也都在NP中。 复杂性理论研究的主要任务之一是显示这两类实际上是不同的 - NP中存在一个问题,它不在P中。看起来很明显,情况就是这样,但如果你能正式证明它,你可以赢得100万美元 。 哦,只是作为一个便笺,如果你可以证明相反的话,那么P和NP是平等的,除了赢得这个数额之外,加密货币很有可能从一天到下一天不复存在。 原因在于,找到工作难题证明的解决方案,散列函数中的冲突或对应于地址的私钥会更容易。 这些都是NP中的问题,既然你证明了P = NP,那么他们必须有一个多项式时间程序。 但是这篇文章并不是为了吓倒你,大多数研究人员都认为P和NP是不相等的。
让我们回到SAT。 这个看似简单的问题的有趣属性是它不仅存在于NP中,而且也是NP完全的。 这里的“complete”一词与“Turing-complete”完全相同。 这意味着它是NP中最难的问题之一,但更重要的是 - NP-complete的定义 - 对NP中任何问题的输入都可以转化为SAT的等价输入,其意义如下:
对于任何NP问题L,都有一个所谓的约化函数 f,它可以在多项式时间内计算,这样:
这种简化函数可以看作是一种编译器:它将源代码编写成某种编程语言,然后转换成另一种编程语言的等价程序,这种编程语言通常是一种具有某种语义行为的机器语言。 由于SAT是NP完全的,所以NP的任何可能的问题都存在这种减少,包括检查例如比特币交易在给定适当的块散列情况下是否有效的问题。 有一个将事务转换为布尔公式的归约函数,当且仅当事务有效时,公式才可满足。
为了看到这样的减少,让我们考虑评估多项式的问题。 首先,让我们定义一个多项式(类似于布尔公式)作为由整型常量,变量,加法,减法,乘法和(正确平衡)括号组成的表达式。 现在我们要考虑的问题是
我们现在将构建从SAT到PolyZero的缩减,从而表明PolyZero也是NP完全的(检查它是否在NP中作为练习)。
在布尔公式的结构元素上定义简化函数r就足够了。 这个想法是,对于任何布尔公式f,值r(f)是具有相同数量变量的多项式,当且仅当r(f)(a 1 ,...,a k )为零,其中true对应于1,false对应于0,并且r(f)仅对来自{0,1}的变量采用值0或1:
人们可能假设r((f ^ g))将被定义为r(f)+ r(g),但是这将取多元式的值超出{0,1}集合。
使用r,公式((x∧y)∨¬x)被转化为(1-(1-(1-x))(1-(1-y))(1-(1-x)),
请注意,r的每个替换规则都满足上述目标,因此r正确地执行了减少操作:
见证保存
从这个例子中,你可以看到,约简函数只定义了如何翻译输入,但当你仔细观察它时(或者读取它证明它有效的减少),你也会看到一种方法来转换有效的证人与输入一起。 在我们的例子中,我们只定义了如何将公式转换为多项式,但是通过证明我们解释了如何转换证人和令人满意的分配。 交易不需要证人的同时转换,但通常也是这样做的。 这对于zkSNARK来说非常重要,因为证明者的唯一任务是说服验证者证明这样的证人存在,而不透露关于证人的信息。
在前一节中,我们看到了NP内部的计算问题如何相互减少,特别是存在NP完全问题,这些问题基本上只是NP中所有其他问题的重新解释 - 包括交易验证问题。 这使得我们可以很容易地找到NP中所有问题的通用zkSNARK:我们只是选择一个合适的NP完全问题。 因此,如果我们想要展示如何使用zkSNARK来验证事务,那么足以展示如何针对某个NP完全的问题进行处理,并且可能在理论上更容易处理。
本文和下一节基于GGPR12文件(链接的技术报告比期刊论文更多),作者发现称为二次跨度程序(QSP)的问题特别适合于zkSNARK。 二次跨度程序由一组多项式组成,其任务是找出那些是另一个给定多项式的倍数的线性组合。 此外,输入字符串的各个位限制您允许使用的多项式。 详细地说(一般的QSP比较宽松一些,但我们已经定义了强壮的版本,因为它稍后会被使用):
长度为n的输入的字段F上的QSP由下式组成
这里的任务大致是将多项式乘以因子并将它们相加,使得总和(称为线性组合 )是t的倍数。 对于每个二进制输入字符串u,函数f限制可以使用的多项式,或更具体地说,它们在线性组合中的因子。 对于正式的:
当且仅当存在来自字段F的元组a =(a 1 ,...,a m ),b =(b 1 ,...,b m )时,输入u被QSP 接受 (验证)
请注意,如果2n小于m,则在选择元组a和b时仍有一些自由。 这意味着QSP仅适用于输入达到一定大小的情况 - 这个问题通过使用非均匀复杂性来解决,这是我们现在不会涉及的一个主题,让我们注意到,对于输入通常很小的密码学来说,它非常适用。
作为布尔公式的可满足性的类比,可以将因子a 1 ,...,a m ,b 1 ,...,b m看作变量的分配,或者一般情况下可以看到NP证人。 为了看到QSP在NP中,注意所有验证者必须做的事情(一旦她知道了因素)就是检查多项式t除以v a w b ,这是一个多项式时间问题。
我们不会在此讨论从泛型计算或电路到QSP的减少,因为它无助于理解一般概念,所以您必须相信我QSP是NP-complete(或者对于一些非统一的类似NP /聚)。 在实践中,这种减少是实际的“工程”部分 - 它必须以一种聪明的方式完成,使得产生的QSP将尽可能小,并且还具有一些其他好的特征。
我们已经可以看到的关于QSP的一件事是如何更有效地验证它们:验证任务包括检查一个多项式是否划分另一个多项式。 这可以通过证明者提供另一个多项式h来促成,使得将任务转变为检查多项式身份或将其不同地置换为检查th-v a w b = 0,即检查确定多项式是零多项式。 这看起来相当容易,但我们稍后将使用的多项式相当大(程度大约是原始电路中栅极数的100倍),因此乘以两个多项式不是一件容易的事。
因此,验证者不是实际计算v a ,w b及其乘积,而是选择一个秘密随机点s(这个点是zCash的“有毒废物”的一部分),计算数字t(s),v k (s)和w k (s)对于所有的k和它们,v a (s)和w b (s)并且仅检查t(s)h(s)= v a (s)w b (s)。 因此,一堆多项式加法,与标量和多项式乘积的乘法被简化为场乘法和加法。
只在一个点上检查一个多项式身份,而不是在所有的点上当然会降低安全性,但是证明者可以作弊的唯一方法就是如果她不是零多项式,那就是如果她设法达到零的该多项式,但是因为她不知道s和0的个数(多项式的阶数)与s(场元素的个数)的可能性相比是微小的,所以这在实践中是非常安全的。
我们现在详细描述用于QSP的zkSNARK。 它始于每个QSP必须执行的设置阶段。 在zCash中,电路(交易验证器)是固定的,因此QSP的多项式是固定的,它允许设置只执行一次,并重新用于所有交易,这只会改变输入u。 对于生成公共参考字符串 (CRS)的设置,验证者选择一个随机和秘密字段元素s并在该点加密多项式的值。 验证者使用一些特定的加密E并在CRS中发布E(v k (s))和E(w k (s))。 CRS还包含其他几个值,这使得验证更有效,并且还增加了零知识属性。 在那里使用的加密E具有一定的同态特性,这允许证明者在没有实际知道v k (s)的情况下计算E(v(s))。
让我们先看一个更简单的情况,即只是在秘密点对多项式进行加密评估,而不是完整的QSP问题。
为此,我们修复一个组(这里通常选择一个椭圆曲线)和一个生成器g。 请记住,如果有一个数字n(组顺序),使得列表g 0 ,g 1 ,g 2 ,...,g n-1包含组中的所有元素,则称该组为元素。 加密仅仅是E(x):= g x 。 现在验证者选择一个秘密字段元素并发布(作为CRS的一部分)
之后,s可以(并且必须)被遗忘。 这正是zCash所说的有毒废物,因为如果有人能够恢复这个以及稍后选择的其他秘密值,他们可以通过在多项式中找到零来任意欺骗证据。
使用这些值,证明者可以在不知道s的情况下计算任意多项式f的E(f(s)):假设我们的多项式是f(x)= 4x2 + 2x + 4,并且我们想要计算E(f(s))那么我们得到E(f(s))= E(4s 2 + 2s + 4)= g 4s ^ 2 + 2s + 4 = E(s 2 )4E(s 1 )2E(s 0 )可以在不知道s的情况下从已发布的CRS中计算出来。
这里唯一的问题是,由于s被破坏,验证者无法检查证明者是否正确评估了多项式。 为此,我们还选择另一个秘密字段元素α,并发布以下“移位”值:
与s一样,在设置阶段之后,值α也被破坏,并且证明者和验证者都不知道。 使用这些加密值,证明者可以类似地计算E(αf(s)),在我们的例子中,这是E(4s 2 +2αs+4α)= E(αs2) 4 E(αs1)2E(αs0 ) 4 。 因此,证明者发布A:= E(f(s))和B:= E(αf(s)),并且验证者必须检查这些值是否匹配。 她通过使用另一种主要成分来做到这一点:所谓的配对功能 e。 椭圆曲线和配对函数必须一起选择,以便以下属性适用于所有x,y:
使用这个配对函数,验证者检查e(A, gα )= e(B,g) - 注意gα是验证者已知的,因为它是CRS的一部分,为E(αs0)。 为了证明如果证明者没有作弊,这个检查是有效的,让我们看看以下的等式:
e(g,g)= e(g f(s) , gα )= e(g,g) αf(s)
e(B,g)= e( gαf(s) ,g)= e(g,g) αf(s)
然而,更重要的部分是证明者是否能够以某种方式提出满足检查e(A, gα )= e(B,g)但不是E(f(s))的值A,B和E(αf(s)))。 这个问题的答案是“我们不希望”。 严重的是,这被称为“指数假设的d-power知识”,并且作弊证明人是否可以做这样的事情是未知的。 这个假设是为证明其他公钥加密方案的安全性而做出的类似假设的延伸,并且这些假设同样未知为真或假。
实际上,上述协议实际上并不允许验证者检查证明者是否评估了多项式f(x)= 4x2 + 2x + 4,验证者只能检查证明者是否在点s处评估了一些多项式。 QSP的zkSNARK将包含另一个值,允许验证者检查证明者的确评估了正确的多项式。
这个例子表明验证者不需要评估完整的多项式来证实这一点,只需要评估配对函数即可。 在下一步中,我们将添加零知识部分,以便验证者不能重构关于f(s)的任何内容,甚至不能重建加密值(E(f(s)))。
为此,证明者选择一个随机δ而不是A:= E(f(s))和B:= E(αf(s))),她通过A':= E(δ+ f(s) ))和B:= E(α(δ+ f(s))))。 如果我们假设加密不能被破坏,那么零知识属性就非常明显。 我们现在必须检查两件事情:1.证明者实际上可以计算这些值,并且2.验证者的检查仍然是真实的。
对于1.,请注意,A'= E(δ+ f(s))= gδ+ f(s) = gδgf(s) = E(δ)E(f(s))= E )A和类似地,B'= E(α(δ+ f(s))))= E(αδ+αf(s)))= gαδ+αf(s) = gαδgα F(S)
= E(α) δE (αf(s))= E(α) δB 。
对于2.,注意验证者检查的唯一事情是她接收到的值A和B对于某个值a满足等式A = E(a)和B = E(αa),这对于a来说显然是这种情况=δ+ f(s),这是a = f(s)的情况。
好的,所以我们现在知道一些关于证明者如何在加密的秘密点上计算多项式的加密值而没有验证者知道关于该值的任何事情的信息。 现在让我们将其应用于QSP问题。
请记住,在QSP中,给定多项式v 0 ,...,v m ,w 0 ,...,w m,目标多项式t(度至多为d)和二进制输入串u。 证明者找到一个1 ,...,a m, b 1 ,...,b m (根据u有些限制)和一个多项式h
在上一节中,我们已经解释了如何设置公共参考字符串(CRS)。 我们选择秘密数字s和α并发布
由于我们没有单一的多项式,而是针对问题固定的多项式集合,所以我们也立即发布评估的多项式:
我们需要更多的秘密数βv,βw,γ(它们将用于验证那些多项式是否被评估过,而不是某些任意多项式)并发布
这是完整的公共参考字符串。 在实际的实现中,CRS的某些元素是不需要的,但这会使表示变得复杂。
现在证明者做什么? 她使用上面解释的减少来找出多项式h和值a 1 ,...,a m, b 1 ,...,b m 。 在这里,使用证人保留约简是很重要的(见上文),因为只有这样,值a 1 ,...,a m, b 1 ,...,b m才能与约简一起计算,并且很难找到除此以外。 为了描述证明者向验证者发送的证明作为证明,我们必须回到QSP的定义。
有一个内射函数f:{(i,j)| 1≤i≤n,j∈{0,1}}→{1,...,m},这限制了a 1 ,...,a m, b 1 ,...,b m的值 。 由于m相对较大,因此对于任何输入都有不会出现在f的输出中的数字。 这些指数不受限制,所以让我们称他们为自由并且定义v free (x)=Σk a k v k (x)其中k在所有指数中都是免费的 。 对于w(x)= b 1 w 1 (x)+ ... + b m w m (x),证明现在由
最后一部分用于检查是否使用了正确的多项式(这是我们在另一个例子中未覆盖的部分)。 请注意,所有这些加密值都可以由证明者只知道CRS而生成。
验证者的任务如下:
由于k的值(其中k不是“自由”的指数)可以直接从输入u计算出来(这也是验证者已知的,这是要验证的),验证者可以计算缺失部分v的全部金额:
由此,验证者现在使用配对函数e确认以下等式(不要害怕):
要掌握这里的一般概念,您必须明白,配对函数允许我们对加密值进行一些有限的计算:我们可以进行任意的加法,但只是一次乘法。 此加法来自加密本身已经加性同态的事实,并且单一乘法是由配对函数具有的两个参数实现的。 因此,e(W',E(1))= e(W,E(α))在加密空间中基本上将W'乘以1,并将其与加密空间中乘以α的W进行比较。 如果您查看W和W'的值应该是 - E(w(s))和E(αw(s)),则检查证明者是否提供了正确的证据。
如果您还记得关于在秘密点评估多项式的部分,这三个首先检查基本上验证了证明者确实评估了由CRS中的部分构建的多项式。 第二项用于验证证明者使用正确的多项式v和w,而不仅仅是一些任意的。 其背后的思想是证明者无法通过某种其他方式计算加密组合E(βv vfree (s)+βw w(s))),而不是从E(v free (s) )和E(w(s))。 原因是值βv不是孤立的CRS的一部分,而是仅与数值v k (s)结合,并且βw仅与多项式w k (s)结合而已知。 “混合”他们的唯一方法是通过同样加密的γ。
假设证明者提供了正确的证据,让我们检查平等是否成立。 左侧和右侧分别是
(s)+ a 1 v 1 (s)+ ... + a m v m (s))(w 0 (s)+ b 1 w 1 (s)+ ... + b m w(s))= h(s)t(s),这是QSP问题的主要条件。 注意,对加密值的乘法转换为对未加密值的加法,因为E(x)E(y)= g x g y = g x + y = E(x + y)。
正如我在开始时所说的,关于zkSNARKS的显着特征比零知识部分更简洁。 我们现在将看到如何增加零知识,下一部分将更加简单地介绍简洁性。
这个想法是,证明者将一些数值“转移”一个随机秘密数量,并平衡等式另一端的偏移。 证明者选择随机δ自由度δw并在证明中执行以下替换
通过这些替换,含有证人因素编码的V free和W值基本上变得不可区分形式的随机性,因此不可能提取证人。 大多数平等检查对修改是“免疫的”,我们仍然必须纠正的唯一值是H或h(s)。 我们必须确保
仍然成立。 随着修改,我们得到了
并通过扩大产品,我们看到用h取代h(s)
会做的伎俩。
正如您在前面的章节中看到的,证明只包含一个组的7个元素(通常是椭圆曲线)。 此外,验证者所要做的工作是检查涉及配对函数和计算E(v in (s))的一些等式,这是一个输入大小为线性的任务。 值得注意的是,验证字符串的大小和验证QSP(没有SNARKs)所需的计算量都不起任何作用。 这意味着SNARK-验证极其复杂的问题和非常简单的问题都需要付出相同的努力。 主要原因是因为我们只检查单点的多项式标识,而不检查完整的多项式。 多项式可以变得越来越复杂,但一个点总是一个点。 影响验证工作的唯一参数是安全级别(即组的大小)和输入的最大大小。
通过将其中的一些参数转换为证人,可以减少第二个参数,输入大小:
而不是验证函数f(u,w),其中u是输入,w是证人,我们取一个散列函数h并验证
这意味着我们用输入h(u)的散列(它应该更短)替换输入u,并验证存在H(u)的一些值x(因此很可能等于u )除了检查f(x,w)。 这基本上将原始输入u移动到见证字符串中,从而增加见证大小,但将输入大小减小到常量。
这是显着的,因为它使我们能够在不断的时间内任意地检验复杂的语句。
由于验证任意计算是以太坊区块链的核心,zkSNARK当然与以太坊非常相关。 使用zkSNARK,不仅可以执行任何人都可以验证的秘密任意计算,而且可以高效地执行此操作。
虽然以太坊使用图灵完整虚拟机,但目前还不可能在以太坊实施zkSNARK验证程序。 验证者任务在概念上可能看起来很简单,但配对函数实际上很难计算,因此它将使用比单个块中当前可用的更多的气体。 椭圆曲线乘法已经相当复杂,并且配对将其转换到另一个级别。
现有的zkSNARK系统(如zCash)为每项任务使用相同的问题/电路/计算。 在zCash的情况下,它是交易验证者。 在Ethereum上,zkSNARK不会局限于单个计算问题,相反,每个人都可以为其专门的计算问题建立一个zkSNARK系统,而无需启动新的区块链。 添加到以太坊的每个新zkSNARK系统都需要一个新的秘密可信设置阶段(某些部分可以重复使用,但不是全部),即必须生成新的CRS。 也可以为“通用虚拟机”添加zkSNARK系统。 这不需要为新用例创建新设置,就像您不需要为以太坊新智能合约引导新区块链一样。
有多种方法可以为Ethereum启用zkSNARK。 所有这些都降低了配对功能和椭圆曲线操作的实际成本(其他所需操作已经足够便宜),因此也可以降低这些操作的气体成本。
第一种选择当然是从长远看更好的方案,但难以实现。 目前,我们正在努力为EVM添加功能和限制,这将允许更好的实时编译和解释,而无需对现有实施进行太多必要的更改。 另一种可能是完全更换EVM并使用诸如eWASM之类的东西。
第二种选择可以通过迫使所有以太坊客户端实现一定的配对函数并在某个椭圆曲线上乘以所谓的预编译合约来实现。 好处是这可能更容易和更快实现。 另一方面,缺点是我们固定在一定的配对函数和一定的椭圆曲线上。 以太坊的任何新客户都必须重新实施这些预编译的合同。 此外,如果有进步,有人发现更好的zkSNARK,更好的配对函数或更好的椭圆曲线,或者如果在椭圆曲线,配对函数或zkSNARK中找到缺陷,我们将不得不添加新的预编译合约。
https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/