算术电路的约束
任意一个程序都可以表示为算术电路,因为
{
+
,
×
}
\{+,\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)=x−1,那么
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)} g−o(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)
协议如下:
-
Setup:所有参与者协同生成 composite CRS,与多项式知识的 SNARK 完全一样,略。
-
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)) -
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)=(x−1)(x−2)(x−3),使得
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)=a⋅la(x)+d⋅ld(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 polynomial 和 output 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)=b⋅rb(x)+c⋅rc(x)=d⋅od(x)+e⋅oe(x)+f⋅of(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保持变量取值的一致性。
协议被扩展为:
-
Setup:把程序写成 d d d个乘法操作,那么
t ( x ) = ∏ i = 1 d ( x − i ) t(x) = \prod_{i=1}^d (x-i) t(x)=i=1∏d(x−i)其中出现的所有变量为 { v i } i = 1 n \{v_i\}_{i=1}^n {vi}i=1n,利用插值法,写出每个变量 v i v_i vi的variable 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)) -
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)) -
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)
上述协议的缺陷为:
- 由于各个
L
(
x
)
,
R
(
x
)
,
O
(
x
)
L(x),R(x),O(x)
L(x),R(x),O(x)的 restrictions check 中使用了相同的偏移
α
\alpha
α,因此恶意的
P
P
P能够:
- 混用: 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)=v1⋅o1(x)+v2⋅l2(x)+⋯
- 交换: O ( s ) × R ( s ) = L ( s ) O(s) \times R(s) = L(s) O(s)×R(s)=L(s)
- 重用: L ( s ) × L ( s ) = O ( s ) L(s) \times L(s) = O(s) L(s)×L(s)=O(s)
- 因为 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检查不出来。
- 因为 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 vi的 unassigned variable polynomial l i ( x ) l_i(x) li(x)里:
- 如果 v i v_i vi出现在了第 j j j个乘法运算里,我们设置 l i ( j ) = 1 l_i(j)=1 li(j)=1
- 如果 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
(ca⋅a)×(cb⋅b)=cr⋅r
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),i∈I,同时置为非零值。例如,可以把程序写成如下形式,
(
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=1∑ncl,i,jvi×i=1∑ncr,i,jvi=i=1∑nco,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=cone⋅vone,其中 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=1∑mvi⋅li(x)
另外的
n
−
m
n-m
n−m个与
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+1∑nvi⋅li(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
a−b=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=2vO−vR,那么校验也会通过:
β
(
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,
-
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=1∏ngzi(s) -
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γ)
证明和验证的过程为,
-
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=1∏ngzi(s) -
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(glL⋅grR⋅goO,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(glL⋅grR)=e(got(s),gh)⋅e(goO,g)⟺ρlL(s)⋅ρrR(s)=ρot(s)h(s)+ρoO(s)
约束电路
将电路拍平后,转化为若干个乘法运算,但这忽略了变量的取值范围。我们对它们添加约束。
-
变量 a a a是布尔值,那么约束为:
a × ( a − 1 ) = 0 ⟺ a × a = a a \times (a-1) = 0 \iff a \times a = a a×(a−1)=0⟺a×a=a其中的常数 0 0 0,每个变量 v v v对应的系数在 Setup 阶段都被强制设为 c = 0 c=0 c=0,而无论 P P P怎么设置 v v v都无济于事。
-
变量 a a a是常数 7 7 7,那么约束为:
( a − 7 ⋅ v o n e ) × 1 = 0 (a-7 \cdot v_{one}) \times 1 = 0 (a−7⋅vone)×1=0这里的 1 = 1 ⋅ v o n e 1 = 1 \cdot v_{one} 1=1⋅vone和 0 = 0 ⋅ v 0 = 0 \cdot v 0=0⋅v都被强制设置了,不受 P P P的控制。
-
变量 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} (23⋅b3+22⋅b2+21⋅b1+20⋅b0)×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=1∑ncl,i,jvi×i=1∑ncr,i,jvi=i=1∑nco,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 vi的 variable 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=1∏d(x−i)
所有参与者协同生成 { 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=1∑nvi⋅li(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=0∏d(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))δl⋅i=m+1∏n(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))δl⋅i=m+1∏n(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))δo⋅i=1∏n(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=1∏m(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(glLP⋅grRP⋅goOP,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(glLP⋅glLV,grRP⋅grRV)⟺ρl(LP+LV)⋅ρr(RP+RV)=e(got(s),gh)⋅e(goOP⋅goOV,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 程序。