看zk-SNARK的文章或者资料的时候,经常会碰到一些算法名称,比如Groth16,GGPR13等等。这些名称是由算法提出的作者名称或者名称首字母以及相应的年份组成。Groth16,是由Jens Groth在2016年提出的算法。GGPR13,是由Rosario Gennaro,Craig Gentry,BryanParno,Mariana Raykova在2013年提出的算法。
零知识证明(zk-SNARK ),从QSP/QAP到Groth16,期间也有很多学者专家,提出各种优化(优化计算时间,优化证明的大小,优化电路的尺寸等等)。Groth16提出的算法,具有非常少的证明数据(2/3个证明数据)以及一个表达式验证。
Groth16论文(On the Size of Pairing-based Non-interactive Arguments)的下载地址:
https://eprint.iacr.org/2016/260.pdf
本文主要从工程应用理解的角度介绍Groth16算法的证明和验证过程。文章中所用的中文字眼可能和行业中不一样,欢迎批评指出。
Proofs - 在零知识证明的场景下,Proofs指具有完美的完备性(Completeness)以及完美的可靠性(Soundness)。也就是,具有无限计算资源也无法攻破。
Arguments - 在零知识证明的场景下,Arguments是指具有完美的完备性以及多项式计算的可靠性。也就是,在多项式计算能力下,是可靠的。
Schwartz-Zippel 定理 - 假设是个n元多项式,多项式总的阶为d。如果
是从有限集合S中随机选取,则的概率是小于等于。简单的说,如果多元多项式,在很大的集合中随机选取参数,恰好函数f等于0的概率几乎为0。
https://brilliant.org/wiki/schwartz-zippel-lemma/
线性(Linear)函数 - 假设函数f满足两个条件:1. 2.,则称函数f为线性函数。
Affine 函数 - 假设函数g,能找到一个线性函数f,满足,则称函数g为Affine函数。也就是,Affine函数是由一个线性函数和偏移构成。
Trapdoor函数 - 假设一个Trapdoor函数f,很容易,但是非常难。但是,如果提供一个secret,也非常容易。
QAP的定义为"
Relation":。也就是说,statements为, witness为,并且的情况下,满足如下的等式:
的阶为n。
设置过程:随机选取,生成。
证明过程:随机选择两个参数,计算
验证过程:
验证过程,计算如下的等式是否成立:
注意,设置过程中的x是一个值,不是代表多项式。在理解证明/验证过程的时候,必须要明确,A/B/C的计算是和CRS中的参数成线性关系(NILP的定义)。在明确这一点的基础上,可以看出的参数能保证A/B/C的计算采用统一的参数。因为会包含
子项,要保证和C相等,必须采用统一的参数。参数增加随机因子,保证零知识(验证者无法从证明中获取有用信息)。参数保证了验证等式的最后两个乘积独立于的参数。
完备性证明(Completeness):
完备性证明,也就是验证等式成立。
可靠性证明 (Soundness):
Groth16算法证明的是statistical knowledge soundness,假设证明者提供的证明和CRS成线性关系。也就是说,证明A可以用如下的表达式表达(A和CRS的各个参数成线性关系):
同理,B/C都可以写成类似的表达:
从Schwartz-Zippel 定理,我们可以把A/B/C看作是的多项式。观察
这个验证等式,发现一些变量的限制条件:
1) (等式的右边没有)
不失一般性,可以假设。
2) (等式右边)
不失一般性,可以假设。
3)(等式的右边没有因子)
也就是。
在上述三个约束下,A/B的表达式变成:
4)等式的右边没有
不失一般性,
5)等式的右边没有
不失一般性,。
6)等式的右边没有,
所以
7)等式的右边没有和
所以,。
在上述七个约束下,A/B的表达式变成:
再看验证的等式:
观察,因为不存在 ,所以,。
也就是说
代入验证等式,所以可以推导出:
,
如果,假设,对于,则
代入A/B,可以获取以下等式:
在证明和CRS线性关系下,所有能使验证等式成立的情况下,等式必须成立。也就说,能提供正确证明的,肯定知道witness。
5
QAP的NIZK Arguments
从QAP的NILP可以演化为QAP的NIZK Arguments。也就是说Groth16算法并不是完美的可靠,而是多项式计算情况下可靠。QAP的定义为"Relation"
也就是说,在一个域中,statements为, witness为,并且的情况下,满足如下的等式(的阶为n):
也就是说,三个有限群, 对应的生成元分别是。为了方便起见,也为了和论文的表达方式一致,的计算用表示,的计算用表示。
设置过程:随机选取,生成。
证明过程:随机选择两个参数,计算
验证过程:验证如下的等式是否成立。
很容易发现,验证过程的等式也可以用4个配对函数表示:
证明过程和QAP的NILP的证明过程类似,不再详细展开。
6
证明元素的最小个数
论文指出zk-SNARK的最少的证明元素是2个。上述的证明方式是需要提供3个证明元素(A/B/C)。论文进一步说明,如果将电路进行一定方式的改造,使用同样的理论,可以降低证明元素为2个,但是,电路的大小会变的很大。
总结:Groth16算法是Jens Groth在2016年发表的算法。该算法的优点是提供的证明元素个数少(只需要3个),验证等式简单,保证完整性和多项式计算能力下的可靠性。Groth16算法论文同时指出,zk-SNARK算法需要的最少的证明元素为2个。目前Groth16算法已经被ZCash,Filecoin等项目使用。