1. 引言
Mina系列博客有:
- Mina概览
- Mina的支付流程
- Mina的zkApp
- Mina中的Pasta(Pallas和Vesta)曲线
- Mina中的Schnorr signature
- Mina中的Pickles SNARK
- Mina中的Kimchi SNARK
- Mina Kimchi SNARK 代码解析
- Mina Berkeley QANet测试网zkApp初体验
- Mina中的Poseidon hash
2. 多项式 VS 函数
令
R
R
R为某域,基于域
R
R
R变量为
X
X
X的多项式表示为:
a
0
+
a
1
X
+
a
2
X
2
+
⋯
+
a
d
X
d
a_0+a_1X+a_2X^2+\cdots +a_dX^d
a0+a1X+a2X2+⋯+adXd
其中
a
i
∈
R
a_i\in R
ai∈R且
d
d
d为任意自然数。
针对基于
R
R
R的多项式的函数
e
v
a
l
:
R
[
X
]
→
(
R
→
R
)
\mathsf{eval}:R[X]\rightarrow (R\rightarrow R)
eval:R[X]→(R→R)定义为:【可将
e
v
a
l
\mathsf{eval}
eval看成是对多项式采样。】
e
v
a
l
(
a
0
+
a
1
X
+
⋯
+
a
d
X
d
)
=
(
x
:
R
)
↦
a
0
+
a
1
x
+
⋯
+
a
d
x
d
\mathsf{eval}(a_0+a_1X+\cdots+a_dX^d)=(x:R)\mapsto a_0+a_1x+\cdots +a_dx^d
eval(a0+a1X+⋯+adXd)=(x:R)↦a0+a1x+⋯+adxd
其中
X
X
X为未赋值的变量名,
e
v
a
l
\mathsf{eval}
eval将其映射为field element
x
x
x,整个evaluation函数可看成是系数
<
a
0
,
a
1
,
⋯
,
a
d
>
<a_0,a_1,\cdots,a_d>
<a0,a1,⋯,ad>与
<
1
,
x
,
⋯
,
x
d
>
<1,x,\cdots, x^d>
<1,x,⋯,xd>的inner product。
注意,多项式与函数是不同的。多项式是一组系数列表,基于某些域值,对于多项式
p
1
,
p
2
p1,p2
p1,p2,会存在
e
v
a
l
(
p
1
)
=
e
v
a
l
(
p
2
)
\mathsf{eval}(p1)=\mathsf{eval}(p2)
eval(p1)=eval(p2),但
p
1
≠
p
2
p1\neq p2
p1=p2的情况。
如,以
F
2
[
X
]
\mathbb{F}_2[X]
F2[X]为域的多项式
X
X
X和
X
2
X^2
X2,二者可映射为相同的函数
F
2
→
F
2
\mathbb{F}_2\rightarrow \mathbb{F}_2
F2→F2(即意味着对
x
∈
R
=
F
2
=
{
0
,
1
}
x\in R=\mathbb{F}_2=\{0,1\}
x∈R=F2={0,1} 有
x
=
x
2
x=x^2
x=x2),但是二者是不同的多项式。
使用多项式的原因在于:
- 1)将关于一组域值的statement 转换为 关于多项式的statement,从而可构建zkSNARKs。
- 2)基于多项式的特定运算效率更高。
对于函数
φ
:
A
→
F
\varphi: A\rightarrow F
φ:A→F,
A
A
A为数组,长度为
∣
A
∣
|A|
∣A∣,需基于
∀
x
∈
A
,
(
x
,
φ
(
x
)
)
\forall x\in A, (x,\varphi(x))
∀x∈A,(x,φ(x))进行插值构建多项式。
对于每一个
x
i
∈
A
x_i\in A
xi∈A,可构建多项式:
f
i
(
X
)
=
{
φ
(
x
i
)
X
=
x
i
0
X
≠
x
i
f_{i}(X) =\left\{\begin{matrix} \varphi(x_i)& X=x_i\\ 0 & X\neq x_i \end{matrix}\right.
fi(X)={φ(xi)0X=xiX=xi
最终的多项式:
f
(
X
)
=
∑
i
f
i
(
X
)
f(X)=\sum_if_i(X)
f(X)=∑ifi(X)。
相应的vanishing 多项式表示为:
v
S
(
X
)
=
(
X
−
x
0
)
(
X
−
x
1
)
⋯
(
X
−
x
d
)
v_S(X)=(X-x_0)(X-x_1)\cdots(X-x_d)
vS(X)=(X−x0)(X−x1)⋯(X−xd)。
同时有 i n t e r p A ( e v a l A ( f ) ) = f \mathsf{interp}_A(\mathsf{eval}_A(f))=f interpA(evalA(f))=f,即对多项式 f f f基于 A A A采样后,再插值获得的多项式仍然是 f f f。(多项式degree为 d d d,不同的采样点数为 d + 1 d+1 d+1。)【 i n t e r p A \mathsf{interp}_A interpA和 e v a l A \mathsf{eval}_A evalA为同构集合(即双射),为同构环。】
对同一Field,两个不同多项式
f
,
g
f,g
f,g的最大degree为
d
d
d,若在
d
+
1
d+1
d+1个不同的点
x
i
x_i
xi均有
f
(
x
i
)
=
g
(
x
i
)
f(x_i)=g(x_i)
f(xi)=g(xi),则认为2多项式相等,即
f
=
g
f=g
f=g。
对2个不同多项式
f
,
g
:
A
→
F
f,g:A\rightarrow F
f,g:A→F采样后的加法、惩罚运算可表示为:
f
+
g
:
=
a
↦
f
(
a
)
+
g
(
a
)
,
f
⋅
g
=
a
↦
f
(
a
)
⋅
g
(
a
)
f+g:=a\mapsto f(a)+g(a),f\cdot g=a\mapsto f(a)\cdot g(a)
f+g:=a↦f(a)+g(a),f⋅g=a↦f(a)⋅g(a)。
Fundamental theorem of polynomials (final version)
Let d ∈ N d \in \N d∈N and let A ⊆ F A \subseteq F A⊆F with ∣ A ∣ = d + 1 |A| = d + 1 ∣A∣=d+1. With
e v a l A : F [ x ] ≤ d → ( A → F ) i n t e r p A : ( A → F ) → F [ x ] ≤ d \mathsf{eval}_A \colon F[x]_{\leq d} \to (A \to F)\\ \mathsf{interp}_A \colon (A \to F) \to F[x]_{\leq d} evalA:F[x]≤d→(A→F)interpA:(A→F)→F[x]≤d
defined as above, these two functions define an isomorphism of rings.
That is is, they are mutually inverse and each one respects addition, subtraction and multiplication.
基于以上表示,可借助FFT算法以 O ( n log n ) O(n\log n) O(nlogn)实现2个degree为 n n n的多项式乘法运算,而直接的乘法运算需要 O ( n 2 ) O(n^2) O(n2)。
3. 多项式的程序表示
在实际计算机实现时,对多项式有3种常用的表达方式:
- 1)dense coefficient形式:将degree为
d
d
d的多项式以长度为
d
+
1
d+1
d+1的向量来表示其所有系数。该向量中的第
i
i
i个元素对应系数
a
i
a_i
ai。这就是arkworks中的
DensePolynomial
类型。有时也可以单项式集合来表示多项式,因为多项式是单项式 x i x^i xi的线性组合。【系数表示法】 - 2)sparse coefficient形式:若多项式中没有很多非零系数,则以dense coefficient来表示将很浪费。采用sparse形式,可将多项式表示为pairs ( u s i z e , F ) (usize,F) (usize,F)向量,其中 F F F为系数的类型。数组 [ ( i 0 , b 0 ) , ⋯ , ( i n , b n ) ] [(i_0,b_0),\cdots ,(i_n,b_n)] [(i0,b0),⋯,(in,bn)]对应的多项式为 b 0 x i 0 + ⋯ + b n x i n b_0x^{i_0}+\cdots + b_nx^{i_n} b0xi0+⋯+bnxin。
- 3)evaluation形式。对于固定的index set A ⊆ F A\subseteq F A⊆F,其中 A = { a 0 , ⋯ , a d } A=\{a_0,\cdots, a_d\} A={a0,⋯,ad},将多项式 f ∈ F [ X ] ≤ d f\in F[X]_{\leq d} f∈F[X]≤d表示为向量 [ f ( a 0 ) , ⋯ , f ( a d ) ] [f(a_0), \cdots, f(a_d)] [f(a0),⋯,f(ad)]。【点值表示法】
evaluation形式很重要,因为evaluation形式下,2个多项式相乘仅需对2个向量中的对应每个元素相乘,所需time为 O ( n ) O(n) O(n)。而直接相乘需要 O ( n 2 ) O(n^2) O(n2)。
对于特定的集合 A ⊆ F A\subseteq F A⊆F,可高效的在dense coefficient形式和evaluation形式之间相互转换。因为,对于特定的 A A A, i n t e r p A \mathsf{interp}_A interpA和 e v a l A \mathsf{eval}_A evalA的计算效率要远远优于 O ( n 2 ) O(n^2) O(n2)。
4. FFT计算多项式乘法
前序博客有:
通过Cooley-Tukey fast Fourier transform(简称FFT)算法(由Gauss 160年前发明,但由Cooley-Tukey独立再发现并公布),进行多项式乘法运算所需复杂度为 O ( n log n ) O(n\log n) O(nlogn)。
FFT算法的核心是系数表示法与点值表示法之间的相互转换,而不是直接进行多项式乘法运算。给定以dense coefficient表示的2个degree为 n − 1 n-1 n−1的多项式 p , q p,q p,q,FFT计算 p ⋅ q p\cdot q p⋅q的流程为:
- 1)借助FFT,将 p , q p,q p,q由系数表示法转换为点值表示法,相应的复杂度为 O ( n log n ) O(n\log n) O(nlogn)。
- 2)依次将2个点值表示法的每个元素相乘 r = p ∗ q r=p*q r=p∗q,相应的复杂度为 O ( n ) O(n) O(n)。
- 3)借助iFFT,将点值表示的 r r r转换为系数表示,相应的复杂度为 O ( n log n ) O(n\log n) O(nlogn)。
关键点在于,可选择任意 n n n个不同的evaluation点来表示任意的degree为 n − 1 n-1 n−1的多项式。Cooley-Tukey FFT通过选择合适的点来生成高效的FFT算法,这些点为固定的,且适于特定degree的任意多项式。
特别地,具有
n
n
n-th root of unity
ω
∈
F
\omega\in F
ω∈F,使得
ω
n
=
1
\omega^n=1
ωn=1,且对于任意的
0
<
r
<
n
0<r<n
0<r<n,有
ω
r
≠
1
\omega^r\neq 1
ωr=1。
1
,
ω
,
ω
2
,
ω
3
,
⋯
,
ω
n
−
1
1,\omega,\omega^2,\omega^3,\cdots,\omega^{n-1}
1,ω,ω2,ω3,⋯,ωn−1为
n
n
n个完全不同的点,且
ω
n
=
1
\omega^n=1
ωn=1。也可将其称为是由
ω
\omega
ω在
F
×
F^{\times}
F×内生成的size为
n
n
n的group。
令 n = 2 k n=2^{k} n=2k,且 ω \omega ω为 2 k 2^k 2k-th root of unity,且 A k = { 1 , ω , ⋯ , ω 2 k − 1 } A_k=\{1,\omega, \cdots, \omega ^{2^k-1}\} Ak={1,ω,⋯,ω2k−1}。
F F T ( k , ω , f ) \mathsf{FFT}(k,\omega,f) FFT(k,ω,f)算法的输入 有:
- k ∈ N k\in\mathbb{N} k∈N
- ω ∈ F \omega\in F ω∈F为 2 k 2^k 2k-th root of unity
- f ∈ F [ X ] < 2 k f\in F[X]_{<2^k} f∈F[X]<2k为dense coefficient形式(即长度为 n n n的系数向量)
F
F
T
(
k
,
ω
,
f
)
\mathsf{FFT}(k,\omega,f)
FFT(k,ω,f)算法的输出为evaluation向量:
[
f
(
1
)
,
f
(
ω
)
,
f
(
ω
2
)
,
⋯
,
f
(
ω
2
k
−
1
)
]
[f(1),f(\omega),f(\omega^2),\cdots,f(\omega^{2^k-1})]
[f(1),f(ω),f(ω2),⋯,f(ω2k−1)]
F
F
T
(
k
,
ω
,
f
)
\mathsf{FFT}(k,\omega,f)
FFT(k,ω,f)算法的复杂度为
O
(
k
2
k
)
O(k2^k)
O(k2k)(若
n
=
2
k
n=2^k
n=2k,亦为
O
(
n
log
n
)
O(n\log n)
O(nlogn))。【若直接根据
f
f
f的系数来计算每个
f
(
ω
i
)
f(\omega^i)
f(ωi)需
O
(
n
)
O(n)
O(n),计算
n
n
n次总的为
O
(
n
2
)
O(n^2)
O(n2)。】
核心在于FFT算法中的递归调用。
将多项式按奇偶项拆分表示为:
f
(
x
)
=
∑
i
<
2
k
c
i
x
i
=
∑
i
<
2
k
−
1
c
2
i
x
2
i
+
∑
i
<
2
k
−
1
c
2
i
+
1
x
2
i
+
1
=
∑
i
<
2
k
−
1
c
2
i
(
x
2
)
i
+
∑
i
<
2
k
−
1
c
2
i
+
1
x
⋅
(
x
2
)
i
=
∑
i
<
2
k
−
1
c
2
i
(
x
2
)
i
+
x
∑
i
<
2
k
−
1
c
2
i
+
1
(
x
2
)
i
=
f
0
(
x
2
)
+
x
f
1
(
x
2
)
\begin{aligned} f(x) &= \sum_{i < 2^k} c_i x^i \\ &= \sum_{i < 2^{k-1}} c_{2i} x^{2i} + \sum_{i < 2^{k-1}} c_{2i + 1} x^{2i + 1} \\ &= \sum_{i < 2^{k-1}} c_{2i} (x^2)^i+ \sum_{i < 2^{k-1}} c_{2i + 1} x \cdot (x^2)^i \\ &= \sum_{i < 2^{k-1}} c_{2i} (x^2)^i+ x \sum_{i < 2^{k-1}} c_{2i + 1} (x^2)^i \\ &= f_0(x^2) + x f_1(x^2) \end{aligned}
f(x)=i<2k∑cixi=i<2k−1∑c2ix2i+i<2k−1∑c2i+1x2i+1=i<2k−1∑c2i(x2)i+i<2k−1∑c2i+1x⋅(x2)i=i<2k−1∑c2i(x2)i+xi<2k−1∑c2i+1(x2)i=f0(x2)+xf1(x2)
注意,若
ω
\omega
ω为
2
k
2^k
2k-th root of unity,则
ω
2
\omega^2
ω2为
2
k
−
1
2^{k-1}
2k−1-th root of unity。可递归调用
F
F
T
(
k
−
1
,
ω
2
,
f
0
)
\mathsf{FFT}(k-1,\omega^2,f_0)
FFT(k−1,ω2,f0)和
F
F
T
(
k
−
1
,
ω
2
,
f
1
)
\mathsf{FFT}(k-1,\omega^2,f_1)
FFT(k−1,ω2,f1)。令:
[
e
0
,
0
,
…
,
e
0
,
2
k
−
1
−
1
]
=
F
F
T
(
k
−
1
,
ω
2
,
f
0
)
[
e
1
,
0
,
…
,
e
1
,
2
k
−
1
−
1
]
=
F
F
T
(
k
−
1
,
ω
2
,
f
1
)
\begin{aligned} [e_{0, 0}, \dots, e_{0, 2^{k-1} - 1}] &= \mathsf{FFT}(k-1, \omega^2, f_0) \\ [e_{1, 0}, \dots, e_{1, 2^{k-1} - 1}] &= \mathsf{FFT}(k-1, \omega^2, f_1) \end{aligned}
[e0,0,…,e0,2k−1−1][e1,0,…,e1,2k−1−1]=FFT(k−1,ω2,f0)=FFT(k−1,ω2,f1)
假设
e
i
,
j
=
f
i
(
(
ω
2
)
j
)
e_{i, j} = f_i((\omega^2)^j)
ei,j=fi((ω2)j),则对任意的
j
j
j有:
f
(
ω
j
)
=
f
0
(
(
ω
2
)
j
)
+
ω
j
f
1
(
(
ω
2
)
j
)
\begin{aligned} f(\omega^j) &= f_0((\omega^2)^j) + \omega^j f_1((\omega^2)^j) \end{aligned}
f(ωj)=f0((ω2)j)+ωjf1((ω2)j)
由于
j
j
j可能大于
2
k
−
1
−
1
2^{k-1}-1
2k−1−1,因此需将其reduce为
m
o
d
2
k
−
1
\mod 2^{k-1}
mod2k−1。若
τ
\tau
τ 为
n
n
n-th root of unity 则有:
τ
j
=
τ
j
m
o
d
n
\tau^j = \tau^{j \mod n}
τj=τjmodn 因
τ
n
=
1
\tau^n = 1
τn=1。因此有:
(
ω
2
)
j
=
(
ω
2
)
j
m
o
d
2
k
−
1
(\omega^2)^j = (\omega^2)^{j \mod 2^{k-1}}
(ω2)j=(ω2)jmod2k−1
从而有:
f
(
ω
j
)
=
f
0
(
(
ω
2
)
j
m
o
d
2
k
−
1
)
+
ω
j
f
1
(
(
ω
2
)
j
m
o
d
2
k
−
1
)
=
e
0
,
j
m
o
d
2
k
−
1
+
ω
j
e
1
,
j
m
o
d
2
k
−
1
\begin{aligned} f(\omega^j) &= f_0((\omega^2)^{j \mod 2^{k-1}} ) + \omega^j f_1((\omega^2)^{j \mod 2^{k-1}}) \\ &= e_{0, j \mod 2^{k-1}} + \omega^j e_{1, j \mod 2^{k-1}} \end{aligned}
f(ωj)=f0((ω2)jmod2k−1)+ωjf1((ω2)jmod2k−1)=e0,jmod2k−1+ωje1,jmod2k−1
计算数组
W
=
[
1
,
ω
,
…
,
ω
2
k
−
1
]
W = [ 1, \omega, \dots, \omega^{2^k - 1}]
W=[1,ω,…,ω2k−1] 的复杂度为
O
(
n
)
O(n)
O(n) (因为每个元素为前一元素乘以
ω
\omega
ω),然后可以
O
(
1
)
O(1)
O(1)复杂度计算:
f
(
ω
j
)
=
e
0
,
j
m
o
d
2
k
−
1
+
W
[
j
]
⋅
e
1
,
j
m
o
d
2
k
−
1
\begin{aligned} f(\omega^j) &= e_{0, j \mod 2^{k-1}} + W[j] \cdot e_{1, j \mod 2^{k-1}} \end{aligned}
f(ωj)=e0,jmod2k−1+W[j]⋅e1,jmod2k−1
由于需计算
n
n
n个类似元素,因此总复杂度为
O
(
n
)
O(n)
O(n)。
完整的 F F T ( k , ω , f ) \mathsf{FFT}(k, \omega, f) FFT(k,ω,f)递归算法示意如下:【将系数表示法转换为点值表示法】
Algorithm: computing e v a l A k \mathsf{eval}_{A_k} evalAk
- I n p u t f = [ c 0 , … , c 2 k − 1 ] \mathsf{Input~} f = [c_0, \ldots, c_{2^k - 1}] Input f=[c0,…,c2k−1] the coefficients of polynomial f ( x ) = ∑ i < 2 k c i x i f(x) = \sum_{i < 2^k} c_i x^i f(x)=∑i<2kcixi
- C o m p u t e W ← [ 1 , ω , ω 2 , . . . , ω 2 k − 1 ] \mathsf{Compute~} W \gets \left[1, \omega, \omega^2, ..., \omega^{2^k - 1}\right] Compute W←[1,ω,ω2,...,ω2k−1]【复杂度为 O ( n ) O(n) O(n)】
- F F T ( k , ω , f ) → [ f ( 1 ) , f ( ω ) , f ( ω 2 ) … , f ( ω 2 k − 1 ) ] \mathsf{FFT}(k, \omega, f) \rightarrow \left[f(1), f(\omega), f(\omega^2) \dots, f(\omega^{2^k - 1})\right] FFT(k,ω,f)→[f(1),f(ω),f(ω2)…,f(ω2k−1)]
- i f k = = 0 \mathtt{if~} k == 0 if k==0
- r e t u r n f \mathtt{return~} f return f
- e l s e \mathtt{else} else
- C o m p u t e f 0 = [ c 0 , c 2 , . . . , c 2 k − 2 ] \mathsf{Compute~} f_0 = [c_0, c_2, ..., c_{2^k - 2}] Compute f0=[c0,c2,...,c2k−2] the even coefficients of f , f, f, corresponding to f 0 ( x ) = ∑ i < 2 k − 1 c 2 i x i f_0(x) = \sum_{i < 2^{k - 1}} c_{2i} x^i f0(x)=∑i<2k−1c2ixi
- C o m p u t e f 1 = [ c 1 , c 3 , . . . , c 2 k − 1 ] \mathsf{Compute~} f_1 = [c_1, c_3, ..., c_{2^k - 1}] Compute f1=[c1,c3,...,c2k−1] the odd coefficients of f , f, f, corresponding to f 1 ( x ) = ∑ i < 2 k − 1 c 2 i + 1 x i f_1(x) = \sum_{i < 2^{k - 1}} c_{2i + 1} x^i f1(x)=∑i<2k−1c2i+1xi【计算 f 0 f_0 f0和 f 1 f_1 f1的复杂度为 O ( n ) O(n) O(n)】
- e 0 ← F F T ( k − 1 , ω 2 , f 0 ) e_0 \gets \mathsf{FFT}(k - 1, \omega^2, f_0) e0←FFT(k−1,ω2,f0)【递归调用size为 n / 2 n/2 n/2】
- e 1 ← F F T ( k − 1 , ω 2 , f 1 ) e_1 \gets \mathsf{FFT}(k - 1, \omega^2, f_1) e1←FFT(k−1,ω2,f1)【递归调用size为 n / 2 n/2 n/2】
- f o r j ∈ [ 0 , 2 k − 1 ] \mathtt{for~} j \in [0, 2^k - 1] for j∈[0,2k−1]【将递归调用结果组合复杂度为 O ( n ) O(n) O(n)】
- F j ← e 0 , j m o d 2 k − 1 + W [ j ] ⋅ e 1 , j m o d 2 k − 1 F_j \gets e_{0, j \mod 2^{k - 1}} + W[j] \cdot e_{1, j \mod 2^{k - 1}} Fj←e0,jmod2k−1+W[j]⋅e1,jmod2k−1
- r e t u r n F \mathtt{return~} F return F
以
T
(
n
)
T(n)
T(n)来表示size为
n
n
n(
n
=
2
k
n=2^k
n=2k)的instance的复杂度,则以上算法总的复杂度为:
O
(
n
)
+
2
T
(
n
/
2
)
O(n)+2T(n/2)
O(n)+2T(n/2)
而
T
(
n
)
=
O
(
n
)
⋅
log
n
=
O
(
n
log
n
)
T(n)=O(n)\cdot \log n=O(n\log n)
T(n)=O(n)⋅logn=O(nlogn),因为一共有
log
n
\log n
logn次递归调用,每次复杂度为
O
(
n
)
O(n)
O(n)。
不过实际实现时,可以非递归的方式实现更好的性能。
将系数表示法转换为点值表示法的算法流程为:【复杂度也为 O ( n log n ) O(n\log n) O(nlogn)】
Algorithm: computing i n t e r p A k \mathsf{interp}_{A_k} interpAk
Input: [ a 0 , … , a n − 1 ] [a_0, \dots, a_{n-1}] [a0,…,an−1] the points we want to interpolate and ω \omega ω a n n nth root of unity.
Interpret the input array as the coefficients of a polynomial g = ∑ i < n a i x n g = \sum_{i < n} a_i x^n g=∑i<naixn.
Let [ e 0 , … , e n ] = F F T ( k , ω − 1 , g ) [e_0, \dots, e_n] = \mathsf{FFT}(k, \omega^{-1}, g) [e0,…,en]=FFT(k,ω−1,g).
Output the polynomial ∑ i < n ( e i / n ) x i \sum_{i < n}(e_i / n) x^i ∑i<n(ei/n)xi. I.e., in terms of the dense-coefficients form, output the vector [ e 0 / n , … , e n − 1 / n ] [e_0 / n, \dots, e_{n - 1}/n] [e0/n,…,en−1/n].
5. 多项式承诺
前序博客有:
- 椭圆曲线形式下的Pedersen commitment——vector commitment和polynomial commitment
- polynomial commitment及实现方式对比
- Marlin中的Polynomial commitment scheme
- Halo:incremental verification + SNARKs without pairings
commitment应具有hiding和binding属性。同时具有一定的同态属性(如基于pairing的commitment具有乘法同态属性;基于DLG的commitment具有加法同态属性。)
polynomial commitment中包含的3个主要算法为:
- 1)Commit算法
- 2)Open算法
- 3)Verify算法
当前的polynomial commitment 方案主要分为:
- 1)基于KZG的多项式承诺方案:需要trusted setup。也可参看博客Pairing-based polynomial commitments and Kate polynomial commitments。
- 2)基于FRI的多项式承诺方案。
- 3)基于Bulletproofs的Inner product argument(IPA)多项式承诺方案。
- 4)IPA + Halo-style aggregation多项式承诺方案。
Technology | 基于的密码学假设 | Proof size | Verification time |
---|---|---|---|
FRI | Hashes only(quantum safe!) | Large(10-200kB) | Medium(poly-logarithmic) |
Inner product arguments (IPAs) | Basic elliptic curves | Medium (1-3 kB) | Very high (linear) |
KZG commitments | Elliptic curves + pairings + trusted setup | Short (~500 bytes) | Low (constant) |
IPA + Halo-style aggregation | Basic elliptic curves | Medium (1-3 kB) | Medium (constant but higher than KZG) |
5.1 inner product argument
前序博客有:
- Efficient Zero-Knowledge Arguments for Arithmetic Circuits in the Discrete Log Setting学习笔记
- Bulletproofs: Short Proofs for Confidential Transactions and More学习笔记
- Bulletproofs 代码解析
- Halo: Recursive Proof Composition without a Trusted Setup 学习笔记
Mina中采用的为inner product argument多项式承诺方案。
Inner product argument的发展历程为:
- 由Bootle等人在2016年《Efficient Zero-Knowledge Arguments for Arithmetic Circuits in the Discrete Log Setting》中发明
- 在2017年《Bulletproofs: Short Proofs for Confidential Transactions and More》论文中进行了优化。
- 在2019年《Halo: Recursive Proof Composition without a Trusted Setup》论文中进一步优化。
详细的衍化历程为:【仅 a ⃗ \vec{a} a为secret info。】
-
1)直接的方案为Prover将secret info a ⃗ \vec{a} a发送给Verifier:
⟨ a ⃗ , b ⃗ ⟩ = z given b ⃗ , z , and a hash of a ⃗ open proof ← a ⃗ \boxed{ \begin{aligned} & \langle \vec{a}, \vec{b} \rangle = z\\ & \text{given } \vec{b} \text{, } z \text{, and a hash of } \vec{a} \end{aligned} } \; \overleftarrow{\text{open proof}} \; \boxed{\vec{a}} ⟨a,b⟩=zgiven b, z, and a hash of aopen proofa -
2)引入中间reduction proof为:【其中 a ⃗ ′ \vec{a}' a′的size 为 a ⃗ \vec{a} a的一半,最终的open proof ( a ⃗ ) ′ (\vec{a})' (a)′ size 也为方案1)中的一半。】
⟨ a ⃗ , b ⃗ ⟩ = z given b ⃗ , z , and a hash of a ⃗ reduction proof ← ⟨ a ′ ⃗ , b ′ ⃗ ⟩ = z ′ given b ′ ⃗ , z ′ , and a hash of a ′ ⃗ open proof ← a ′ ⃗ \boxed{\begin{aligned} & \langle \vec{a}, \vec{b} \rangle = z\\ & \text{given } \vec{b} \text{, } z \text{, and a hash of } \vec{a} \end{aligned}} \; \overleftarrow{\text{reduction proof}} \; \boxed{\begin{aligned} & \langle \vec{a'}, \vec{b'} \rangle = z'\\ & \text{ given } \vec{b'} \text{, } z' \text{, and a hash of } \vec{a'} \end{aligned}} \; \overleftarrow{\text{open proof}} \; \boxed{\vec{a'}} ⟨a,b⟩=zgiven b, z, and a hash of areduction proof⟨a′,b′⟩=z′ given b′, z′, and a hash of a′open proofa′
其中的reduction proof为最神奇之处,运行该reduction log 2 ( n ) \log_2(n) log2(n)次,最终的opening proof size可减为1。当然整个proof中不只包含该size为1的final opening proof,还包含在reduction中的所有元素,总的大小仍要远小于原始的proof size n n n。总的proof size主要来源于这多个reduction subproofs。总的proof实际是这些subproofs(或miniproofs)的集合。
以多项式
f
=
a
1
+
a
2
x
+
a
3
x
2
+
a
4
x
3
f=a_1+a_2x+a_3x^2+a_4x^3
f=a1+a2x+a3x2+a4x3为例,有
a
⃗
=
(
a
1
,
a
2
,
a
3
,
a
4
)
\vec{a}=(a_1,a_2,a_3,a_4)
a=(a1,a2,a3,a4),
G
⃗
=
(
G
1
,
G
2
,
G
3
,
G
4
)
\vec{G}=(G_1,G_2,G_3,G_4)
G=(G1,G2,G3,G4)为相互不知道discret logarithm关系的generators。
inner product argument针对的场景为:
- 1)Prover发送对多项式 f f f的commitment值: A = < a ⃗ , G ⃗ > A=<\vec{a},\vec{G}> A=<a,G>为对 a ⃗ \vec{a} a的commitment。
- 2)Verifier发送evaluation point
s
s
s,请求evaluation值
f
(
s
)
f(s)
f(s),有:
b
⃗
=
(
b
1
,
b
2
,
b
3
,
b
4
)
=
(
1
,
s
,
s
2
,
s
3
)
\vec{b}=(b_1,b_2,b_3,b_4)=(1,s,s^2,s^3)
b=(b1,b2,b3,b4)=(1,s,s2,s3)。
Verifier还发送random challenge x x x。 - 3)Prover发送evaluation结果 z z z 以及 相应的proof。
其中Verifier发送的random challenge x x x用于实现half reduction:
- a ′ ⃗ = x − 1 ( a 1 a 2 ) + x ( a 3 a 4 ) = ( x − 1 a 1 + x a 3 x − 1 a 2 + x a 4 ) \vec{a'} = x^{-1} \begin{pmatrix}a_1 \\ a_2\end{pmatrix} + x \begin{pmatrix}a_3 \\ a_4\end{pmatrix}=\begin{pmatrix}x^{-1} a_1 + x a_3 \\ x^{-1} a_2 + x a_4 \end{pmatrix} a′=x−1(a1a2)+x(a3a4)=(x−1a1+xa3x−1a2+xa4)
- b ′ ⃗ = x ( b 1 b 2 ) + x − 1 ( b 3 b 4 ) = ( x b 1 + x − 1 b 3 x b 2 + x − 1 b 4 ) \vec{b'} = x \begin{pmatrix}b_1 \\ b_2\end{pmatrix} + x^{-1} \begin{pmatrix}b_3 \\ b_4\end{pmatrix}=\begin{pmatrix}x b_1 + x^{-1} b_3 \\ x b_2 + x^{-1} b_4 \end{pmatrix} b′=x(b1b2)+x−1(b3b4)=(xb1+x−1b3xb2+x−1b4)
- G ′ ⃗ = x ( G 1 G 2 ) + x − 1 ( G 3 G 4 ) = ( x G 1 + x − 1 G 3 x G 2 + x − 1 G 4 ) \vec{G'} = x \begin{pmatrix}G_1 \\ G_2\end{pmatrix} + x^{-1} \begin{pmatrix}G_3 \\ G_4\end{pmatrix}=\begin{pmatrix}x G_1 + x^{-1} G_3 \\ x G_2 + x^{-1} G_4 \end{pmatrix} G′=x(G1G2)+x−1(G3G4)=(xG1+x−1G3xG2+x−1G4)
这样将待证明的问题由
<
a
⃗
,
b
⃗
>
=
z
<\vec{a},\vec{b}>=z
<a,b>=z reduce为 证明
<
a
⃗
′
,
b
⃗
′
>
=
z
′
<\vec{a}',\vec{b}'>=z'
<a′,b′>=z′。
此时,Prover可直接将
a
⃗
′
,
b
⃗
′
,
z
′
\vec{a}',\vec{b}',z'
a′,b′,z′直接发送给Verifier,Verifier验证
<
a
⃗
′
,
b
⃗
′
>
=
z
′
<\vec{a}',\vec{b}'>=z'
<a′,b′>=z′确实成立。但是,此时仍然有2个问题:
- 1)需要向Verifier证明 < a ⃗ ′ , b ⃗ ′ > = z ′ <\vec{a}',\vec{b}'>=z' <a′,b′>=z′确实等价为之前的statement < a ⃗ , b ⃗ > = z <\vec{a},\vec{b}>=z <a,b>=z。
- 2)Verifier需要自己来计算 z ′ , b ⃗ ′ , G ⃗ ′ 和 A ′ = < b ⃗ ′ , G ⃗ ′ > z',\vec{b}',\vec{G}' 和A'=<\vec{b}',\vec{G}'> z′,b′,G′和A′=<b′,G′>。
其中:
- (1)
A
′
A'
A′ 的计算逻辑为:
A ′ ⃗ = ⟨ a ′ ⃗ , G ′ ⃗ ⟩ = ( x − 1 a 1 + x a 3 ) ( x G 1 + x − 1 G 3 ) + ( x − 1 a 2 + x a 4 ) ( x G 2 + x − 1 G 4 ) = A + x − 2 ( a 1 G 3 + a 2 G 4 ) + x 2 ( a 3 G 1 + a 4 G 2 ) = A + x − 2 L a + x 2 R a \begin{aligned} \vec{A'} =& \langle \vec{a'}, \vec{G'} \rangle \\ =& (x^{-1} a_1 + x a_3)(x G_1 + x^{-1} G_3) + (x^{-1} a_2 + x a_4)(x G_2 + x^{-1}G_4) \\ =& A + x^{-2} (a_1 G_3 + a_2 G_4) + x^2 (a_3 G_1 + a_4 G_2) \\ =& A + x^{-2} L_a + x^{2} R_a \end{aligned} A′====⟨a′,G′⟩(x−1a1+xa3)(xG1+x−1G3)+(x−1a2+xa4)(xG2+x−1G4)A+x−2(a1G3+a2G4)+x2(a3G1+a4G2)A+x−2La+x2Ra
为了计算 A ′ A' A′,Verifier需要:- 之前的commitment A A A,Verifier已知。
- x x x的一些幂值 x 2 , x − 2 x^2,x^{-2} x2,x−2,Verifier可自己计算。
- 2个curve point L a , R a L_a,R_a La,Ra,可由Prover提供给Verifier。【若采用压缩模式表示curve point,大小可压缩为约等于2个field element的size。】
- (2)
z
′
z'
z′的计算逻辑为:
z ′ ⃗ = ⟨ a ′ ⃗ , b ′ ⃗ ⟩ = ⟨ ( x − 1 a 1 + x a 3 x − 1 a 2 + x a 4 ) , ( x b 1 + x − 1 b 3 x b 2 + x − 1 b 4 ) ⟩ = ( a 1 b 1 + a 2 b 2 + a 3 b 3 + a 4 b 4 ) + x − 2 ( a 1 b 3 + a 2 b 4 ) + x 2 ( a 3 b 1 + a 4 b 2 ) = z + x − 2 ( L z ) + x 2 ( R z ) \begin{aligned} \vec{z'} =& \langle \vec{a'}, \vec{b'} \rangle \\ =& \langle \begin{pmatrix}x^{-1} a_1 + x a_3 \\ x^{-1} a_2 + x a_4 \end{pmatrix}, \begin{pmatrix}x b_1 + x^{-1} b_3 \\ x b_2 + x^{-1} b_4 \end{pmatrix} \rangle \\ =& (a_1b_1 + a_2b_2 + a_3b_3 + a_4b_4) + x^{-2} (a_1b_3 + a_2b_4) + x^2 (a_3b_1 + a_4b_2) \\ =& z + x^{-2} (L_z) + x^2 (R_z) \end{aligned} z′====⟨a′,b′⟩⟨(x−1a1+xa3x−1a2+xa4),(xb1+x−1b3xb2+x−1b4)⟩(a1b1+a2b2+a3b3+a4b4)+x−2(a1b3+a2b4)+x2(a3b1+a4b2)z+x−2(Lz)+x2(Rz)
为了计算 z ′ z' z′,Verifier需要:- evaluation结果 z z z,Verifier已知。
- x x x的一些幂值 x 2 , x − 2 x^2,x^{-2} x2,x−2,Verifier可自己计算。
- 2个scalar value L z , R z L_z,R_z Lz,Rz,可由Prover提供给Verifier。
因此,最终Prover发送的proof中包含的信息为:
- 1)向量 a ⃗ ′ \vec{a}' a′:为 a ⃗ \vec{a} a的一半大小。
- 2)2个curve point L a , R a L_a,R_a La,Ra。【若采用压缩表示,大小约为2个field element。】
- 3)2个scalar value L z , R z L_z,R_z Lz,Rz。
相应的证明过程变为:
不过,本例中,
a
⃗
\vec{a}
a的size为4,若直接reveal
a
⃗
\vec{a}
a,相应的proof size为4个field element,但经reduction后proof size反而变为了
2
+
2
+
2
=
6
2+2+2=6
2+2+2=6个field element,反而不值当。但是当
a
⃗
\vec{a}
a很大时,如128,reduction后的proof size 仅为
64
+
2
+
2
=
68
64+2+2=68
64+2+2=68个field element。而且,还可进一步优化。
5.2 Halo对inner product argument的优化
Halo优化类似于bulletproofs优化,可进一步减少proof size。
Halo优化中,将待证明问题由
A
=
<
a
⃗
,
G
⃗
>
∧
<
a
⃗
,
b
⃗
>
=
z
A=<\vec{a}, \vec{G}> \wedge <\vec{a},\vec{b}>=z
A=<a,G>∧<a,b>=z进一步转换为证明:【注意,实际应再引入一个公共generator
U
z
U_z
Uz,Verifier再发送random challenge
r
z
r_z
rz,Prover计算
U
=
r
z
U
z
U=r_zU_z
U=rzUz。】
C
=
A
+
z
U
=
⟨
a
⃗
,
G
⃗
⟩
+
⟨
a
⃗
,
b
⃗
⟩
U
C = A + zU = \langle \vec{a}, \vec{G} \rangle + \langle \vec{a}, \vec{b} \rangle U
C=A+zU=⟨a,G⟩+⟨a,b⟩U
可将其half reduction为证明:
C
′
=
A
′
+
z
′
U
=
⟨
a
′
⃗
,
G
′
⃗
⟩
+
⟨
a
′
⃗
,
b
′
⃗
⟩
U
C' = A' + z' U = \langle \vec{a'}, \vec{G'} \rangle + \langle \vec{a'}, \vec{b'} \rangle U
C′=A′+z′U=⟨a′,G′⟩+⟨a′,b′⟩U
因为:
C
′
=
⟨
a
′
⃗
,
G
′
⃗
⟩
+
⟨
a
′
⃗
,
b
′
⃗
⟩
U
=
[
A
+
x
−
2
L
a
+
x
2
R
a
]
+
[
z
+
x
−
2
(
L
z
)
+
x
2
(
R
z
)
]
U
=
C
+
x
−
2
(
L
a
+
L
z
U
)
+
x
2
(
R
a
+
R
z
U
)
\begin{aligned} C' =& \langle \vec{a'}, \vec{G'} \rangle + \langle \vec{a'}, \vec{b'} \rangle U \\ =& [A + x^{-2} L_a + x^{2} R_a] + [z + x^{-2} (L_z) + x^2 (R_z)] U\\ = & C + x^{-2} (L_a + L_z U) + x^{2} (R_a + R_z U) \end{aligned}
C′===⟨a′,G′⟩+⟨a′,b′⟩U[A+x−2La+x2Ra]+[z+x−2(Lz)+x2(Rz)]UC+x−2(La+LzU)+x2(Ra+RzU)
此时,Verifier除需要
a
⃗
′
\vec{a}'
a′之外,还需要2个curve point(~ 2个field element):
- L = L a + L z U L = L_a + L_z U L=La+LzU
- R = R a + R z U R = R_a + R_z U R=Ra+RzU
经此优化之后,每一轮reduction,由之前的4个field element降为2个field element。
在最后一轮,Verifier可计算并验证
C
′
=
C
+
x
−
2
L
+
x
2
R
=
⟨
a
′
⃗
,
G
′
⃗
⟩
+
⟨
a
′
⃗
,
b
′
⃗
⟩
U
C' = C + x^{-2}L + x^2 R=\langle \vec{a'}, \vec{G'} \rangle + \langle \vec{a'}, \vec{b'} \rangle U
C′=C+x−2L+x2R=⟨a′,G′⟩+⟨a′,b′⟩U是否成立即可。
至此,仍然需要Verifier自己来计算
G
⃗
′
\vec{G}'
G′和
b
⃗
′
\vec{b}'
b′。
经Halo优化后相应的证明为:
5.3 inner product argument + zero knowledge
目前为止,在最后一轮,需要直接发送
a
′
a'
a′,
a
′
a'
a′为单一element,将泄漏原始向量
a
⃗
\vec{a}
a的某些信息(
a
′
a'
a′为原始向量
a
⃗
\vec{a}
a的线性组合。)
详细参看Halo论文的附录A。
为实现zero knowledge,再额外引入一个公共generator
H
H
H以实现blinding:【
r
r
r由Prover生成,仅Prover知悉。】
C
=
A
+
z
U
+
r
H
=
⟨
a
⃗
,
G
⃗
⟩
+
⟨
a
⃗
,
b
⃗
⟩
U
+
r
H
C = A + zU + rH = \langle \vec{a}, \vec{G} \rangle + \langle \vec{a}, \vec{b} \rangle U +rH
C=A+zU+rH=⟨a,G⟩+⟨a,b⟩U+rH
同理,
L
=
L
a
+
L
z
U
,
R
=
R
a
+
R
z
U
L=L_a+L_zU,R=R_a+R_zU
L=La+LzU,R=Ra+RzU也会泄露
a
⃗
\vec{a}
a的某些信息,因此需要在每轮中引入随机值
r
L
,
r
R
r_L,r_R
rL,rR来进行blinding,使得有:
- L = L a + L z U + r L H L = L_a + L_z U + r_L H L=La+LzU+rLH
- R = R a + R z U + r R H R = R_a + R_z U + r_R H R=Ra+RzU+rRH
最终的commitment 仍保持为:
C
′
=
C
+
x
−
2
L
+
x
2
R
C' = C + x^{-2} L + x^2 R
C′=C+x−2L+x2R
Prover仅需发送
a
⃗
′
\vec{a}'
a′和最终的blinding value
r
′
r'
r′(
r
′
r'
r′由
r
r
r和每一轮的
r
L
,
r
R
r_L,r_R
rL,rR组成),Verifier再自己重构
G
⃗
′
\vec{G}'
G′和
b
⃗
′
\vec{b}'
b′来将
C
′
C'
C′ open为:
⟨
a
′
⃗
,
G
′
⃗
⟩
+
⟨
a
′
⃗
,
b
′
⃗
⟩
U
+
r
′
H
\langle \vec{a'}, \vec{G'} \rangle + \langle \vec{a'}, \vec{b'} \rangle U + r'H
⟨a′,G′⟩+⟨a′,b′⟩U+r′H
其中
r
′
r'
r′等于类似
r
+
∑
i
(
x
i
2
r
L
i
+
x
i
−
2
r
R
i
)
r + \sum_i (x_i^2r_{Li} + x_i^{-2}r_{Ri})
r+∑i(xi2rLi+xi−2rRi)。
最终,整个协议的proof为:
- 1)每轮2个curve point L , R L,R L,R。
- 2)最后一轮open时的1个scalar value a ′ a' a′。
- 3)最后一轮open时的1个blinding (scalar) value r ′ r' r′。
不过,在上述协议中,Prover即使不发送
a
⃗
′
\vec{a}'
a′,仅发送
r
′
r'
r′的情况下,某人也可能会计算出
a
⃗
′
\vec{a}'
a′。为此,在Halo论文中,提出了一种更通用的Schnorr协议,可在不发送
a
⃗
′
和
r
′
\vec{a}'和r'
a′和r′的情况下,open相应的commitment:【下图中为不发送
a
,
r
′
a,r'
a,r′的情况下open
Q
=
a
G
+
a
b
U
+
r
′
H
Q=aG+abU+r'H
Q=aG+abU+r′H】
最终经
log
2
n
\log_2n
log2n轮reduction,通过Fiat-Shamir transformation实现的non-interactive zero-knowledge inner product argument为:
5.4 Mina中的多项式承诺tips
5.4.1 约束所commit的多项式的最大degree
为约束所commit的多项式的最大degree,可要求Prover将多项式的系数移到最右端,使得若该多项式的degree大于所设定的最大degree,则无法符合要求。等价为:
right_shift
(
f
)
=
x
n
−
m
a
x
f
\text{right\_shift}(f) = x^{n-max} f
right_shift(f)=xn−maxf
当Verifier验证时,也需要对收到的evaluation值也同样进行右移操作:
right_shift
(
f
(
z
)
)
=
z
n
−
m
a
x
f
(
z
)
\text{right\_shift}(f(z)) = z^{n-max} f(z)
right_shift(f(z))=zn−maxf(z)
5.4.2 对多个多项式在同一点进行聚合证明
⟨ f ⃗ + v ⋅ g ⃗ , x ⃗ ⟩ = f ( x ) + v ⋅ g ( x ) \langle \vec{f} + v \cdot \vec{g}, \vec{x}\rangle = f(x) + v \cdot g(x) ⟨f+v⋅g,x⟩=f(x)+v⋅g(x)
5.4.3 对单个多项式在多个点进行聚合证明
⟨ f ⃗ , x 1 ⃗ + u ⋅ x 2 ⃗ ⟩ = f ( x 1 ) + u ⋅ f ( x 2 ) \langle \vec{f}, \vec{x_1} + u \cdot \vec{x_2}\rangle = f(x_1) + u \cdot f(x_2) ⟨f,x1+u⋅x2⟩=f(x1)+u⋅f(x2)
5.4.4 对多个多项式open多个不同点的聚合证明
如对多项式
f
f
f open
x
1
x_1
x1,对多项式
g
g
g open
x
1
,
x
2
x_1,x_2
x1,x2,相应的聚合证明为:
⟨
f
⃗
+
v
⋅
g
⃗
,
x
1
⃗
+
u
⋅
x
2
⃗
⟩
=
f
(
x
1
)
+
v
⋅
g
(
x
1
)
+
u
⋅
(
f
(
x
2
)
+
v
⋅
g
(
x
2
)
)
\langle \vec{f} + v \cdot \vec{g}, \vec{x_1} + u \cdot \vec{x_2} \rangle = f(x_1) + v \cdot g(x_1) + u \cdot (f(x_2) + v \cdot g(x_2))
⟨f+v⋅g,x1+u⋅x2⟩=f(x1)+v⋅g(x1)+u⋅(f(x2)+v⋅g(x2))
注意,这种类型的聚合中要求提供所有组合的evaluation值,可能包含某些不需要的evalaution值(如
f
(
x
2
)
f(x_2)
f(x2))。
5.4.5 对多项式进行切分
若多项式的degree大于SRS所允许的最大degree n n n,可将其切分为多个degree不超过 n n n的多项式。
5.4.6 proof of correct commitment to a polynomial
这在HALO中有用。
针对的场景为:
已知commitment
A
A
A和多项式
f
f
f,证明
A
=
c
o
m
(
f
)
A=com(f)
A=com(f)。
相应的证明过程为:
- 生成一个随机点 s s s
- evaluate f f f at s s s,有 f ( s ) = y f(s)=y f(s)=y
- 请求evaluation proof of A A A on s s s,若其也evaluate to y y y,则大概率 A A A是多项式 f f f的commitment。
参考资料
[1] Mina-book——多项式
[2] Mina-book——多项式承诺方案