通用 zkSNARK

算术电路的约束

任意一个程序都可以表示为算术电路,因为 { + , × } \{+,\times\} {+,×}是完备的。将电路“拍平”,也就是添加中间变量,表示为如下形式的若干操作:
left operand    operator    right operand = output \text{left operand }\textbf{ operator }\text{ right operand = output} left operand  operator  right operand = output
其中运算符 operator ∈ { + , − , × , ÷ } \textbf{operator} \in \{+,-,\times,\div\} operator{+,,×,÷},左操作数 left operand \text{left operand} left operand、右操作数 right operand \text{right operand} right operand、运算结果 output \text{output} output,它们都是 F \mathbb F F上的变量(variable)

单个乘法操作

单个乘法操作的等式写作
a × b = c a \times b = c a×b=c

由于我们已经构建了多项式知识的 zkSNARK,因此我们希望把上述乘法操作转化为 operand polynomial
l ( x )   operator   r ( x ) = o ( x ) l(x) \textbf{ operator } r(x) = o(x) l(x) operator r(x)=o(x)

我们希望对于某个点 x = 1 x=1 x=1(随便取),它们满足
l ( 1 ) = a r ( 1 ) = b o ( 1 ) = c l(1) = a\\ r(1) = b\\ o(1) = c\\ l(1)=ar(1)=bo(1)=c

多项式可以取做: l ( x ) = a x , r ( x ) = b ( x ) , o ( x ) = c x l(x)=ax,r(x)=b(x),o(x)=cx l(x)=ax,r(x)=b(x),o(x)=cx,当然其他的多项式也都可以,满足上述点值关系即可。

那么就有下式成立:
l ( 1 ) × r ( 1 ) − o ( 1 ) = 0 l(1) \times r(1) - o(1) = 0 l(1)×r(1)o(1)=0

这意味着 x = 1 x=1 x=1是多项式 p ( x ) = l ( x ) r ( x ) − o ( x ) p(x) = l(x)r(x)-o(x) p(x)=l(x)r(x)o(x)的根。令 t ( x ) = x − 1 t(x) = x-1 t(x)=x1,那么
l ( x ) r ( x ) − o ( x ) = t ( x ) h ( x ) l(x)r(x) - o(x) = t(x)h(x) l(x)r(x)o(x)=t(x)h(x)

让 Prover 证明这个关于多项式知识的声明:多项式 p ( x ) = l ( x ) r ( x ) − o ( x ) p(x) = l(x)r(x)-o(x) p(x)=l(x)r(x)o(x)有一个因式 t ( x ) t(x) t(x)

注意,因为 p ( x ) p(x) p(x)是从三个多项式 l ( x ) , r ( x ) , o ( x ) l(x),r(x),o(x) l(x),r(x),o(x)运算出来的,因此如果证明这个声明:多项式 p ( x ) p(x) p(x)有一个因式 t ( x ) t(x) t(x),那么恶意的 Prover 可以伪造 p ( x ) ′ p(x)' p(x),只要它满足 p ′ ( 1 ) = 0 p'(1)=0 p(1)=0,就可以欺骗 Verifier

为了抵御 P P P的上述操作, P P P应当分别发送 l ( x ) , r ( x ) , o ( x ) l(x),r(x),o(x) l(x),r(x),o(x)的相关承诺。选取随机点 s s s,因为承诺的减法需要计算逆元 g − o ( s ) g^{-o(s)} go(s),这过于昂贵。我们让 V V V验证: l ( s ) r ( s ) = t ( s ) h ( s ) + o ( s ) l(s)r(s) = t(s)h(s) + o(s) l(s)r(s)=t(s)h(s)+o(s)

