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——多项式承诺方案