看zk-SNARK的文章或者资料的时候,经常会碰到一些算法名称,比如Groth16,GGPR13等等。这些名称是由算法提出的作者名称或者名称首字母以及相应的年份组成。Groth16,是由Jens Groth在2016年提出的算法。GGPR13,是由Rosario Gennaro,Craig Gentry,Bryan Parno,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 定理 - 假设 f ( x 1 , x 2 , . . . , x n ) f(x_1, x_2, ..., x_n) f(x1,x2,...,xn)是个n元多项式,多项式总的阶为d。如果 r 1 , r 2 , . . . , r n r_1, r_2, ..., r_n r1,r2,...,rn是从有限集合S中随机选取,则 f ( r 1 , r 2 , . . . , r n ) = 0 f(r_1, r_2, ..., r_n) = 0 f(r1,r2,...,rn)=0的概率是小于等于 d ∣ s ∣ \frac{d}{|s|} ∣s∣d。简单的说,如果多元多项式,在很大的集合中随机选取参数,恰好函数f等于0的概率几乎为0。
https://brilliant.org/wiki/schwartz-zippel-lemma/
线性(Linear)函数 - 假设函数f满足两个条件:1. f ( x + y ) = f ( x ) + f ( y ) f(x+y) = f(x)+f(y) f(x+y)=f(x)+f(y) 2. f ( α x ) = α f ( x ) f(\alpha x) = \alpha f(x) f(αx)=αf(x),则称函数f为线性函数。
Affine 函数 - 假设函数g,能找到一个线性函数f,满足 g ( x ) = f ( x ) + b g(x) = f(x) + b g(x)=f(x)+b,则称函数g为Affine函数。也就是,Affine函数是由一个线性函数和偏移构成。
Trapdoor函数 - 假设一个Trapdoor函数f, x → f ( x ) x \to f(x) x→f(x) 很容易,但是 f ( x ) → x f(x) \to x f(x)→x非常难。但是,如果提供一个secret, f ( x ) → x f(x) \to x f(x)→x也非常容易。
Jens Groth是谁?
Groth是英国伦敦UCL大学的计算机系的教授。伦敦大学学院 (University College London),简称UCL,建校于1826年,位于英国伦敦,是一所世界著名的顶尖高等学府,为享有顶级声誉的综合研究型大学,伦敦大学联盟创始院校,英国金三角名校,与剑桥大学、牛津大学、帝国理工、伦敦政经学院并称G5超级精英大学。
http://www0.cs.ucl.ac.uk/staff/j.groth/
Groth从2009年开始,每年发表一篇或者多篇密码学或者零知识证明的文章,所以你经常会听到Groth09,Groth10等等算法。
简言之,牛人~。
NILP
Groth16的论文先引出NILP(non-interactive linear proofs)的定义:
-
( σ , τ ) ← S e t u p ( R ) (\sigma, \tau) \gets Setup(R) (σ,τ)←Setup(R) :设置过程,生成 σ ∈ F m \sigma \in F^m σ∈Fm, τ ∈ F n \tau \in F^n τ∈Fn。
-
π ← P r o v e ( R , σ , ϕ , ω ) \pi \gets Prove(R, \sigma, \phi, \omega) π←Prove(R,σ,ϕ,ω) :证明过程,证明过程又分成两步:a. 生成线性关系 Π ← P r o o f M a t r i x ( R , ϕ , ω ) \Pi \gets ProofMatrix(R, \phi, \omega) Π←ProofMatrix(R,ϕ,ω),其中ProofMatrix是个多项式算法。b. 生成证明: π = Π σ \pi = \Pi\sigma π=Πσ。
-
0 / 1 ← V f y ( R , σ , ϕ , π ) 0/1 \gets Vfy(R, \sigma, \phi, \pi) 0/1←Vfy(R,σ,ϕ,π) :验证过程,验证者使用 ( R , ϕ ) (R, \phi) (R,ϕ)生成电路t,并验证 t ( σ , π ) t(\sigma, \pi) t(σ,π)是否成立。
在NILP定义的基础上,Groth16进一步定义了split NILP,也就是说,CRS分成两部分 ( σ 1 , σ 2 ) (\sigma1, \sigma2) (σ1,σ2),证明者提交的证明也分成两部分 ( π 1 , π 2 ) (\pi1, \pi2) (π1,π2)。
总的来说,核心在“Linear”上,证明者生成的证明和CRS成线性关系。
QAP的NILP
QAP的定义为"Relation": R = ( F , a u x , ℓ , { u i ( X ) , v i ( X ) , w i ( X ) } i = 0 m , t ( X ) ) R=(F, aux, \ell, \{u_i(X), v_i(X), w_i(X)\}_{i=0}^m, t(X)) R=(F,aux,ℓ,{ ui(X),vi(X),wi(X)}i=0m,t(X))。也就是说,statements为 ( a 1 , . . . , a ℓ ) ∈ F ℓ (a_1, ..., a_\ell) \in F^\ell (a1,...,aℓ)∈Fℓ, witness为 ( a l + 1 , . . . , a m ) ∈ F m − ℓ (a_{l+1}, ..., a_m) \in F^{m-\ell} (al+1,...,am)∈Fm−ℓ,并且 a 0 = 1 a_0 = 1 a0=1的情况下,满足如下的等式:
∑ i = 0 m a i u i ( X ) ⋅ ∑ i = 0 m a i v i ( X ) = ∑ i = 0 m a i w i ( X ) + h ( X ) t ( X ) \sum_{i=0}^m a_iu_i(X) \cdot \sum_{i=0}^m a_iv_i(X) = \sum_{i=0}^m {a_iw_i(X)+h(X)t(X)} ∑i=0maiui(X)⋅∑i=0maivi(X)=∑i=0maiwi(X)+h(X)t(X)
t ( X ) t(X) t(X)的阶为n。
-
设置过程:随机选取 α , β , γ , δ , x ← F ∗ \alpha, \beta, \gamma, \delta, x \gets F^* α,β,γ,δ,x←F∗,生成 σ , τ \sigma, \tau σ,τ。
τ = ( α , β , γ , δ , x ) \tau = (\alpha, \beta, \gamma, \delta, x) τ=(α,β,γ,δ,x)
σ = ( α , β , γ , δ , { x i } i = 0 n − 1 , { β u i ( x ) + α v i ( x ) + w i ( x ) γ } i = 0 ℓ , { β u i ( x ) + α v i ( x ) + w i ( x ) δ } i = ℓ + 1 m , { x i t ( x ) δ } i = 0 n − 2 ) \sigma = (\alpha, \beta, \gamma, \delta, \{x^i\}_{i=0}^{n-1}, \{\cfrac{\beta u_i(x)+\alpha v_i(x)+w_i(x)}{\gamma}\}_{i=0}^\ell, \{\cfrac{\beta u_i(x)+\alpha v_i(x)+w_i(x)}{\delta}\}_{i=\ell+1}^m, \{\cfrac{x^it(x)}{\delta}\}_{i=0}^{n-2}) σ=(α,β,γ,δ,{ xi}i=0n−1,{ γβui(x)+αvi(x)+wi(x)}i=0ℓ,{ δβui(x)+αvi(x)+wi(x)}i=ℓ+1m,{ δxit(x)}i=0n−2)
-
证明过程:随机选择两个参数 r 和 s r和s r和s,计算 π = Π σ = ( A , B , C ) \pi = \Pi\sigma = (A, B, C) π=Πσ=(A,B,C)
A = α + ∑ i = 0 m a i u i ( x ) + r δ A = \alpha + \sum_{i=0}^{m} a_i u_i(x) + r\delta A=α+∑i=0maiui(x)+rδ
B = β + ∑ i = 0 m a i v i ( x ) + s δ B = \beta + \sum_{i=0}^{m} a_i v_i(x) + s\delta B=β+∑i=0maivi(x)+sδ
C = ∑ i = ℓ + 1 m a i ( β u i ( x ) + α v i ( x ) + w i ( x ) ) + h ( x ) t ( x ) δ + A s + r B − r s δ C = \cfrac{\sum_{i=\ell+1}^m a_i (\beta u_i(x)+\alpha v_i(x)+w_i(x))+h(x)t(x)}{\delta} + As + r B - r s \delta C=δ∑i=ℓ+1mai(βui(x)+αvi(x)+wi(x))+h(x)t(x)+As+rB−rsδ
-
验证过程:
验证过程,计算如下的等式是否成立:
A ⋅ B = α ⋅ β + ∑ i = 0 ℓ a i ( β u i ( x ) + α v i ( x ) + w i ( x ) ) γ ⋅ γ + C ⋅ δ A\cdot B = \alpha \cdot \beta + \cfrac{\sum_{i=0}^\ell a_i (\beta u_i(x)+\alpha v_i(x)+w_i(x))}{\gamma} \cdot \gamma + C \cdot \delta A⋅B=α⋅β+γ∑i=0ℓai(βui(x)+αvi(x)+wi(x))⋅γ+C⋅δ
注意,设置过程中的x是一个值,不是代表多项式。在理解证明/验证过程的时候,必须要明确,A/B/C的计算是和CRS中的参数成线性关系(NILP的定义)。在明确这一点的基础上,可以看出 α 和 β \alpha和 \beta α和β的参数能保证A/B/C的计算采用统一的 a 0 , a 1 , . . . , a m a_0, a_1, ... , a_m a0,a1,...,am参数。因为 A ⋅ B A\cdot B A⋅B会包含 ∑ i = 0 ℓ a i ( β u i ( x ) + α v i ( x ) ) \sum_{i=0}^\ell a_i (\beta u_i(x)+\alpha v_i(x)) ∑i=0ℓai(βui(x)+αvi(x))子项,要保证 A ⋅ B A\cdot B A⋅B和C相等,必须采用统一的 a 0 , a 1 , . . . , a m a_0, a_1, ... , a_m a0,a1,...,am</