下面复杂度的分析结合论文 Basefold Protocol 4, Basefold Evaluation Argument Protocol Based on the Evaluation Form 协议描述以及代码实现 Basefold.py 。
论文中 evaluation 的协议描述如下:
公共输入
f ~ \tilde{f} f ~ 的 Commitment π d = E n c d ( a ) \pi_d=\mathsf{Enc}_d(\mathbf{a}) π d = Enc d ( a ) ,实际实现中会用 Merkle Tree 进行 commit,记为π d = E n c d ( a ) = M T . c o m m i t ( E n c d ( a ) ) \pi_d=\mathsf{Enc}_d(\mathbf{a}) = \mathsf{MT.commit}(\mathsf{Enc}_d(\mathbf{a})) π d = Enc d ( a ) = MT.commit ( Enc d ( a )) 求值点 u \mathbf{u} u 运算值 v = f ~ ( u ) v=\tilde{f}(\mathbf{u}) v = f ~ ( u ) IOPP.query 阶段的重复查询次数 l l l FRI 协议中的 blow up factor: R \mathcal{R} R Witness
MLE f ~ \tilde{f} f ~ 的 Evaluation Form 向量 a = ( a 0 , a 1 , … , a N − 1 ) \mathbf{a}=(a_0, a_1, \ldots, a_{N - 1}) a = ( a 0 , a 1 , … , a N − 1 ) ,即 a i = f ~ ( b i t s ( i ) ) a_i = \tilde{f}(\mathsf{bits}(i)) a i = f ~ ( bits ( i )) , 满足
f ~ ( X 0 , X 1 , X 2 , … , X d − 1 ) = ∑ b ∈ { 0 , 1 } d f ~ ( b ) ⋅ e q b ( X 0 , X 1 , X 2 , … , X d − 1 ) \tilde{f}(X_0, X_1, X_2, \ldots, X_{d - 1}) = \sum_{\mathbf{b}\in\{0,1\}^d} \tilde{f}(\mathbf{b})\cdot eq_{\mathbf{b}}(X_0, X_1, X_2, \ldots, X_{d - 1}) f ~ ( X 0 , X 1 , X 2 , … , X d − 1 ) = b ∈ { 0 , 1 } d ∑ f ~ ( b ) ⋅ e q b ( X 0 , X 1 , X 2 , … , X d − 1 ) 对应代码实现中传入的参数为
proof = prove_basefold_evaluation_arg_multilinear_basis(f_code=ff_code, f_evals=ff, us=point, v=eval, k=log_n - log_k0, k0=2**log_k0, T=T, blowup_factor=blowup_factor, commit=commit, num_verifier_queries=4, transcript=transcript, debug=False); proof
verify_basefold_evaluation_arg_multilinear_basis(len(ff_code), commit=commit, proof=proof, us=point, v=eval, d=2, k=log_n - log_k0, T=T, blowup_factor=blowup_factor, num_verifier_queries=4)
Prover ¶ Encoding ¶ 输入:f ~ \tilde{f} f ~ 的在 boolean hypercube 上的值, a = ( a 0 , a 1 , … , a N − 1 ) \mathbf{a}=(a_0, a_1, \ldots, a_{N - 1}) a = ( a 0 , a 1 , … , a N − 1 ) 。先将其编码成 foldable code,再用 basefold 的 eval 协议。
编码过程的计算复杂度为 R 2 ⋅ d N F m u l \frac{\mathcal{R}}{2} \cdot dN ~ \mathbb{F}_{\mathsf{mul}} 2 R ⋅ d N F mul 。 Round 1 ¶ Prover 发送 h ( d ) ( X ) h^{(d)}(X) h ( d ) ( X ) 的取值,( h ( d ) ( 0 ) , h ( d ) ( 1 ) , h ( d ) ( 2 ) ) (h^{(d)}(0), h^{(d)}(1), h^{(d)}(2)) ( h ( d ) ( 0 ) , h ( d ) ( 1 ) , h ( d ) ( 2 ))
h ( d ) ( X ) = ∑ b 1 , b 2 , … , b d ∈ { 0 , 1 } 2 f ( X , b 1 , b 2 , … , b d ) ⋅ e q ~ ( ( X , b 1 , b 2 , … , b d ) , u ) h^{(d)}(X) = \sum_{b_1,b_2, \ldots, b_d\in\{0,1\}^2}f(X, b_1, b_2, \ldots, b_d)\cdot \tilde{eq}((X, b_1, b_2, \ldots, b_d), \mathbf{u}) h ( d ) ( X ) = b 1 , b 2 , … , b d ∈ { 0 , 1 } 2 ∑ f ( X , b 1 , b 2 , … , b d ) ⋅ e q ~ (( X , b 1 , b 2 , … , b d ) , u ) Prover Cost Round 1 ¶ 分析 Round 1 的算法复杂度:
计算 c ⃗ = e q ~ u ( b ⃗ ) \vec{c} = \tilde{eq}_{\bf{u}}(\vec{b}) c = e q ~ u ( b ) ,其中 b ⃗ = { 0 , 1 } d \vec{b} = \{0,1\}^d b = { 0 , 1 } d ,也就是计算在 hypercube 上的取值,总共计算 2 d 2^d 2 d 个值。 eq = MLEPolynomial.eqs_over_hypercube(us)
该函数具体实现方法为
@classmethod
def eqs_over_hypercube(cls, rs):
k = len(rs)
n = 1 << k
evals = [1] * n
half = 1
for i in range(k):
for j in range(half):
evals[j+half] = evals[j] * rs[i]
evals[j] = evals[j] - evals[j+half]
half *= 2
return evals
这里复杂度的具体分析与 ph23 中分析一致,直接借用分析结果,复杂度为 ( 2 d − 1 ) F m u l (2^d - 1) ~ \mathbb{F}_{\mathsf{mul}} ( 2 d − 1 ) F mul 。
Prover 计算 h d ( X ) h_d(X) h d ( X ) 并发送给 Verifier。 由于 h d ( X ) h_d(X) h d ( X ) 是一个 2 次的多项式,因此计算 h d ( 0 ) , h d ( 1 ) , h d ( 2 ) h_d(0), h_d(1), h_d(2) h d ( 0 ) , h d ( 1 ) , h d ( 2 ) 的值并发送给 Verifier 。
例如 d = 3 d = 3 d = 3 ,则
h ( d ) ( 0 ) = a 0 ⋅ e 0 + a 1 ⋅ e 1 + a 2 ⋅ e 2 + a 3 ⋅ e 3 h ( d ) ( 1 ) = a 4 ⋅ e 4 + a 5 ⋅ e 5 + a 6 ⋅ e 6 + a 7 ⋅ e 7 h ( d ) ( 2 ) = ∑ i = 0 3 ( 2 ⋅ a i + 4 − a i ) ⋅ ( 2 ⋅ e i + 4 − e i ) = ∑ i = 0 3 ( 4 a i + 4 ⋅ e i + 4 + a i e i − 2 ⋅ a i e i + 4 − 2 a i + 4 e i ) = 4 ⋅ h ( d ) ( 1 ) + h d ( 0 ) − 2 ⋅ ∑ i = 0 3 a i e i + 4 − 2 ⋅ ∑ i = 0 3 a i + 4 e i \begin{split}
h^{(d)}(0) &= a_0\cdot e_0 + a_1\cdot e_1 + a_2\cdot e_2 + a_3\cdot e_3 \\
h^{(d)}(1) &= a_4\cdot e_4 + a_5\cdot e_5 + a_6\cdot e_6 + a_7\cdot e_7 \\
h^{(d)}(2) &= \sum_{i=0}^{3} (2\cdot a_{i+4} - a_i)\cdot (2\cdot e_{i+4} - e_i) \\
& = \sum_{i=0}^{3} (4 a_{i+4} \cdot e_{i+4} + a_ie_i - 2 \cdot a_{i}e_{i + 4} - 2 a_{i+4}e_i)\\
& = 4 \cdot h^{(d)}(1) + h^d(0) - 2 \cdot \sum_{i=0}^{3} a_{i}e_{i + 4} - 2 \cdot \sum_{i=0}^{3} a_{i + 4}e_{i}
\end{split} h ( d ) ( 0 ) h ( d ) ( 1 ) h ( d ) ( 2 ) = a 0 ⋅ e 0 + a 1 ⋅ e 1 + a 2 ⋅ e 2 + a 3 ⋅ e 3 = a 4 ⋅ e 4 + a 5 ⋅ e 5 + a 6 ⋅ e 6 + a 7 ⋅ e 7 = i = 0 ∑ 3 ( 2 ⋅ a i + 4 − a i ) ⋅ ( 2 ⋅ e i + 4 − e i ) = i = 0 ∑ 3 ( 4 a i + 4 ⋅ e i + 4 + a i e i − 2 ⋅ a i e i + 4 − 2 a i + 4 e i ) = 4 ⋅ h ( d ) ( 1 ) + h d ( 0 ) − 2 ⋅ i = 0 ∑ 3 a i e i + 4 − 2 ⋅ i = 0 ∑ 3 a i + 4 e i h_eval_at_0 = sum([f_low[j] * eq_low[j] for j in range(half)])
h_eval_at_1 = sum([f_high[j] * eq_high[j] for j in range(half)])
h_eval_at_2 = sum([ (2 * f_high[j] - f_low[j]) * (2 * eq_high[j] - eq_low[j]) for j in range(half)])
h_poly_vec.append([h_eval_at_0, h_eval_at_1, h_eval_at_2])
对于求 h ( d ) ( X ) h^{(d)}(X) h ( d ) ( X ) ,进行分解要满足
1 − X = a ⋅ ( 1 − 1 ) + b ⋅ ( 1 − 0 ) X = a ⋅ 1 + b ⋅ ( 1 − 0 ) \begin{align}
& 1 - X = a \cdot (1 - 1) + b \cdot (1 - 0) \\
& X = a \cdot 1 + b \cdot (1 - 0)
\end{align} 1 − X = a ⋅ ( 1 − 1 ) + b ⋅ ( 1 − 0 ) X = a ⋅ 1 + b ⋅ ( 1 − 0 ) 得到
a = X , b = 1 − X a = X, \quad b = 1 - X a = X , b = 1 − X 因此对于 X = 2 X = 2 X = 2 ,有 a = 2 , b = − 1 a = 2, b = -1 a = 2 , b = − 1 ,因此
e q ~ ( ( u 0 , u 1 , u 2 ) , ( b 0 , b 1 , 2 ) ) = 2 × e q ~ ( ( u 0 , u 1 , u 2 ) , ( b 0 , b 1 , 1 ) ) − e q ~ ( ( u 0 , u 1 , u 2 ) , ( b 0 , b 1 , 0 ) ) \begin{align}
& \tilde{eq}((u_0, u_1, u_2), (b_0, b_1, 2)) = 2 \times \tilde{eq}((u_0, u_1, u_2), (b_0, b_1, 1)) - \tilde{eq}((u_0, u_1, u_2), (b_0, b_1, 0)) \\
\end{align} e q ~ (( u 0 , u 1 , u 2 ) , ( b 0 , b 1 , 2 )) = 2 × e q ~ (( u 0 , u 1 , u 2 ) , ( b 0 , b 1 , 1 )) − e q ~ (( u 0 , u 1 , u 2 ) , ( b 0 , b 1 , 0 )) 一般通用公式为
h ( d ) ( X ) = ∑ b ∈ { 0 , 1 } d − 1 ( X ⋅ f ( b , 1 ) + ( 1 − X ) ⋅ f ( b , 0 ) ) ⋅ ( X ⋅ e q ~ ( b , 1 ) + ( 1 − X ) ⋅ e q ~ ( b , 0 ) ) h^{(d)}(X) = \sum_{\mathbf{b} \in \{0,1\}^{d - 1}} (X \cdot f(\mathsf{b},1) + (1 - X) \cdot f(\mathsf{b}, 0)) \cdot (X \cdot \tilde{eq}(\mathsf{b},1) + (1 - X) \cdot \tilde{eq}(\mathsf{b}, 0)) h ( d ) ( X ) = b ∈ { 0 , 1 } d − 1 ∑ ( X ⋅ f ( b , 1 ) + ( 1 − X ) ⋅ f ( b , 0 )) ⋅ ( X ⋅ e q ~ ( b , 1 ) + ( 1 − X ) ⋅ e q ~ ( b , 0 )) 计算 h ( d ) ( 0 ) h^{(d)}(0) h ( d ) ( 0 ) 复杂度为 2 d − 1 F m u l 2^{d - 1} ~ \mathbb{F}_{\mathsf{mul}} 2 d − 1 F mul 计算 h ( d ) ( 1 ) h^{(d)}(1) h ( d ) ( 1 ) 复杂度为 2 d − 1 F m u l 2^{d - 1} ~ \mathbb{F}_{\mathsf{mul}} 2 d − 1 F mul 计算 h ( d ) ( 2 ) h^{(d)}(2) h ( d ) ( 2 ) 复杂度为 ( 2 ⋅ 2 d − 1 + 3 ) F m u l (2 \cdot 2^{d - 1} + 3) ~ \mathbb{F}_{\mathsf{mul}} ( 2 ⋅ 2 d − 1 + 3 ) F mul 总计复杂度为:
( 4 ⋅ 2 d − 1 + 3 ) F m u l = ( 2 N + 3 ) F m u l (4 \cdot 2^{d - 1} + 3) ~ \mathbb{F}_{\mathsf{mul}} = (2N + 3) ~ \mathbb{F}_{\mathsf{mul}} ( 4 ⋅ 2 d − 1 + 3 ) F mul = ( 2 N + 3 ) F mul 因此这一轮的总复杂度为
( 3 N + 2 ) F m u l (3N + 2) ~ \mathbb{F}_{\mathsf{mul}} ( 3 N + 2 ) F mul Prover 发送的有
( h ( d ) ( 0 ) , h ( d ) ( 1 ) , h ( d ) ( 2 ) ) (h^{(d)}(0), h^{(d)}(1), h^{(d)}(2)) ( h ( d ) ( 0 ) , h ( d ) ( 1 ) , h ( d ) ( 2 )) Round 2 ¶ 对于 i = d − 1 , d − 2 , … , 1 i = d - 1, d - 2, \ldots, 1 i = d − 1 , d − 2 , … , 1 ,
Verifier 发送挑战数 α i ← $ F p \alpha_i \stackrel{\$}{\leftarrow} \mathbb{F}_p α i ← $ F p
Prover 同时进行 Basefold-IOPP 协议和 Sumcheck 协议:
Prover 发送折叠后的向量编码: π i = f o l d α i ∗ ( π i + 1 ) \pi_i = \mathsf{fold}^*_{\alpha_i}(\pi_{i + 1}) π i = fold α i ∗ ( π i + 1 ) ,实际实现中,会发送对应的 Merkle Tree 承诺
c m ( π i ) = c m ( f o l d α i ∗ ( π i + 1 ) ) = M T . c o m m i t ( f o l d α i ∗ ( π i + 1 ) ) \mathsf{cm}(\pi_i) = \mathsf{cm}(\mathsf{fold}^*_{\alpha_i}(\pi_{i + 1})) = \mathsf{MT.commit}(\mathsf{fold}^*_{\alpha_i}(\pi_{i + 1})) cm ( π i ) = cm ( fold α i ∗ ( π i + 1 )) = MT.commit ( fold α i ∗ ( π i + 1 )) Prover 计算 h ( i ) ( α i ) h^{(i)}(\alpha_i) h ( i ) ( α i ) 作为下一轮 Sumcheck 协议的求和值
Prover 计算 f ( i ) ( X 0 , X 1 , … , X i − 1 ) f^{(i)}(X_0, X_1, \ldots, X_{i - 1}) f ( i ) ( X 0 , X 1 , … , X i − 1 ) 的 Evaluations 为 a ( i ) = f o l d α i ∗ ( a ( i + 1 ) ) \mathbf{a}^{(i)} = \mathsf{fold}^{*}_{\alpha_i}(\mathbf{a}^{(i + 1)}) a ( i ) = fold α i ∗ ( a ( i + 1 ) )
Prover 计算并发送 h ( i ) ( X ) h^{(i)}(X) h ( i ) ( X )
h ( i ) ( X ) = ∑ b ⃗ ∈ { 0 , 1 } i − 1 f ( b ⃗ , X , α i , α i + 1 , … , α d − 1 ) ⋅ e q ~ ( ( b ⃗ , X , α i , … , α d − 1 ) , u ⃗ ) h^{(i)}(X) = \sum_{\vec{b}\in\{0,1\}^{i - 1}}f(\vec{b}, X, \alpha_i, \alpha_{i + 1}, \ldots, \alpha_{d - 1})\cdot \tilde{eq}((\vec{b}, X, \alpha_i, \ldots, \alpha_{d-1}), \vec{u}) h ( i ) ( X ) = b ∈ { 0 , 1 } i − 1 ∑ f ( b , X , α i , α i + 1 , … , α d − 1 ) ⋅ e q ~ (( b , X , α i , … , α d − 1 ) , u ) 等式右边同样是一个关于 X X X 次数为 2 的 Univariate Polynomial,因此 Prover 可以根据 a ( i ) \mathbf{a}^{(i)} a ( i ) 计算出 h ( i ) ( X ) h^{(i)}(X) h ( i ) ( X ) 在 X = 0 , 1 , 2 X=0,1,2 X = 0 , 1 , 2 处的取值: ( h ( i ) ( 0 ) , h ( i ) ( 1 ) , h ( i ) ( 2 ) ) (h^{(i)}(0), h^{(i)}(1), h^{(i)}(2)) ( h ( i ) ( 0 ) , h ( i ) ( 1 ) , h ( i ) ( 2 )) 。
Prover Cost Round 2 ¶ 下面分析上述流程的复杂度,对于第 i i i 次
Prover 计算并发送 π i = f o l d α i ∗ ( π i + 1 ) \pi_i = \mathsf{fold}^*_{\alpha_i}(\pi_{i + 1}) π i = fold α i ∗ ( π i + 1 ) f_code = basefold_fri_multilinear_basis(f_code, T[k-i-1], alpha, debug=debug)
def basefold_fri_multilinear_basis(vs, table, c, debug=False):
assert len(table) == len(vs)/2, "len(table) is not double len(vs), len(table) = %d, len(vs) = %d" % (len(table), len(vs))
n = len(vs)
half = int(n / 2)
new_vs = []
left = vs[:half]
right = vs[half:]
for i in range(0, half):
if debug: print("(left[i] + right[i])/2=", (left[i] + right[i])/2)
new_vs.append((1 - c) * (left[i] + right[i])/2 + (c) * (left[i] - right[i])/(2*table[i]))
return new_vs
函数传入的参数 f_code
表示的就是 π i \pi_i π i ,那么传入的 π i \pi_i π i 的长度为 2 i ⋅ R 2^i \cdot \mathcal{R} 2 i ⋅ R ,也记为 n i n_i n i 。
for i in range(0, half)
总共循环 n i / 2 n_i /2 n i /2 次,在每一次循环中涉及到的有限域操作为
2 F m u l + F i n v + 3 F m u l + F i n v = 5 F m u l + 2 F i n v 2 ~ \mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{inv}} + 3 ~ \mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{inv}} = 5 ~ \mathbb{F}_{\mathsf{mul}} + 2~\mathbb{F}_{\mathsf{inv}} 2 F mul + F inv + 3 F mul + F inv = 5 F mul + 2 F inv 因此这个函数的整体计算复杂度为
( 5 ⋅ n i 2 ) F m u l + ( 2 ⋅ n i 2 ) F i n v = 5 n i 2 F m u l + n i F i n v (5 \cdot \frac{n_i}{2}) ~ \mathbb{F}_{\mathsf{mul}} + (2 \cdot \frac{n_i}{2} )~\mathbb{F}_{\mathsf{inv}} = \frac{5n_i}{2} ~ \mathbb{F}_{\mathsf{mul}} + n_i~\mathbb{F}_{\mathsf{inv}} ( 5 ⋅ 2 n i ) F mul + ( 2 ⋅ 2 n i ) F inv = 2 5 n i F mul + n i F inv 2. Prover 计算 h ( i ) ( α i ) h^{(i)}(\alpha_i) h ( i ) ( α i ) 作为下一轮 Sumcheck 协议的求和值
# compute the new sum = h(alpha)
sumcheck_sum = UniPolynomial.uni_eval_from_evals([h_eval_at_0, h_eval_at_1, h_eval_at_2], alpha, [Fp(0),Fp(1),Fp(2)])
@classmethod
def uni_eval_from_evals(cls, evals, z, D):
n = len(evals)
if n != len(D):
raise ValueError("Domain size should be equal to the length of evaluations")
if z in D:
return evals[D.index(z)]
weights = cls.barycentric_weights(D)
# print("weights={}".format(weights))
e_vec = [weights[i] / (z - D[i]) for i in range(n)]
numerator = sum([e_vec[i] * evals[i] for i in range(n)])
denominator = sum([e_vec[i] for i in range(n)])
return (numerator / denominator)
Prover 计算 f ( i ) ( X 0 , X 1 , … , X i − 1 ) f^{(i)}(X_0, X_1, \ldots, X_{i - 1}) f ( i ) ( X 0 , X 1 , … , X i − 1 ) 的 Evaluations 为 a ( i ) = f o l d α i ∗ ( a ( i + 1 ) ) \mathbf{a}^{(i)} = \mathsf{fold}^{*}_{\alpha_i}(\mathbf{a}^{(i + 1)}) a ( i ) = fold α i ∗ ( a ( i + 1 ) ) f = [(1 - alpha) * f_low[i] + alpha * f_high[i] for i in range(half)]
这里 half
长度为 2 i 2^i 2 i ,因此复杂度为
2 ⋅ 2 i F m u l = 2 i + 1 F m u l 2 \cdot 2^{i} ~ \mathbb{F}_{\mathsf{mul}} = 2^{i + 1} ~ \mathbb{F}_{\mathsf{mul}} 2 ⋅ 2 i F mul = 2 i + 1 F mul Prover 计算并发送 h ( i ) ( X ) h^{(i)}(X) h ( i ) ( X ) h ( i ) ( X ) = ∑ b ⃗ ∈ { 0 , 1 } i − 1 f ( b ⃗ , X , α i , α i + 1 , … , α d − 1 ) ⋅ e q ~ ( ( b ⃗ , X , α i , … , α d − 1 ) , u ⃗ ) h^{(i)}(X) = \sum_{\vec{b}\in\{0,1\}^{i - 1}}f(\vec{b}, X, \alpha_i, \alpha_{i + 1}, \ldots, \alpha_{d - 1})\cdot \tilde{eq}((\vec{b}, X, \alpha_i, \ldots, \alpha_{d-1}), \vec{u}) h ( i ) ( X ) = b ∈ { 0 , 1 } i − 1 ∑ f ( b , X , α i , α i + 1 , … , α d − 1 ) ⋅ e q ~ (( b , X , α i , … , α d − 1 ) , u ) 等式右边同样是一个关于 X X X 次数为 2 的 Univariate Polynomial,因此 Prover 可以根据 a ( i ) \mathbf{a}^{(i)} a ( i ) 计算出 h ( i ) ( X ) h^{(i)}(X) h ( i ) ( X ) 在 X = 0 , 1 , 2 X=0,1,2 X = 0 , 1 , 2 处的取值: ( h ( i ) ( 0 ) , h ( i ) ( 1 ) , h ( i ) ( 2 ) ) (h^{(i)}(0), h^{(i)}(1), h^{(i)}(2)) ( h ( i ) ( 0 ) , h ( i ) ( 1 ) , h ( i ) ( 2 )) 。
eq_low = eq[:half]
eq_high = eq[half:]
eq = [(1 - alpha) * eq_low[i] + alpha * eq_high[i] for i in range(half)]
h_eval_at_0 = sum([f_low[j] * eq_low[j] for j in range(half)])
h_eval_at_1 = sum([f_high[j] * eq_high[j] for j in range(half)])
h_eval_at_2 = sum([ (2 * f_high[j] - f_low[j]) * (2 * eq_high[j] - eq_low[j]) for j in range(half)])
h_poly_vec.append([h_eval_at_0, h_eval_at_1, h_eval_at_2])
计算 eq = [(1 - alpha) * eq_low[i] + alpha * eq_high[i] for i in range(half)]
的复杂度与前面计算 f
一样,复杂度为 2 i + 1 F m u l 2^{i + 1} ~ \mathbb{F}_{\mathsf{mul}} 2 i + 1 F mul 计算 ( h ( i ) ( 0 ) , h ( i ) ( 1 ) , h ( i ) ( 2 ) ) (h^{(i)}(0), h^{(i)}(1), h^{(i)}(2)) ( h ( i ) ( 0 ) , h ( i ) ( 1 ) , h ( i ) ( 2 )) 复杂度的分析与前面分析 h d ( X ) h_d(X) h d ( X ) 一样,这里直接套用结果,复杂度为 ( 2 ⋅ 2 i + 3 ) F m u l (2 \cdot 2^{i} + 3) ~ \mathbb{F}_{\mathsf{mul}} ( 2 ⋅ 2 i + 3 ) F mul 因此这一步的复杂度为
2 i + 1 F m u l + ( 4 ⋅ 2 i − 1 + 3 ) F m u l = ( 4 ⋅ 2 i + 3 ) F m u l 2^{i + 1} ~ \mathbb{F}_{\mathsf{mul}} + (4 \cdot 2^{i - 1} + 3) ~ \mathbb{F}_{\mathsf{mul}} =(4 \cdot 2^{i} + 3) ~ \mathbb{F}_{\mathsf{mul}} 2 i + 1 F mul + ( 4 ⋅ 2 i − 1 + 3 ) F mul = ( 4 ⋅ 2 i + 3 ) F mul 将前面所有步骤的复杂度相加为
5 n i 2 F m u l + n i F i n v + 2 i + 1 F m u l + ( 4 ⋅ 2 i + 3 ) F m u l = ( 5 n i 2 + 6 ⋅ 2 i + 3 ) F m u l + n i F i n v \frac{5n_i}{2} ~ \mathbb{F}_{\mathsf{mul}} + n_i~\mathbb{F}_{\mathsf{inv}} + 2^{i + 1} ~ \mathbb{F}_{\mathsf{mul}} + (4 \cdot 2^i + 3) ~ \mathbb{F}_{\mathsf{mul}} = (\frac{5n_i}{2} + 6 \cdot 2^{i} + 3) ~ \mathbb{F}_{\mathsf{mul}} + n_i~\mathbb{F}_{\mathsf{inv}} 2 5 n i F mul + n i F inv + 2 i + 1 F mul + ( 4 ⋅ 2 i + 3 ) F mul = ( 2 5 n i + 6 ⋅ 2 i + 3 ) F mul + n i F inv 代入 n i = 2 i ⋅ R n_i = 2^i \cdot \mathcal{R} n i = 2 i ⋅ R ,复杂度为
( 5 ⋅ 2 i ⋅ R 2 + 6 ⋅ 2 i + 3 ) F m u l + ( 2 i ⋅ R ) F i n v = ( ( 5 2 R + 6 ) ⋅ 2 i + 3 ) F m u l + ( 2 i ⋅ R ) F i n v (\frac{5\cdot 2^i \cdot \mathcal{R}}{2} + 6 \cdot 2^{i} + 3) ~ \mathbb{F}_{\mathsf{mul}} + (2^i \cdot \mathcal{R})~\mathbb{F}_{\mathsf{inv}} = ((\frac{5}{2} \mathcal{R} + 6) \cdot 2^i + 3) ~ \mathbb{F}_{\mathsf{mul}} + (2^i \cdot \mathcal{R})~\mathbb{F}_{\mathsf{inv}} ( 2 5 ⋅ 2 i ⋅ R + 6 ⋅ 2 i + 3 ) F mul + ( 2 i ⋅ R ) F inv = (( 2 5 R + 6 ) ⋅ 2 i + 3 ) F mul + ( 2 i ⋅ R ) F inv 将所有 i = d − 1 , … , 1 i = d - 1, \ldots, 1 i = d − 1 , … , 1 的复杂度相加,为
∑ i = 1 d − 1 ( ( 5 2 R + 6 ) ⋅ 2 i + 3 ) F m u l + ( 2 i ⋅ R ) F i n v = ( ( 5 2 R + 6 ) ( N − 2 ) + 3 ( d − 1 ) ) F m u l + R ( N − 2 ) F i n v = ( ( 5 2 R + 6 ) N + 3 d − 5 R − 15 ) F m u l + ( R N − 2 R ) F i n v \begin{align}
& \sum_{i = 1}^{d - 1}((\frac{5}{2} \mathcal{R} + 6) \cdot 2^i + 3) ~ \mathbb{F}_{\mathsf{mul}} + (2^i \cdot \mathcal{R})~\mathbb{F}_{\mathsf{inv}} \\
= & ((\frac{5}{2} \mathcal{R} + 6) (N - 2) + 3(d - 1)) ~ \mathbb{F}_{\mathsf{mul}} + \mathcal{R}(N - 2)~\mathbb{F}_{\mathsf{inv}} \\
= & ((\frac{5}{2} \mathcal{R} + 6) N + 3d - 5 \mathcal{R} - 15) ~ \mathbb{F}_{\mathsf{mul}} + (\mathcal{R}N - 2 \mathcal{R})~\mathbb{F}_{\mathsf{inv}}
\end{align} = = i = 1 ∑ d − 1 (( 2 5 R + 6 ) ⋅ 2 i + 3 ) F mul + ( 2 i ⋅ R ) F inv (( 2 5 R + 6 ) ( N − 2 ) + 3 ( d − 1 )) F mul + R ( N − 2 ) F inv (( 2 5 R + 6 ) N + 3 d − 5 R − 15 ) F mul + ( R N − 2 R ) F inv 补充增加关于 Merkle Tree 的计算,对于 i = d − 1 , … , 1 i = d - 1, \ldots, 1 i = d − 1 , … , 1 , Prover 发送折叠后的向量编码: π i = f o l d α i ∗ ( π i + 1 ) \pi_i = \mathsf{fold}^*_{\alpha_i}(\pi_{i + 1}) π i = fold α i ∗ ( π i + 1 ) ,实际实现中,会发送对应的 Merkle Tree 承诺
c m ( π i ) = c m ( f o l d α i ∗ ( π i + 1 ) ) = M T . c o m m i t ( f o l d α i ∗ ( π i + 1 ) ) \mathsf{cm}(\pi_i) = \mathsf{cm}(\mathsf{fold}^*_{\alpha_i}(\pi_{i + 1})) = \mathsf{MT.commit}(\mathsf{fold}^*_{\alpha_i}(\pi_{i + 1})) cm ( π i ) = cm ( fold α i ∗ ( π i + 1 )) = MT.commit ( fold α i ∗ ( π i + 1 )) 这里 Merkle Tree 的叶子节点有 2 i ⋅ R 2^i \cdot \mathcal{R} 2 i ⋅ R 个,记为 M T . c o m m i t ( 2 i ⋅ R ) \mathsf{MT.commit}(2^{i} \cdot \mathcal{R}) MT.commit ( 2 i ⋅ R ) ,总记为
∑ i = 1 d − 1 M T . c o m m i t ( 2 i ⋅ R ) \sum_{i = 1}^{d - 1} \mathsf{MT.commit}(2^{i} \cdot \mathcal{R}) i = 1 ∑ d − 1 MT.commit ( 2 i ⋅ R ) Round 3 ¶ Verifier 发送挑战数 α 0 ← F p \alpha_0\leftarrow \mathbb{F}_p α 0 ← F p Prover 继续进行 Basefold-IOPP 协议:Prover 发送折叠后的向量编码 π 0 = f o l d α 0 ∗ ( π 1 ) \pi_0 = \mathsf{fold}^*_{\alpha_0}(\pi_1) π 0 = fold α 0 ∗ ( π 1 ) ,由于这一步最后 Verifier 会检查 π 0 \pi_0 π 0 是否是合法的编码,因此这里会将所有的值发送给 Verifier,而不是其 Merkle 承诺。 Prover Cost Round 3 ¶ 复杂度与前面分析 π i \pi_i π i 是一致的,复杂度为
5 n 0 2 F m u l + n 0 F i n v = 5 2 R F m u l + R F i n v \frac{5n_0}{2} ~ \mathbb{F}_{\mathsf{mul}} + n_0~\mathbb{F}_{\mathsf{inv}} = \frac{5 }{2} \mathcal{R}~ \mathbb{F}_{\mathsf{mul}} + \mathcal{R} ~ \mathbb{F}_{\mathsf{inv}} 2 5 n 0 F mul + n 0 F inv = 2 5 R F mul + R F inv Round 4 ¶ 这一轮是 Verifier 进行 IOPP.query ,主要是为了后面 verifier 来检查折叠的正确性。论文中的协议描述如下:
重复 l l l 次:
Verifier 随机选取一个索引值 μ ← $ [ 1 , n d − 1 ] \mu \stackrel{\$}{\leftarrow} [1, n_{d - 1}] μ ← $ [ 1 , n d − 1 ] 对于 i = d − 1 , … , 0 i = d - 1, \ldots, 0 i = d − 1 , … , 0 :Prover 发送 π i + 1 [ μ ] , π i + 1 [ μ + n i ] \pi_{i + 1}[\mu], \pi_{i + 1}[\mu + n_i] π i + 1 [ μ ] , π i + 1 [ μ + n i ] 以及 π i + 1 [ μ ] \pi_{i + 1}[\mu] π i + 1 [ μ ] 对应的 Merkle Path。
{ π i + 1 [ μ ] , π π i + 1 ( μ ) } ← M T . o p e n ( π i + 1 , μ ) \{\pi_{i + 1}[\mu], \pi_{\pi_{i + 1}}(\mu)\} \leftarrow \mathsf{MT.open}(\pi_{i + 1}, \mu) { π i + 1 [ μ ] , π π i + 1 ( μ )} ← MT.open ( π i + 1 , μ ) 如果 i > 0 i >0 i > 0 并且 μ > n i − 1 \mu > n_{i - 1} μ > n i − 1 ,Prover 计算新的 μ \mu μ ,μ ← μ − n i − 1 \mu \leftarrow \mu - n_{i - 1} μ ← μ − n i − 1 Prover Cost Round 4 ¶ 由于这一轮 Prover 发送的都是之前已经计算过的值,因此没有额外的计算消耗。
Prover Cost ¶ 将上面的计算复杂度相加,为
( 3 N + 2 ) F m u l + ( ( 5 2 R + 6 ) N + 3 d − 5 R − 15 ) F m u l + ( R N − 2 R ) F i n v + 5 2 R F m u l + R F i n v = ( ( 5 2 R + 9 ) ⋅ N + 3 d − 5 2 R − 13 ) F m u l + ( R ⋅ N − R ) F i n v \begin{aligned}
& (3N + 2) ~ \mathbb{F}_{\mathsf{mul}} \\
& + ((\frac{5}{2} \mathcal{R} + 6) N + 3d - 5 \mathcal{R} - 15) ~ \mathbb{F}_{\mathsf{mul}} + (\mathcal{R}N - 2 \mathcal{R})~\mathbb{F}_{\mathsf{inv}} \\
& + \frac{5 }{2} \mathcal{R}~ \mathbb{F}_{\mathsf{mul}} + \mathcal{R} ~ \mathbb{F}_{\mathsf{inv}}\\
= & \left((\frac{5}{2} \mathcal{R} + 9) \cdot N + 3d - \frac{5}{2} \mathcal{R} - 13 \right) ~ \mathbb{F}_{\mathsf{mul}} + (\mathcal{R} \cdot N - \mathcal{R}) ~ \mathbb{F}_{\mathsf{inv}}
\end{aligned} = ( 3 N + 2 ) F mul + (( 2 5 R + 6 ) N + 3 d − 5 R − 15 ) F mul + ( R N − 2 R ) F inv + 2 5 R F mul + R F inv ( ( 2 5 R + 9 ) ⋅ N + 3 d − 2 5 R − 13 ) F mul + ( R ⋅ N − R ) F inv 加上关于 Merkle Tree 进行承诺的复杂度,为
( ( 5 2 R + 9 ) ⋅ N + 3 d − 5 2 R − 13 ) F m u l + ( R ⋅ N − R ) F i n v + ∑ i = 1 d − 1 M T . c o m m i t ( 2 i ⋅ R ) \begin{aligned}
\left((\frac{5}{2} \mathcal{R} + 9) \cdot N + 3d - \frac{5}{2} \mathcal{R} - 13 \right) ~ \mathbb{F}_{\mathsf{mul}} + (\mathcal{R} \cdot N - \mathcal{R}) ~ \mathbb{F}_{\mathsf{inv}} + \sum_{i = 1}^{d - 1} \mathsf{MT.commit}(2^{i} \cdot \mathcal{R})
\end{aligned} ( ( 2 5 R + 9 ) ⋅ N + 3 d − 2 5 R − 13 ) F mul + ( R ⋅ N − R ) F inv + i = 1 ∑ d − 1 MT.commit ( 2 i ⋅ R ) 若加上 Prover 计算编码 π d \pi_d π d 的算法复杂度,则总复杂度为
( R 2 ⋅ d N + ( 5 2 R + 9 ) ⋅ N + 3 d − 5 2 R − 13 ) F m u l + ( R ⋅ N − R ) F i n v + ∑ i = 1 d − 1 M T . c o m m i t ( 2 i ⋅ R ) \left(\frac{\mathcal{R}}{2} \cdot dN + (\frac{5}{2} \mathcal{R} + 9) \cdot N + 3d - \frac{5}{2} \mathcal{R} - 13 \right) ~ \mathbb{F}_{\mathsf{mul}} + (\mathcal{R} \cdot N - \mathcal{R}) ~ \mathbb{F}_{\mathsf{inv}} + \sum_{i = 1}^{d - 1} \mathsf{MT.commit}(2^{i} \cdot \mathcal{R}) ( 2 R ⋅ d N + ( 2 5 R + 9 ) ⋅ N + 3 d − 2 5 R − 13 ) F mul + ( R ⋅ N − R ) F inv + i = 1 ∑ d − 1 MT.commit ( 2 i ⋅ R ) Proof ¶ Prover 发送的证明为
π = ( ( h ( d ) ( 0 ) , h ( d ) ( 1 ) , h ( d ) ( 2 ) ) , c m ( π d − 1 ) , c m ( π d − 2 ) , … , c m ( π 1 ) , h ( d − 1 ) ( 0 ) , h ( d − 1 ) ( 1 ) , h ( d − 1 ) ( 2 ) , … , h ( 1 ) ( 0 ) , h ( 1 ) ( 1 ) , h ( 1 ) ( 2 ) , π 0 { π d [ μ ( d ) ] , π d [ μ ( d ) + n d − 1 ] , π π d ( μ ( d ) ) , … , π 1 [ μ ( 1 ) ] , π 1 [ μ ( 1 ) + n 0 ] , π π 1 ( μ ( 1 ) ) } l ) \begin{aligned}
\pi = & ((h^{(d)}(0), h^{(d)}(1), h^{(d)}(2)), \mathsf{cm}(\pi_{d - 1}), \mathsf{cm}(\pi_{d - 2}), \ldots, \mathsf{cm}(\pi_{1}),\\
& \quad h^{(d-1)}(0), h^{(d-1)}(1), h^{(d-1)}(2), \ldots, h^{(1)}(0), h^{(1)}(1), h^{(1)}(2), \pi_0 \\
& \quad \{\pi_{d}[\mu^{(d)}], \pi_{d}[\mu^{(d)} + n_{d-1}], \pi_{\pi_{d}}(\mu^{(d)}), \ldots, \pi_{1}[\mu^{(1)}], \pi_{1}[\mu^{(1)} + n_{0}], \pi_{\pi_{1}}(\mu^{(1)}) \}^l )
\end{aligned} π = (( h ( d ) ( 0 ) , h ( d ) ( 1 ) , h ( d ) ( 2 )) , cm ( π d − 1 ) , cm ( π d − 2 ) , … , cm ( π 1 ) , h ( d − 1 ) ( 0 ) , h ( d − 1 ) ( 1 ) , h ( d − 1 ) ( 2 ) , … , h ( 1 ) ( 0 ) , h ( 1 ) ( 1 ) , h ( 1 ) ( 2 ) , π 0 { π d [ μ ( d ) ] , π d [ μ ( d ) + n d − 1 ] , π π d ( μ ( d ) ) , … , π 1 [ μ ( 1 ) ] , π 1 [ μ ( 1 ) + n 0 ] , π π 1 ( μ ( 1 ) ) } l ) 在上面的表示中,μ ( d ) , … , μ ( 1 ) \mu^{(d)}, \ldots, \mu^{(1)} μ ( d ) , … , μ ( 1 ) 表示的是在 IOPP.query 阶段的随机指标,其更新计算过程如 Prover Round 4 中的描述。{ ⋅ } l \{ \cdot \}^l { ⋅ } l 表示重复 l l l 轮,每次其中的证明可能不同。
Proof size ¶ c m ( π i ) \mathsf{cm}(\pi_{i}) cm ( π i ) 这种表示的是 Merkle Tree 承诺,实际是 Merkle Tree 的根节点,为一个哈希值,用 H H H 表示。π π i ( μ ( i ) ) \pi_{\pi_{i}}(\mu^{(i)}) π π i ( μ ( i ) ) 表示的是 Merkle Tree 的路径,这棵树的高度是 log n i \log n_i log n i ,因此 Merkle Path 中会发送 log n i \log n_i log n i 个哈希值,记为 log n i H \log n_i ~ H log n i H 。Proof 大小为
3 F + d H + ( 3 ⋅ ( d − 1 ) ) F + n 0 F + l ⋅ ( 2 d F + ( log n d + … + log n 1 ) H ) = ( 3 d + R + 2 d l ) F + d H + l ( d + log R + … + 1 + log R ) H = ( 3 d + R + 2 d l ) F + ( d + l ⋅ ( d ( d + 1 ) 2 + d ⋅ log R ) ) H = ( ( 2 l + 3 ) d + R ) F + ( l 2 ⋅ d 2 + ( log R ⋅ l + 1 2 ⋅ l + 1 ) ⋅ d ) H \begin{aligned}
& \quad 3 ~ \mathbb{F} + d ~ H + (3 \cdot (d - 1))~ \mathbb{F} + n_0 ~ \mathbb{F} + l \cdot (2d ~ \mathbb{F} + (\log n_d + \ldots + \log n_1) ~ H) \\
& = (3d + \mathcal{R} + 2dl) ~ \mathbb{F} + d ~ H + l (d + \log \mathcal{R} + \ldots + 1 + \log \mathcal{R}) ~ H \\
& = (3d + \mathcal{R} + 2dl) ~ \mathbb{F} + \left(d + l \cdot \left(\frac{d (d + 1)}{2} + d \cdot \log \mathcal{R} \right) \right) ~ H \\
& = ((2l + 3)d + \mathcal{R}) ~ \mathbb{F} + \left( \frac{l}{2} \cdot d^2 + \left(\log \mathcal{R} \cdot l +\frac{1}{2} \cdot l + 1\right) \cdot d \right) ~ H
\end{aligned} 3 F + d H + ( 3 ⋅ ( d − 1 )) F + n 0 F + l ⋅ ( 2 d F + ( log n d + … + log n 1 ) H ) = ( 3 d + R + 2 d l ) F + d H + l ( d + log R + … + 1 + log R ) H = ( 3 d + R + 2 d l ) F + ( d + l ⋅ ( 2 d ( d + 1 ) + d ⋅ log R ) ) H = (( 2 l + 3 ) d + R ) F + ( 2 l ⋅ d 2 + ( log R ⋅ l + 2 1 ⋅ l + 1 ) ⋅ d ) H 代码中发送了每次的编码 π i \pi_i π i ,实际上并不需要。代码中发送了每次求得的编码,π 0 , π 1 , … , π d \pi_0, \pi_1, \ldots, \pi_d π 0 , π 1 , … , π d ,实际只用发送要进行 IOPP.query 处对应的值,以及这些编码的承诺。
Verification ¶ Verifier 验证下面的等式:
Verifier 发送若干轮的 Query, Q = { q i } Q=\{q_i\} Q = { q i }
Verifier 检验 Sumcheck 的每一步折叠的正确性,
验证
h ( d ) ( 0 ) + h ( d ) ( 1 ) = ? v h^{(d)}(0) + h^{(d)}(1) \overset{?}{=} v h ( d ) ( 0 ) + h ( d ) ( 1 ) = ? v 对于 i = 1 , … , d − 1 i = 1, \ldots, d - 1 i = 1 , … , d − 1 ,验证
h ( i ) ( 0 ) + h ( i ) ( 1 ) = ? h ( i + 1 ) ( α i ) \begin{split}
h^{(i)}(0) + h^{(i)}(1) &\overset{?}{=} h^{(i+1)}(\alpha_i) \\
\end{split} h ( i ) ( 0 ) + h ( i ) ( 1 ) = ? h ( i + 1 ) ( α i ) Verifier 验证最后的编码 π 0 \pi_0 π 0 是否正确 π 0 = ? e n c 0 ( h ( 1 ) ( α 0 ) e q ~ ( ( α 0 , … , α d − 1 ) , u ) ) \pi_0 \overset{?}{=} \mathsf{enc}_0\left(\frac{h^{(1)}(\alpha_0)}{\tilde{eq}((\alpha_0,\ldots,\alpha_{d-1}), \mathbf{u})}\right) π 0 = ? enc 0 ( e q ~ (( α 0 , … , α d − 1 ) , u ) h ( 1 ) ( α 0 ) ) Verifier Cost Analysis ¶ 下面分析 verification 阶段的算法复杂度。
Verifier 进行 IOPP.query 的验证,重复 l l l 次: 对于 i = d − 1 , … , 0 i = d- 1,\ldots, 0 i = d − 1 , … , 0 ,Verifier 验证折叠的正确性:
先验证发送的 π i + 1 [ μ ] \pi_{i + 1}[\mu] π i + 1 [ μ ] 的正确性 M T . v e r i f y ( c m ( π i + 1 ) , π i + 1 [ μ ] , π π i + 1 ( μ ) ) = ? 1 \mathsf{MT.verify}(\mathsf{cm}(\pi_{i + 1}), \pi_{i + 1}[\mu], \pi_{\pi_{i + 1}}(\mu)) \stackrel{?}{=} 1 MT.verify ( cm ( π i + 1 ) , π i + 1 [ μ ] , π π i + 1 ( μ )) = ? 1 这里的复杂度记为 M T V ( log n i + 1 ) \mathsf{MTV}(\log n_{i+1}) MTV ( log n i + 1 ) ,括号里的参数表示 Merkle Tree 的高度,这里的计算消耗主要是计算哈希值,一棵树的高度是多少,Verifier 就需要计算多少的哈希值,这里记为 log n i + 1 H \log n_{i+1} ~ H log n i + 1 H 。
f o l d = ( 1 − α ) ⋅ π i + 1 [ μ ] + π i + 1 [ μ + n i ] 2 + α ⋅ π i + 1 [ μ ] − π i + 1 [ μ + n i ] 2 ⋅ x [ μ ] \mathsf{fold} = (1 - \alpha) \cdot \frac{\pi_{i + 1}[\mu] + \pi_{i + 1}[\mu + n_i]}{2} + \alpha \cdot \frac{\pi_{i + 1}[\mu] - \pi_{i + 1}[\mu + n_i]}{2 \cdot x[\mu]} fold = ( 1 − α ) ⋅ 2 π i + 1 [ μ ] + π i + 1 [ μ + n i ] + α ⋅ 2 ⋅ x [ μ ] π i + 1 [ μ ] − π i + 1 [ μ + n i ] assert f_code_folded == ((1 - alpha) * (code_left + code_right)/2 + (alpha) * (code_left - code_right)/(2*table[x0])), "failed to check multilinear base fri"
这里计算的复杂度为
5 F m u l + 2 F i n v 5 ~ \mathbb{F}_{\mathsf{mul}} + 2~\mathbb{F}_{\mathsf{inv}} 5 F mul + 2 F inv Verifier 拿到自己计算的折叠后的值与 Prover 发送的值进行比较 f o l d = ? π i [ μ ] \mathsf{fold} \stackrel{?}{=} \pi_{i}[\mu] fold = ? π i [ μ ] Verifier 最后还会对 π 0 \pi_0 π 0 进行验证,验证是否是合法的编码,对于 RS 编码来说,就是验证 π 0 \pi_0 π 0 是一个常数多项式对应的编码,验证每个值都相等。 # check the final code
final_code = f_code_vec[i]
assert len(final_code) == blowup_factor, "len(final_code) != blowup_factor, len(final_code) = %d, blowup_factor = %d" % (len(final_code), blowup_factor)
for i in range(len(final_code)):
assert final_code[0] == final_code[i], "final_code is not a repetition code"
汇总这一步进行 IOPP.query 的复杂度为
l ⋅ ∑ i = 1 d M T V ( log n i ) + 5 d l F m u l + 2 d l F i n v = l ⋅ ∑ i = 1 d M T V ( i + log R ) + 5 d l F m u l + 2 d l F i n v l \cdot \sum_{i = 1}^{d}\mathsf{MTV}(\log n_{i}) + 5dl ~ \mathbb{F}_{\mathsf{mul}} + 2dl~\mathbb{F}_{\mathsf{inv}} = l \cdot\sum_{i = 1}^{d}\mathsf{MTV}(i + \log \mathcal{R}) + 5dl ~ \mathbb{F}_{\mathsf{mul}} + 2dl~\mathbb{F}_{\mathsf{inv}} l ⋅ i = 1 ∑ d MTV ( log n i ) + 5 d l F mul + 2 d l F inv = l ⋅ i = 1 ∑ d MTV ( i + log R ) + 5 d l F mul + 2 d l F inv Verifier 检验 Sumcheck 的每一步折叠的正确性,这一步的计算复杂度来自 Verifier 需要自己计算 h ( i + 1 ) ( α i ) h^{(i+1)}(\alpha_i) h ( i + 1 ) ( α i ) ,对于 i = 1 , … , d − 1 i = 1, \ldots, d - 1 i = 1 , … , d − 1 , sumcheck_sum = UniPolynomial.uni_eval_from_evals(h_evals, alpha, [Fp(0),Fp(1),Fp(2)])
@classmethod
def uni_eval_from_evals(cls, evals, z, D):
n = len(evals)
if n != len(D):
raise ValueError("Domain size should be equal to the length of evaluations")
if z in D:
return evals[D.index(z)]
weights = cls.barycentric_weights(D)
# print("weights={}".format(weights))
e_vec = [weights[i] / (z - D[i]) for i in range(n)]
numerator = sum([e_vec[i] * evals[i] for i in range(n)])
denominator = sum([e_vec[i] for i in range(n)])
return (numerator / denominator)
这里是用重心插值来计算得到 h ( i + 1 ) ( α i ) h^{(i+1)}(\alpha_i) h ( i + 1 ) ( α i ) 的值。
h ( α ) = ∑ ω i ⋅ y i α − x i ∑ ω i α − x i h(\alpha) = \frac{\sum \frac{\omega_i \cdot y_i}{\alpha - x_i}}{\sum \frac{\omega_i}{\alpha - x_i}} h ( α ) = ∑ α − x i ω i ∑ α − x i ω i ⋅ y i 其中 y i = h ( x i ) y_i = h(x_i) y i = h ( x i ) ,ω i \omega_i ω i 是重心插值权重,可以通过预计算得到,
ω i = 1 ∏ j = 1 , j ≠ i n ( x i − x j ) \omega_i = \frac{1}{\prod_{j = 1, j \neq i}^n (x_i - x_j)} ω i = ∏ j = 1 , j = i n ( x i − x j ) 1 如果 ∣ D ∣ = n |D| = n ∣ D ∣ = n ,那么这里计算复杂度为
( 2 n + 3 ) F m u l + ( n + 2 ) F i n v (2n + 3) ~ \mathbb{F}_{\mathsf{mul}} + (n + 2) ~ \mathbb{F}_{\mathsf{inv}} ( 2 n + 3 ) F mul + ( n + 2 ) F inv 该结论具体来自 ph23-analysis 分析,在验证过程的第一步,分析方法类似。
在计算 h ( i + 1 ) ( α i ) h^{(i+1)}(\alpha_i) h ( i + 1 ) ( α i ) 时,已知的有 h ( i + 1 ) ( 0 ) , h ( i + 1 ) ( 1 ) , h ( i + 1 ) ( 2 ) h^{(i+1)}(0),h^{(i+1)}(1),h^{(i+1)}(2) h ( i + 1 ) ( 0 ) , h ( i + 1 ) ( 1 ) , h ( i + 1 ) ( 2 ) , 在上面的计算式中代入 n = 3 n = 3 n = 3 ,因此这里计算 h ( i + 1 ) ( α i ) h^{(i+1)}(\alpha_i) h ( i + 1 ) ( α i ) 的复杂度为
9 F m u l + 5 F i n v 9 ~ \mathbb{F}_{\mathsf{mul}} + 5 ~ \mathbb{F}_{\mathsf{inv}} 9 F mul + 5 F inv 这里 i = 1 , … , d − 1 i = 1, \ldots, d - 1 i = 1 , … , d − 1 ,总共有 d − 1 d - 1 d − 1 次,因此总复杂度为
9 ( d − 1 ) F m u l + 5 ( d − 1 ) F i n v 9(d - 1) ~ \mathbb{F}_{\mathsf{mul}} + 5(d - 1) ~ \mathbb{F}_{\mathsf{inv}} 9 ( d − 1 ) F mul + 5 ( d − 1 ) F inv Verifier 验证最后的编码 π 0 \pi_0 π 0 是否正确 π 0 = ? e n c 0 ( h ( 1 ) ( α 0 ) e q ~ ( ( α 0 , … , α d − 1 ) , u ) ) \pi_0 \overset{?}{=} \mathsf{enc}_0\left(\frac{h^{(1)}(\alpha_0)}{\tilde{eq}((\alpha_0,\ldots,\alpha_{d-1}), \mathbf{u})}\right) π 0 = ? enc 0 ( e q ~ (( α 0 , … , α d − 1 ) , u ) h ( 1 ) ( α 0 ) ) 计算 e q ~ ( ( α 0 , … , α d − 1 ) , u ) \tilde{eq}((\alpha_0,\ldots,\alpha_{d-1}), \mathbf{u}) e q ~ (( α 0 , … , α d − 1 ) , u ) , e q ~ ( ( α 0 , … , α d − 1 ) , u ) = ∏ i = 0 d − 1 ( ( 1 − α i ) ( 1 − u i ) + α i u i ) \tilde{eq}((\alpha_0,\ldots,\alpha_{d-1}), \mathbf{u}) = \prod_{i = 0}^{d- 1} \big( (1 - \alpha_i)(1 - u_i) + \alpha_i u_i\big) e q ~ (( α 0 , … , α d − 1 ) , u ) = i = 0 ∏ d − 1 ( ( 1 − α i ) ( 1 − u i ) + α i u i ) 每一项 ( 1 − α i ) ( 1 − u i ) + α i u i (1 - \alpha_i)(1 - u_i) + \alpha_i u_i ( 1 − α i ) ( 1 − u i ) + α i u i 计算量是 2 F m u l 2 ~\mathbb{F}_{\mathsf{mul}} 2 F mul ,计算这 d d d 项的复杂度为 2 d F m u l 2d ~\mathbb{F}_{\mathsf{mul}} 2 d F mul ,最后有 d d d 个数相乘,总复杂度为
2 d F m u l + ( d − 1 ) F m u l = ( 3 d − 1 ) F m u l 2d ~\mathbb{F}_{\mathsf{mul}} + (d - 1) ~\mathbb{F}_{\mathsf{mul}} = (3d - 1) ~\mathbb{F}_{\mathsf{mul}} 2 d F mul + ( d − 1 ) F mul = ( 3 d − 1 ) F mul [!bug]
代码中 Verifier 计算 e q ~ ( ( α 0 , … , α d − 1 ) , u ) \tilde{eq}((\alpha_0,\ldots,\alpha_{d-1}), \mathbf{u}) e q ~ (( α 0 , … , α d − 1 ) , u ) 的方式可以进行更改。
eq_evals = MLEPolynomial.eqs_over_hypercube(us)
for i in range(k):
alpha = challenge_vec[i]
eq_low = eq_evals[:half]
eq_high = eq_evals[half:]
if debug: print("eq_low={}, eq_high={}".format(eq_low, eq_high))
eq_evals = [(1-alpha) * eq_low[i] + alpha * eq_high[i] for i in range(half)]
# check f(alpha_vec)
f_eval_at_random = sumcheck_sum/eq_evals[0]
这种计算方式的复杂度为 O ( N ) O(N) O ( N )
可以改为使用连乘的计算方式,复杂度为 O ( d ) O(d) O ( d ) 。
# use another way to compute eq_evals[0]
challenge_vec_test = challenge_vec[::-1]
print(f"challenge_vec_test = {challenge_vec_test}")
eq_evals_test = 1
for i in range(k):
eq_evals_test *= (1 - challenge_vec_test[i]) * (1 - us[i]) + challenge_vec_test[i] * us[i]
print(f"eq_evals_test = {eq_evals_test}")
Verifier 自己计算 h ( 1 ) ( α 0 ) h^{(1)}(\alpha_0) h ( 1 ) ( α 0 ) 复杂度分析与上面类似,为
9 F m u l + 5 F i n v 9 ~ \mathbb{F}_{\mathsf{mul}} + 5 ~ \mathbb{F}_{\mathsf{inv}} 9 F mul + 5 F inv 计算 h ( 1 ) ( α 0 ) e q ~ ( ( α 0 , … , α d − 1 ) , u ) \frac{h^{(1)}(\alpha_0)}{\tilde{eq}((\alpha_0,\ldots,\alpha_{d-1}), \mathbf{u})} e q ~ (( α 0 , … , α d − 1 ) , u ) h ( 1 ) ( α 0 ) ,涉及有限域中的求逆和相乘操作,复杂度为 F m u l + F i n v \mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{inv}} F mul + F inv 。
计算编码
e n c 0 ( h ( 1 ) ( α 0 ) e q ~ ( ( α 0 , … , α d − 1 ) , u ) ) \mathsf{enc}_0\left(\frac{h^{(1)}(\alpha_0)}{\tilde{eq}((\alpha_0,\ldots,\alpha_{d-1}), \mathbf{u})}\right) enc 0 ( e q ~ (( α 0 , … , α d − 1 ) , u ) h ( 1 ) ( α 0 ) ) # check f(alpha_vec)
f_eval_at_random = sumcheck_sum/eq_evals[0]
if debug: print("f_eval_at_random={}".format(f_eval_at_random))
if debug: print("rs_encode([f_eval_at_random], k0=1, c=blowup_factor)=", rs_encode([f_eval_at_random], k0=1, c=blowup_factor))
assert rs_encode([f_eval_at_random], k0=1, c=blowup_factor) == f_code_folded, "❌: Encode(f(rs)) != f_code_0"
其实这里已经是常数多项式了,因此编码后也是 R \mathcal{R} R 个常数,不涉及 Verifier 的计算消耗。
Verifier Cost ¶ 汇总 verifier 的计算量为
l ⋅ ∑ i = 1 d M T V ( i + log R ) + 5 d l F m u l + 2 d l F i n v + 9 ( d − 1 ) F m u l + 5 ( d − 1 ) F i n v + ( 3 d − 1 ) F m u l + 9 F m u l + 5 F i n v + F m u l + F i n v = l ⋅ ∑ i = 1 d M T V ( i + log R ) + ( 5 d l + 12 d ) F m u l + ( 2 d l + 5 d + 1 ) F i n v = l ⋅ ∑ i = 1 d ( i + log R ) H + ( 5 d l + 12 d ) F m u l + ( 2 d l + 5 d + 1 ) F i n v = l ⋅ ( d ( d + 1 ) 2 + d ⋅ log R ) H + ( 5 d l + 12 d ) F m u l + ( 2 d l + 5 d + 1 ) F i n v = ( l 2 ⋅ d 2 + ( l log R + l 2 ) d ) H + ( 5 l + 12 ) d F m u l + ( ( 2 l + 5 ) d + 1 ) F i n v \begin{aligned}
& l \cdot\sum_{i = 1}^{d}\mathsf{MTV}(i + \log \mathcal{R}) + 5dl ~ \mathbb{F}_{\mathsf{mul}} + 2dl~\mathbb{F}_{\mathsf{inv}} \\
& \quad + 9(d - 1) ~ \mathbb{F}_{\mathsf{mul}} + 5(d - 1) ~ \mathbb{F}_{\mathsf{inv}} \\
& \quad + (3 d - 1) ~ \mathbb{F}_{\mathsf{mul}} + 9 ~ \mathbb{F}_{\mathsf{mul}} + 5 ~ \mathbb{F}_{\mathsf{inv}} + \mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{inv}} \\
= & l \cdot\sum_{i = 1}^{d}\mathsf{MTV}(i + \log \mathcal{R}) + (5dl + 12d) ~ \mathbb{F}_{\mathsf{mul}} + (2dl + 5d + 1) ~ \mathbb{F}_{\mathsf{inv}} \\
= & l \cdot\sum_{i = 1}^{d}(i + \log \mathcal{R}) ~ H + (5dl + 12d) ~ \mathbb{F}_{\mathsf{mul}} + (2dl + 5d + 1) ~ \mathbb{F}_{\mathsf{inv}} \\
= & l \cdot \left(\frac{d (d + 1)}{2} + d \cdot \log \mathcal{R} \right) ~ H + (5dl + 12d) ~ \mathbb{F}_{\mathsf{mul}} + (2dl + 5d + 1) ~ \mathbb{F}_{\mathsf{inv}} \\
= & \left( \frac{l}{2} \cdot d^2 + (l\log \mathcal{R} + \frac{l}{2})d \right) ~ H + (5l + 12)d ~ \mathbb{F}_{\mathsf{mul}} + ((2l + 5)d + 1) ~ \mathbb{F}_{\mathsf{inv}}
\end{aligned} = = = = l ⋅ i = 1 ∑ d MTV ( i + log R ) + 5 d l F mul + 2 d l F inv + 9 ( d − 1 ) F mul + 5 ( d − 1 ) F inv + ( 3 d − 1 ) F mul + 9 F mul + 5 F inv + F mul + F inv l ⋅ i = 1 ∑ d MTV ( i + log R ) + ( 5 d l + 12 d ) F mul + ( 2 d l + 5 d + 1 ) F inv l ⋅ i = 1 ∑ d ( i + log R ) H + ( 5 d l + 12 d ) F mul + ( 2 d l + 5 d + 1 ) F inv l ⋅ ( 2 d ( d + 1 ) + d ⋅ log R ) H + ( 5 d l + 12 d ) F mul + ( 2 d l + 5 d + 1 ) F inv ( 2 l ⋅ d 2 + ( l log R + 2 l ) d ) H + ( 5 l + 12 ) d F mul + (( 2 l + 5 ) d + 1 ) F inv Prover’s cost:
( ( 5 2 R + 9 ) ⋅ N + 3 d − 5 2 R − 13 ) F m u l + ( R ⋅ N − R ) F i n v + ∑ i = 1 d − 1 M T . c o m m i t ( 2 i ⋅ R ) \begin{aligned}
\left((\frac{5}{2} \mathcal{R} + 9) \cdot N + 3d - \frac{5}{2} \mathcal{R} - 13 \right) ~ \mathbb{F}_{\mathsf{mul}} + (\mathcal{R} \cdot N - \mathcal{R}) ~ \mathbb{F}_{\mathsf{inv}} + \sum_{i = 1}^{d - 1} \mathsf{MT.commit}(2^{i} \cdot \mathcal{R})
\end{aligned} ( ( 2 5 R + 9 ) ⋅ N + 3 d − 2 5 R − 13 ) F mul + ( R ⋅ N − R ) F inv + i = 1 ∑ d − 1 MT.commit ( 2 i ⋅ R ) 若加上 Prover 计算编码 π d \pi_d π d 的算法复杂度,则总复杂度为
( R 2 ⋅ d N + ( 5 2 R + 9 ) ⋅ N + 3 d − 5 2 R − 13 ) F m u l + ( R ⋅ N − R ) F i n v + ∑ i = 1 d − 1 M T . c o m m i t ( 2 i ⋅ R ) \left(\frac{\mathcal{R}}{2} \cdot dN + (\frac{5}{2} \mathcal{R} + 9) \cdot N + 3d - \frac{5}{2} \mathcal{R} - 13 \right) ~ \mathbb{F}_{\mathsf{mul}} + (\mathcal{R} \cdot N - \mathcal{R}) ~ \mathbb{F}_{\mathsf{inv}} + \sum_{i = 1}^{d - 1} \mathsf{MT.commit}(2^{i} \cdot \mathcal{R}) ( 2 R ⋅ d N + ( 2 5 R + 9 ) ⋅ N + 3 d − 2 5 R − 13 ) F mul + ( R ⋅ N − R ) F inv + i = 1 ∑ d − 1 MT.commit ( 2 i ⋅ R ) Proof size:
( ( 2 l + 3 ) d + R ) F + ( l 2 ⋅ d 2 + ( log R ⋅ l + 1 2 ⋅ l + 1 ) ⋅ d ) H \begin{align}
((2l + 3)d + \mathcal{R}) ~ \mathbb{F} + \left( \frac{l}{2} \cdot d^2 + \left(\log \mathcal{R} \cdot l +\frac{1}{2} \cdot l + 1\right) \cdot d \right) ~ H
\end{align} (( 2 l + 3 ) d + R ) F + ( 2 l ⋅ d 2 + ( log R ⋅ l + 2 1 ⋅ l + 1 ) ⋅ d ) H Verifier’s cost:
( l 2 ⋅ d 2 + ( l log R + l 2 ) d ) H + ( 5 l + 12 ) d F m u l + ( ( 2 l + 5 ) d + 1 ) F i n v \begin{align}
\left( \frac{l}{2} \cdot d^2 + (l\log \mathcal{R} + \frac{l}{2})d \right) ~ H + (5l + 12)d ~ \mathbb{F}_{\mathsf{mul}} + ((2l + 5)d + 1) ~ \mathbb{F}_{\mathsf{inv}}
\end{align} ( 2 l ⋅ d 2 + ( l log R + 2 l ) d ) H + ( 5 l + 12 ) d F mul + (( 2 l + 5 ) d + 1 ) F inv