参考文献:
SNARK 是 succinct non-interactive arguments of knowledge 的简写。它是一个知识的证明系统,除了完备性(completeness)和可靠性(soundness),额外拥有:
而 zkSNARK,它额外再拥有零知识性(zero-knowledge)。事实上,零知识很容易达成(加入随机偏移即可),最重要的特性其实是 “简洁、无交互”。
对于 n n n个变元,定义项的总度数(total degree)为
deg ( ∏ i = 1 n x i s i ) = ∑ i = 1 n s i \deg(\prod_{i=1}^n x_i^{s_i}) = \sum_{i=1}^n s_i deg(i=1∏nxisi)=i=1∑nsi
(有限 / 无限)域 F \mathbb F F上的 n n n元 d d d次多项式,
P ( x 1 , ⋯ , x n ) ∈ F [ x 1 , ⋯ , x n ] P(x_1,\cdots,x_n) \in \mathbb F[x_1,\cdots,x_n] P(x1,⋯,xn)∈F[x1,⋯,xn]
令 S ⊆ F S \subseteq \mathbb F S⊆F是有限子集,那么独立均匀地选取随机点 ( r 1 , ⋯ , r n ) ∈ S n (r_1,\cdots,r_n) \in S^n (r1,⋯,rn)∈Sn,有
P r [ P ( r 1 , ⋯ , r n ) = 0 ] ≤ d ∣ S ∣ Pr[P(r_1,\cdots,r_n)=0] \le \dfrac{d}{|S|} Pr[P(r1,⋯,rn)=0]≤∣S∣d
等价地,令 Z ( f ) Z(f) Z(f)是 f f f的零点集,那么有
∣ Z ( f ) ∩ S n ∣ ≤ d ⋅ ∣ S ∣ n − 1 |Z(f) \cap S^n| \le d \cdot |S|^{n-1} ∣Z(f)∩Sn∣≤d⋅∣S∣n−1
我们可以高效地检查若干(大规模)多项式之间的等式关系。例如:
f ( x ) = g ( x ) h ( x ) ⟺ f ( x ) − g ( x ) h ( x ) = 0 f(x) = g(x)h(x) \iff f(x)-g(x)h(x) = 0 f(x)=g(x)h(x)⟺f(x)−g(x)h(x)=0
已知 f , g , h f,g,h f,g,h的度数最高为 d d d,那么我们圈定一个范围 S S S,满足 d ≪ ∣ S ∣ d \ll |S| d≪∣S∣,那么我们随机选取 r ∈ S r \in S r∈S,检查下述等式是否成立:
f ( r ) − g ( r ) h ( r ) = 0 f(r) - g(r)h(r) = 0 f(r)−g(r)h(r)=0
如果 f ( x ) − g ( x ) h ( x ) = 0 f(x)-g(x)h(x) = 0 f(x)−g(x)h(x)=0,那么对于任意的 r r r,有
P r [ f ( r ) − g ( r ) h ( r ) = 0 ] = 1 Pr[f(r) - g(r)h(r) = 0] =1 Pr[f(r)−g(r)h(r)=0]=1
如果 f ( x ) − g ( x ) h ( x ) ≠ 0 f(x)-g(x)h(x) \neq 0 f(x)−g(x)h(x)=0,那么对于任意的 r r r,上述检查通过的概率为
P r [ f ( r ) − g ( r ) h ( r ) = 0 ] ≤ d ∣ S ∣ Pr[f(r) - g(r)h(r) = 0] \le \frac{d}{|S|} Pr[f(r)−g(r)h(r)=0]≤∣S∣d
无论每个多项式有多大,我们仅仅检查一个随机点上的等式即可!没必要计算多项式乘法,然后再检查每个系数是否相等。
可以证明的多项式的性质有很多,我们关注对多项式因子的知识证明。确切地说:
我们利用 Schwartz-Zippel lemma 来设计简洁的证明:
上述协议的问题:
我们应当让 P P P无法获得 r , t ( r ) r,t(r) r,t(r),从而避免它伪造 p ( r ) p(r) p(r)或者 p ( x ) p(x) p(x),于是同态加密登场了。我们实际上不关心解密问题,因此我们只需要一个承诺算法。
选取合适的循环群(后续技术中要求它是存在双线性映射的椭圆曲线群),它的生成元为 g g g,其上的 CDH 是困难的:
E ( s ) = g s E(s) = g^s E(s)=gs
明显有同态加法:
E ( s 1 ) ⋅ E ( s 2 ) = g s 1 + s 2 = E ( s 1 + s 2 ) E(s_1) \cdot E(s_2) = g^{s_1+s_2} = E(s_1+s_2) E(s1)⋅E(s2)=gs1+s2=E(s1+s2)
以及标量乘法:
E ( s ) c = g c ⋅ s = E ( c ⋅ s ) E(s)^c = g^{c \cdot s} = E(c \cdot s) E(s)c=gc⋅s=E(c⋅s)
它不支持同态乘法(太笨重,也没必要)。利用同态加法和标量乘法,我们完全可以对一个多项式 ϕ ( x ) \phi(x) ϕ(x)做承诺:随机点 s ∈ F s \in \mathbb F s∈F的函数值 ϕ ( s ) \phi(s) ϕ(s)对应的单个群元素 g ϕ ( s ) g^{\phi(s)} gϕ(s)(Kate Commitment)
协议修改为:
V V V随机采样 s s s,发送承诺
E ( s 0 ) , E ( s 1 ) , ⋯ , E ( s d ) E(s^0),E(s^1),\cdots,E(s^d) E(s0),E(s1),⋯,E(sd)
P P P拥有
p ( x ) = ∑ i = 0 d p i x i p(x) = \sum_{i=0}^d p_i x^i p(x)=i=0∑dpixi
然后计算
E ( p ( s ) ) = ∏ i = 0 d ( g s i ) p i = ∏ i = 0 d E ( s i ) p i = g p E(p(s)) = \prod_{i=0}^d (g^{s^i})^{p_i} = \prod_{i=0}^d E(s^i)^{p_i} = g^p E(p(s))=i=0∏d(gsi)pi=i=0∏dE(si)pi=gp
类似的计算 h ( x ) = p ( x ) / t ( x ) h(x)=p(x)/t(x) h(x)=p(x)/t(x)对应的 E ( h ( s ) ) E(h(s)) E(h(s)),然后发送 g p , g h g^p,g^h gp,gh给 V V V
V V V本地计算 t = t ( s ) t=t(s) t=t(s),然后验证 g p = ( g h ) t g^p = (g^h)^t gp=(gh)t
上述协议的问题:
我们应当限制 P P P正确地使用这些承诺 E ( s i ) E(s^i) E(si)的幂次,来计算 p ( s ) p(s) p(s)的承诺。这里,我们让 V V V对承诺 E ( s ) E(s) E(s)做随机偏移 E ( s ) α E(s)^\alpha E(s)α,要求 P P P返回的一对值 a , a ′ a,a' a,a′满足限制 a α = a ′ a^\alpha=a' aα=a′
那么由于 CDH 限制了 P P P不知道 α \alpha α,于是它只能选取某个整数 c c c,并计算
a = ( E ( s ) ) c , a ′ = ( E ( s ) α ) c a=(E(s))^c,a'=(E(s)^\alpha)^c a=(E(s))c,a′=(E(s)α)c
这是除了穷举外,唯一的使得 a α = a ′ a^\alpha=a' aα=a′的计算方法。 V V V虽然不知道 c c c的值(也不应知道),但它可以确定 a a a确实是 E ( s ) E(s) E(s)的某个幂次。
协议修改为:
V V V随机采样 s , α s,\alpha s,α,发送承诺
E ( s 0 ) , E ( s 1 ) , ⋯ , E ( s d ) E(s^0),E(s^1),\cdots,E(s^d) E(s0),E(s1),⋯,E(sd)
以及偏移的承诺
E ( s 0 ) α , E ( s 1 ) α , ⋯ , E ( s d ) α E(s^0)^\alpha,E(s^1)^\alpha,\cdots,E(s^d)^\alpha E(s0)α,E(s1)α,⋯,E(sd)α
P P P拥有
p ( x ) = ∑ i = 0 d p i x i p(x) = \sum_{i=0}^d p_i x^i p(x)=i=0∑dpixi
然后计算
E ( p ( s ) ) = ∏ i = 0 d ( g s i ) p i = ∏ i = 0 d E ( s i ) p i = g p E(p(s)) = \prod_{i=0}^d (g^{s^i})^{p_i} = \prod_{i=0}^d E(s^i)^{p_i} = g^p E(p(s))=i=0∏d(gsi)pi=i=0∏dE(si)pi=gp
以及对应的偏移
E ( p ( s ) ) α = ( ∏ i = 0 d ( g s i ) p i ) α = ∏ i = 0 d ( E ( s i ) α ) p i = g α ⋅ p = g p ′ E(p(s))^\alpha = (\prod_{i=0}^d (g^{s^i})^{p_i})^\alpha = \prod_{i=0}^d (E(s^i)^\alpha)^{p_i} = g^{\alpha \cdot p} = g^{p'} E(p(s))α=(i=0∏d(gsi)pi)α=i=0∏d(E(si)α)pi=gα⋅p=gp′
类似的计算 h ( x ) = p ( x ) / t ( x ) h(x)=p(x)/t(x) h(x)=p(x)/t(x)对应的 E ( h ( s ) ) E(h(s)) E(h(s)),然后发送 g p , g p ’ , g h g^p,g^{p’},g^h gp,gp’,gh给 V V V
V V V本地计算 t = t ( s ) t=t(s) t=t(s),先检查约束 ( g p ) α = g p ′ (g^p)^\alpha=g^{p'} (gp)α=gp′,然后再验证 g p = ( g h ) t g^p = (g^h)^t gp=(gh)t
上述协议的问题:
由于 V V V只能根据 P P P发送的承诺值 g p , g p ′ , g h , g h ′ g^p,g^{p'},g^h,g^{h'} gp,gp′,gh,gh′,来确定 p ( x ) p(x) p(x)的信息。因此,我们让 P P P也对这些承诺值做随机偏移 δ \delta δ
协议修改为:
V V V随机采样 s , α s,\alpha s,α,发送承诺
E ( s 0 ) , E ( s 1 ) , ⋯ , E ( s d ) E(s^0),E(s^1),\cdots,E(s^d) E(s0),E(s1),⋯,E(sd)
以及偏移的承诺
E ( s 0 ) α , E ( s 1 ) α , ⋯ , E ( s d ) α E(s^0)^\alpha,E(s^1)^\alpha,\cdots,E(s^d)^\alpha E(s0)α,E(s1)α,⋯,E(sd)α
P P P拥有
p ( x ) = ∑ i = 0 d p i x i p(x) = \sum_{i=0}^d p_i x^i p(x)=i=0∑dpixi
然后计算
E ( p ( s ) ) = ∏ i = 0 d ( g s i ) p i = ∏ i = 0 d E ( s i ) p i = g p E(p(s)) = \prod_{i=0}^d (g^{s^i})^{p_i} = \prod_{i=0}^d E(s^i)^{p_i} = g^p E(p(s))=i=0∏d(gsi)pi=i=0∏dE(si)pi=gp
以及对应的偏移
E ( p ( s ) ) α = ( ∏ i = 0 d ( g s i ) p i ) α = ∏ i = 0 d ( E ( s i ) α ) p i = g α ⋅ p = g p ′ E(p(s))^\alpha = (\prod_{i=0}^d (g^{s^i})^{p_i})^\alpha = \prod_{i=0}^d (E(s^i)^\alpha)^{p_i} = g^{\alpha \cdot p} = g^{p'} E(p(s))α=(i=0∏d(gsi)pi)α=i=0∏d(E(si)α)pi=gα⋅p=gp′
类似的计算 h ( x ) = p ( x ) / t ( x ) h(x)=p(x)/t(x) h(x)=p(x)/t(x)对应的 E ( h ( s ) ) E(h(s)) E(h(s))
然后选取随机偏移 δ \delta δ,计算并发送
( g p ) δ , ( g p ’ ) δ , ( g h ) δ (g^p)^\delta,(g^{p’})^\delta,(g^h)^\delta (gp)δ,(gp’)δ,(gh)δ
V V V本地计算 t = t ( s ) t=t(s) t=t(s),先检查约束 ( ( g p ) δ ) α = ( g p ′ ) δ ((g^p)^\delta)^\alpha=(g^{p'})^\delta ((gp)δ)α=(gp′)δ,然后再验证
( g p ) δ = E ( δ ⋅ p ( s ) ) = ( ( g h ) δ ) t = E ( δ ⋅ t ( s ) h ( s ) ) (g^p)^\delta = E(\delta \cdot p(s)) = ((g^h)^\delta)^t = E(\delta \cdot t(s)h(s)) (gp)δ=E(δ⋅p(s))=((gh)δ)t=E(δ⋅t(s)h(s))
上述协议的问题:
观察协议,发现只要让 step 1 的随机点和随机偏移 s , α s,\alpha s,α成为证明系统的 secret parameters 即可。这个秘密参数应当满足以下性质: to be reusable, public, trustworthy and infeasible to abuse。它叫做 common reference string(CRS),就是天上掉馅饼 !!!∑(゚Д゚ノ)ノ
我们让可信方生成 s , α s,\alpha s,α,然后计算 E ( t ( s ) ) , { E ( s i ) , E ( s i ) α } i = 1 d E(t(s)),\{E(s^i),E(s^i)^\alpha\}_{i=1}^d E(t(s)),{E(si),E(si)α}i=1d,公开后立刻销毁 s , α s,\alpha s,α,防止 P P P伪造信息。任意的人都可以作为 P , V P,V P,V在任意的一次证明中使用它,且他们都不知道 s , α s,\alpha s,α的值。
由于 V V V不知道 t ( s ) t(s) t(s),那么怎么验证 E ( p ( s ) ) = E ( t ( s ) ⋅ h ( s ) ) E(p(s))=E(t(s) \cdot h(s)) E(p(s))=E(t(s)⋅h(s))是个问题,因为承诺算法 E ( ⋅ ) E(\cdot) E(⋅)不支持同态乘法。于是我们引入双线性对(可在椭圆曲线群上实例化),它可以计算密文下的单次乘法。
椭圆曲线群 G , G G,\textbf{G} G,G,令 g , g g,\textbf{g} g,g是它们各自的生成元,存在双线性映射 e : G × G → G e:G \times G \to \textbf{G} e:G×G→G,使得 e ( g , g ) = g e(g,g)=\textbf{g} e(g,g)=g,满足
e ( g a , g b ) = g ( g a b , g ) = e ( g , g a b ) = e ( g , g ) a b = g a b e(g^a,g^b) = g(g^{ab},g) = e(g,g^{ab}) = e(g,g)^{ab} = \textbf{g}^{ab} e(ga,gb)=g(gab,g)=e(g,gab)=e(g,g)ab=gab
易知,
e ( g a , g b ) ⋅ e ( g c , g d ) = g a b + c d e(g^a,g^b) \cdot e(g^c,g^d) = \textbf{g}^{ab+cd} e(ga,gb)⋅e(gc,gd)=gab+cd
协议修改为:
Setup:可信方随机采样 s , α s,\alpha s,α,计算承诺
E ( s 0 ) , E ( s 1 ) , ⋯ , E ( s d ) E(s^0),E(s^1),\cdots,E(s^d) E(s0),E(s1),⋯,E(sd)
以及偏移的承诺
E ( s 0 ) α , E ( s 1 ) α , ⋯ , E ( s d ) α E(s^0)^\alpha,E(s^1)^\alpha,\cdots,E(s^d)^\alpha E(s0)α,E(s1)α,⋯,E(sd)α
设置 Proving key(公开的):
( 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)
设置 Verification key(公开的):
( g α , g t ( s ) ) \left( g^\alpha,\, g^{t(s)} \right) (gα,gt(s))
上述两者就构成了 CRS
Proving: P P P拥有
p ( x ) = ∑ i = 0 d p i x i p(x) = \sum_{i=0}^d p_i x^i p(x)=i=0∑dpixi
然后计算
E ( p ( s ) ) = ∏ i = 0 d ( g s i ) p i = ∏ i = 0 d E ( s i ) p i = g p E(p(s)) = \prod_{i=0}^d (g^{s^i})^{p_i} = \prod_{i=0}^d E(s^i)^{p_i} = g^p E(p(s))=i=0∏d(gsi)pi=i=0∏dE(si)pi=gp
以及对应的偏移
E ( p ( s ) ) α = ( ∏ i = 0 d ( g s i ) p i ) α = ∏ i = 0 d ( E ( s i ) α ) p i = g α ⋅ p = g p ′ E(p(s))^\alpha = (\prod_{i=0}^d (g^{s^i})^{p_i})^\alpha = \prod_{i=0}^d (E(s^i)^\alpha)^{p_i} = g^{\alpha \cdot p} = g^{p'} E(p(s))α=(i=0∏d(gsi)pi)α=i=0∏d(E(si)α)pi=gα⋅p=gp′
类似的计算 h ( x ) = p ( x ) / t ( x ) h(x)=p(x)/t(x) h(x)=p(x)/t(x)对应的 E ( h ( s ) ) , E ( α ⋅ p ( s ) ) E(h(s)),E(\alpha \cdot p(s)) E(h(s)),E(α⋅p(s))
然后选取随机偏移 δ \delta δ,计算并发送
π = { ( g p ) δ , ( g p ’ ) δ , ( g h ) δ } \pi = \{(g^p)^\delta,(g^{p’})^\delta,(g^h)^\delta\} π={(gp)δ,(gp’)δ,(gh)δ}
Verification:利用双线性对(计算乘法), V V V先检查约束,
e ( ( g p ) δ , g α ) = e ( ( g p ′ ) δ , g ) e((g^p)^\delta,g^\alpha) = e((g^{p'})^\delta,g) e((gp)δ,gα)=e((gp′)δ,g)
然后再验证因子
e ( ( g p ) δ , g ) = e ( ( g h ) δ , g t ( s ) ) e((g^p)^\delta,g) = e((g^h)^\delta,g^{t(s)}) e((gp)δ,g)=e((gh)δ,gt(s))
注意,应当让 G ≠ G G \neq \textbf{G} G=G,使得 e ( ⋅ , ⋅ ) e(\cdot,\cdot) e(⋅,⋅)类似一个Hash函数。如果 G = G G = \textbf{G} G=G,那么恶意的 P P P可以设置 g p ′ = e ( g p , g α ) g^{p'}=e(g^p,g^\alpha) gp′=e(gp,gα),于是也可以通过检查
e ( e ( g p , g α ) , g ) = e ( g p , g α ) e(e(g^p,g^\alpha),g) = e(g^p,g^\alpha) e(e(gp,gα),g)=e(gp,gα)
上述协议的问题:
为了避免诚实方的问题,我们生成 composite CRS。假设存在 n n n个参与者 { P j } j = 1 n \{P_j\}_{j=1}^n {Pj}j=1n,我们选取 P 1 P_1 P1作为链表开头:
P 1 P_1 P1随机选取 s 1 , α 1 s_1,\alpha_1 s1,α1,公布它的 CRS
( g A 1 , { g S 1 i } i , { g A S 1 i } i ) : = ( g α 1 , { g s 1 i } i , { g α 1 s 1 i } i ) \left( g^{A_1}, \{g^{S_1^i}\}_i, \{g^{AS_1^i}\}_i \right) := \left( g^{\alpha_1},\, \{g^{s_1^i}\}_i,\, \{g^{\alpha_1 s_1^i}\}_i \right) (gA1,{gS1i}i,{gAS1i}i):=(gα1,{gs1i}i,{gα1s1i}i)
P j P_j Pj接收到 P j − 1 P_{j-1} Pj−1的 CRS 后,随机选取 s j , α j s_j,\alpha_j sj,αj,利用加法同态,计算新的 CRS
( g A j , { g S j i } i , { g A j S j i } i ) : = ( g A j − 1 ⋅ α j , { g S j − 1 i ⋅ s j i } i , { g A j − 1 S j − 1 i ⋅ α j s j i } i ) \left( g^{A_j}, \{g^{S_j^i}\}_i, \{g^{A_jS_j^i}\}_i \right) := \left( g^{A_{j-1} \cdot \alpha_j},\, \{g^{S_{j-1}^i \cdot s_j^i}\}_i,\, \{g^{A_{j-1}S_{j-1}^i \cdot \alpha_j s_j^i}\}_i \right) (gAj,{gSji}i,{gAjSji}i):=(gAj−1⋅αj,{gSj−1i⋅sji}i,{gAj−1Sj−1i⋅αjsji}i)
最后, P n P_n Pn发布最终的 CRS
( g A n , { g S n i } i , { g A n S n i } i ) \left( g^{\Alpha_n}, \{g^{S_n^i}\}_i, \{g^{A_nS_n^i}\}_i \right) (gAn,{gSni}i,{gAnSni}i)
为了防止第 j ∈ [ n ] j \in [n] j∈[n]个参与者对不同的幂次 i i i使用不同的 s s s,从而破坏 CRS 令它不可用,我们需要做一致性检查(consistency check):
以 i = 1 i=1 i=1的承诺 E ( S 1 ) E(S^1) E(S1)为标准值(canonical value),依次检查其他的 i = 2 , ⋯ , d i = 2,\cdots,d i=2,⋯,d的幂次的承诺,
e ( E ( S i ) , g ) = e ( g S , g S i − 1 ) = e ( E ( S 1 ) , g S i − 1 ) e(E(S^i),g) = e(g^S,g^{S^{i-1}}) = e(E(S^1),g^{S^{i-1}}) e(E(Si),g)=e(gS,gSi−1)=e(E(S1),gSi−1)
然后,还要检查每个 i = 1 , 2 , ⋯ , d i=1,2,\cdots,d i=1,2,⋯,d的偏移的承诺,
e ( E ( A S i ) , g ) = e ( g S i , g A ) = e ( E ( A i ) , g A ) e(E(A S^i),g) = e(g^{S^i},g^A) = e(E(A^i),g^A) e(E(ASi),g)=e(gSi,gA)=e(E(Ai),gA)
另外,为了防止第 j ≥ 2 j \ge 2 j≥2个参与者不使用前 j − 1 j-1 j−1个人的 CRS,从而移除它们的随机性,我们还需要验证它们确实是在 ( g A j − 1 , { g S j − 1 i } i , { g A j − 1 S j − 1 i } i ) \left( g^{A_{j-1}}, \{g^{S_{j-1}^i}\}_i, \{g^{A_{j-1}S_{j-1}^i}\}_i \right) (gAj−1,{gSj−1i}i,{gAj−1Sj−1i}i)的基础上计算了幂次,利用双线性对判断密文下乘积是否相等,
要求 j ≥ 2 j \ge 2 j≥2的参与者都公布额外的关于 s j , α j s_j,\alpha_j sj,αj的承诺
( g α j , { g s j i } i , { g α j s j i } i ) \left( g^{\alpha_j}, \{g^{s_j^i}\}_i, \{g^{\alpha_j s_j^i}\}_i \right) (gαj,{gsji}i,{gαjsji}i)
每个参与者都可以检查
e ( E ( A j i ) , g ) = e ( E ( A j − 1 i ) , g α j ) e(E(A_{j}^i),g) = e(E(A_{j-1}^i),g^{\alpha_j}) e(E(Aji),g)=e(E(Aj−1i),gαj)
e ( E ( S j i ) , g ) = e ( E ( S j − 1 i ) , g s j i ) e(E(S_{j}^i),g) = e(E(S_{j-1}^i),g^{s_j^i}) e(E(Sji),g)=e(E(Sj−1i),gsji)
e ( E ( A j S j i ) , g ) = e ( E ( A j − 1 S j − 1 i ) , g α j s j i ) e(E(A_j S_{j}^i),g) = e(E(A_{j-1} S_{j-1}^i),g^{\alpha_j s_j^i}) e(E(AjSji),g)=e(E(Aj−1Sj−1i),gαjsji)
在 CRS model 下,我们实现了对于多项式知识 t ( x ) ∣ p ( x ) t(x) | p(x) t(x)∣p(x) 的非交互简洁零知识证明,Prover 只需发送一个消息
π = { ( g p ) δ , ( g p ’ ) δ , ( g h ) δ } \pi = \{(g^p)^\delta,(g^{p’})^\delta,(g^h)^\delta\} π={(gp)δ,(gp’)δ,(gh)δ}
给 Verifier 验证。这个 proof 仅仅包含 3 3 3个承诺,无论 p ( x ) , t ( x ) p(x),t(x) p(x),t(x)的规模有多大。