参考文献:
- Petkus M. Why and how zk-snark works: Definitive explanation[J]. arXiv preprint arXiv:1906.07221, 2019.
- Kilian J. A note on efficient zero-knowledge proofs and arguments[C]//Proceedings of the twenty-fourth annual ACM symposium on Theory of computing. 1992: 723-732.
- Reitwiessner C. zkSNARKs in a nutshell[J]. Ethereum blog, 2016, 6: 1-15.
- Nitulescu A. zk-SNARKs: A Gentle Introduction[R]. Technical report, 2020.
zkSNARKs
SNARK 是 succinct non-interactive arguments of knowledge 的简写。它是一个知识的证明系统,除了完备性(completeness)和可靠性(soundness),额外拥有:
- 简洁性(Succinct):相较于证明的内容,消息的长度很小
- 非交互性(Non-interactive):消息的发送方只有 Prover
- 论证(ARguments):Verifier 仅可以抵御多项式有界敌手,又称 “computational soundness”
- 关于知识的(of Knowledge):如果 Prover 不知道 witness,那么它不能构造出 proof / argument
而 zkSNARK,它额外再拥有零知识性(zero-knowledge)。事实上,零知识很容易达成(加入随机偏移即可),最重要的特性其实是 “简洁、无交互”。
Schwartz-Zippel lemma
描述
对于
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
无论每个多项式有多大,我们仅仅检查一个随机点上的等式即可!没必要计算多项式乘法,然后再检查每个系数是否相等。
多项式知识的证明
可以证明的多项式的性质有很多,我们关注对多项式因子的知识证明。确切地说:
- Prover(简记 P P P)宣称自己拥有的多项式 p ( x ) p(x) p(x),它有一个因子 t ( x ) t(x) t(x)
- Verifier(简记 V V V)要求 Prover 证明存在一个 h ( x ) h(x) h(x),满足 p ( x ) = t ( x ) h ( x ) p(x)=t(x)h(x) p(x)=t(x)h(x)
简洁的证明
我们利用 Schwartz-Zippel lemma 来设计简洁的证明:
- V V V随机采样 r r r,发送 r r r给 P P P
- P P P计算 h ( x ) = p ( x ) / t ( x ) h(x) = p(x)/t(x) h(x)=p(x)/t(x),再计算 p = p ( r ) , h = h ( r ) p=p(r),h=h(r) p=p(r),h=h(r),然后发送 p , h p,h p,h给 V V V
- V V V本地计算 t = t ( r ) t=t(r) t=t(r),验证 p = t ⋅ h p=t \cdot h p=t⋅h
上述协议的问题:
- P P P如果持有 p ( x ) = t ( x ) h ( x ) + s ( x ) p(x)=t(x)h(x)+s(x) p(x)=t(x)h(x)+s(x),其中 r ( x ) ≠ 0 r(x)\neq 0 r(x)=0,它可以计算 h ′ ( r ) = h ( r ) + s ( r ) / t ( r ) h'(r)=h(r)+s(r)/t(r) h′(r)=h(r)+s(r)/t(r), V V V检查 p = t ⋅ h ’ p=t \cdot h’ p=t⋅h’成立
- P P P即使完全不知道 p ( x ) p(x) p(x),它依然可以随机选取 h h h,然后设置 p = t ⋅ h p=t \cdot h p=t⋅h,但 V V V完全无法发现 P P P并没持有 p ( x ) p(x) p(x)
- P P P知道了 r r r,因此它可以任意构造多项式 p ′ ( x ) p'(x) p′(x),使它满足 p ′ ( r ) = t ( r ) ⋅ h ( r ) p'(r)=t(r) \cdot h(r) p′(r)=t(r)⋅h(r),于是 V V V获得了 t ( x ) ∣ p ′ ( x ) t(x)|p'(x) t(x)∣p′(x)的证明,而不是 t ( x ) ∣ p ( x ) t(x)|p(x) t(x)∣p(x)的证明
- P P P知道 t ( x ) t(x) t(x)的次数,因此它可以找一个次数特别高的多项式 p ( x ) p(x) p(x),使得它满足 t ( x ) ∣ p ( x ) t(x) | p(x) t(x)∣p(x)
同态承诺
我们应当让 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完全可以使用任意策略,来计算两个任意的值 z p , z h z_p,z_h zp,zh,只要满足 z p = z h t ( s ) z_p = z_h^{t(s)} zp=zht(s):先计算出 E ( t ( s ) ) = g t ( s ) E(t(s)) = g^{t(s)} E(t(s))=gt(s),然后随机选取 r r r,设置 z h = g r z_h=g^r zh=gr, z p = ( g t ( s ) ) r z_p = (g^{t(s)})^r zp=(gt(s))r
限制多项式
我们应当限制 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
上述协议的问题:
- 理论上 h ( x ) h(x) h(x)的系数 h i h_i hi的范围是整个域 F \mathbb F F,但是实际工程里的系数是有限的取值,因此 V V V完全可以根据 E ( h ( s ) ) E(h(s)) E(h(s))的信息获得 h ( x ) h(x) h(x)的一些特性信息。 p ( x ) = t ( x ) h ( x ) p(x)=t(x)h(x) p(x)=t(x)h(x)也一样。
添加零知识
由于 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))
上述协议的问题:
- 由于上述协议是 P P P, V V V交互式进行的,因此第三者 V ′ V' V′总是可以质疑上述 proof 的正确性。
实现非交互性
观察协议,发现只要让 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α)
上述协议的问题:
- s , α s,\alpha s,α是由一个可信方选取的,计算了承诺后立即销毁它们。这在现实中不切实际:没有人会相信其他人确实销毁了 s , α s,\alpha s,α,持有它们的 P P P拥有伪造 proof 的能力。
CRS
为了避免诚实方的问题,我们生成 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)的规模有多大。