Introduction
is a zk-SNARK construction introduced in 2016 by Jens Groth, characterized by its compact proof size of just 3 group elements and exceptionally fast verification speed. It is widely used in frameworks like and .
Background
Quardratic Arithmetic Protocol (QAP)
For a system where the number of instance variables is ℓ + 1 \ell + 1 ℓ + 1 , the number of witness variables is m − ℓ m - \ell m − ℓ (thus, the total number of variables is m + 1 m + 1 m + 1 ), and the number of constraints is n n n , can be represented as follows:
This R1CS system can be reduced to a Quadratic Arithmetic Program (QAP) :
( ∑ i = 0 m a i ( X ) ⋅ z i ) ( ∑ i = 0 m b i ( X ) ⋅ z i ) − ∑ i = 0 m c i ( X ) ⋅ z i = 0 m o d t ( X ) (\sum_{i = 0}^m a_i(X) \cdot z_i ) (\sum_{i = 0}^m b_i(X) \cdot z_i) - \sum_{i = 0}^m c_i(X) \cdot z_i = 0 \mod t(X) ( i = 0 ∑ m a i ( X ) ⋅ z i ) ( i = 0 ∑ m b i ( X ) ⋅ z i ) − i = 0 ∑ m c i ( X ) ⋅ z i = 0 mod t ( X ) where
a i ( X ) a_i(X) a i ( X ) : A polynomial such that a i ( x j ) = A j , i a_i(x_j) = A_{j, i} a i ( x j ) = A j , i where 0 ≤ i ≤ m 0 \le i \le m 0 ≤ i ≤ m and 0 ≤ j < n 0 \le j < n 0 ≤ j < n .
b i ( X ) b_i(X) b i ( X ) : A polynomial such that b i ( x j ) = B j , i b_i(x_j) = B_{j, i} b i ( x j ) = B j , i where 0 ≤ i ≤ m 0 \le i \le m 0 ≤ i ≤ m and 0 ≤ j < n 0 \le j < n 0 ≤ j < n .
c i ( X ) c_i(X) c i ( X ) : A polynomial such that c i ( x j ) = C j , i c_i(x_j) = C_{j, i} c i ( x j ) = C j , i where 0 ≤ i ≤ m 0 \le i \le m 0 ≤ i ≤ m and 0 ≤ j < n 0 \le j < n 0 ≤ j < n .
t ( X ) t(X) t ( X ) : X n − 1 X^n - 1 X n − 1 .
z i z_i z i : A variable, where 0 ≤ i ≤ m 0 \le i \le m 0 ≤ i ≤ m .
Here, deg a i ( X ) = deg b i ( X ) = deg c i ( X ) = n − 1 \deg a_i(X) = \deg b_i(X) = \deg c_i(X) = n - 1 deg a i ( X ) = deg b i ( X ) = deg c i ( X ) = n − 1 .
Then we can define h ( X ) h(X) h ( X ) as follows:
h ( X ) = ( ∑ i = 0 m a i ( X ) ⋅ z i ) ( ∑ i = 0 m b i ( X ) ⋅ z i ) − ∑ i = 0 m c i ( X ) ⋅ z i t ( X ) h(X) = \frac{(\sum_{i = 0}^m a_i(X) \cdot z_i) (\sum_{i = 0}^m b_i(X) \cdot z_i) - \sum_{i = 0}^m c_i(X) \cdot z_i}{t(X)} h ( X ) = t ( X ) ( ∑ i = 0 m a i ( X ) ⋅ z i ) ( ∑ i = 0 m b i ( X ) ⋅ z i ) − ∑ i = 0 m c i ( X ) ⋅ z i Where deg h ( X ) = n − 2 \deg h(X) = n - 2 deg h ( X ) = n − 2 .
Protocol Explanation
Key Generation
Create a verifying key v k \mathsf{vk} vk .
v k = ( [ α ] 1 , [ β ] 2 , [ γ ] 2 , [ δ ] 2 , { [ β a i ( x ) + α b i ( x ) + c i ( x ) γ ] 1 } i = 0 ℓ ) \mathsf{vk} = \left([\alpha]_1, [\beta]_2, [\gamma]_2, [\delta]_2, \left\{ \left[ \frac{\beta a_i(x) + \alpha b_i(x) + c_i(x)}{\gamma} \right]_1 \right\}_{i = 0}^{\ell} \right) vk = ( [ α ] 1 , [ β ] 2 , [ γ ] 2 , [ δ ] 2 , { [ γ β a i ( x ) + α b i ( x ) + c i ( x ) ] 1 } i = 0 ℓ ) Create a proving key p k \mathsf{pk} pk .
p k = v k + ( [ β ] 1 , [ δ ] 1 , { [ a i ( x ) ] 1 } i = 0 m , { [ b i ( x ) ] 1 } i = 0 m , { [ b i ( x ) ] 2 } i = 0 m , { [ β a i ( x ) + α b i ( x ) + c i ( x ) δ ] 1 } i = ℓ + 1 m , { [ x i t ( x ) δ ] 1 } i = 0 n − 2 ) \mathsf{pk} = \mathsf{vk} +
\left(
\begin{align*}
& [\beta]_1, [\delta]_1, \{ [a_i(x)]_1\}_{i=0}^{m}, \{ [b_i(x)]_1\}_{i=0}^{m}, \{ [b_i(x)]_2\}_{i=0}^{m}, \\
& \left\{ \left[\frac{\beta a_i(x) + \alpha b_i(x) + c_i(x)}{\delta} \right]_1 \right\}_{i = \ell + 1}^{m}, \left\{ \left[ \frac{x^i t(x)}{\delta} \right]_1 \right\}_{i = 0}^{n - 2}
\end{align*}
\right) pk = vk + [ β ] 1 , [ δ ] 1 , {[ a i ( x ) ] 1 } i = 0 m , {[ b i ( x ) ] 1 } i = 0 m , {[ b i ( x ) ] 2 } i = 0 m , { [ δ β a i ( x ) + α b i ( x ) + c i ( x ) ] 1 } i = ℓ + 1 m , { [ δ x i t ( x ) ] 1 } i = 0 n − 2 Computing h(X)
Create a ( X ) , b ( X ) , c ( X ) a(X), b(X), c(X) a ( X ) , b ( X ) , c ( X ) :
a ( X ) = ∑ j = 0 n − 1 L j ( X ) ( ∑ i = 0 m A j , i ⋅ z i ) b ( X ) = ∑ j = 0 n − 1 L j ( X ) ( ∑ i = 0 m A j , i ⋅ z i ) c ( X ) = ∑ j = 0 n − 1 L j ( X ) ( ∑ i = 0 m A j , i ⋅ z i ) a(X) = \sum_{j = 0}^{n-1} L_j(X) (\sum_{i = 0}^{m} A_{j, i} \cdot z_i) \\
b(X) = \sum_{j = 0}^{n-1} L_j(X) (\sum_{i = 0}^{m} A_{j, i} \cdot z_i) \\
c(X) = \sum_{j = 0}^{n-1} L_j(X) (\sum_{i = 0}^{m} A_{j, i} \cdot z_i) \\ a ( X ) = j = 0 ∑ n − 1 L j ( X ) ( i = 0 ∑ m A j , i ⋅ z i ) b ( X ) = j = 0 ∑ n − 1 L j ( X ) ( i = 0 ∑ m A j , i ⋅ z i ) c ( X ) = j = 0 ∑ n − 1 L j ( X ) ( i = 0 ∑ m A j , i ⋅ z i ) where L j ( X ) L_j(X) L j ( X ) are lagrange basis polynomials.
Evaluate a ( X ) , b ( X ) , c ( X ) a(X), b(X), c(X) a ( X ) , b ( X ) , c ( X ) on a coset domain:
a = ( a ( g 0 ) , … , a ( g n − 1 ) ) b = ( b ( g 0 ) , … , b ( g n − 1 ) ) c = ( c ( g 0 ) , … , c ( g n − 1 ) ) \bm{a} = (a(g^0), \dots, a(g^{n-1})) \\
\bm{b} = (b(g^0), \dots, b(g^{n-1})) \\
\bm{c} = (c(g^0), \dots, c(g^{n-1})) a = ( a ( g 0 ) , … , a ( g n − 1 )) b = ( b ( g 0 ) , … , b ( g n − 1 )) c = ( c ( g 0 ) , … , c ( g n − 1 )) where g i = ( η ω ) i g^i = (\eta \omega)^i g i = ( η ω ) i . The reason why we compute on a coset domain is avoiding division by zero since t ( ω j ) = 0 t(\omega^j) = 0 t ( ω j ) = 0 .
h = ( a ( g 0 ) b ( g 0 ) − c ( g 0 ) t ( g 0 ) , … , a ( g n − 1 ) b ( g n − 1 ) − c ( g n − 1 ) t ( g n − 1 ) ) \bm{h} = \left(\frac{a(g^0)b(g^0) - c(g^0)}{t(g^0)}, \dots, \frac{a(g^{n - 1})b(g^{n - 1}) - c(g^{n - 1})}{t(g^{n-1})}\right) h = ( t ( g 0 ) a ( g 0 ) b ( g 0 ) − c ( g 0 ) , … , t ( g n − 1 ) a ( g n − 1 ) b ( g n − 1 ) − c ( g n − 1 ) ) h ( X ) = ∑ i = 0 n − 1 L ′ i ( X ) a ( g i ) b ( g i ) − c ( g i ) t ( g i ) h(X) = \sum_{i = 0}^{n-1} {L'}_i(X) \frac{a(g^i)b(g^i) - c(g^i)}{t(g^i)} h ( X ) = i = 0 ∑ n − 1 L ′ i ( X ) t ( g i ) a ( g i ) b ( g i ) − c ( g i ) where L ′ i ( X ) {L'}_i(X) L ′ i ( X ) are lagrange basis polynomials on a coset domain.
To compute h ( X ) h(X) h ( X ) , the costs are:
3 IFFT operations of length n n n
3 FFT on a coset domain operation of length n n n
1 evaluations of length n n n
Proof Generation
Sample r , s ← $ F r, s \stackrel{\$}{\leftarrow} \mathbb{F} r , s ← $ F and generate the proof π = ( [ A ] 1 , [ B ] 2 , [ C ] 1 ) \pi = ([A]_1, [B]_2, [C]_1) π = ([ A ] 1 , [ B ] 2 , [ C ] 1 ) .
[ A ] 1 = [ α ] 1 + ∑ i = 0 m z i [ a i ( x ) ] 1 + r [ δ ] 1 [ B ] 2 = [ β ] 2 + ∑ i = 0 m z i [ b i ( x ) ] 2 + s [ δ ] 2 [ C ] 1 = ∑ i = ℓ + 1 m z i [ β a i ( x ) + α b i ( x ) + c i ( x ) δ ] 1 + ∑ i = 0 n − 2 h i [ x i t ( x ) δ ] 1 + s [ A ] 1 + r [ B ] 1 − r s [ δ ] 1 [A]_1 = [\alpha]_1 + \sum_{i=0}^m z_i [a_i(x)]_1 + r [\delta]_1 \\
[B]_2 = [\beta]_2 + \sum_{i=0}^m z_i [b_i(x)]_2 + s [\delta]_2 \\
[C]_1 = \sum_{i = \ell + 1}^{m} z_i \left[ \frac{\beta a_i(x) + \alpha b_i(x) + c_i(x)}{\delta} \right]_1 + \sum_{i = 0}^{n - 2} h_i \left[ \frac{x^i t(x)}{\delta} \right]_1 + s[A]_1 + r[B]_1 - rs[\delta]_1
[ A ] 1 = [ α ] 1 + i = 0 ∑ m z i [ a i ( x ) ] 1 + r [ δ ] 1 [ B ] 2 = [ β ] 2 + i = 0 ∑ m z i [ b i ( x ) ] 2 + s [ δ ] 2 [ C ] 1 = i = ℓ + 1 ∑ m z i [ δ β a i ( x ) + α b i ( x ) + c i ( x ) ] 1 + i = 0 ∑ n − 2 h i [ δ x i t ( x ) ] 1 + s [ A ] 1 + r [ B ] 1 − rs [ δ ] 1 where h i h_i h i are the coefficients of the h ( X ) h(X) h ( X ) .
To generate a proof π \pi π , the costs are:
For computing [ A ] 1 [\mathbb{A}]_1 [ A ] 1 :
1 MSM operation of length m + 1 m + 1 m + 1 in G 1 \mathbb{G}_1 G 1
For computing [ B ] 2 [\mathbb{B}]_2 [ B ] 2 :
1 MSM operation of length m + 1 m + 1 m + 1 in G 2 \mathbb{G}_2 G 2
For computing [ C ] 1 [\mathbb{C}]_1 [ C ] 1 :
1 MSM operation of length m − ℓ m - \ell m − ℓ in G 1 \mathbb{G}_1 G 1
1 MSM operation of length n − 1 n − 1 n − 1 in G 1 \mathbb{G}_1 G 1
1 MSM operation of length m + 1 m + 1 m + 1 in G 1 \mathbb{G}_1 G 1 (for [ B ] 1 [B]_1 [ B ] 1 )
To compute ∑ i = 0 n − 2 h i [ x i t ( x ) δ ] 1 \sum_{i = 0}^{n - 2} h_i \left[ \frac{x^i t(x)}{\delta} \right]_1 ∑ i = 0 n − 2 h i [ δ x i t ( x ) ] 1 of the proof efficiently, consider the following setup:
∑ i = 0 n − 2 h i [ x i t ( x ) δ ] 1 = [ h ( x ) t ( x ) δ ] 1 = [ a ( x ) b ( x ) − c ( x ) δ ] 1 = ∑ i = 0 2 n − 2 ( a ( ω ′ i ) b ( ω ′ i ) − c ( ω ′ i ) ) [ L ′ i ( x ) δ ] 1 \begin{align*}
\sum_{i = 0}^{n - 2} h_i \left[ \frac{x^i t(x)}{\delta} \right]_1 &= \left[ \frac{h(x)t(x)}{\delta} \right]_1 \\
&= \left[ \frac{a(x)b(x) - c(x)}{\delta} \right]_1 \\
&= \sum_{i = 0}^{2n - 2} (a({\omega'}^i)b({\omega'}^i) - c({\omega'}^i)) \left[ \frac{{L'}_i(x)}{\delta} \right]_1
\end{align*} i = 0 ∑ n − 2 h i [ δ x i t ( x ) ] 1 = [ δ h ( x ) t ( x ) ] 1 = [ δ a ( x ) b ( x ) − c ( x ) ] 1 = i = 0 ∑ 2 n − 2 ( a ( ω ′ i ) b ( ω ′ i ) − c ( ω ′ i )) [ δ L ′ i ( x ) ] 1 Where ω ′ \omega' ω ′ be a 2 n 2n 2 n -th root of unity and ω \omega ω an n n n -th root of unity. These satisfy:
( ω ′ i ) 2 n = ( ω ′ 2 i ) n = ( ω i ) n = 1 ({\omega'}^i)^{2n} = ({\omega'}^{2i})^n = (\omega^i)^n= 1 ( ω ′ i ) 2 n = ( ω ′ 2 i ) n = ( ω i ) n = 1 and L ′ i ( X ) {L'}_i(X) L ′ i ( X ) are lagrange basis polynomials.
Properties of a ( X ) b ( X ) − c ( X ) a(X)b(X) - c(X) a ( X ) b ( X ) − c ( X )
∑ i = 0 2 n − 2 ( a ( ω ′ i ) b ( ω ′ i ) − c ( ω ′ i ) ) [ L ′ i ( x ) δ ] 1 \sum_{i = 0}^{2n - 2} (a({\omega'}^i)b({\omega'}^i) - c({\omega'}^i)) \left[ \frac{{L'}_i(x)}{\delta} \right]_1 ∑ i = 0 2 n − 2 ( a ( ω ′ i ) b ( ω ′ i ) − c ( ω ′ i )) [ δ L ′ i ( x ) ] 1 can be divided into evaluations at even powers and odd powers.
∑ i = 0 2 n − 2 ( a ( ω ′ i ) b ( ω ′ i ) − c ( ω ′ i ) ) [ L ′ i ( x ) δ ] 1 = ∑ i = 0 n − 1 ( a ( ω ′ 2 i ) b ( ω ′ 2 i ) − c ( ω ′ 2 i ) ) [ L ′ 2 i ( x ) δ ] 1 + ∑ i = 0 n − 2 ( a ( ω ′ 2 i + 1 ) b ( ω ′ 2 i + 1 ) − c ( ω ′ 2 i + 1 ) ) [ L ′ 2 i + 1 ( x ) δ ] 1 \begin{align*}
\sum_{i = 0}^{2n - 2} (a({\omega'}^i)b({\omega'}^i) - c({\omega'}^i)) \left[ \frac{{L'}_i(x)}{\delta} \right]_1 &= \sum_{i = 0}^{n - 1} (a({\omega'}^{2i})b({\omega'}^{2i}) - c({\omega'}^{2i})) \left[ \frac{{L'}_{2i}(x)}{\delta} \right]_1 \\
& + \sum_{i = 0}^{n - 2} (a({\omega'}^{2i + 1})b({\omega'}^{2i + 1}) - c({\omega'}^{2i + 1})) \left[ \frac{{L'}_{2i + 1}(x)}{\delta} \right]_1
\end{align*} i = 0 ∑ 2 n − 2 ( a ( ω ′ i ) b ( ω ′ i ) − c ( ω ′ i )) [ δ L ′ i ( x ) ] 1 = i = 0 ∑ n − 1 ( a ( ω ′ 2 i ) b ( ω ′ 2 i ) − c ( ω ′ 2 i )) [ δ L ′ 2 i ( x ) ] 1 + i = 0 ∑ n − 2 ( a ( ω ′ 2 i + 1 ) b ( ω ′ 2 i + 1 ) − c ( ω ′ 2 i + 1 )) [ δ L ′ 2 i + 1 ( x ) ] 1 Evaluation at even powers of ω ′ \omega' ω ′ : For 0 ≤ j < n 0 \le j < n 0 ≤ j < n , evaluates to zero at even powers of ω ′ \omega' ω ′ :
a ( ω ′ 2 j ) b ( ω ′ 2 j ) − c ( ω ′ 2 j ) = a ( ω j ) b ( ω j ) − c ( ω j ) = 0 a({\omega'}^{2j})b({\omega'}^{2j}) - c({\omega'}^{2j}) = a({\omega}^{j})b({\omega}^{j}) - c({\omega}^{j}) = 0 a ( ω ′ 2 j ) b ( ω ′ 2 j ) − c ( ω ′ 2 j ) = a ( ω j ) b ( ω j ) − c ( ω j ) = 0 This implies:
∑ i = 0 n − 1 ( a ( ω ′ 2 i ) b ( ω ′ 2 i ) − c ( ω ′ 2 i ) ) [ L ′ 2 i ( x ) δ ] 1 = 0 \sum_{i = 0}^{n - 1} (a({\omega'}^{2i})b({\omega'}^{2i}) - c({\omega'}^{2i})) \left[ \frac{{L'}_{2i}(x)}{\delta} \right]_1 = 0 i = 0 ∑ n − 1 ( a ( ω ′ 2 i ) b ( ω ′ 2 i ) − c ( ω ′ 2 i )) [ δ L ′ 2 i ( x ) ] 1 = 0 Evaluation at odd powers of ω ′ \omega' ω ′ : For 0 ≤ j < n 0 \le j < n 0 ≤ j < n , given p ( X ) = p 0 + p 1 X + ⋯ + p n − 1 X n − 1 p(X) = p_0 + p_1X + \cdots + p_{n-1}X^{n-1} p ( X ) = p 0 + p 1 X + ⋯ + p n − 1 X n − 1 , we can compute the evaluations at odd powers of ω ′ \omega' ω ′ :
p ( ω ′ 2 j + 1 ) = ∑ i = 0 n − 1 p i ( ω ′ 2 j + 1 ) i = ∑ i = 0 n − 1 p i ω ′ i ( ω ′ 2 j ) i = ∑ i = 0 n − 1 p i ω ′ i ( ω j ) i = p ′ ( ω j ) p({\omega'}^{2j + 1}) = \sum_{i =0}^{n-1} p_i ({\omega'}^{2j + 1})^i = \sum_{i=0}^{n-1} p_i {\omega'}^i ({\omega'}^{2j})^i = \sum_{i=0}^{n-1} p_i {\omega'}^i ({\omega}^{j})^i = p'({\omega}^{j}) p ( ω ′ 2 j + 1 ) = i = 0 ∑ n − 1 p i ( ω ′ 2 j + 1 ) i = i = 0 ∑ n − 1 p i ω ′ i ( ω ′ 2 j ) i = i = 0 ∑ n − 1 p i ω ′ i ( ω j ) i = p ′ ( ω j ) Where p ′ ( X ) = p 0 + p 1 ω ′ X + ⋯ + p n − 1 ω ′ n − 1 X n − 1 p'(X) = p_0 + p_1{\omega'}X + \cdots + p_{n-1}{\omega'}^{n-1}X^{n-1} p ′ ( X ) = p 0 + p 1 ω ′ X + ⋯ + p n − 1 ω ′ n − 1 X n − 1 .
This implies:
∑ i = 0 n − 2 ( a ( ω ′ 2 i + 1 ) b ( ω ′ 2 i + 1 ) − c ( ω ′ 2 i + 1 ) ) [ L ′ 2 i + 1 ( x ) δ ] 1 = ∑ i = 0 n − 2 ( a ′ ( ω i ) b ′ ( ω i ) − c ′ ( ω i ) ) [ L ′ 2 i + 1 ( x ) δ ] 1 \sum_{i = 0}^{n - 2} (a({\omega'}^{2i + 1})b({\omega'}^{2i + 1}) - c({\omega'}^{2i + 1})) \left[ \frac{{L'}_{2i + 1}(x)}{\delta} \right]_1 = \sum_{i = 0}^{n - 2} (a'({\omega}^{i})b'({\omega}^{i}) - c'({\omega}^{i})) \left[ \frac{{L'}_{2i + 1}(x)}{\delta} \right]_1 i = 0 ∑ n − 2 ( a ( ω ′ 2 i + 1 ) b ( ω ′ 2 i + 1 ) − c ( ω ′ 2 i + 1 )) [ δ L ′ 2 i + 1 ( x ) ] 1 = i = 0 ∑ n − 2 ( a ′ ( ω i ) b ′ ( ω i ) − c ′ ( ω i )) [ δ L ′ 2 i + 1 ( x ) ] 1 Thus, the evaluations of a ( X ) b ( X ) − c ( X ) a(X)b(X) - c(X) a ( X ) b ( X ) − c ( X ) at odd powers of ω ′ \omega' ω ′ can be efficiently computed by combining FFT results of a ′ ( X ) , b ′ ( X ) , c ′ ( X ) a'(X), b'(X), c'(X) a ′ ( X ) , b ′ ( X ) , c ′ ( X ) .
Optimizing h ( X ) h(X) h ( X ) in the Proving Key
To eliminate the IFFT of h ( X ) h(X) h ( X ) , the term { [ x i t ( x ) δ ] 1 } i = 0 n − 2 \left\{ \left[ \frac{x^i t(x)}{\delta} \right]_1 \right\}_{i = 0}^{n - 2} { [ δ x i t ( x ) ] 1 } i = 0 n − 2 in the proving key (pk) is replaced with { [ L ′ 2 i + 1 ( x ) δ ] } i = 0 n − 2 \left\{ \left[ \frac{{L'}_{2i + 1}(x)}{\delta} \right] \right\}_{i = 0}^{n - 2} { [ δ L ′ 2 i + 1 ( x ) ] } i = 0 n − 2 :
∑ i = 0 n − 2 h i [ x i t ( x ) δ ] 1 → ∑ i = 0 n − 2 ( a ′ ( ω i ) b ′ ( ω i ) − c ′ ( ω i ) ) [ L ′ 2 i + 1 ( x ) δ ] 1 \sum_{i = 0}^{n - 2} h_i \left[ \frac{x^i t(x)}{\delta} \right]_1 \rightarrow \sum_{i = 0}^{n - 2} (a'({\omega}^i)b'({\omega}^i) - c'({\omega}^i)) \left[ \frac{{L'}_{2i + 1}(x)}{\delta} \right]_1 i = 0 ∑ n − 2 h i [ δ x i t ( x ) ] 1 → i = 0 ∑ n − 2 ( a ′ ( ω i ) b ′ ( ω i ) − c ′ ( ω i )) [ δ L ′ 2 i + 1 ( x ) ] 1 Then computing h ( X ) h(X) h ( X ) is performed as follows:
Create a ( X ) , b ( X ) , c ( X ) a(X),b(X),c(X) a ( X ) , b ( X ) , c ( X ) :
a ( X ) = ∑ j = 0 n − 1 L j ( X ) ( ∑ i = 0 m A j , i ⋅ z i ) b ( X ) = ∑ j = 0 n − 1 L j ( X ) ( ∑ i = 0 m A j , i ⋅ z i ) c ( X ) = ∑ j = 0 n − 1 L j ( X ) ( ∑ i = 0 m A j , i ⋅ z i ) a(X) = \sum_{j = 0}^{n-1} L_j(X) (\sum_{i = 0}^{m} A_{j, i} \cdot z_i) \\
b(X) = \sum_{j = 0}^{n-1} L_j(X) (\sum_{i = 0}^{m} A_{j, i} \cdot z_i) \\
c(X) = \sum_{j = 0}^{n-1} L_j(X) (\sum_{i = 0}^{m} A_{j, i} \cdot z_i) \\ a ( X ) = j = 0 ∑ n − 1 L j ( X ) ( i = 0 ∑ m A j , i ⋅ z i ) b ( X ) = j = 0 ∑ n − 1 L j ( X ) ( i = 0 ∑ m A j , i ⋅ z i ) c ( X ) = j = 0 ∑ n − 1 L j ( X ) ( i = 0 ∑ m A j , i ⋅ z i ) where L j ( X ) L_j(X) L j ( X ) are lagrange basis polynomials.
Create a ′ ( X ) , b ′ ( X ) , c ′ ( X ) a'(X),b'(X),c'(X) a ′ ( X ) , b ′ ( X ) , c ′ ( X ) :
a ′ ( X ) = ∑ i = 0 n − 1 a i ω ′ i X i b ′ ( X ) = ∑ i = 0 n − 1 b i ω ′ i X i c ′ ( X ) = ∑ i = 0 n − 1 c i ω ′ i X i a'(X) = \sum_{i =0}^{n-1} a_i {\omega'}^i X^i \\ b'(X) = \sum_{i =0}^{n-1} b_i {\omega'}^i X^i \\ c'(X) = \sum_{i =0}^{n-1} c_i {\omega'}^i X^i a ′ ( X ) = i = 0 ∑ n − 1 a i ω ′ i X i b ′ ( X ) = i = 0 ∑ n − 1 b i ω ′ i X i c ′ ( X ) = i = 0 ∑ n − 1 c i ω ′ i X i where ω ′ \omega' ω ′ is 2 n 2n 2 n -th root of unity.
Evaluate a ′ ( X ) , b ′ ( X ) , c ′ ( X ) a'(X), b'(X), c'(X) a ′ ( X ) , b ′ ( X ) , c ′ ( X ) :
a ′ = ( a ′ ( ω 0 ) , … , a ′ ( ω n − 1 ) ) b ′ = ( b ′ ( ω 0 ) , … , b ′ ( ω n − 1 ) ) c ′ = ( c ′ ( ω 0 ) , … , c ′ ( ω n − 1 ) ) \bm{a'} = (a'({\omega}^0), \dots, a'({\omega}^{n-1})) \\\bm{b'} = (b'({\omega}^0), \dots, b'({\omega}^{n-1})) \\\bm{c'} = (c'({\omega}^0), \dots, c'({\omega}^{n-1})) a ′ = ( a ′ ( ω 0 ) , … , a ′ ( ω n − 1 )) b ′ = ( b ′ ( ω 0 ) , … , b ′ ( ω n − 1 )) c ′ = ( c ′ ( ω 0 ) , … , c ′ ( ω n − 1 )) where ω \omega ω is n n n -th root of unity.
h = ( a ′ ( ω 0 ) b ′ ( ω 0 ) − c ′ ( ω 0 ) , … , a ′ ( ω n − 1 ) b ′ ( ω n − 1 ) − c ′ ( ω n − 1 ) ) \bm{h} = (a'({\omega}^0)b'({\omega}^0) - c'({\omega}^0), \dots, a'({\omega}^{n - 1})b'({\omega}^{n - 1}) - c'({\omega}^{n - 1})) h = ( a ′ ( ω 0 ) b ′ ( ω 0 ) − c ′ ( ω 0 ) , … , a ′ ( ω n − 1 ) b ′ ( ω n − 1 ) − c ′ ( ω n − 1 )) To compute h \bm{h} h , the costs are:
3 IFFT operations of length n n n
3 FFT operation of length n n n
1 evaluations of length n n n
Proof Verification
The verifier checks the proof using the pairing equation: (Note that the right hand side will be precomputed.)
e ( [ A ] 1 , [ B ] 2 ) ⋅ e ( ∑ i = 0 ℓ z i [ β a i ( x ) + α b i ( x ) + c i ( x ) γ ] 1 , [ − γ ] 2 ) ⋅ e ( [ C ] 1 , [ − δ ] 2 ) = ? e ( [ α ] 1 , [ β ] 2 ) e([A]_1, [B]_2) \cdot e(\sum_{i=0}^\ell z_i \left[ \frac{\beta a_i(x) + \alpha b_i(x) + c_i(x)}{\gamma} \right]_1, [-\gamma]_2) \cdot e([C]_1, [-\delta]_2) \stackrel{?}=e([\alpha]_1, [\beta]_2)
e ([ A ] 1 , [ B ] 2 ) ⋅ e ( i = 0 ∑ ℓ z i [ γ β a i ( x ) + α b i ( x ) + c i ( x ) ] 1 , [ − γ ] 2 ) ⋅ e ([ C ] 1 , [ − δ ] 2 ) = ? e ([ α ] 1 , [ β ] 2 ) Proof. Considering only the exponent part, the equation simplifies as follows:
A B = ( α + ∑ i = 0 m z i a i ( x ) + r δ ) ( β + ∑ i = 0 m z i b i ( x ) + s δ ) = α β + ∑ i = 0 m z i ( β a i ( x ) + α b i ( x ) ) + ( ∑ i = 0 m z i a i ( x ) ) ( ∑ i = 0 m z i b i ( x ) ) ⏟ ∑ i = 0 m z i c i ( x ) + h ( x ) t ( x ) + s δ A + r δ B − r s δ 2 = α β + ∑ i = 0 m z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) + h ( x ) t ( x ) + s δ A + r δ B − r s δ 2 = α β + ∑ i = 0 l z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) + ∑ i = l + 1 m z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) + h ( x ) t ( x ) + s δ A + r δ B − r s δ 2 = α β + ∑ i = 0 l z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) + δ ( ∑ i = l + 1 m z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) δ + h ( x ) t ( x ) δ + s A + r B − r s δ ) ⏟ C \begin{align*}
AB &= (\alpha + \sum_{i = 0}^m z_i a_i(x) + r \delta) (\beta + \sum_{i = 0}^m z_i b_i(x) + s \delta) \\
&= \alpha \beta + \sum_{i = 0}^m z_i (\beta a_i(x) + \alpha b_i(x) ) + \underbrace{(\sum_{i = 0}^m z_i a_i(x))(\sum_{i = 0}^m z_i b_i(x))}_{\sum_{i=0}^m z_i c_i(x) + h(x) t(x)} + s \delta A + r \delta B - rs\delta^2 \\
&= \alpha \beta + \sum_{i = 0}^m z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x)) + h(x)t(x) + s \delta A + r \delta B - rs\delta^2 \\
&= \alpha \beta + \sum_{i = 0}^l z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x)) + \sum_{i = l + 1}^m z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x)) + h(x) t(x) + s \delta A + r \delta B - rs\delta^2 \\
&= \alpha \beta + \sum_{i = 0}^l z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x)) + \delta \underbrace{\left( \frac{\sum_{i = l + 1}^{m} z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x))}{\delta} + \frac{h(x)t(x)}{\delta} + s A + r B - rs\delta \right)}_{C}
\end{align*} A B = ( α + i = 0 ∑ m z i a i ( x ) + rδ ) ( β + i = 0 ∑ m z i b i ( x ) + sδ ) = α β + i = 0 ∑ m z i ( β a i ( x ) + α b i ( x )) + ∑ i = 0 m z i c i ( x ) + h ( x ) t ( x ) ( i = 0 ∑ m z i a i ( x )) ( i = 0 ∑ m z i b i ( x )) + sδ A + rδ B − rs δ 2 = α β + i = 0 ∑ m z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + h ( x ) t ( x ) + sδ A + rδ B − rs δ 2 = α β + i = 0 ∑ l z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + i = l + 1 ∑ m z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + h ( x ) t ( x ) + sδ A + rδ B − rs δ 2 = α β + i = 0 ∑ l z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + δ C ( δ ∑ i = l + 1 m z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + δ h ( x ) t ( x ) + s A + r B − rsδ ) To verify a proof, the costs are:
1 MSM operation of length ℓ \ell ℓ in G 1 \mathbb{G}_1 G 1
Batch Proof Verification
Assume there are n n n proofs. We denote each proof π i \pi_i π i for 0 ≤ i < n 0 \leq i < n 0 ≤ i < n as follows:
π i = ( [ A i ] 1 , [ B i ] 2 , [ C i ] 1 ) \pi_i = ([A_i]_1, [B_i]_2, [C_i]_1) π i = ([ A i ] 1 , [ B i ] 2 , [ C i ] 1 ) Using the random linear combination trick with θ i ← $ F \theta_i \stackrel{\$}\leftarrow \mathbb{F} θ i ← $ F , you can verify proofs in a batch:
∏ i = 0 n − 1 ( e ( θ i [ A i ] 1 , [ B i ] 2 ) ) ⋅ e ( ∑ i = 0 n − 1 θ i ( ∑ j = 0 ℓ z j [ β a j ( x ) + α b j ( x ) + c j ( x ) γ ] 1 ) , [ γ ] 2 ) ⋅ e ( ∑ i = 0 n − 1 θ i [ C i ] 1 , [ − δ ] 2 ) = ? ( ∏ i = 0 n − 1 θ i ) e ( [ α ] 1 , [ β ] 2 ) \prod_{i=0}^{n-1} \left(e(\theta_i[A_i]_1, [B_i]_2) \right) \cdot e(\sum_{i=0}^{n-1} \theta_i \left(\sum_{j=0}^{\ell}z_j \left[ \frac{\beta a_j(x) + \alpha b_j(x) + c_j(x)}{\gamma} \right]_1\right), [\gamma]_2) \cdot e(\sum_{i=0}^{n-1}\theta_i[C_i]_1, [-\delta]_2) \stackrel{?}= \left(\prod_{i=0}^{n-1}\theta_i\right) e([\alpha]_1, [\beta]_2) i = 0 ∏ n − 1 ( e ( θ i [ A i ] 1 , [ B i ] 2 ) ) ⋅ e ( i = 0 ∑ n − 1 θ i ( j = 0 ∑ ℓ z j [ γ β a j ( x ) + α b j ( x ) + c j ( x ) ] 1 ) , [ γ ] 2 ) ⋅ e ( i = 0 ∑ n − 1 θ i [ C i ] 1 , [ − δ ] 2 ) = ? ( i = 0 ∏ n − 1 θ i ) e ([ α ] 1 , [ β ] 2 ) Proof.
From the single verification case, for 0 ≤ i < n 0 \leq i < n 0 ≤ i < n , we know that the following equation holds:
A i B i = α β + ∑ j = 0 l z j ( β a j ( x ) + α b j ( x ) + c j ( x ) ) + δ C i A_iB_i = \alpha \beta + \sum_{j = 0}^l z_j (\beta a_j(x) + \alpha b_j(x) + c_j(x)) + \delta C_i A i B i = α β + j = 0 ∑ l z j ( β a j ( x ) + α b j ( x ) + c j ( x )) + δ C i Multiplying both sides by θ i \theta_i θ i gives:
θ i A i B i = θ i α β + θ i ( ∑ j = 0 l z j ( β a j ( x ) + α b j ( x ) + c j ( x ) ) ) + θ i δ C i \theta_iA_iB_i = \theta_i \alpha \beta + \theta_i \left(\sum_{j = 0}^l z_j (\beta a_j(x) + \alpha b_j(x) + c_j(x))\right) + \theta_i \delta C_i θ i A i B i = θ i α β + θ i ( j = 0 ∑ l z j ( β a j ( x ) + α b j ( x ) + c j ( x )) ) + θ i δ C i Summing over i = 0 i = 0 i = 0 to n − 1 n - 1 n − 1 , we obtain:
∑ i = 0 n − 1 θ i A i B i = ( ∑ i = 0 n − 1 θ i ) α β + ∑ i = 0 n − 1 θ i ( ∑ j = 0 l z j ( β a j ( x ) + α b j ( x ) + c j ( x ) ) ) + ∑ i = 0 n − 1 θ i δ C i \sum_{i=0}^{n-1}\theta_i A_iB_i = \left(\sum_{i=0}^{n-1}\theta_i\right) \alpha \beta + \sum_{i=0}^{n-1}\theta_i \left(\sum_{j = 0}^l z_j (\beta a_j(x) + \alpha b_j(x) + c_j(x))\right) + \sum_{i=0}^{n-1}\theta_i \delta C_i i = 0 ∑ n − 1 θ i A i B i = ( i = 0 ∑ n − 1 θ i ) α β + i = 0 ∑ n − 1 θ i ( j = 0 ∑ l z j ( β a j ( x ) + α b j ( x ) + c j ( x )) ) + i = 0 ∑ n − 1 θ i δ C i These are precisely the exponent parts in the batch verification equation.
To verify n n n proofs, the costs are:
n n n MSM operations of length ℓ \ell ℓ in G 1 \mathbb{G}_1 G 1
3 n + 1 3n + 1 3 n + 1 scalar multiplications in G 1 \mathbb{G}_1 G 1
n − 1 n - 1 n − 1 field multiplications
n + 2 n + 2 n + 2 pairing operations
If each proof were verified individually, the process would require 3 n 3n 3 n expensive pairing operations. However, batch verification significantly reduces this cost.
Malleability
Malleability is a property of cryptographic systems or protocols where an attacker can modify a valid message or ciphertext into another valid message or ciphertext without needing to know the original plaintext. The modified message still appears valid under the cryptographic scheme, which can lead to vulnerabilities and unintended consequences.
Attack 1
An attacker selects y ← $ F y \stackrel{\$}{\leftarrow} \mathbb{F} y ← $ F and modifies the proof π ′ = ( [ A ′ ] 1 , [ B ′ ] 2 , [ C ′ ] 1 ) \pi' = ([A']_1, [B']_2, [C']_1) π ′ = ([ A ′ ] 1 , [ B ′ ] 2 , [ C ′ ] 1 ) as follows:
[ A ′ ] 1 = y [ A ] 1 [ B ′ ] 2 = y − 1 [ B ] 2 [ C ′ ] 1 = [ C ] 1 [A']_1 = y[A]_1 \\ [B']_2 = y^{-1}[B]_2 \\ [C']_1 = [C]_1 [ A ′ ] 1 = y [ A ] 1 [ B ′ ] 2 = y − 1 [ B ] 2 [ C ′ ] 1 = [ C ] 1 Even though the modified proof π ′ \pi' π ′ differs from the original, it remains valid because A ′ B ′ = A B A'B' = AB A ′ B ′ = A B .
Attack 2
An attacker selects y ← $ F y \stackrel{\$}{\leftarrow} \mathbb{F} y ← $ F and modifies π ′ = ( [ A ′ ] 1 , [ B ′ ] 2 , [ C ′ ] 1 ) \pi' = ([A']_1, [B']_2, [C']_1) π ′ = ([ A ′ ] 1 , [ B ′ ] 2 , [ C ′ ] 1 ) as folows:
[ A ′ ] 1 = [ A ] 1 [ B ′ ] 2 = [ B ] 2 + y δ [ C ′ ] 1 = [ C ] 1 + y [ A ] 1 [A']_1 = [A]_1 \\ [B']_2 = [B]_2 + y \delta \\ [C']_1 = [C]_1 + y [A]_1 [ A ′ ] 1 = [ A ] 1 [ B ′ ] 2 = [ B ] 2 + yδ [ C ′ ] 1 = [ C ] 1 + y [ A ] 1 Proof. The validity of the modified proof π ′ \pi' π ′ can be shown as:
A ′ B ′ = A ( B + y δ ) = A B + y δ A = α β + ∑ i = 0 l z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) + δ C + y δ A = α β + ∑ i = 0 l z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) + δ ( C + y A ) ⏟ C ′ \begin{align*} A'B' &= A(B + y\delta) \\ &= AB + y\delta A \\ &= \alpha\beta + \sum_{i = 0}^l z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x)) + \delta C + y \delta A \\ &= \alpha\beta + \sum_{i = 0}^l z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x)) + \delta \underbrace{(C + y A)}_{C'} \end{align*} A ′ B ′ = A ( B + yδ ) = A B + yδ A = α β + i = 0 ∑ l z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + δ C + yδ A = α β + i = 0 ∑ l z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + δ C ′ ( C + y A ) Combining Attacks
[ A ′ ] 1 = 1 r 1 [ A ] 1 [ B ′ ] 2 = r 1 [ B ] 2 + r 1 r 2 [ δ ] 2 [ C ′ ] 1 = [ C ] 1 + r 2 [ A ] 1 [A']_1 = \frac{1}{r_1}[A]_1 \\ [B']_2 = r_1 [B]_2 + r_1r_2[\delta]_2 \\ [C']_1 = [C]_1 +r_2 [A]_1 [ A ′ ] 1 = r 1 1 [ A ] 1 [ B ′ ] 2 = r 1 [ B ] 2 + r 1 r 2 [ δ ] 2 [ C ′ ] 1 = [ C ] 1 + r 2 [ A ] 1 Proof. The modified proof π ′ \pi' π ′ remains valid:
A ′ B ′ = 1 r 1 A ( r 1 B + r 1 r 2 δ ) = A B + r 2 δ A = α β + ∑ i = 0 l z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) + δ C + r 2 δ A = α β + ∑ i = 0 l z i ( β a i ( x ) + α b i ( x ) + c i ( x ) ) + δ ( C + r 2 A ) ⏟ C ′ \begin{align*} A'B' &= \frac{1}{r_1}A(r_1B + r_1r_2\delta) \\ &= AB + r_2 \delta A \\ &= \alpha\beta + \sum_{i = 0}^l z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x)) + \delta C + r_2 \delta A \\ &= \alpha\beta + \sum_{i = 0}^l z_i (\beta a_i(x) + \alpha b_i(x) + c_i(x)) + \delta \underbrace{(C + r_2 A)}_{C'} \end{align*} A ′ B ′ = r 1 1 A ( r 1 B + r 1 r 2 δ ) = A B + r 2 δ A = α β + i = 0 ∑ l z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + δ C + r 2 δ A = α β + i = 0 ∑ l z i ( β a i ( x ) + α b i ( x ) + c i ( x )) + δ C ′ ( C + r 2 A ) Conclusion
Groth16 is a highly efficient zk-SNARK protocol that combines succinctness, fast verification, and strong zero-knowledge guarantees. Its compact proof size of just 3 group elements and (almost) constant-time verification make it a preferred choice for various privacy-preserving applications or proof compressions(STARK to SNARK).
References