协议如下:

  1. Setup:所有参与者协同生成 composite CRS,与多项式知识的 SNARK 完全一样,略。

  2. Proving: P P P根据变量的取值 a , b , c a,b,c a,b,c,设置 l ( x ) , r ( x ) , o ( x ) l(x),r(x),o(x) l(x),r(x),o(x),然后计算出
    h ( x ) = l ( x ) r ( x ) − o ( x ) t ( x ) h(x) = \dfrac{l(x)r(x)-o(x)}{t(x)} h(x)=t(x)l(x)r(x)o(x)

    根据 Proving key,计算它们的承诺
    g l ( s ) ,   g r ( s ) ,   g o ( s ) ,   g h ( s ) g^{l(s)},\, g^{r(s)},\, g^{o(s)},\, g^{h(s)} gl(s),gr(s),go(s),gh(s)

    以及 p ( x ) p(x) p(x)对应的偏移多项式的承诺
    g α l ( s ) ,   g α r ( s ) ,   g α o ( s ) g^{\alpha l(s)},\, g^{\alpha r(s)},\, g^{\alpha o(s)} gαl(s),gαr(s),gαo(s)

    发送如下形式的 proof
    π = ( g l ( s ) ,   g r ( s ) ,   g o ( s ) ,   g h ( s ) ,   g α l ( s ) ,   g α r ( s ) ,   g α o ( s ) ) \pi = \left( g^{l(s)},\, g^{r(s)},\, g^{o(s)},\, g^{h(s)},\, g^{\alpha l(s)},\, g^{\alpha r(s)},\, g^{\alpha o(s)} \right) π=(gl(s),gr(s),go(s),gh(s),gαl(s),gαr(s),gαo(s))

  3. Verification: V V V收到了 ( g l ,   g r ,   g o ,   g h ,   g l ′ ,   g r ′ ,   g o ′ ) \left( g^l,\, g^r,\, g^o,\, g^h,\, g^{l'},\, g^{r'},\, g^{o'} \right) (gl,gr,go,gh,gl,gr,go),然后做如下的检查,

    polynomials restriction check
    e ( g l ′ , g ) = e ( g l , g α ) e ( g r ′ , g ) = e ( g r , g α ) e ( g o ′ , g ) = e ( g o , g α ) \begin{aligned} e(g^{l'},g) &= e(g^l,g^\alpha)\\ e(g^{r'},g) &= e(g^r,g^\alpha)\\ e(g^{o'},g) &= e(g^o,g^\alpha)\\ \end{aligned} e(gl,g)e(gr,g)e(go,g)=e(gl,gα)=e(gr,gα)=e(go,gα)

    valid operation check
    e ( g l , g r ) = e ( g t , g h ) ⋅ e ( g o , g )    ⟺    l ( s ) r ( s ) = t ( s ) h ( s ) + o ( s ) e(g^l,g^r) = e(g^t,g^h) \cdot e(g^o,g) \iff l(s)r(s) = t(s)h(s)+o(s) e(gl,gr)=e(gt,gh)e(go,g)l(s)r(s)=t(s)h(s)+o(s)

在上述协议中,我们移除了零知识的部分。它不是重点,在本节的最后我们会重新补上它。

多个乘法操作

多个乘法操作的等式可以写作:
a × b = d d × c = e a × c = f \begin{aligned} a \times b &= d\\ d \times c &= e\\ a \times c &= f \end{aligned} a×bd×ca×c=d=e=f

我们依然把它描述为如下形式
L ( x )   operator   R ( x ) = O ( x ) L(x) \textbf{ operator } R(x) = O(x) L(x) operator R(x)=O(x)

并且根据 a , b , c , r 1 , r 2 , r 3 a,b,c,r_1,r_2,r_3 a,b,c,r1,r2,r3出现在第几个操作上,令
L ( 1 ) = a ,   L ( 2 ) = d ,   L ( 3 ) = a R ( 1 ) = b ,   R ( 2 ) = c ,   R ( 3 ) = c O ( 1 ) = d ,   O ( 2 ) = e ,   O ( 3 ) = f \begin{aligned} & L(1)=a,\, L(2) = d,\, L(3) = a\\ & R(1)=b,\, R(2) = c,\, R(3) = c\\ & O(1)=d,\, O(2) = e,\, O(3) = f\\ \end{aligned} L(1)=a,L(2)=d,L(3)=aR(1)=b,R(2)=c,R(3)=cO(1)=d,O(2)=e,O(3)=f

一旦确定了 a , b , c , d , e , f a,b,c,d,e,f a,b,c,d,e,f的具体取值,就可以使用插值法(解线性方程组、牛顿插值法、拉格朗日插值公式、快速傅里叶变换)计算出 L ( x ) , R ( x ) , O ( x ) L(x),R(x),O(x) L(x),R(x),O(x)

3 3 3个乘法操作,因此 t ( x ) = ( x − 1 ) ( x − 2 ) ( x − 3 ) t(x)=(x-1)(x-2)(x-3) t(x)=(x1)(x2)(x3),使得
t ( x ) ∣ P ( x ) = L ( x ) R ( x ) − O ( x ) t(x) \mid P(x) = L(x)R(x) - O(x) t(x)P(x)=L(x)R(x)O(x)

我们证明这个 statement 即可。

但是,这有问题:变量 a a a多次出现在左操作数上,恶意的 P P P可以选取 L ( 1 ) ≠ L ( 3 ) L(1) \neq L(3) L(1)=L(3),从而改变证明的多项式 P ′ ( x ) ≠ P ( x ) P'(x) \neq P(x) P(x)=P(x)。我们应当强制相同的变量在不同的位置都有相同的值。

left operand polynomial L ( x ) L(x) L(x),拆分为多个 unassigned variable polynomial l a ( x ) , l d ( x ) l_a(x),l_d(x) la(x),ld(x),依据相应的变量出没出现在第 i i i个乘法的做操作数上,使得它们满足:
l a ( 1 ) = 1 ,   l a ( 2 ) = 0 ,   l a ( 3 ) = 1 l d ( 1 ) = 0 ,   l d ( 2 ) = 1 ,   l d ( 3 ) = 0 \begin{aligned} & l_a(1)=1,\, l_a(2) = 0,\, l_a(3) = 1\\ & l_d(1)=0,\, l_d(2) = 1,\, l_d(3) = 0\\ \end{aligned} la(1)=1,la(2)=0,la(3)=1ld(1)=0,ld(2)=1,ld(3)=0

其他变量 b , c , e , f b,c,e,f b,c,e,f没出现在左操作符里,因此都是零多项式,可以忽略。分别乘以对应变量的取值,再相加:
L ( x ) = a ⋅ l a ( x ) + d ⋅ l d ( x ) L(x) = a \cdot l_a(x) + d \cdot l_d(x) L(x)=ala(x)+dld(x)

它满足
L ( 1 ) = a ,   L ( 2 ) = d ,   L ( 3 ) = a L(1)=a,\, L(2) = d,\, L(3) = a L(1)=a,L(2)=d,L(3)=a

符合左操作数的取值,并且强制了 L ( 1 ) = L ( 3 ) L(1)=L(3) L(1)=L(3)

类似的,强制约束 right operand polynomialoutput polynomial 的取值:
R ( x ) = b ⋅ r b ( x ) + c ⋅ r c ( x ) O ( x ) = d ⋅ o d ( x ) + e ⋅ o e ( x ) + f ⋅ o f ( x ) \begin{aligned} R(x) &= b \cdot r_b(x) + c \cdot r_c(x)\\ O(x) &= d \cdot o_d(x) + e \cdot o_e(x) + f \cdot o_f(x)\\ \end{aligned} R(x)O(x)=brb(x)+crc(x)=dod(x)+eoe(x)+fof(x)

除了 Prover 的程序输入值和输出值是保密的,程序本身是公开的,自然这些 operator 上的左右变量和输出变量的关系是公开的。因此上述的 l a ( a ) , l d ( x ) l_a(a),l_d(x) la(a),ld(x), r b ( x ) , r c ( x ) r_b(x),r_c(x) rb(x),rc(x), o d ( x ) , o e ( x ) , o f ( x ) o_d(x),o_e(x),o_f(x) od(x),oe(x),of(x)都可以在 Setup 阶段确定,以强制 P P P保持变量取值的一致性。

协议被扩展为:

  1. Setup:把程序写成 d d d个乘法操作,那么
    t ( x ) = ∏ i = 1 d ( x − i ) t(x) = \prod_{i=1}^d (x-i) t(x)=i=1d(xi)

    其中出现的所有变量为 { v i } i = 1 n \{v_i\}_{i=1}^n {vi}i=1n,利用插值法,写出每个变量 v i v_i vivariable polynomials l i ( x ) , r i ( x ) , o i ( x ) l_{i}(x),r_{i}(x),o_{i}(x) li(x),ri(x),oi(x)

    所有参与者协同生成 composite CRS,
    ( g α , { g s i } i = 1 d , { g α s i } i = 1 d ) \left( g^{\alpha}, \{g^{s^i}\}_{i=1}^d, \{g^{\alpha s^i}\}_{i=1}^d \right) (gα,{gsi}i=1d,{gαsi}i=1d)

    设置 Proving key
    ( g α ,   { g s i } i = 1 d ,   { g l i ( s ) ,   g r i ( s ) ,   g o i ( s ) } i = 1 n ,   { g α l i ( s ) ,   g α r i ( s ) ,   g α o i ( s ) } i = 1 n ) \begin{aligned} \left( g^\alpha,\, \{g^{s^i}\}_{i=1}^d,\, \\ \{ g^{l_{i}(s)},\, g^{r_{i}(s)},\, g^{o_{i}(s)}\}_{i=1}^n,\, \{ g^{\alpha l_{i}(s)},\, g^{\alpha r_{i}(s)},\, g^{\alpha o_{i}(s)}\}_{i=1}^n \right) \end{aligned} (gα,{gsi}i=1d,{gli(s),gri(s),goi(s)}i=1n,{gαli(s),gαri(s),gαoi(s)}i=1n)

    设置 Verification key
    ( g α ,   g t ( s ) ) \begin{aligned} \left( g^\alpha,\, g^{t(s)} \right) \end{aligned} (gα,gt(s))

  2. Proving: P P P根据变量 { v i } i = 1 n \{v_i\}_{i=1}^n {vi}i=1n的取值,设置 L ( x ) , R ( x ) , O ( x ) L(x),R(x),O(x) L(x),R(x),O(x),然后计算出
    h ( x ) = L ( x ) R ( x ) − O ( x ) t ( x ) h(x) = \dfrac{L(x)R(x)-O(x)}{t(x)} h(x)=t(x)L(x)R(x)O(x)

    根据 Proving key,计算它们的承诺
    g L ( s ) ,   g R ( s ) ,   g O ( s ) ,   g h ( s ) g^{L(s)},\, g^{R(s)},\, g^{O(s)},\, g^{h(s)} gL(s),gR(s),gO(s),gh(s)

    以及 P ( x ) P(x) P(x)对应的偏移多项式的承诺
    g α L ( s ) ,   g α R ( s ) ,   g α O ( s ) g^{\alpha L(s)},\, g^{\alpha R(s)},\, g^{\alpha O(s)} gαL(s),gαR(s),gαO(s)

    发送如下形式的 proof
    π = ( g L ( s ) ,   g R ( s ) ,   g O ( s ) ,   g h ( s ) ,   g α L ( s ) ,   g α R ( s ) ,   g α O ( s ) ) \pi = \left( g^{L(s)},\, g^{R(s)},\, g^{O(s)},\, g^{h(s)},\, g^{\alpha L(s)},\, g^{\alpha R(s)},\, g^{\alpha O(s)} \right) π=(gL(s),gR(s),gO(s),gh(s),gαL(s),gαR(s),gαO(s))

  3. Verification: V V V收到了 ( g L ,   g R ,   g O ,   g h ,   g L ′ ,   g R ′ ,   g O ′ ) \left( g^L,\, g^R,\, g^O,\, g^h,\, g^{L'},\, g^{R'},\, g^{O'} \right) (gL,gR,gO,gh,gL,gR,gO),然后做如下的检查,

    variable polynomial restrictions check
    e ( g L ′ , g ) = e ( g L , g α ) e ( g R ′ , g ) = e ( g R , g α ) e ( g O ′ , g ) = e ( g O , g α ) \begin{aligned} e(g^{L'},g) &= e(g^L,g^\alpha)\\ e(g^{R'},g) &= e(g^R,g^\alpha)\\ e(g^{O'},g) &= e(g^O,g^\alpha)\\ \end{aligned} e(gL,g)e(gR,g)e(gO,g)=e(gL,gα)=e(gR,gα)=e(gO,gα)

    valid operation check
    e ( g l , g r ) = e ( g t , g h ) ⋅ e ( g o , g )    ⟺    l ( s ) r ( s ) = t ( s ) h ( s ) + o ( s ) e(g^l,g^r) = e(g^t,g^h) \cdot e(g^o,g) \iff l(s)r(s) = t(s)h(s)+o(s) e(gl,gr)=e(gt,gh)e(go,g)l(s)r(s)=t(s)h(s)+o(s)

上述协议的缺陷为:

  1. 由于各个 L ( x ) , R ( x ) , O ( x ) L(x),R(x),O(x) L(x),R(x),O(x)的 restrictions check 中使用了相同的偏移 α \alpha α,因此恶意的 P P P能够:
    1. 混用: L ′ ( x ) = v 1 ⋅ o 1 ( x ) + v 2 ⋅ l 2 ( x ) + ⋯ L'(x)=v_1 \cdot o_1(x) + v_2 \cdot l_2(x) + \cdots L(x)=v1o1(x)+v2l2(x)+
    2. 交换: O ( s ) × R ( s ) = L ( s ) O(s) \times R(s) = L(s) O(s)×R(s)=L(s)
    3. 重用: L ( s ) × L ( s ) = O ( s ) L(s) \times L(s) = O(s) L(s)×L(s)=O(s)
  2. 因为 L ( x ) , R ( x ) , O ( x ) L(x),R(x),O(x) L(x),R(x),O(x)的 restrictions check 是分别执行的, P P P完全可以在不同的位置中,对变量 v i v_i vi赋予不同的值。例如在第 1 1 1个乘法里的左操作数里赋值为 3 3 3,但在第 3 3 3个乘法里的右操作数里赋值为 6 6 6,而 V V V检查不出来。
  3. 因为 P P P获得了 g α g^\alpha gα,那么对于任意的 v ’ v’ v,它可以计算 g L ( s ) ⋅ g v ′ = g L ( s ) + v ′ g^{L(s)} \cdot g^{v'} = g^{L(s)+v'} gL(s)gv=gL(s)+v以及对应的偏移 g α L ( s ) ⋅ ( g α ) v ′ = g α ( L ( s ) + v ′ ) g^{\alpha L(s)} \cdot (g^\alpha)^{v'} = g^{\alpha (L(s)+v')} gαL(s)(gα)v=gα(L(s)+v),但 L ′ ( x ) = L ( x ) + v ′ L'(x)=L(x)+v' L(x)=L(x)+v并不是 V V V所预期的那个 statement。换句话说, P P P可以任意修改 L ( x ) L(x) L(x)的常数项。

其他操作

Constant Coefficients

在上述的每个变量 v i v_i viunassigned variable polynomial l i ( x ) l_i(x) li(x)里:

  1. 如果 v i v_i vi出现在了第 j j j个乘法运算里,我们设置 l i ( j ) = 1 l_i(j)=1 li(j)=1
  2. 如果 v i v_i vi没有出现在第 j j j个乘法运算里,那么我们设置 l i ( j ) = 0 l_i(j)=0 li(j)=0

实际上,我们可以设置任意的常数 c j c_j cj,那么就构建了如下形式的公式:
( c a ⋅ a ) × ( c b ⋅ b ) = c r ⋅ r (c_a \cdot a) \times (c_b \cdot b) = c_r \cdot r (caa)×(cbb)=crr

r i ( x ) r_i(x) ri(x) o i ( x ) o_i(x) oi(x)也都类似。

Addition for Free

在之前,我们设置的不同变量 v i v_i vi l i ( x ) l_i(x) li(x),在任意一个点 x = j x=j x=j的位置上, ∃ k , l k ( j ) = c k ≠ 0 \exist k,l_k(j)=c_k \neq 0 k,lk(j)=ck=0,并且 ∀ i ≠ k , l i ( j ) = 0 \forall i \neq k,l_i(j)=0 i=k,li(j)=0。也就是说,把程序写成了如下形式,
a × d = r b × e = s c × f = t \begin{aligned} a \times d &= r\\ b \times e &= s\\ c \times f &= t\\ \end{aligned} a×db×ec×f=r=s=t

每个操作数中仅仅包含一个变量。对应的图像为:

在这里插入图片描述

但我们可以把任意多个变量的 l i ( j ) , i ∈ I l_i(j),i \in I li(j),iI,同时置为非零值。例如,可以把程序写成如下形式,
( a + c ) × d = r b × e = s c × f = t \begin{aligned} (a+c) \times d &= r\\ b \times e &= s\\ c \times f &= t\\ \end{aligned} (a+c)×db×ec×f=r=s=t

它对应的 L ( x ) L(x) L(x)如图所示:

在这里插入图片描述

进一步的,我们把程序转化为 d d d个乘法运算:
∑ i = 1 n c l , i , j v i × ∑ i = 1 n c r , i , j v i = ∑ i = 1 n c o , i , j v i \sum_{i=1}^n c_{l,i,j}v_i \times \sum_{i=1}^n c_{r,i,j}v_i = \sum_{i=1}^n c_{o,i,j}v_i i=1ncl,i,jvi×i=1ncr,i,jvi=i=1nco,i,jvi

其中 j = 1 , ⋯   , d j =1,\cdots,d j=1,,d是乘法运算的索引, 3 3 3 d d d长向量 { c l , i , c r , i , c o , i } \{c_{l,i},c_{r,i},c_{o,i}\} {cl,i,cr,i,co,i}是变量 v i v_i vi的在不同乘法运算中的常系数。

Addition

但如果我们仅仅是计算加法 a + b = r a+b=r a+b=r,而不计算乘法,那么上述的算法就不可用了。可以把它写作
( a + b ) × 1 = r (a+b) \times 1 = r (a+b)×1=r

这里的 1 = c o n e ⋅ v o n e 1 = c_{one} \cdot v_{one} 1=conevone,其中 c o n e = 1 c_{one}=1 cone=1是 Setup 阶段就可以确定的(不受 P P P的控制),而 v o n e v_{one} vone是被 P P P控制的变量(可以任意赋值,而不被 V V V发现)。

为了强制 v o n e = 1 v_{one}=1 vone=1,我们可以让这个变量对应的多项式 l 0 ( x ) , r 0 ( x ) , o 0 ( x ) l_0(x),r_0(x),o_0(x) l0(x),r0(x),o0(x) V V V控制。同时,程序的公开输入输出变量 v i , i = 1 , ⋯   , m v_i,i=1,\cdots,m vi,i=1,,m,也都可以交由 V V V来控制:
L V ( x ) = l 0 ( x ) + ∑ i = 1 m v i ⋅ l i ( x ) L_V(x) = l_0(x) + \sum_{i=1}^m v_i \cdot l_i(x) LV(x)=l0(x)+i=1mvili(x)

另外的 n − m n-m nm个与 P P P的私有输入有关的变量 v i , i = m + 1 , ⋯   , n v_i,i=m+1,\cdots,n vi,i=m+1,,n,它们对应的多项式被 P P P控制:
L P ( x ) = ∑ i = m + 1 n v i ⋅ l i ( x ) L_P(x) = \sum_{i=m+1}^n v_i \cdot l_i(x) LP(x)=i=m+1nvili(x)

因为承诺的加法同态性质,所以可以重构 L ( x ) L(x) L(x)的承诺:
E ( L ( s ) ) = E ( L V ( s ) + L P ( x ) ) = E ( L V ( x ) ) ⋅ E ( L P ( x ) ) E(L(s)) = E(L_V(s)+L_P(x)) = E(L_V(x)) \cdot E(L_P(x)) E(L(s))=E(LV(s)+LP(x))=E(LV(x))E(LP(x))

类似地,构建 R V ( x ) , R P ( x ) R_V(x),R_P(x) RV(x),RP(x) O V ( x ) , O P ( x ) O_V(x),O_P(x) OV(x),OP(x)

Subtraction and Division

减法 a − b = r a-b=r ab=r可以表示为:
( a + ( − 1 ) ⋅ b ) × 1 = r (a + (-1) \cdot b) \times 1 = r (a+(1)b)×1=r

除法 a / b = r a/b=r a/b=r可以表示为:
b × r = a b \times r = a b×r=a

两者都可以复用之前的技术。

其他的约束和检查

Non-Interchangeability of Operands and Output

为了防止恶意的 P P P混用和交换 l i ( x ) , r i ( x ) , o i ( x ) l_i(x),r_i(x),o_i(x) li(x),ri(x),oi(x),我们应当在不同的位置,使用不同的随机偏移 α l , α r , α o \alpha_l,\alpha_r,\alpha_o αl,αr,αo

那么在 Setup 阶段,计算的 CRS 修改为

  • proving key:
    ( { g s i } i = 1 d ,   { g l i ( s ) ,   g α l l i ( s ) } i = 1 n ,   { g r i ( s ) ,   g α r r i ( s ) } i = 1 n ,   { g o i ( s ) ,   g α o o i ( s ) } i = 1 n ) \begin{aligned} \left( \{g^{s^i}\}_{i=1}^d,\, \\ \{ g^{l_{i}(s)},\, g^{\alpha_l l_{i}(s)}\}_{i=1}^n,\, \\ \{ g^{r_{i}(s)},\, g^{\alpha_r r_{i}(s)}\}_{i=1}^n,\, \\ \{ g^{o_{i}(s)},\, g^{\alpha_o o_{i}(s)}\}_{i=1}^n \right) \end{aligned} ({gsi}i=1d,{gli(s),gαlli(s)}i=1n,{gri(s),gαrri(s)}i=1n,{goi(s),gαooi(s)}i=1n)

  • verification key:
    ( g t ( s ) ,   g α l ,   g α r ,   g α o ) \left( g^{t(s)},\, g^{\alpha_l},\, g^{\alpha_r},\, g^{\alpha_o} \right) (gt(s),gαl,gαr,gαo)

然后在 Proving 和 Verification 步骤里,可以自然地修改,略。

Variable Consistency Across Operands

为了强制让不同的位置( l , r , o l,r,o l,r,o)的同一个变量 v i v_i vi的值都相等,我们可以:将它的多项式都加起来,
g l i ( s ) + r i ( s ) + o i ( s ) g^{l_i(s)+r_i(s)+o_i(s)} gli(s)+ri(s)+oi(s)

然后再做偏移 β \beta β
g β ⋅ ( l i ( s ) + r i ( s ) + o i ( s ) ) g^{\beta \cdot (l_i(s)+r_i(s)+o_i(s))} gβ(li(s)+ri(s)+oi(s))

这强制 P P P对于 v L , i = v R , i = v O , i = v β , i v_{L,i}=v_{R,i}=v_{O,i}=v_{\beta,i} vL,i=vR,i=vO,i=vβ,i计算:
( g l i ( s ) ) v L , i ,   ( g r i ( s ) ) v R , i ,   ( g o i ( s ) ) v O , i ,   ( g β ⋅ ( l i ( s ) + r i ( s ) + o i ( s ) ) ) v β , i (g^{l_i(s)})^{v_{L,i}},\, (g^{r_i(s)})^{v_{R,i}},\, (g^{o_i(s)})^{v_{O,i}},\, (g^{\beta \cdot (l_i(s)+r_i(s)+o_i(s))})^{v_{\beta,i}} (gli(s))vL,i,(gri(s))vR,i,(goi(s))vO,i,(gβ(li(s)+ri(s)+oi(s)))vβ,i

然而,这个检查是有问题的: l ( s ) , r ( s ) , o ( s ) l(s),r(s),o(s) l(s),r(s),o(s)都是 F \mathbb F F上的数值,有不可忽略的概率,使得它们之间存在整除关系。假如 l ( s ) = r ( s ) = w , o ( s ) = y l(s)=r(s)=w,o(s)=y l(s)=r(s)=w,o(s)=y,那么恶意的 P P P可以选取 v β = v O , v L = 2 v O − v R v_\beta=v_O,v_L=2v_O-v_R vβ=vO,vL=2vOvR,那么校验也会通过:
β ( v L w + v R w + v O y ) = v O ⋅ β ( 2 w + y ) = v β ⋅ β ( w + w + y ) \beta(v_Lw+v_Rw+v_Oy) = v_O \cdot \beta(2w+y) = v_\beta \cdot \beta(w+w+y) β(vLw+vRw+vOy)=vOβ(2w+y)=vββ(w+w+y)

因此,我们应当在 Setup 阶段为每个 operand 选取不同的 β l , β r , β o \beta_l,\beta_r,\beta_o βl,βr,βo,然后添加一些新的 CRS:

  • proving key:
    ( { g s i } i = 1 d ,   { g l i ( s ) ,   g α l l i ( s ) } i = 1 n ,   { g r i ( s ) ,   g α r r i ( s ) } i = 1 n ,   { g o i ( s ) ,   g α o o i ( s ) } i = 1 n ,   { g β l l i ( s ) + β r r i ( s ) + β o o i ( s ) } i = 1 n ) \begin{aligned} \left( \{g^{s^i}\}_{i=1}^d,\, \\ \{ g^{l_{i}(s)},\, g^{\alpha_l l_{i}(s)}\}_{i=1}^n,\, \\ \{ g^{r_{i}(s)},\, g^{\alpha_r r_{i}(s)}\}_{i=1}^n,\, \\ \{ g^{o_{i}(s)},\, g^{\alpha_o o_{i}(s)}\}_{i=1}^n,\,\\ \{g^{\beta_l l_i(s) + \beta_r r_i(s) + \beta_o o_i(s)}\}_{i=1}^n \right) \end{aligned} ({gsi}i=1d,{gli(s),gαlli(s)}i=1n,{gri(s),gαrri(s)}i=1n,{goi(s),gαooi(s)}i=1n,{gβlli(s)+βrri(s)+βooi(s)}i=1n)

  • verification key:
    ( g t ( s ) ,   g α l ,   g α r ,   g α o ,   g β l ,   g β r ,   g β o ) \left( g^{t(s)},\, g^{\alpha_l},\, g^{\alpha_r},\, g^{\alpha_o},\, g^{\beta_l},\, g^{\beta_r},\, g^{\beta_o} \right) (gt(s),gαl,gαr,gαo,gβl,gβr,gβo)

然后在 Proving 和 Verification 步骤里,可以添加对应的 variable consistency polynomials check

  1. Proving:对于每个变量 v i v_i vi,计算
    g z i ( s ) = ( g β l l i ( s ) + β r r i ( s ) + β o o i ( s ) ) v i g^{z_i(s)} = (g^{\beta_l l_i(s) + \beta_r r_i(s) + \beta_o o_i(s)})^{v_i} gzi(s)=(gβlli(s)+βrri(s)+βooi(s))vi

    然后得到
    g Z ( s ) = ∏ i = 1 n g z i ( s ) g^{Z(s)} = \prod_{i=1}^n g^{z_i(s)} gZ(s)=i=1ngzi(s)

  2. Verification:检查下式,
    e ( g L , g β l ) ⋅ e ( g R , g β r ) ⋅ e ( g O , g β o ) = e ( g Z , g )    ⟺    β l L + β r R + β o O = Z e(g^L,g^{\beta_l}) \cdot e(g^R,g^{\beta_r}) \cdot e(g^O,g^{\beta_o}) = e(g^Z,g) \iff \beta_lL + \beta_rR + \beta_oO = Z e(gL,gβl)e(gR,gβr)e(gO,gβo)=e(gZ,g)βlL+βrR+βoO=Z

Non-malleability of Variable Consistency Polynomials

因为 P P P持有 g β l , g β r , g β o g^{\beta_l},g^{\beta_r},g^{\beta_o} gβl,gβr,gβo,它拥有了任意修改 L ( x ) , R ( x ) , O ( x ) L(x),R(x),O(x) L(x),R(x),O(x)的常数项的能力。我们应当禁止 P P P修改的常数项。

我们在 Setup 阶段再添加一个秘密的随机偏移 γ \gamma γ,在 V V V检查变量的一致性时,改变为:
e ( g L , g β l γ ) ⋅ e ( g R , g β r γ ) ⋅ e ( g O , g β o γ ) = e ( g Z , g γ )    ⟺    γ ( β l L + β r R + β o O ) = γ Z e(g^L,g^{\beta_l \gamma}) \cdot e(g^R,g^{\beta_r \gamma}) \cdot e(g^O,g^{\beta_o \gamma}) = e(g^Z,g^\gamma) \iff \gamma(\beta_lL + \beta_rR + \beta_oO) = \gamma Z e(gL,gβlγ)e(gR,gβrγ)e(gO,gβoγ)=e(gZ,gγ)γ(βlL+βrR+βoO)=γZ

Pinocchio protocol

然而,上述的 3 3 3个约束和检查,添加了 4 4 4个新的承诺值和 4 4 4个双线性映射检查,这是昂贵的。2013年的匹诺曹协议,使用了一种更高效的方案:Setup 阶段,随机采样 β , γ , ρ l , ρ r \beta,\gamma,\rho_l,\rho_r β,γ,ρl,ρr,然后设置 ρ 0 = ρ l ⋅ ρ r \rho_0=\rho_l \cdot \rho_r ρ0=ρlρr,再令
g l = g ρ l ,   g r = g ρ r ,   g o = g ρ o g_l = g^{\rho_l},\, g_r = g^{\rho_r},\, g_o = g^{\rho_o} gl=gρl,gr=gρr,go=gρo
P P P V V V获得自己的 key,

  • proving key:
    ( { g s i } i = 1 d ,   { g l l i ( s ) ,   g l α l l i ( s ) } i = 1 n ,   { g r r i ( s ) ,   g r α r r i ( s ) } i = 1 n ,   { g o o i ( s ) ,   g o α o o i ( s ) } i = 1 n ,   { g l β l i ( s ) ⋅ g r β r i ( s ) ⋅ g o β o i ( s ) } i = 1 n ) \begin{aligned} (&\{g^{s^i}\}_{i=1}^d,\, \\ &\{ g_l^{l_{i}(s)},\, g_l^{\alpha_l l_{i}(s)}\}_{i=1}^n,\, \\ &\{ g_r^{r_{i}(s)},\, g_r^{\alpha_r r_{i}(s)}\}_{i=1}^n,\, \\ &\{ g_o^{o_{i}(s)},\, g_o^{\alpha_o o_{i}(s)}\}_{i=1}^n,\,\\ &\{g_l^{\beta l_i(s)} \cdot g_r^{\beta r_i(s)} \cdot g_o^{\beta o_i(s)}\}_{i=1}^n) \end{aligned} ({gsi}i=1d,{glli(s),glαlli(s)}i=1n,{grri(s),grαrri(s)}i=1n,{gooi(s),goαooi(s)}i=1n,{glβli(s)grβri(s)goβoi(s)}i=1n)

  • verification key:
    ( g o t ( s ) ,   g α l ,   g α r ,   g α o ,   g β γ ,   g γ ) \left( g_o^{t(s)},\, g^{\alpha_l},\, g^{\alpha_r},\, g^{\alpha_o},\, g^{\beta \gamma},\, g^{\gamma} \right) (got(s),gαl,gαr,gαo,gβγ,gγ)

证明和验证的过程为,

  1. Proving:对于每个变量 v i v_i vi,计算
    g z i ( s ) = ( g l β l i ( s ) ⋅ g r β r i ( s ) ⋅ g o β o i ( s ) ) v i g^{z_i(s)} = (g_l^{\beta l_i(s)} \cdot g_r^{\beta r_i(s)} \cdot g_o^{\beta o_i(s)})^{v_i} gzi(s)=(glβli(s)grβri(s)goβoi(s))vi

    然后得到
    g Z ( s ) = ∏ i = 1 n g z i ( s ) g^{Z(s)} = \prod_{i=1}^n g^{z_i(s)} gZ(s)=i=1ngzi(s)

  2. Verification:做如下的检查,

    variable polynomials restriction check
    e ( g l L ′ , g ) = e ( g l L , g α l ) ,   e ( g r R ′ , g ) = e ( g r R , g α r ) ,   e ( g o O ′ , g ) = e ( g o O , g α o ) e(g_l^{L'},g) = e(g_l^L,g^{\alpha_l}),\, e(g_r^{R'},g) = e(g_r^R,g^{\alpha_r}),\, e(g_o^{O'},g) = e(g_o^O,g^{\alpha_o}) e(glL,g)=e(glL,gαl),e(grR,g)=e(grR,gαr),e(goO,g)=e(goO,gαo)

    variable values consistency check
    e ( g l L ⋅ g r R ⋅ g o O , g β γ ) = e ( g Z , g γ ) e(g_l^L \cdot g_r^R \cdot g_o^O, g^{\beta \gamma}) = e(g^Z,g^\gamma) e(glLgrRgoO,gβγ)=e(gZ,gγ)

    valid operations check
    e ( g l L ⋅ g r R ) = e ( g o t ( s ) , g h ) ⋅ e ( g o O , g )    ⟺    ρ l L ( s ) ⋅ ρ r R ( s ) = ρ o t ( s ) h ( s ) + ρ o O ( s ) e(g_l^L \cdot g_r^R) = e(g_o^{t(s)},g^h) \cdot e(g_o^O,g) \iff \rho_l L(s) \cdot \rho_r R(s) = \rho_o t(s) h(s) + \rho_o O(s) e(glLgrR)=e(got(s),gh)e(goO,g)ρlL(s)ρrR(s)=ρot(s)h(s)+ρoO(s)

约束电路

将电路拍平后,转化为若干个乘法运算,但这忽略了变量的取值范围。我们对它们添加约束。

  1. 变量 a a a是布尔值,那么约束为:
    a × ( a − 1 ) = 0    ⟺    a × a = a a \times (a-1) = 0 \iff a \times a = a a×(a1)=0a×a=a

    其中的常数 0 0 0,每个变量 v v v对应的系数在 Setup 阶段都被强制设为 c = 0 c=0 c=0,而无论 P P P怎么设置 v v v都无济于事。

  2. 变量 a a a是常数 7 7 7,那么约束为:
    ( a − 7 ⋅ v o n e ) × 1 = 0 (a-7 \cdot v_{one}) \times 1 = 0 (a7vone)×1=0

    这里的 1 = 1 ⋅ v o n e 1 = 1 \cdot v_{one} 1=1vone 0 = 0 ⋅ v 0 = 0 \cdot v 0=0v都被强制设置了,不受 P P P的控制。

  3. 变量 a a a是一个 4 4 4比特数,将它拆解为 4 4 4个比特 b 0 , b 1 , b 2 , b 3 b_0,b_1,b_2,b_3 b0,b1,b2,b3,约束为:
    ( 2 3 ⋅ b 3 + 2 2 ⋅ b 2 + 2 1 ⋅ b 1 + 2 0 ⋅ b 0 ) × 1 = a b 0 × b 0 = b 0 b 1 × b 1 = b 1 b 2 × b 2 = b 2 b 3 × b 3 = b 3 \begin{aligned} (2^3 \cdot b_3 + 2^2 \cdot b_2 + 2^1 \cdot b_1 + 2^0 \cdot b_0) \times 1 &= a\\ b_0 \times b_0 &= b_0\\ b_1 \times b_1 &= b_1\\ b_2 \times b_2 &= b_2\\ b_3 \times b_3 &= b_3\\ \end{aligned} (23b3+22b2+21b1+20b0)×1b0×b0b1×b1b2×b2b3×b3=a=b0=b1=b2=b3

类似的,可以构造出其他更复杂的约束。

添加零知识性

仿照多项式知识的 zkSNARK,我们让 P P P对 proof 添加随机偏移 δ \delta δ,但如果 L , R , O L,R,O L,R,O都使用相同的偏移,那么它破坏了协议的安全性。因此,应当使用不同的偏移 δ l , δ r , δ o \delta_l,\delta_r,\delta_o δl,δr,δo,并做平衡:
( δ l + L ( s ) ) ⋅ ( δ r + R ( s ) ) = t ( s ) ⋅ ( Δ + h ( s ) ) + ( δ o + O ( s ) ) (\delta_l + L(s)) \cdot (\delta_r + R(s)) = t(s) \cdot (\Delta + h(s)) + (\delta_o + O(s)) (δl+L(s))(δr+R(s))=t(s)(Δ+h(s))+(δo+O(s))

可以推出:
Δ = δ l L ( s ) ⋅ δ r R ( s ) + δ l δ r − δ o t ( s ) \Delta = \dfrac{\delta_l L(s) \cdot \delta_r R(s) + \delta_l \delta_r - \delta_o}{t(s)} Δ=t(s)δlL(s)δrR(s)+δlδrδo

为了高效的计算,将每个偏移都设置为 t ( s ) t(s) t(s)的倍数,转化为:
( δ l t ( s ) + L ( s ) ) ⋅ ( δ r t ( s ) + R ( s ) ) = t ( s ) ⋅ ( Δ + h ( s ) ) + ( δ o t ( s ) + O ( s ) ) Δ = δ r L ( s ) ⋅ δ l R ( s ) + δ l δ r t ( s ) − δ o \begin{aligned} (\delta_l t(s) + L(s)) \cdot (\delta_r t(s) + R(s)) &= t(s) \cdot (\Delta + h(s)) + (\delta_o t(s) + O(s))\\ \Delta &= \delta_r L(s) \cdot \delta_l R(s) + \delta_l \delta_r t(s) - \delta_o \end{aligned} (δlt(s)+L(s))(δrt(s)+R(s))Δ=t(s)(Δ+h(s))+(δot(s)+O(s))=δrL(s)δlR(s)+δlδrt(s)δo

g l = g ρ l ,   g r = g ρ r ,   g o = g ρ o g_l=g^{\rho_l},\, g_r=g^{\rho_r},\, g_o=g^{\rho_o} gl=gρl,gr=gρr,go=gρo,需要在 Proving key 中添加一些 CRS,
{ g l t ( s ) ,   g l α l t ( s ) ,   g l β t ( s ) } , { g r t ( s ) ,   g r α r t ( s ) ,   g r β t ( s ) } , { g o t ( s ) ,   g o α o t ( s ) ,   g o β t ( s ) } . \begin{aligned} \{ g_l^{t(s)},\, g_l^{\alpha_l t(s)},\, g_l^{\beta t(s)} \},\\ \{ g_r^{t(s)},\, g_r^{\alpha_r t(s)},\, g_r^{\beta t(s)} \},\\ \{ g_o^{t(s)},\, g_o^{\alpha_o t(s)},\, g_o^{\beta t(s)} \}.\\ \end{aligned} {glt(s),glαlt(s),glβt(s)},{grt(s),grαrt(s),grβt(s)},{got(s),goαot(s),goβt(s)}.

General-Purpose zk-SNARK Protocol

Setup

把程序写成 d d d个乘法操作,
∑ i = 1 n c l , i , j v i × ∑ i = 1 n c r , i , j v i = ∑ i = 1 n c o , i , j v i \sum_{i=1}^n c_{l,i,j}v_i \times \sum_{i=1}^n c_{r,i,j}v_i = \sum_{i=1}^n c_{o,i,j}v_i i=1ncl,i,jvi×i=1ncr,i,jvi=i=1nco,i,jvi

其中出现的所有变量为 { v i } i = 0 n \{v_i\}_{i=0}^n {vi}i=0n,这里 v 0 = v o n e v_0 = v_{one} v0=vone 1 1 1对应的变量。而 c l , c r , c o c_l,c_r,c_o cl,cr,co可以写作 ( n + 1 ) × d (n+1) \times d (n+1)×d F \mathbb F F上矩阵(所谓的R1CS矩阵程序)。利用插值法,写出每个变量 v i v_i vivariable polynomials 3 3 3 d d d次的多项式 l i ( x ) , r i ( x ) , o i ( x ) l_{i}(x),r_{i}(x),o_{i}(x) li(x),ri(x),oi(x)

对应的,
t ( x ) = ∏ i = 1 d ( x − i ) t(x) = \prod_{i=1}^d (x-i) t(x)=i=1d(xi)

所有参与者协同生成 { s , ρ l , ( ρ r , ρ o = ρ l ρ r ) , ( α l , α r , α o ) , β , γ } \{s,\rho_l,(\rho_r,\rho_o=\rho_l \rho_r),(\alpha_l,\alpha_r,\alpha_o),\beta,\gamma\} {s,ρl,(ρr,ρo=ρlρr),(αl,αr,αo),β,γ}对应的 composite CRS:令 g l = g ρ l ,   g r = g ρ r ,   g o = g ρ o g_l=g^{\rho_l},\, g_r=g^{\rho_r},\, g_o=g^{\rho_o} gl=gρl,gr=gρr,go=gρo

设置 Proving key
( { g s i } i = 0 d ,   { g l l i ( s ) ,   g r r i ( s ) ,   g o o i ( s ) } i = 0 n ,   { g l α l l i ( s ) ,   g r α r r i ( s ) ,   g o α o o i ( s ) } i = m + 1 n ,   { g l β l i ( s ) ⋅ g r β r i ( s ) ⋅ g o β o i ( s ) } i = m + 1 n ,   { g l t ( s ) ,   g l α l t ( s ) ,   g l β t ( s ) } ,   { g r t ( s ) ,   g r α r t ( s ) ,   g r β t ( s ) } ,   { g o t ( s ) ,   g o α o t ( s ) ,   g o β t ( s ) } ) \begin{aligned} (&\{g^{s^i}\}_{i=0}^d,\, \{ g_l^{l_{i}(s)},\, g_r^{r_{i}(s)},\, g_o^{o_{i}(s)}\}_{i=0}^n,\, \\ &\{ g_l^{\alpha_l l_{i}(s)},\, g_r^{\alpha_r r_{i}(s)},\, g_o^{\alpha_o o_{i}(s)} \}_{i=m+1}^n,\, \{g_l^{\beta l_i(s)} \cdot g_r^{\beta r_i(s)} \cdot g_o^{\beta o_i(s)}\}_{i=m+1}^n,\, \\ &\{ g_l^{t(s)},\, g_l^{\alpha_l t(s)},\, g_l^{\beta t(s)} \},\, \{ g_r^{t(s)},\, g_r^{\alpha_r t(s)},\, g_r^{\beta t(s)} \},\, \{ g_o^{t(s)},\, g_o^{\alpha_o t(s)},\, g_o^{\beta t(s)} \}) \end{aligned} ({gsi}i=0d,{glli(s),grri(s),gooi(s)}i=0n,{glαlli(s),grαrri(s),goαooi(s)}i=m+1n,{glβli(s)grβri(s)goβoi(s)}i=m+1n,{glt(s),glαlt(s),glβt(s)},{grt(s),grαrt(s),grβt(s)},{got(s),goαot(s),goβt(s)})

设置 Verification key
( g 1 ,   g α l ,   g α r ,   g α o ,   g β γ ,   g γ ,   g o t ( s ) ,   { g l l i ( s ) ,   g r r i ( s ) ,   g o o i ( s ) } i = 0 m ) \begin{aligned} (&g^1,\, g^{\alpha_l},\, g^{\alpha_r},\, g^{\alpha_o},\, g^{\beta \gamma},\, g^{\gamma},\, \\ &g_o^{t(s)},\, \{ g_l^{l_i(s)},\, g_r^{r_i(s)},\, g_o^{o_i(s)} \}_{i=0}^m) \end{aligned} (g1,gαl,gαr,gαo,gβγ,gγ,got(s),{glli(s),grri(s),gooi(s)}i=0m)

Proving

P P P根据公共输入输出 { v i } i = 1 m \{v_i\}_{i=1}^m {vi}i=1m的值,确定其他的变量 { v i } i = m + 1 n \{v_i\}_{i=m+1}^n {vi}i=m+1n的取值,计算左操作数的多项式 L ( x ) L(x) L(x)
L ( x ) = l 0 ( x ) + ∑ i = 1 n v i ⋅ l i ( x ) L(x) = l_0(x) + \sum_{i=1}^n v_i \cdot l_i(x) L(x)=l0(x)+i=1nvili(x)

其中 l 0 ( x ) l_0(x) l0(x)对应的是 v o n e v_{one} vone变量。类似的,计算出 R ( x ) , O ( x ) R(x),O(x) R(x),O(x)

P P P随机采样 δ l , δ r , δ o \delta_l,\delta_r,\delta_o δl,δr,δo,然后计算平衡后的 h ( x ) h(x) h(x)
h ( x ) = L ( x ) R ( x ) − O ( x ) t ( x ) + ( δ r L ( x ) + δ l R ( x ) + δ l δ r t ( x ) − δ o ) h(x) = \dfrac{L(x)R(x)-O(x)}{t(x)} + (\delta_rL(x) + \delta_l R(x) + \delta_l \delta_r t(x) - \delta_o) h(x)=t(x)L(x)R(x)O(x)+(δrL(x)+δlR(x)+δlδrt(x)δo)

根据 Proving key,计算它的承诺
g h ( s ) = ∏ i = 0 d ( g s i ) h i g^{h(s)} = \prod_{i=0}^d (g^{s^i})^{h_i} gh(s)=i=0d(gsi)hi

计算变量 { v i } i = m + 1 n \{v_i\}_{i=m+1}^n {vi}i=m+1n L P ( x ) L_P(x) LP(x)的零知识的承诺,
g l L P ( s ) = ( g l t ( s ) ) δ l ⋅ ∏ i = m + 1 n ( g l l i ( s ) ) v i g_l^{L_P(s)} = (g_l^{t(s)})^{\delta_l} \cdot \prod_{i=m+1}^n (g_l^{l_i(s)})^{v_i} glLP(s)=(glt(s))δli=m+1n(glli(s))vi

以及它对应的偏移多项式的承诺
g l L P ′ ( s ) = ( g l α l t ( s ) ) δ l ⋅ ∏ i = m + 1 n ( g l α l l i ( s ) ) v i g_l^{L_P'(s)} = (g_l^{\alpha_l t(s)})^{\delta_l} \cdot \prod_{i=m+1}^n (g_l^{\alpha_l l_i(s)})^{v_i} glLP(s)=(glαlt(s))δli=m+1n(glαlli(s))vi

类似的,计算 g R P ( s ) ,   g O P ( s ) g^{R_P(s)},\, g^{O_P(s)} gRP(s),gOP(s)和对应的 g R P ′ ( s ) ,   g O P ′ ( s ) g^{R_P'(s)},\, g^{O_P'(s)} gRP(s),gOP(s)

然后计算零知识的变量一致性多项式,
g Z ( s ) = ( g l β t ( s ) ) δ l ⋅ ( g r β t ( s ) ) δ r ⋅ ( g o β t ( s ) ) δ o ⋅ ∏ i = 1 n ( g l β l i ( s ) ⋅ g r β r i ( s ) ⋅ g o β o i ( s ) ) v i g^{Z(s)} = (g_l^{\beta t(s)})^{\delta_l} \cdot (g_r^{\beta t(s)})^{\delta_r} \cdot (g_o^{\beta t(s)})^{\delta_o} \cdot \prod_{i=1}^n (g_l^{\beta l_i(s)} \cdot g_r^{\beta r_i(s)} \cdot g_o^{\beta o_i(s)})^{v_i} gZ(s)=(glβt(s))δl(grβt(s))δr(goβt(s))δoi=1n(glβli(s)grβri(s)goβoi(s))vi

发送如下形式的 proof:
π = ( g l L P ( s ) ,   g r R P ( s ) ,   g o O P ( s ) ,   g l L P ′ ( s ) ,   g r R P ′ ( s ) ,   g o O P ′ ( s ) ,   g Z ( s ) ,   g h ( s ) ) \pi = \left( g_l^{L_P(s)},\, g_r^{R_P(s)},\, g_o^{O_P(s)},\, g_l^{L_P'(s)},\, g_r^{R_P'(s)},\, g_o^{O_P'(s)},\, g^{Z(s)},\, g^{h(s)} \right) π=(glLP(s),grRP(s),goOP(s),glLP(s),grRP(s),goOP(s),gZ(s),gh(s))

Verification

V V V收到了 ( g l L ,   g r R ,   g o O ,   g l L ′ ,   g r R ′ ,   g o O ′ ,   g Z ,   g h ) \left( g_l^L,\, g_r^R,\, g_o^O,\, g_l^{L'},\, g_r^{R'},\, g_o^{O'},\, g^Z,\, g^h \right) (glL,grR,goO,glL,grR,goO,gZ,gh),先计算公开的输入输出变量 { v i } i = 1 m \{v_i\}_{i=1}^m {vi}i=1m对应的 L V ( s ) L_V(s) LV(s)的承诺:
g l L V ( s ) = g l l 0 ( s ) ⋅ ∏ i = 1 m ( g l l i ( s ) ) v i g_l^{L_V(s)} = g_l^{l_0(s)} \cdot \prod_{i=1}^m (g_l^{l_i(s)})^{v_i} glLV(s)=gll0(s)i=1m(glli(s))vi

类似地,计算 g r R V ( s ) , g o O V ( s ) g_r^{R_V(s)},g_o^{O_V(s)} grRV(s),goOV(s),然后做如下的检查:

variable polynomials restriction check
e ( g l L P ′ , g ) = e ( g l L P , g α l )    ⟺    ρ l L P ′ ( s ) = α l ρ l L P ( s ) e ( g r R P ′ , g ) = e ( g r R P , g α r )    ⟺    ρ r R P ′ ( s ) = α r ρ r R P ( s ) e ( g o O P ′ , g ) = e ( g o O P , g α o )    ⟺    ρ o O P ′ ( s ) = α o ρ o O P ( s ) \begin{aligned} e(g_l^{L_P'},g) &= e(g_l^{L_P},g^{\alpha_l}) \iff \rho_l L_P'(s) = \alpha_l \rho_l L_P(s)\\ e(g_r^{R_P'},g) &= e(g_r^{R_P},g^{\alpha_r}) \iff \rho_r R_P'(s) = \alpha_r \rho_r R_P(s)\\ e(g_o^{O_P'},g) &= e(g_o^{O_P},g^{\alpha_o}) \iff \rho_o O_P'(s) = \alpha_o \rho_o O_P(s)\\ \end{aligned} e(glLP,g)e(grRP,g)e(goOP,g)=e(glLP,gαl)ρlLP(s)=αlρlLP(s)=e(grRP,gαr)ρrRP(s)=αrρrRP(s)=e(goOP,gαo)ρoOP(s)=αoρoOP(s)

variable values consistency check
e ( g l L P ⋅ g r R P ⋅ g o O P ,   g β γ ) = e ( g Z ,   g γ )    ⟺    β γ ( ρ l L P + ρ r R P + ρ o O P ) = γ Z e(g_l^{L_P} \cdot g_r^{R_P} \cdot g_o^{O_P},\, g^{\beta \gamma}) = e(g^Z,\, g^\gamma) \iff \beta \gamma (\rho_l L_P + \rho_r R_P + \rho_o O_P) = \gamma Z e(glLPgrRPgoOP,gβγ)=e(gZ,gγ)βγ(ρlLP+ρrRP+ρoOP)=γZ

valid operation check
e ( g l L P ⋅ g l L V ,   g r R P ⋅ g r R V ) = e ( g o t ( s ) ,   g h ) ⋅ e ( g o O P ⋅ g o O V ,   g )    ⟺    ρ l ( L P + L V ) ⋅ ρ r ( R P + R V ) = ρ o t ( s ) h ( s ) + ρ o ( O P + O P ) \begin{aligned} e(g_l^{L_P} \cdot g_l^{L_V},\, g_r^{R_P} \cdot g_r^{R_V}) &= e(g_o^{t(s)},\, g^h) \cdot e(g_o^{O_P} \cdot g_o^{O_V},\, g) \\ \iff \rho_l(L_P+L_V) \cdot \rho_r(R_P+R_V) &= \rho_o t(s) h(s) + \rho_o(O_P+O_P) \end{aligned} e(glLPglLV,grRPgrRV)ρl(LP+LV)ρr(RP+RV)=e(got(s),gh)e(goOPgoOV,g)=ρot(s)h(s)+ρo(OP+OP)

总结

zkSNARK 的关注点是:给定一个程序,它的输入输出是否满足约束( constraint):Prover 利用私有的输入 x x x计算了函数 f ( x ) f(x) f(x),得到私有的结果 y y y。Prover 声明: y = f ( x ) y=f(x) y=f(x),向 Verifier 证明之。

比如 Prover 做声明 y y y,拥有证据 w w w,满足 ( w , y ) ∈ R (w,y) \in \mathscr R (w,y)R。给定公开的验证电路 C ( y , w ) C(y,w) C(y,w),Prover 向 Verifier 证明它的 w w w满足约束 C ( y , w ) = 0 C(y,w)=0 C(y,w)=0,且不泄露 w w w的任何信息。

zkSNARK 的最重要特性就是“简洁、非交互”:无论电路 C C C有多大,无论 y , w y,w y,w有多长,Prover 公布的 proof 仅仅包含 8 8 8个承诺值,并且任何的 Verifier 都可以随时随地的验证这个 proof 的正确性。

本文介绍的 zkSNARK 是基于 Linear Probabilistically Checkable Proof 的。第一个 zkSNARK 是基于 Merkle Tree 的 Kilien 协议,但 PCP 理论并不是为密码学应用专门设计的。基于布尔电路上 QSP(Quadratic Span Programs)效率高得多。QSP 问题是 NPC,任何 NP 都可有效地转化到 QSP 上。算术电路上 QAP(Quadratic Arithmetic Program)更具有普适性,本文的 L , R , O L,R,O L,R,O 以及 t t t 就是 QAP 程序。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值