网络上讲解零知识证明的文章就不多,这些文章要不太浅显,要不太深入,很少有能给入门者整体框架上的认识。
比如,阿里巴巴零知识证明就是一个非常好的通俗理解零知识证明的例子:
阿里巴巴被强盗抓住,为了保命,他需要向强盗证明自己拥有打开石门的密码,同时又不能把密码告诉强盗。他想出一个解决办法,先让强盗离开自己一箭之地,距离足够远让强盗无法听到口令,足够近让阿里巴巴无法在强盗的弓箭下逃生。阿里巴巴就在这个距离下向强盗展示了石门的打开和关闭。
这个整个过程就是零知识证明,证明者能够在不向验证者提供任何有用信息(石门的口令)的情况下,使验证者相信某个论断(阿里巴巴知道打开石门的方法)是正确的。
技术人除了通俗的理解零知识证明外,还需要对零知识的理论和推导过程深入理解运用。以太坊的一篇blog,比较适合想深入理解零知识证明的小伙伴。
https://blog.ethereum.org/2016/12/05/zksnarks-in-a-nutshell/
这篇文章也是这篇blog的翻译和我自己的理解。通过这篇文章,能快速建立零知识证明的逻辑框架。虽然这篇文章有些推导公式,但是相对简单,小伙伴可以耐心阅读。
先给出零知识证明的逻辑框架:
0 - 零知识证明的基本概念
零知识证明,zkSNARK,zero-knowledge Succint Non-interactive ARguments of Knowledge的简称:
零知识证明大体由四部分组成:
在了解零知识的基础概念上,慢慢推导整个零知识证明过程,先从NP问题说起。
1- NP问题以及约化
解决一个问题需要花费时间。如果解决问题需要的时间与问题的规模之间是多项式关系,则可以称该问题具有多项式复杂度。一般问题可分成两类:P问题和NP问题。P问题指的是在多项式时间内可解的问题。 NP问题(Non-Deterministic Polynomial Problem,非确定性多项式问题),指不能在多项式内可解,但是可以在多项式时间内验证的问题。
很显然,P问题也是NP问题,但是是否NP问题是P问题,NP=P?,目前为止还没有人能证明。一般认为,NP问题不等于P问题,也就是说,NP问题不存在多项式解法。
约化(Reduction),可以理解成问题的转化。对任意一个程序A的输入,都能按某种法则变换成程序B的输入,使两程序的输出相同,那么,可以说,问题A可约化为问题B。
NPC问题,是一个NP问题,并且,其他所有的NP问题都能归约到它。简单的说,NP问题之间可以相互归约,一个NP问题求解,其他NP问题一样能求解。
举例说明,NP问题以及NP问题的归约。
布尔公式满足性问题(SAT问题,boolean formula satisfiability) 就是一个NP问题。布尔公式定义如下:
假设变量 x 1 x_1 x1, x 2 x_2 x2, x 3 x_3 x3, … 是布尔公式
假设f是布尔公式, ¬ f \lnot f ¬f也是布尔公式(取反)
假设f和g是布尔公式, f ∧ g f \land g f∧g和 f ∨ g f \lor g f∨g也是布尔公式(与和或)
一个布尔公式可满足,指输入是0/1的情况下,存在输出为真。SAT问题指,找出所有可满足的布尔公式。SAT问题看上去,除了枚举一个个可能的布尔公式外,没有更好的办法,也就是多项式时间内不可解。如果知道一个可满足的布尔公式,验证非常方便(输入是0/1的情况下,看看输出是否为真)。SAT问题是NP问题。
再看看另外一个NP问题:PolyZero问题。PolyZero问题指某个多项式满足:多项式输入是0或1的情况下,多项式输出为0。
P o l y Z e r o ( f ) : = 1 PolyZero(f) := 1 PolyZero(f):=1
f满足输入是0/1的情况下,多项式输出为0。
一个布尔表达式f可以通过如下的归约函数r,转化为多项式:
也就是说,一个SAT问题,通过归约函数r,可以归约为一个PolyZero问题:f是可满足的,当且仅当r(f)输出为0。
S A T ( f ) = P o l y Z e r o ( r ( f ) ) SAT(f) = PolyZero(r(f)) SAT(f)=PolyZero(r(f))
总结一下,NP问题是在多项式时间内无解,但是可以多项式时间验证的问题。NP问题可以相互归约。
2 - QSP问题
需要证明的问题,肯定是NP问题,如果是P问题,不存在问题解的”寻找“,也就不存在证明。简单的说,zkSNARK问题处理的都是NP问题。既然NP问题相互可以归约,首先需要确定一个NP问题,其他NP问题都可以归约到这个NP问题,再进行证明。也就是,证明了一个NP问题,就可以证明所有NP问题。
QSP问题是个NP问题,也特别适合zkSNARK。为啥特别适合,目前还不需要深究。有相关的论文论证:https://eprint.iacr.org/2012/215.pdf。
QSP问题是这样一个NP问题:给定一系列的多项式,以及给定一个目标多项式,找出多项式的组合能整除目标多项式。输入为 n n n位的QSP问题定义如下:
给定一个证据(Witness)u,满足如下条件,即可验证u是QSP问题的解:
a k , b k = 1 如 果 k = f ( i , u [ i ] ) a_k, b_k = 1\ \ 如果 k = f(i, u[i]) ak,bk=1 如果k=f(i,u[i])
a k , b k = 0 如 果 k = f ( i , 1 − u [ i ] ) a_k, b_k = 0\ \ 如果 k = f(i, 1- u[i]) ak,bk=0 如果k=f(i,1−u[i])
v a w b 能 整 除 t , 其 中 v a = v 0 + a 1 v 1 + . . . + a m v m , w b = w 0 + b 1 w 1 + . . . + b m w m v_aw_b能整除\ t,其中v_a = v_0 + a_1v_1 + ... + a_mv_m, w_b = w_0 + b_1w_1+ ... + b_mw_m vawb能整除 t,其中va=v0+a1v1+...+amvm,wb=w0+b1w1+...+bmwm
对一个证据u,对每一位进行两次映射计算( u [ i ] u[i] u[i]以及 1 − u [ i ] 1-u[i] 1−u[i]),确定多项式之间的系数。因为针对证据u的每一位,计算两次,确定多项式之间的系数,如果 2 n < m 2n < m 2n<m,多项式的选择还是有很大的灵活性。
如果证明者知道QSP问题的解,需要提供证据(也就是u)。验证者在获知证据u的情况下,按照上述的规则恢复出多项式的系数,验证 v a v b v_av_b vavb是否能整除 t t t: t h = v a w b th=v_aw_b th=vawb。为了方便验证者验证,证明者可以同时提供 h h h。在多项式维度比较大的情况下,多项式的乘法还是比较复杂的。
有个简单的想法,与其验证者验证整个多项式是否相等,不如随机挑选数值进行验证。假设验证者随机挑选验证数值s,验证者只需要验证 t ( s ) h ( s ) = v a ( s ) w b ( s ) t(s)h(s)=v_a(s)w_b(s) t(s)h(s)=va(s)wb(s)。
以上是基础知识,下面开始介绍zkSNARK的证明过程。在继续深入一个QSP问题证明细节之前,先看看一个多项式问题的证明过程。
3 - 多项式问题的证明过程
假设一个多项式 f ( x ) = a 0 + a 1 x + a 2 x 2 + . . . + a d − 1 x d − 1 + a d x d f(x)=a_0+a_1x+a_2x^2+ ... + a_{d-1}x^{d-1}+a_dx^d f(x)=a0+a1x+a2x2+...+ad−1xd−1+adxd。证明一个多项式,即给定一个输入 x x x,提供 f ( x ) f(x) f(x)的证明。
3.1 有线群论基础(椭圆曲线)
定一个有限群,生成元是 g g g,阶为 n n n,则该群包括如下的元素: g 0 , g 1 , g 2 , . . . , g n − 1 g^0,g^1,g^2, ... ,g^{n-1} g0,g1,g2,...,gn−1。通过有限群加密的方式很简单: E ( x ) : = g x E(x) := g^x E(x):=gx。也就是说,得知 g x g^x gx的情况下,不能反推出 x x x。
3.2 选定随机数
验证者随机选择一个有限群中的元素,比如 s s s。提供如下的计算结果( s s s的不同阶的加密结果):
E ( s 0 ) , E ( s 1 ) , . . . , E ( s d ) E(s^0), E(s^1), ... , E(s^d) E(s0),E(s1),...,E(sd)
在生成这些计算结果后, s s s就不需要了,可以忘记。
3.3 E ( f ( s ) ) E(f(s)) E(f(s))计算
举个例子, f ( x ) = 4 + 2 x + 4 x 2 f(x) = 4 + 2x + 4x^2 f(x)=4+2x+4x2, E ( f ( s ) ) = E ( s 0 ) 4 E ( s 1 ) 2 E ( s 2 ) 4 E(f(s)) = E(s^0)^4E(s^1)^2E(s^2)^4 E(f(s))=E(s0)4E(s1)2E(s2)4。显然, E ( f ( s ) ) E(f(s)) E(f(s)) 可以不知道 s s s 的情况下,通过验证者提供的数据计算出来。
3.4 α \alpha α对
注意的是,验证者是不知道待证明的多项式参数的,即使证明者提供了 E ( f ( s ) ) E(f(s)) E(f(s)),验证者也无法验证。 α \alpha α对的方法可以让验证者确认证明者是通过多项式计算出结果。 在3.2的基础上,验证者还随机选择另外一个元素 α \alpha α,并提供额外的计算结果:
E ( α s 0 ) , E ( α s 1 ) , . . . , E ( α s d ) E(\alpha s^0), E(\alpha s^1), ... , E(\alpha s^d) E(αs0),E(αs1),...,E(αsd)
证明者需要提供 E ( f ( s ) ) E(f(s)) E(f(s))和 E ( α f ( s ) ) E(\alpha f(s)) E(αf(s))。
E ( f ( s ) ) = E ( s 0 ) 4 E ( s 1 ) 2 E ( s 2 ) 4 E(f(s)) = E(s^0)^4E(s^1)^2E(s^2)^4 E(f(s))=E(s0)4E(s1)2E(s2)4
E ( α f ( s ) ) = E ( α s 0 ) 4 E ( α s 1 ) 2 E ( α s 2 ) 4 E(\alpha f(s)) = E(\alpha s^0)^4E(\alpha s^1)^2E(\alpha s^2)^4 E(αf(s))=E(αs0)4E(αs1)2E(αs2)4
3.5 配对函数
配对函数 e e e,满足如下定义:
e ( g x , g y ) = e ( g , g ) x y e(g^x, g^y) = e(g, g)^{xy} e(gx,gy)=e(g,g)xy
验证者验证 α \alpha α对的方式很简单,检验如下的等式是否成立:
e ( E ( f ( s ) ) , g α ) = e ( E ( α f ( s ) ) , g ) e(E(f(s)), g^\alpha) = e(E(\alpha f(s)), g) e(E(f(s)),gα)=e(E(αf(s)),g)
假设 A = e ( E ( f ( s ) ) , B = E ( α f ( s ) ) A= e(E(f(s)), B=E(\alpha f(s)) A=e(E(f(s)),B=E(αf(s))推导过程如下:
e ( A , g α ) = e ( E ( f ( s ) ) , g α ) = e ( g f ( s ) , g α ) = e ( g , g ) α f ( s ) e(A, g^\alpha) = e(E(f(s)), g^\alpha) = e(g^{f(s)}, g^\alpha) = e(g, g)^{\alpha f(s)} e(A,gα)=e(E(f(s)),gα)=e(gf(s),gα)=e(g,g)αf(s)
e ( B , g ) = e ( E ( α f ( s ) ) , g ) = e ( g α f ( s ) , g ) = e ( g , g ) α f ( s ) e(B, g) = e(E(\alpha f(s)), g) = e(g^{\alpha f(s)}, g) = e(g, g)^{\alpha f(s)} e(B,g)=e(E(αf(s)),g)=e(gαf(s),g)=e(g,g)αf(s)
到此为止,验证者提供 α \alpha α对的情况下,证明者可以证明通过某个多项式计算出某个结果,验证者不知道具体的多项式的参数。
3.6 δ \delta δ 偏移
更进一步,证明者采用 δ \delta δ 偏移,甚至不想让验证者知道 E ( f ( s ) ) E(f(s)) E(f(s))。采用 δ \delta δ 偏移,证明者不再提供 A A A和 B B B,而是随机一个 δ \delta δ参数,提供 A ′ A' A′和 B ′ B' B′。
A ′ = E ( δ + f ( s ) ) = g δ + f ( s ) = g δ g f ( s ) = E ( δ ) E ( f ( s ) ) = E ( δ ) A A' = E(\delta + f(s)) = g^{\delta + f(s)} = g^\delta g^{f(s)} = E(\delta)E(f(s)) = E(\delta)A 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 ) = E ( α ) δ E ( α f ( s ) ) = E ( α ) δ B B' = E(\alpha (\delta + f(s))) = E(\alpha\delta + \alpha f(s)) = g^{\alpha \delta + \alpha f(s)} = E(\alpha)^\delta E(\alpha f(s)) = E(\alpha)^\delta B B′=E(α(δ+f(s)))=E(αδ+αf(s))=gαδ+αf(s)=E(α)δE(αf(s))=E(α)δB
很显然,验证者从 A ′ A' A′无法推导出 E ( f ( s ) ) E(f(s)) E(f(s)),但验证者一样能验证 α \alpha α对的配对函数是否成立:
e ( A ′ , g α ) = e ( E ( δ + f ( s ) ) , g α ) = e ( g δ + f ( s ) , g α ) = e ( g , g ) α ( δ + f ( s ) ) e(A', g^\alpha) = e(E(\delta + f(s)), g^\alpha) = e(g^{\delta + f(s)}, g^\alpha) = e(g, g)^{\alpha (\delta + f(s))} e(A′,gα)=e(E(δ+f(s)),gα)=e(gδ+f(s),gα)=e(g,g)α(δ+f(s))
e ( B , g ) = e ( E ( α ( δ + f ( s ) ) , g ) = e ( g α ( δ + f ( s ) ) , g ) = e ( g , g ) α ( δ + f ( s ) ) e(B, g) = e(E(\alpha (\delta + f(s)), g) = e(g^{\alpha (\delta + f(s))}, g) = e(g, g)^{\alpha (\delta + f(s))} e(B,g)=e(E(α(δ+f(s)),g)=e(gα(δ+f(s)),g)=e(g,g)α(δ+f(s))
多项式的整个证明过程如下图所示:
4 - QSP问题的skSNARK证明
skSNARK证明过程分为两部分:a) setup阶段 b)证明阶段。QSP问题就是给定一系列的多项式 v 0 , . . . , v m , w 0 , . . . , w m v_0, ..., v_m, w_0, ..., w_m v0,...,vm,w0,...,wm以及目标多项式 t t t,证明存在一个证据 u u u。这些多项式中的最高阶为 d d d。
4.1 setup和CRS
CRS - Common Reference String,也就是预先setup的公开信息。在选定 s s s和 α \alpha α的情况下,发布如下信息:
s s s和 α \alpha α的计算结果
E ( s 0 ) , E ( s 1 ) , . . . , E ( s d ) E(s^0), E(s^1), ... , E(s^d) E(s0),E(s1),...,E(sd)
E ( α s 0 ) , E ( α s 1 ) , . . . , E ( α s d ) E(\alpha s^0), E(\alpha s^1), ... , E(\alpha s^d) E(αs0),E(αs1),...,E(αsd)
多项式的 α \alpha α对的计算结果
E ( t ( s ) ) , E ( α t ( s ) ) E(t(s)), E(\alpha t(s)) E(t(s)),E(αt(s))
E ( v 0 ( s ) ) , . . . E ( v m ( s ) ) , E ( α v 0 ( s ) ) , . . . , E ( α v m ( s ) ) E(v_0(s)), ... E(v_m(s)), E(\alpha v_0(s)), ..., E(\alpha v_m(s)) E(v0(s)),...E(vm(s)),E(αv0(s)),...,E(αvm(s))
E ( w 0 ( s ) ) , . . . E ( w m ( s ) ) , E ( α w 0 ( s ) ) , . . . , E ( α w m ( s ) ) E(w_0(s)), ... E(w_m(s)), E(\alpha w_0(s)), ..., E(\alpha w_m(s)) E(w0(s)),...E(wm(s)),E(αw0(s)),...,E(αwm(s))
多项式的 β v , β w , γ \beta_v, \beta_w, \gamma βv,βw,γ 参数的计算结果
E ( γ ) , E ( β v γ ) , E ( β w γ ) E(\gamma), E(\beta_v\gamma), E(\beta_w\gamma) E(γ),E(βvγ),E(βwγ)
E ( β v v 1 ( s ) ) , . . . , E ( β v v m ( s ) ) E(\beta_vv_1(s)), ... , E(\beta_vv_m(s)) E(βvv1(s)),...,E(βvvm(s))
E ( β w w 1 ( s ) ) , . . . , E ( β w w m ( s ) ) E(\beta_ww_1(s)), ... , E(\beta_ww_m(s)) E(βww1(s)),...,E(βwwm(s))
E ( β v t ( s ) ) , E ( β w t ( s ) ) E(\beta_vt(s)), E(\beta_wt(s)) E(βvt(s)),E(βwt(s))
4.2 证明者提供证据
在QSP的映射函数中,如果 2 n < m 2n < m 2n<m, 1 , . . . , m 1, ..., m 1,...,m中有些数字没有映射到。这些没有映射到的数字组成 I f r e e I_{free} Ifree,并定义( k k k为未映射到的数字):
v f r e e ( x ) = ∑ k a k v k ( x ) v_{free}(x) = \sum_k a_kv_k(x) vfree(x)=k∑akvk(x)
证明者需提供的证据如下
V f r e e : = E ( v f r e e ( s ) ) , W : = E ( w ( s ) ) , H : = E ( h ( s ) ) , V_{free} := E(v_{free}(s)), \ W := E(w(s)), \ H := E(h(s)), Vfree:=E(vfree(s)), W:=E(w(s)), H:=E(h(s)),
V f r e e ′ : = E ( α v f r e e ( s ) ) , W ′ : = E ( α w ( s ) ) , H ′ : = E ( α h ( s ) ) , V_{free}' := E(\alpha v_{free}(s)), W' := E(\alpha w(s)), H' := E(\alpha h(s)), Vfree′:=E(αvfree(s)),W′:=E(αw(s)),H′:=E(αh(s)),
Y : = E ( β v v f r e e ( s ) + β w w ( s ) ) Y := E(\beta_vv_{free}(s) + \beta_ww(s)) Y:=E(βvvfree(s)+βww(s))
V f r e e / V f r e e ′ , W / W ′ , H / H ′ V_{free}/V_{free}', W/W', H/H' Vfree/Vfree′,W/W′,H/H′是 α \alpha α对,用以验证 v f r e e , w , h v_{free},w,h vfree,w,h是否是多项式形式。 t t t是已知,公开的,毋需验证。 Y Y Y用来确保 v f r e e ( s ) v_{free}(s) vfree(s)和 w ( s ) w(s) w(s)的计算采用一致的参数。
4.3 验证者验证
在QSP的映射函数中,如果 2 n < m 2n < m 2n<m, 1 , . . . , m 1, ..., m 1,...,m中所有映射到的数字作为组成系数组成的二项式定义为(和 v f r e e v_{free} vfree互补):
v i n ( x ) = ∑ k a k v k ( x ) v_{in}(x) = \sum_k a_kv_k(x) vin(x)=k∑akvk(x)
验证者需要验证如下的等式是否成立:
e ( V f r e e ′ , g ) = e ( V f r e e , g α ) , e ( W ′ , E ( 1 ) ) = e ( W , E ( α ) ) , e ( H ′ , E ( 1 ) ) = e ( H , E ( α ) ) e(V_{free}', g) = e(V_{free}, g^\alpha), e(W', E(1)) = e(W, E(\alpha)), e(H', E(1)) = e(H, E(\alpha)) e(Vfree′,g)=e(Vfree,gα),e(W′,E(1))=e(W,E(α)),e(H′,E(1))=e(H,E(α))
e ( E ( γ ) , Y ) = e ( E ( β v γ ) , V f r e e ) e ( E ( β w γ ) , W ) e(E(\gamma), Y) = e(E(\beta_v\gamma), V_{free})e(E(\beta_w\gamma), W) e(E(γ),Y)=e(E(βvγ),Vfree)e(E(βwγ),W)
e ( E ( v 0 ( s ) ) E ( v i n ( s ) ) V f r e e , E ( w 0 ( s ) ) W ) = e ( H , E ( t ( s ) ) ) e(E(v_0(s))E(v_{in}(s))V_{free}, E(w_0(s))W) = e(H, E(t(s))) e(E(v0(s))E(vin(s))Vfree,E(w0(s))W)=e(H,E(t(s)))
第一个(系列)等式验证 V f r e e / V f r e e ′ , W / W ′ , H / H ′ V_{free}/V'_{free}, W/W', H/H' Vfree/Vfree′,W/W′,H/H′是否是 α \alpha α对。
第二个等式验证 V f r e e V_{free} Vfree和 W W W的计算采用一致的参数。因为 v f r e e v_{free} vfree和w都是二项式,它们的和也同样是一个多项式,所以采用 γ \gamma γ 参数进行确认。证明过程如下:
e ( E ( γ ) , Y ) = e ( E ( γ ) , E ( β v v f r e e ( s ) + β w w ( s ) ) ) = e ( g , g ) γ ( β v v f r e e ( s ) + β w w ( s ) ) e(E(\gamma), Y) = e(E(\gamma), E(\beta_vv_{free}(s) + \beta_ww(s))) = e(g, g)^{\gamma(\beta_vv_{free}(s) + \beta_ww(s))} e(E(γ),Y)=e(E(γ),E(βvvfree(s)+βww(s)))=e(g,g)γ(βvvfree(s)+βww(s))
e ( E ( β v γ ) , V f r e e ) e ( E ( β w γ ) , W ) = e ( E ( β v γ ) , E ( v f r e e ( s ) ) ) e ( E ( β w γ ) , E ( w ( s ) ) ) = e ( g , g ) ( β v γ ) v f r e e ( s ) e ( g , g ) ( β w γ ) w ( s ) = e ( g , g ) γ ( β v v f r e e ( s ) + β w w ( s ) ) e(E(\beta_v\gamma), V_{free})e(E(\beta_w\gamma), W) = e(E(\beta_v\gamma), E(v_{free}(s)))e(E(\beta_w\gamma), E(w(s))) = e(g,g)^{(\beta_v\gamma)v_{free}(s)}e(g,g)^{(\beta_w\gamma)w(s)} = e(g, g)^{\gamma(\beta_vv_{free}(s) + \beta_ww(s))} e(E(βvγ),Vfree)e(E(βwγ),W)=e(E(βvγ),E(vfree(s)))e(E(βwγ),E(w(s)))=e(g,g)(βvγ)vfree(s)e(g,g)(βwγ)w(s)=e(g,g)γ(βvvfree(s)+βww(s))
第三个等式验证 v ( s ) w ( s ) = h ( s ) t ( s ) v(s)w(s) = h(s)t(s) v(s)w(s)=h(s)t(s),其中 v 0 ( s ) + v i n ( s ) + v f r e e ( s ) = v ( s ) v_0(s)+v_{in}(s)+v_{free}(s) = v(s) v0(s)+vin(s)+vfree(s)=v(s)。
简单的说,逻辑是确认 v , w , h v, w, h v,w,h是多项式,并且 v , w v,w v,w采用同样的参数,满足 v ( s ) w ( s ) = h ( s ) t ( s ) v(s)w(s) = h(s)t(s) v(s)w(s)=h(s)t(s)。
到目前为止,整个QSP的zkSNARK的证明过程逻辑已见雏形:
图2
4.4 δ \delta δ 偏移
为了进一步“隐藏” V f r e e V_{free} Vfree和 W W W,额外需要采用两个偏移: δ f r e e 和 δ w \delta_{free}和\delta_w δfree和δw。 v f r e e ( s ) / w ( s ) / h ( s ) v_{free}(s)/w(s)/h(s) vfree(s)/w(s)/h(s)进行如下的变形,验证者用同样的逻辑验证。
v f r e e ( s ) → v f r e e ( s ) + δ f r e e t ( s ) v_{free}(s) \rightarrow v_{free}(s) + \delta_{free}t(s) vfree(s)→vfree(s)+δfreet(s)
w ( s ) → w ( s ) + δ w t ( s ) w(s) \rightarrow w(s) + \delta_wt(s) w(s)→w(s)+δwt(s)
h ( s ) → h ( s ) + δ f r e e ( w 0 ( s ) + w ( s ) ) + δ w ( v 0 ( s ) + v i n ( s ) + v f r e e ( s ) ) + ( δ f r e e δ w ) t ( s ) h(s) \rightarrow h(s)+\delta_{free}(w_0(s) + w(s)) + \delta_w(v_0(s) + v_{in}(s) + v_{free}(s)) + (\delta_{free}\delta_w)t(s) h(s)→h(s)+δfree(w0(s)+w(s))+δw(v0(s)+vin(s)+vfree(s))+(δfreeδw)t(s)
至此,zkSNARK的推导逻辑就基本完整。使用zkSNARK证明,由如下的几步组成:
1/ 问题转化: 一个需要证明的NP问题转化为选定的NP问题(比如QSP问题)
2/ 设置参数(setup):设置参数的过程也是挑选随机数的过程,并提供CRS
3/ 证明者获取证据u,通过CRS计算证据(proof)
4/ 验证者验证证据以及响应的proof
总结:零知识证明由四部分组成:多项式问题的转化,随机挑选验证,同态隐藏以及零知识。需要零知识证明的问题先转化为特定的NP问题,挑选随机数,设置参数,公布CRS。证明者,在求得证据的情况下,通过CRS计算出证据。验证者再无需其他知识的情况下可以进行验证。