Skip to article frontmatterSkip to article content

PH23 协议复杂度分析

PH23+KZG10 协议(优化版)协议描述文档:PH23+KZG10 Protocol (Optimized Version)

对于 KZG10 协议,因为其 Commitment 具有加法同态性。

Precomputation

  1. 预计算 s0(X),,sn1(X)s_0(X),\ldots, s_{n-1}(X) 以及 vH(X)v_H(X)
vH(X)=XN1v_H(X) = X^N -1
si(X)=vH(X)vHi(X)=XN1X2i1s_i(X) = \frac{v_H(X)}{v_{H_i}(X)} = \frac{X^N-1}{X^{2^i}-1}
  1. 预计算 D=(1,ω,ω2,,ω2n1)D=(1, \omega, \omega^2, \ldots, \omega^{2^{n-1}}) 上的 Bary-Centric Weights {w^i}\{\hat{w}_i\}。这个可以加速
w^j=lj1ω2jω2l\hat{w}_j = \prod_{l\neq j} \frac{1}{\omega^{2^j} - \omega^{2^l}}
  1. 预计算 Lagrange Basis 的 KZG10 SRS A0=[L0(τ)]1,A1=[L1(τ)]1,A2=[L2(τ)]1,,AN1=[L2n1(τ)]1A_0 =[L_0(\tau)]_1, A_1= [L_1(\tau)]_1, A_2=[L_2(\tau)]_1, \ldots, A_{N-1} = [L_{2^{n-1}}(\tau)]_1

Common inputs

  1. Ca=[f^(τ)]1C_a=[\hat{f}(\tau)]_1: the (uni-variate) commitment of f~(X0,X1,,Xn1)\tilde{f}(X_0, X_1, \ldots, X_{n-1})
  2. u=(u0,u1,,un1)\vec{u}=(u_0, u_1, \ldots, u_{n-1}): 求值点
  3. v=f~(u0,u1,,un1)v=\tilde{f}(u_0,u_1,\ldots, u_{n-1}): MLE 多项式 f~\tilde{f}X=u\vec{X}=\vec{u} 处的运算值

Commit 计算过程

  1. Prover 构造一元多项式 a(X)a(X),使其 Evaluation form 等于 a=(a0,a1,,aN1)\vec{a}=(a_0, a_1, \ldots, a_{N-1}),其中 ai=f~(bits(i))a_i = \tilde{f}(\mathsf{bits}(i)), 为 f~\tilde{f} 在 Boolean Hypercube {0,1}n\{0,1\}^n 上的取值。
a(X)=a0L0(X)+a1L1(X)+a2L2(X)++aN1LN1(X)a(X) = a_0\cdot L_0(X) + a_1\cdot L_1(X) + a_2\cdot L_2(X) + \cdots + a_{N-1}\cdot L_{N-1}(X)

Prover: 这一步 Prover 不需要求出系数式,直接用 evaluation form 进行计算,不涉及计算复杂度。

  1. Prover 计算 f^(X)\hat{f}(X) 的承诺 CaC_a,并发送 CaC_a
Ca=a0A0+a1A1+a2A2++aN1AN1=[f^(τ)]1C_{a} = a_0\cdot A_0 + a_1\cdot A_1 + a_2\cdot A_2 + \cdots + a_{N-1}\cdot A_{N-1} = [\hat{f}(\tau)]_1

其中 A0=[L0(τ)]1,A1=[L1(τ)]1,A2=[L2(τ)]1,,AN1=[L2n1(τ)]1A_0 =[L_0(\tau)]_1, A_1= [L_1(\tau)]_1, A_2=[L_2(\tau)]_1, \ldots, A_{N-1} = [L_{2^{n-1}}(\tau)]_1 ,在预计算过程中已经得到。

Prover: 算法复杂度为 msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1) ,表示 NN 长的向量的承诺。

Commit 阶段复杂度

在 commit 阶段 prover 的复杂度总计为:

>msm(N,G1)>> \mathsf{msm}(N, \mathbb{G}_1) >

Evaluation 证明协议

回忆下证明的多项式运算的约束:

f~(u0,u1,u2,,un1)=v\tilde{f}(u_0, u_1, u_2, \ldots, u_{n-1}) = v

这里 u=(u0,u1,u2,,un1)\vec{u}=(u_0, u_1, u_2, \ldots, u_{n-1}) 是一个公开的挑战点。

Prover Memory

Round 1.

Prover:

Round 1-1

  1. 计算向量 c\vec{c},其中每个元素 ci=eq(bits(i),u)c_i=\overset{\sim}{eq}(\mathsf{bits}(i), \vec{u})
Prover Cost 1-1

Prover:

向量 c\vec{c} 的计算算法为

@classmethod
def eqs_over_hypercube(cls, rs):
    k = len(rs)
    n = 1 << k
    evals = [Field(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

例如 k=2k = 2 ,计算结果应该为

>>00(1u0)(1u1)>10u0(1u1)>01(1u0)u1>11u0u1>>> \begin{aligned} > 00 & \quad (1 - u_0) & (1- u_1) \\ > 10 & \quad u_0 & (1- u_1) \\ > 01 & \quad (1 - u_0) & u_1 \\ > 11 & \quad u_0 & u_1 > \end{aligned} >

这个算法就是先按 u0u_0 所在的二进制位进行计算,接着如果增加一位 u1u_1 ,再更新所有的元素。

  • for j in range(1) 循环内部计算出 evals[1]evals[0]:
    • evals[1] = u0u_0 ,对应 u0u_0 所在的位 1
    • evals[0] = 1u01 - u_0 ,对应 u0u_0 所在的二进制位 0
  • for j in range(2) ,更新 u1u_1 所在的位。
    • j = 0,更新 evals[0]evals[2]
    • j = 1,更新 evals[1]evals[3]

每次循环 for j in range(half) 内部有 1 次有限域上的乘法,即 evals[j+half] = evals[j] * rs[i] ,而 half 的变化为 1,2,22,,2k11, 2, 2^2, \ldots, 2^{k-1} ,因此总共的有限域乘法个数为:

>1+2+22++2k1=1(12k)12=2k1=N1>> 1 + 2 + 2^2 + \ldots + 2^{k - 1} = \frac{1(1 - 2^k)}{1 - 2} = 2^k - 1 = N - 1 >

因此这里的计算复杂度为 (N1) Fmul(N - 1) ~ \mathbb{F}_{\mathsf{mul}}

Prover Memory 1-1

Round 1-2

构造多项式 c(X)c(X),其在 HH 上的运算结果恰好是 c\vec{c}

c(X)=i=0N1ciLi(X)c(X) = \sum_{i=0}^{N-1} c_i \cdot L_i(X)
Prover Cost 1-2

Prover: 这一步不需要计算 c(X)c(X) ,直接拿到 c\vec{c} 进行后续的计算。

Round 1-3

计算 c(X)c(X) 的承诺 Cc=[c(τ)]1C_c= [c(\tau)]_1,并发送 CcC_c

Cc=KZG10.Commit(c)=[c(τ)]1C_c = \mathsf{KZG10.Commit}(\vec{c}) = [c(\tau)]_1
Prover Cost 1-3

CcC_c 的承诺计算方法为

Cc=c0A0+c1A1++cN1AN1C_c = c_0 \cdot A_0 + c_1 \cdot A_1 + \ldots + c_{N - 1} \cdot A_{N - 1}

这里算法复杂度为 msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1)

Prover Cost Round 1

Prover 复杂度为:

>(N1) Fmul+msm(N,G1)>> (N - 1) ~ \mathbb{F}_{\mathsf{mul}} + \mathsf{msm}(N, \mathbb{G}_1) >

Prover Memory Round 1

Round 2.

Verifier: 发送挑战数 α$Fp\alpha\leftarrow_{\$}\mathbb{F}_p

Prover:

Round 2-1

构造关于 c\vec{c} 的约束多项式 p0(X),,pn(X)p_0(X),\ldots, p_{n}(X)

p0(X)=s0(X)(c(X)(1u0)(1u1)...(1un1))pk(X)=sk1(X)(unkc(X)(1unk)c(ω2nkX)),k=1n\begin{split} p_0(X) &= s_0(X) \cdot \Big( c(X) - (1-u_0)(1-u_1)...(1-u_{n-1}) \Big) \\ p_k(X) &= s_{k-1}(X) \cdot \Big( u_{n-k}\cdot c(X) - (1-u_{n-k})\cdot c(\omega^{2^{n-k}}\cdot X)\Big) , \quad k=1\ldots n \end{split}
Prover Cost 2-1

📝 笔记:先介绍一般如何快速的做有限域上的多项式乘法和除法,不妨设

H={g0,g1,,g2N1}=gH' = \{g^0, g^1, \ldots, g^{2N - 1}\} = \langle g \rangle

>H=g2=ω={ω0,ω1,,ωN1}>>H = \langle g^2 \rangle = \langle \omega \rangle = \{\omega^0, \omega^1, \ldots, \omega^{N - 1} \} >

>gH={gω0,gω1,,gωN1}={g1,g3,,g2N1}>>gH = \{g\omega^0, g\omega^1, \ldots, g\omega^{N - 1} \} =\{ g^1, g^3, \ldots, g^{2N - 1} \} >

若要计算

>a(X)=a1+a2X++aN1XN1>>a(X) = a_1 + a_2 X + \ldots + a_{N - 1}X^{N - 1} >

>b(X)=b1+b2X++bN1XN1>>b(X) = b_1 + b_2 X + \ldots + b_{N - 1}X^{N - 1} >

的乘积多项式 c(X)=a(X)b(X)c(X) = a(X)\cdot b(X) 。若我们拥有的是 a(X)a(X)b(X)b(X)HH 上的 evaluation form,即

[a(x)xH],[b(x)xH][a(x)|_{x \in H}], \quad [b(x)|_{x \in H}]

我们想要计算的是商多项式

>q(X)=a(X)b(X)zH(X)>>q(X) = \frac{a(X) \cdot b(X)}{z_H(X)} >

由于 deg(q)<N\deg(q) < N ,因此存储 q(X)q(X) 依然可以用 evaluation form ,由于 zH(X)z_H(X)HH 上都为 0 ,因此我们可以分别求出

>[(a(x)b(x))xgH],[zH(x)xgH]>>[(a(x) \cdot b(x))|_{x \in gH}], \quad [z_H(x)|_{x \in gH}] >

再对位相除计算出 [q(x)xgH][q(x)|_{x \in gH}]

  • 计算得到 [a(x))xgH][a(x))|_{x \in gH}] : 先对 [a(x)xH][a(x)|_{x \in H}] 做一次 IFFT 得到 a(X)a(X) 的系数,再做一次 FFT 计算得到其在 gHgH 上的值。这里实际实现时可以同步进行计算,不过复杂度应该没有变化,为 NlogN FmulN \log N ~ \mathbb{F}_{\mathsf{mul}} ,也记为 FFT(N)+IFFT(N)\mathsf{FFT}(N) + \mathsf{IFFT}(N)
  • 计算得到 [b(x))xgH][b(x))|_{x \in gH}] : 先对 [b(x)xH][b(x)|_{x \in H}] 做一次 IFFT 得到 b(X)b(X) 的系数,再做一次 FFT 计算得到其在 gHgH 上的值。这一步复杂度为 FFT(N)+IFFT(N)\mathsf{FFT}(N) + \mathsf{IFFT}(N) ,即 NlogN FmulN \log N ~ \mathbb{F}_{\mathsf{mul}}
  • 先计算 [(a(x)b(x))xgH][(a(x) \cdot b(x))|_{x \in gH}] : NN 个元素相乘,复杂度为 N FmulN ~ \mathbb{F}_{\mathsf{mul}}
  • 计算 [zH(x)xgH][z_H(x)|_{x \in gH}] : 由于 zH(X)=XN1z_H(X) = X^N - 1 ,因此
    zH(x)=zH(gωi)=(gωi)N1=gN(ωN)i1=gN1z_H(x) = z_H(g\omega^i) = (g\omega^i)^N - 1 = g^N \cdot (\omega^N)^i - 1 = g^N - 1
    zH(X)z_H(X)gHgH 上的值始终是一个常数,那么其逆 (gN1)1(g^N - 1)^{-1} 也可以提前计算好。这一步不涉及 Prover 的复杂度。
  • 计算 [q(x)xgH][q(x)|_{x \in gH}] :用 [(a(x)b(x))xgH][(a(x) \cdot b(x))|_{x \in gH}] 的值分别乘以 (gN1)1(g^N - 1)^{-1} 就能得到 [q(x)xgH][q(x)|_{x \in gH}] ,复杂度为 N FmulN ~ \mathbb{F}_{\mathsf{mul}}

因此整体计算除法的复杂度为

>2 FFT(N)+2 IFFT(N)+2N Fmul>> 2~ \mathsf{FFT}(N) + 2~\mathsf{IFFT}(N) + 2N ~ \mathbb{F}_{\mathsf{mul}} >

现在分析算法复杂度。Prover 要计算出 [pi(x)xgH][p_i(x)|_{x \in gH}] ,便于后续计算商多项式的 evaluation form。

  1. prover 计算 [s0(x)xgH],[s1(x)xgH],,[sn1(x)xgH][s_0(x)|_{x \in gH}], [s_1(x)|_{x \in gH}], \ldots, [s_{n - 1}(x)|_{x \in gH}] 。可以以一个 O(n)O(n) 的算法得到任意一个点 s0(x),,sn1(x)s_0(x), \ldots, s_{n - 1}(x) 的值,具体计算方法如 Round 3 所示,复杂度为 (n1) Fmul(n - 1) ~ \mathbb{F}_{\mathsf{mul}} 。由于 gH=N|gH| = N ,因此求出所有在 gHgH 上的值的复杂度为 (n1)N Fmul(n - 1)N ~ \mathbb{F}_{\mathsf{mul}}
  2. 计算得到 [c(x)xgH][c(x)|_{x \in gH}] ,对 [c(x)xH][c(x)|_{x \in H}] 先用 IFFT 得到其系数,再用 FFT 求其在 gHgH 上的值,复杂度为 FFT(N)+IFFT(N)\mathsf{FFT}(N) + \mathsf{IFFT}(N)
  3. 计算 [(c(x)(1u0)(1u1)(1un1))xgH][(c(x) - (1 - u_0)(1 - u_1) \ldots (1 - u_{n - 1}))|_{x \in gH}](1u0)(1u1)(1un1)(1 - u_0)(1 - u_1) \ldots (1 - u_{n - 1}) 其实就是 c0c_0 ,这里直接相减进行计算就行。
  4. 计算 [p0(x)xgH][p_0(x)|_{x \in gH}] ,涉及 NN 个数相乘,复杂度为 N FmulN ~ \mathbb{F}_{\mathsf{mul}}
  5. 对于 k=1,,nk = 1, \ldots, n ,计算 [(unkc(x)(1unk)c(ω2nkx))xgH][( u_{n-k}\cdot c(x) - (1-u_{n-k})\cdot c(\omega^{2^{n-k}}\cdot x))|_{x \in gH}] :对每一个 kkxgHx \in gH ,每次涉及 2 次有限域的乘法,因此计算所有 kk 对应的值的复杂度为 2nN Fmul2nN ~ \mathbb{F}_{\mathsf{mul}}
  6. 对于 k=1,,nk = 1, \ldots, n ,计算 [pk(x)xgH][p_k(x)|_{x \in gH}] ,对每一个 kk ,涉及 NN 个数相乘,因此总复杂度为 nN FmulnN ~ \mathbb{F}_{\mathsf{mul}}

总结下这一步的总复杂度为

(n1)N Fmul+FFT(N)+IFFT(N)+N Fmul+3nN Fmul=FFT(N)+IFFT(N)+4nN Fmul\begin{aligned} & (n - 1)N ~ \mathbb{F}_{\mathsf{mul}} + \mathsf{FFT}(N) + \mathsf{IFFT}(N) + N ~ \mathbb{F}_{\mathsf{mul}} + 3nN ~ \mathbb{F}_{\mathsf{mul}} \\ = & \mathsf{FFT}(N) + \mathsf{IFFT}(N) + 4nN ~ \mathbb{F}_{\mathsf{mul}} \end{aligned}
Prover Memory 2-1

Round 2-2

{pi(X)}\{p_i(X)\} 聚合为一个多项式 p(X)p(X)

p(X)=p0(X)+αp1(X)+α2p2(X)++αnpn(X)p(X) = p_0(X) + \alpha\cdot p_1(X) + \alpha^2\cdot p_2(X) + \cdots + \alpha^{n}\cdot p_{n}(X)
Prover Cost 2-2

这一步其实算的并不是多项式的系数,而是中间计算出 [p(x)xgH][p(x)|_{x \in gH}]

  1. prover 由 α\alpha 计算得到 α2,α3,,αn\alpha^2, \alpha^3, \ldots, \alpha^n ,总共有 n1n - 1 次有限域上的乘法,因此复杂度是 (n1) Fmul(n - 1) ~ \mathbb{F}_{\mathsf{mul}}
  2. 对每一个 xgHx \in gH ,直接计算
p(x)=p0(x)+αp1(x)+α2p2(x)++αnpn(x)p(x) = p_0(x) + \alpha\cdot p_1(x) + \alpha^2\cdot p_2(x) + \cdots + \alpha^{n}\cdot p_{n}(x)

涉及有限域乘法为 nn 个,总共有 gH=N|gH| = Nxx ,因此复杂度为 nN FmulnN ~ \mathbb{F}_{\mathsf{mul}}

总结下这一步的复杂度为

(nN+n1) Fmul(nN + n - 1) ~ \mathbb{F}_{\mathsf{mul}}
Prover Memory 2-2

Round 2-3

构造累加多项式 z(X)z(X),满足

z(1)=a0c0z(ωi)z(ωi1)=a(ωi)c(ωi),i=1,,N1z(ωN1)=v\begin{split} z(1) &= a_0\cdot c_0 \\ z(\omega_{i}) - z(\omega_{i-1}) &= a(\omega_{i})\cdot c(\omega_{i}), \quad i=1,\ldots, N-1 \\ z(\omega^{N-1}) &= v \\ \end{split}
Prover Cost 2-3

前面已经得到了 [a(x)xH][a(x)|_{x \in H}] 以及 [c(x)xH][c(x)|_{x \in H}] ,得到 [z(x)xH][z(x)|_{x \in H}] 就比较好计算了。

z(1)=a0c0z(ω1)=z(1)+a(ω1)c(ω1)z(ωN1)=z(ωN2)+a(ωN1)c(ωN1)z(ωN1)=v\begin{aligned} & z(1) = a_0 \cdot c_0 \\ & z(\omega_1) = z(1) + a(\omega_1) \cdot c(\omega_1) \\ & \cdots \\ & z(\omega_{N - 1}) = z(\omega_{N - 2}) + a(\omega_{N - 1}) \cdot c(\omega_{N - 1}) \\ & z(\omega^{N - 1}) = v \end{aligned}

涉及的复杂度为 N FmulN ~ \mathbb{F}_{\mathsf{mul}}

Prover Memory 2-3

Round 2-4

构造约束多项式 h0(X),h1(X),h2(X)h_0(X), h_1(X), h_2(X),满足

h0(X)=L0(X)(z(X)c0a(X))h1(X)=(X1)(z(X)z(ω1X)a(X)c(X))h2(X)=LN1(X)(z(X)v)\begin{split} h_0(X) &= L_0(X)\cdot\big(z(X) - c_0\cdot a(X) \big) \\ h_1(X) &= (X-1)\cdot\big(z(X)-z(\omega^{-1}\cdot X)-a(X)\cdot c(X)) \\ h_2(X) & = L_{N-1}(X)\cdot\big( z(X) - v \big) \\ \end{split}
Prover Cost 2-4

要计算出 [h0(x)xgH],[h1(x)xgH],[h2(x)xgH][h_0(x)|_{x \in gH}], [h_1(x)|_{x \in gH}], [h_2(x)|_{x \in gH}]

2 FFT(N)+2 IFFT(N)+5N Fmul2~ \mathsf{FFT}(N) + 2~ \mathsf{IFFT}(N) + 5N ~ \mathbb{F}_{\mathsf{mul}}
Prover Memory 2-4

这一轮增加 [h0(x)xgH],[h1(x)xgH],[h2(x)xgH][h_0(x)|_{x \in gH}], [h_1(x)|_{x \in gH}], [h_2(x)|_{x \in gH}]

Round 2-5

p(X)p(X)h0(X),h1(X),h2(X)h_0(X), h_1(X), h_2(X) 聚合为一个多项式 h(X)h(X),满足

h(X)=p(X)+αn+1h0(X)+αn+2h1(X)+αn+3h2(X)\begin{split} h(X) &= p(X) + \alpha^{n+1} \cdot h_0(X) + \alpha^{n+2} \cdot h_1(X) + \alpha^{n+3} \cdot h_2(X) \end{split}
Prover Cost 2-5

这一轮计算 [h(x)xgH][h(x)_{x \in gH}]

Prover Memory 2-5

Round 2-6

计算 Quotient 多项式 t(X)t(X),满足

h(X)=t(X)vH(X)h(X) =t(X)\cdot v_H(X)
Prover Cost 2-6

计算出 [t(x)xgH][t(x)|_{x \in gH}] ,对于 xgH\forall x \in gH

t(x)=h(x)(vH(x))1=h(x)(gN1)1t(x) = h(x) \cdot (v_H(x))^{-1} = h(x) \cdot (g^N - 1)^{-1}

复杂度为 N FmulN ~ \mathbb{F}_{\mathsf{mul}}

Prover Memory 2-6

Round 2-7

计算 Ct=[t(τ)]1C_t=[t(\tau)]_1Cz=[z(τ)]1C_z=[z(\tau)]_1,并发送 CtC_tCzC_z

Ct=KZG10.Commit(t(X))=[t(τ)]1Cz=KZG10.Commit(z(X))=[z(τ)]1\begin{split} C_t &= \mathsf{KZG10.Commit}(t(X)) = [t(\tau)]_1 \\ C_z &= \mathsf{KZG10.Commit}(z(X)) = [z(\tau)]_1 \end{split}
Prover Cost 2-7

计算 CtC_t

Ct=t0A0++tN1AN1C_t = t_0 A_0 + \ldots + t_{N - 1}A_{N - 1}

复杂度为 msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1)

计算 CzC_z: msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1)

因此这一步的总复杂度为

FFT(N)+IFFT(N)+2 msm(N,G1)\mathsf{FFT}(N) + \mathsf{IFFT}(N) + 2 ~ \mathsf{msm}(N, \mathbb{G}_1)

💡 Option

如果在不考虑内存的情况下,内存中可以提前存好另一组 KZG10 的 SRS,B0=[L0(τ)]1,B1=[L1(τ)]1,B2=[L2(τ)]1,,BN1=[L2n1(τ)]1B_0 =[L'_0(\tau)]_1, B_1= [L'_1(\tau)]_1, B_2=[L'_2(\tau)]_1, \ldots, B_{N-1} = [L'_{2^{n} - 1}(\tau)]_1 ,其中 L0,,LN1L_0', \ldots, L_{N - 1}' 是在 gHgH 上的 Lagrange 插值多项式。

  • 计算 CtC_t

    Ct=t0B0++tN1BN1C_t = t_0 B_0 + \ldots + t_{N - 1}B_{N - 1}

    其中 [t0,,tN1][t_0, \ldots, t_{N-1}] 就是 [t(x)xgH][t(x)|_{x \in gH}] 。那么这一步的复杂度为 msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1)

  • 计算 CzC_z: msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1)

总复杂度为

2 msm(N,G1)2 ~ \mathsf{msm}(N, \mathbb{G}_1)

这种方案会少一次 FFT 和一次 IFFT,节省 NlogN FmulN \log N ~ \mathbb{F}_{\mathsf{mul}} 的计算。

Prover Cost Round 2

汇总上面所有步骤的 Prover 计算复杂度

FFT(N)+IFFT(N)+4nN Fmul+(nN+n1) Fmul+N Fmul+2 FFT(N)+2 IFFT(N)+5N Fmul+(3N+3) Fmul+N Fmul+FFT(N)+IFFT(N)+2 msm(N,G1)=4 FFT(N)+4 IFFT(N)+(5nN+10N+n+2) Fmul+2 msm(N,G1)\begin{aligned} & \mathsf{FFT}(N) + \mathsf{IFFT}(N) + 4nN ~ \mathbb{F}_{\mathsf{mul}} + (nN + n - 1) ~ \mathbb{F}_{\mathsf{mul}} + N ~ \mathbb{F}_{\mathsf{mul}} + 2~ \mathsf{FFT}(N) + 2~ \mathsf{IFFT}(N) + 5N ~ \mathbb{F}_{\mathsf{mul}} \\ & + (3N + 3) ~ \mathbb{F}_{\mathsf{mul}} + N ~ \mathbb{F}_{\mathsf{mul}} + \mathsf{FFT}(N) + \mathsf{IFFT}(N) + 2 ~ \mathsf{msm}(N, \mathbb{G}_1) \\ = & 4 ~ \mathsf{FFT}(N) + 4 ~ \mathsf{IFFT}(N) + (5nN + 10N + n + 2) ~ \mathbb{F}_{\mathsf{mul}} + 2 ~ \mathsf{msm}(N, \mathbb{G}_1) \end{aligned}

Round 3.

Verifier: 发送随机求值点 ζ$Fp\zeta\leftarrow_{\$}\mathbb{F}_p

Prover:

Round 3-1

  1. 计算 si(X)s_i(X)ζ\zeta 处的取值:
s0(ζ),s1(ζ),,sn1(ζ)s_0(\zeta), s_1(\zeta), \ldots, s_{n-1}(\zeta)
Prover Cost 3-1

这里 Prover 可以高效计算 si(ζ)s_i(\zeta) ,由 si(X)s_i(X) 的公式得

si(ζ)=ζN1ζ2i1=(ζN1)(ζ2i+1)(ζ2i1)(ζ2i+1)=ζN1ζ2i+11(ζ2i+1)=si+1(ζ)(ζ2i+1)\begin{aligned} s_i(\zeta) & = \frac{\zeta^N - 1}{\zeta^{2^i} - 1} \\ & = \frac{(\zeta^N - 1)(\zeta^{2^i} +1)}{(\zeta^{2^i} - 1)(\zeta^{2^i} +1)} \\ & = \frac{\zeta^N - 1}{\zeta^{2^{i + 1}} - 1} \cdot (\zeta^{2^i} +1) \\ & = s_{i + 1}(\zeta) \cdot (\zeta^{2^i} +1) \end{aligned}

因此 si(ζ)s_i(\zeta) 的值可以通过 si+1(ζ)s_{i + 1}(\zeta) 计算得到,而

sn1(ζ)=ζN1ζ2n11=ζ2n1+1s_{n-1}(\zeta) = \frac{\zeta^N - 1}{\zeta^{2^{n-1}} - 1} = \zeta^{2^{n-1}} + 1

因此可以得到一个 O(n)O(n) 的算法来计算 si(ζ)s_i(\zeta) ,并且这里不含除法运算。计算过程是:sn1(ζ)sn2(ζ)s0(ζ)s_{n-1}(\zeta) \rightarrow s_{n-2}(\zeta) \rightarrow \cdots \rightarrow s_0(\zeta)

  • 可以先由随机数 ζ\zeta 计算出 ζ2,ζ4,,ζ2n1\zeta^2, \zeta^4, \ldots, \zeta^{2^{n - 1}} 次,这里由 ζ2=ζ×ζ\zeta^2 = \zeta \times \zeta 需要一次有限域乘法,接着 ζ4=ζ2×ζ2\zeta^4 = \zeta^2 \times \zeta^2 ,需要一次有限域乘法,以此类推得到所有这些值,每次需要一次有限域乘法,总共会涉及 n1n - 1 次有限域乘法,复杂度为 (n1) Fmul(n - 1) ~ \mathbb{F}_{\mathsf{mul}}
  • 计算得到 sn1(ζ)=ζ2n1+1s_{n-1}(\zeta) = \zeta^{2^{n-1}} + 1 ,这里只涉及有限域的加法,不计入复杂度中。
  • 计算 si(ζ)(i=0,,n2)s_{i}(\zeta) (i = 0, \ldots, n - 2)si(ζ)=si+1(ζ)(ζ2i+1)s_{i}(\zeta) = s_{i + 1}(\zeta) \cdot (\zeta^{2^i} +1) 这里需要一次有限域乘法,因此需要的有限域乘法操作为 Fmul\mathbb{F}_{\mathsf{mul}} ,取遍 i=0,,n2i = 0, \ldots, n - 2 ,总复杂度为 (n1) Fmul(n - 1) ~ \mathbb{F}_{\mathsf{mul}}

因此总共的复杂度为

>(n1) Fmul+(n1) Fmul=2(n1) Fmul>> (n - 1) ~ \mathbb{F}_{\mathsf{mul}} + (n - 1) ~ \mathbb{F}_{\mathsf{mul}} = 2(n - 1) ~ \mathbb{F}_{\mathsf{mul}} >

Round 3-2

定义求值 Domain DD',包含 n+1n+1 个元素:

D=Dζ={ζ,ωζ,ω2ζ,ω4ζ,,ω2n1ζ}D'=D\zeta = \{\zeta, \omega\zeta, \omega^2\zeta,\omega^4\zeta, \ldots, \omega^{2^{n-1}}\zeta\}

Round 3-3

计算并发送 c(X)c(X)DD' 上的取值

c(ζ),c(ζω),c(ζω2),c(ζω4),,c(ζω2n1)c(\zeta), c(\zeta\cdot\omega), c(\zeta\cdot\omega^2), c(\zeta\cdot\omega^4), \ldots, c(\zeta\cdot\omega^{2^{n-1}})
Prover Cost 3-3

💡 这里由于多算了很多值,本来只需要在 DD' 上的值,现在算了在 D(2)D^{(2)} 上的值,还有优化的空间。

  • 求在 D’ 上的 sub tree 复杂度为 nlog2nn\log^2n
  • 是否有优化算法

这一步的复杂度为

n Fmul+FFT(N)n ~\mathbb{F}_{\mathsf{mul}} + \mathsf{FFT}(N)

Round 3-4

计算并发送 z(ω1ζ)z(\omega^{-1}\cdot\zeta)

Prover Cost 3-4

在 Round 2-4 已经计算出 z(X)z(X) 的系数式,这里可以直接拿着系数式求 z(X)z(X) 在一点的值。

Prover:

计算 ω1ζ\omega^{-1}\cdot\zeta 复杂度为 Fmul\mathbb{F}_{\mathsf{mul}} ,计算 z(ω1ζ)z(\omega^{-1}\cdot\zeta) 复杂度为 N FmulN ~\mathbb{F}_{\mathsf{mul}} ,总复杂度为:

>(N+1) Fmul>> (N + 1) ~ \mathbb{F}_{\mathsf{mul}} >
Prover Memory 3-4

Round 3-5

计算 Linearized Polynomial lζ(X)l_\zeta(X)

lζ(X)=(s0(ζ)(c(ζ)c0)+αs0(ζ)(un1c(ζ)(1un1)c(ω2n1ζ))+α2s1(ζ)(un2c(ζ)(1un2)c(ω2n2ζ))++αn1sn2(ζ)(u1c(ζ)(1u1)c(ω2ζ))+αnsn1(ζ)(u0c(ζ)(1u0)c(ωζ))+αn+1(L0(ζ)(z(X)c0a(X))+αn+2(ζ1)(z(X)z(ω1ζ)c(ζ)a(X))+αn+3LN1(ζ)(z(X)v)vH(ζ)t(X) )\begin{split} l_\zeta(X) =& \Big(s_0(\zeta) \cdot (c(\zeta) - c_0) \\ & + \alpha\cdot s_0(\zeta) \cdot (u_{n-1}\cdot c(\zeta) - (1-u_{n-1})\cdot c(\omega^{2^{n-1}}\cdot\zeta))\\ & + \alpha^2\cdot s_1(\zeta) \cdot (u_{n-2}\cdot c(\zeta) - (1-u_{n-2})\cdot c(\omega^{2^{n-2}}\cdot\zeta)) \\ & + \cdots \\ & + \alpha^{n-1}\cdot s_{n-2}(\zeta)\cdot (u_{1}\cdot c(\zeta) - (1-u_{1})\cdot c(\omega^2\cdot\zeta))\\ & + \alpha^n\cdot s_{n-1}(\zeta)\cdot (u_{0}\cdot c(\zeta) - (1-u_{0})\cdot c(\omega\cdot\zeta)) \\ & + \alpha^{n+1}\cdot (L_0(\zeta)\cdot\big(z(X) - c_0\cdot a(X))\\ & + \alpha^{n+2}\cdot (\zeta - 1)\cdot\big(z(X)-z(\omega^{-1}\cdot\zeta)-c(\zeta)\cdot a(X) ) \\ & + \alpha^{n+3}\cdot L_{N-1}(\zeta)\cdot(z(X) - v) \\ & - v_H(\zeta)\cdot t(X)\ \Big) \end{split}

显然,lζ(ζ)=0l_\zeta(\zeta)= 0,因此这个运算值不需要发给 Verifier,并且 [lζ(τ)]1[l_\zeta(\tau)]_1 可以由 Verifier 自行构造。

Prover Cost 3-5

计算得到 [lζ(x)xH][l_{\zeta}(x)|_{x \in H}]

这一步的总复杂度为

(12N+4n+2) Fmul(12 N + 4n + 2) ~ \mathbb{F}_{\mathsf{mul}}

Round 3-6

构造多项式 c(X)c^*(X),它是下面向量在 DζD\zeta 上的插值多项式

c=(c(ωζ),c(ω2ζ),c(ω4ζ),,c(ω2n1ζ),c(ζ))\vec{c^*}= \Big(c(\omega\cdot\zeta), c(\omega^2\cdot\zeta), c(\omega^4\cdot\zeta), \ldots, c(\omega^{2^{n-1}}\cdot\zeta), c(\zeta)\Big)

Prover 可以利用事先预计算的 DD 上的 Bary-Centric Weights {w^i}\{\hat{w}_i\} 来快速计算 c(X)c^*(X)

c(X)=c0w^0Xωζ+c1w^1Xω2ζ++cnw^nXω2nζw^0Xωζ+w^1Xω2ζ++w^nXω2nζc^*(X) = \frac{c^*_0 \cdot \frac{\hat{w}_0}{X-\omega\zeta} + c^*_1 \cdot \frac{\hat{w}_1}{X-\omega^{2}\zeta} + \cdots + c^*_n \cdot \frac{\hat{w}_n}{X-\omega^{2^n}\zeta}}{ \frac{\hat{w}_0}{X-\omega\zeta} + \frac{\hat{w}_1}{X-\omega^2\zeta} + \cdots + \frac{\hat{w}_n}{X-\omega^{2^n}\zeta} }

这里 w^j\hat{w}_j 为预计算的值:

w^j=lj1ω2jω2l\hat{w}_j = \prod_{l\neq j} \frac{1}{\omega^{2^j} - \omega^{2^l}}
Prover Cost 3-6

📝 Notes

  • c(X)c(X) 的系数在前面已经计算得到了
  • 这里 c(X)c(X) 计算得到系数式,再求 c\vec{c^*}
  • 这里得到的是 c(X)c^*(X) 的系数式
  • product fast inter
  • c(X)c^*(X) 复杂度为 (n+1)log2(n+1)(n + 1) \log^2(n + 1)

📝 之前的分析过程:

Prover:

  • c\vec{c^*}ω2iζ\omega^{2^i}\zeta 的值在本轮的第 3 步已经计算得到。
  • 计算 w^iXω2iζ\frac{\hat{w}_i}{X-\omega^{2^i}\zeta} ,分子是一个常数,分母是一个一次多项式,复杂度记为 polydiv(0,1)\mathsf{polydiv}(0, 1) ,得到的结果其实是一个分式。
  • 计算 ciw^iXω2iζc_i^* \cdot \frac{\hat{w}_i}{X-\omega^{2^i}\zeta} ,这里将复杂度记为 polymul(0,1)\mathsf{polymul}(0, -1)
  • 最后计算 c(X)c^*(X) ,分子和分母分别通分后,分子分母均为一个次数为 nn 的多项式,因此它们相除的复杂度记为 polydiv(n,n)\mathsf{polydiv}(n, n) ,最后得到的结果 c(X)c^*(X) 次数也为 nn

多项式相加的复杂度只涉及有限域的加法,不做计入,因此这一步 c(X)c^*(X) 的复杂度为

>n polymul(0,1)+n polydiv(0,1)+polydiv(n,n)>> n ~ \mathsf{polymul}(0, -1) + n ~\mathsf{polydiv}(0, 1) + \mathsf{polydiv}(n, n) >

复杂度为

(n+1)log2(n+1) Fmul(n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}}

Round 3-7

因为 lζ(ζ)=0l_\zeta(\zeta)= 0,所以存在 Quotient 多项式 qζ(X)q_\zeta(X) 满足

qζ(X)=1Xζlζ(X)q_\zeta(X) = \frac{1}{X-\zeta}\cdot l_\zeta(X)
Prover Cost 3-7

这一步的计算采用的是下面的算法,代码为

def division_by_linear_divisor(self, d):
    """
    Divide a polynomial by a linear divisor (X - d) using Ruffini's rule.

    Args:
        coeffs (list): Coefficients of the polynomial, from lowest to highest degree.
        d (Scalar): The constant term of the linear divisor.

    Returns:
        tuple: (quotient coefficients, remainder)
    """
    assert len(self.coeffs) > 0, "Polynomial degree must be at least 1"

    n = len(self.coeffs)
    quotient = [0] * (n - 1)
    
    # Start with the highest degree coefficient
    current = self.coeffs[-1]
    
    # Iterate through coefficients from second-highest to lowest degree
    for i in range(n - 2, -1, -1):
        # Store the current value in the quotient
        quotient[i] = current
        
        # Compute the next value
        current = current * d + self.coeffs[i]
    
    # The final current value is the remainder
    remainder = current

    return UniPolynomial(quotient), remainder

对于一个 nn 次的多项式

>f(X)=f0+f1X+f2X2++fn1Xn1+fnXn>> f(X) = f_0 + f_1 X + f_2 X^2 + \cdots + f_{n-1} X^{n-1} + f_n X^n >

除上一个一次多项式 XdX - d ,想得到其商多项式和余项,即满足 f(X)=q(X)(Xd)+r(X)f(X) = q(X)(X - d) + r(X) ,那么可以这样来分解

>>f0+f1X+f2X2++fn1Xn1+fnXn>=(Xd)(fnXn1)+dfnXn1+fn1Xn1++f1X+f0>=(Xd)(fnXn1)+(Xd)((dfn+fn1)Xn2)>+d(dfn+fn1)+fn2Xn2++f1X+f0>>> \begin{aligned} > & f_0 + f_1 X + f_2 X^2 + \cdots + f_{n-1} X^{n-1} + f_n X^n \\ > = & (X - d)(f_n \cdot X^{n - 1}) + d \cdot f_n \cdot X^{n - 1} + f_{n - 1} X^{n - 1} + \cdots + f_1 X + f_0 \\ > = & (X - d)(f_n \cdot X^{n - 1}) + (X - d)((df_n + f_{n - 1}) \cdot X^{n - 2}) \\ > & + d \cdot (df_n + f_{n - 1}) + f_{n - 2} X^{n - 2} + \cdots + f_1 X + f_0 \\ > \end{aligned} >

通过上式子发现,

>>qn1=fn>qi=dqi+1+fi+1,i=n2,,0>>> \begin{aligned} > & q_{n - 1} = f_n \\ > & q_i = d \cdot q_{i + 1} + f_{i + 1} , \quad i = n - 2, \ldots, 0 \\ > \end{aligned} >

因此最后的余项为

>r(X)=dq0+f0>> r(X) = d \cdot q_0 + f_0 >

这里 iin2,,0n - 2, \ldots, 0 ,每次会涉及一次有限域乘法,最后算 r(X)r(X) 也涉及一次乘法,因此复杂度为 n Fmuln ~ \mathbb{F}_{\mathsf{mul}}

回到分析计算 qζ(X)q_\zeta(X) 的复杂度,需要分析 lζ(X)l_\zeta(X) 的次数。

>>lζ(X)=(s0(ζ)(c(ζ)c0)>+αs0(ζ)(un1c(ζ)(1un1)c(ω2n1ζ))>+α2s1(ζ)(un2c(ζ)(1un2)c(ω2n2ζ))>+>+αn1sn2(ζ)(u1c(ζ)(1u1)c(ω2ζ))>+αnsn1(ζ)(u0c(ζ)(1u0)c(ωζ))>+αn+1(L0(ζ)(z(X)c0a(X))>+αn+2(ζ1)(z(X)z(ω1ζ)c(ζ)a(X))>+αn+3LN1(ζ)(z(X)v)>vH(ζ)t(X) )>>> \begin{split} > l_\zeta(X) =& \Big(s_0(\zeta) \cdot (c(\zeta) - c_0) \\ > & + \alpha\cdot s_0(\zeta) \cdot (u_{n-1}\cdot c(\zeta) - (1-u_{n-1})\cdot c(\omega^{2^{n-1}}\cdot\zeta))\\ > & + \alpha^2\cdot s_1(\zeta) \cdot (u_{n-2}\cdot c(\zeta) - (1-u_{n-2})\cdot c(\omega^{2^{n-2}}\cdot\zeta)) \\ > & + \cdots \\ > & + \alpha^{n-1}\cdot s_{n-2}(\zeta)\cdot (u_{1}\cdot c(\zeta) - (1-u_{1})\cdot c(\omega^2\cdot\zeta))\\ > & + \alpha^n\cdot s_{n-1}(\zeta)\cdot (u_{0}\cdot c(\zeta) - (1-u_{0})\cdot c(\omega\cdot\zeta)) \\ > & + \alpha^{n+1}\cdot (L_0(\zeta)\cdot\big(z(X) - c_0\cdot a(X))\\ > & + \alpha^{n+2}\cdot (\zeta - 1)\cdot\big(z(X)-z(\omega^{-1}\cdot\zeta)-c(\zeta)\cdot a(X) \big) \\ > & + \alpha^{n+3}\cdot L_{N-1}(\zeta)\cdot(z(X) - v) \\ > & - v_H(\zeta)\cdot t(X)\ \Big) > \end{split} >

前面几项都为常数,

  • αn+1(L0(ζ)(z(X)c0a(X))\alpha^{n+1}\cdot (L_0(\zeta)\cdot\big(z(X) - c_0\cdot a(X)) 的次数为 N1+N1=2N2N - 1 + N - 1 = 2N - 2
  • αn+2(ζ1)(z(X)z(ω1ζ)c(ζ)a(X))\alpha^{n+2}\cdot (\zeta - 1)\cdot\big(z(X)-z(\omega^{-1}\cdot\zeta)-c(\zeta)\cdot a(X) \big) 的次数为 N1N - 1
  • αn+3LN1(ζ)(z(X)v)\alpha^{n+3}\cdot L_{N-1}(\zeta)\cdot(z(X) - v) 的次数为 N1+N1=2N2N - 1 + N - 1 = 2N - 2vH(ζ)t(X)v_H(\zeta)\cdot t(X) 的次数为 2N12N - 1

因此 lζ(X)l_\zeta(X) 的次数为 2N12N - 1 。因此计算 qζ(X)q_\zeta(X) 的复杂度为 (2N1) Fmul(2N - 1) ~ \mathbb{F}_{\mathsf{mul}}

📝 高效求逆算法

一般地,对于 NN 个任意点 a0,,aN1a_0, \ldots, a_{N - 1} ,想要求出它们的逆 a01,,aN11a_0^{-1}, \ldots, a_{N-1}^{-1} ,如果直接求逆的话,计算消耗比较大,想将求逆操作转换为有限域上的乘法操作。具体的算法是

  1. 先计算出 NN 个乘积
b0=a0b1=b0a1=a0a1b2=b1a2=a0a1a2bN2=bN3aN2=a0a1aN2bN1=bN2aN1=a0a1aN2aN1\begin{aligned} & b_0 = a_0 \\ & b_1 = b_0 \cdot a_1 = a_0 \cdot a_1 \\ & b_2 = b_1 \cdot a_2 = a_0 \cdot a_1 \cdot a_2 \\ & \ldots \\ & b_{N - 2} = b_{N - 3} \cdot a_{N - 2} = a_0 \cdot a_1 \cdots a_{N - 2} \\ & b_{N - 1} = b_{N - 2} \cdot a_{N - 1} = a_0 \cdot a_1 \cdots a_{N - 2} \cdot a_{N - 1}\\ \end{aligned}

计算 b1,,bN1b_1, \ldots, b_{N - 1} ,每次都涉及一次有限域的乘法,复杂度为 (N1) Fmul(N - 1) ~ \mathbb{F}_{\mathsf{mul}}

  1. 计算出 bN11b_{N-1}^{-1} ,复杂度为 Finv\mathbb{F}_{\mathsf{inv}}
  2. 计算
bN21=(a0a1aN2)1=aN1bN11bN31=(a0a1aN3)1=aN2bN21b11=(a0a1)1=a2b21\begin{aligned} & b_{N-2}^{-1} = (a_0 \cdot a_1 \cdots a_{N - 2} )^{-1} = a_{N - 1} \cdot b_{N-1}^{-1} \\ & b_{N-3}^{-1} = (a_0 \cdot a_1 \cdots a_{N - 3} )^{-1} = a_{N - 2} \cdot b_{N-2}^{-1} \\ & \ldots \\ & b_{1}^{-1} = (a_0 \cdot a_1 )^{-1} = a_{2} \cdot b_{2}^{-1} \\ \end{aligned}

这一步复杂度为 (N2) Fmul(N - 2) ~ \mathbb{F}_{\mathsf{mul}}

  1. 现在再从头相乘计算出 a01,,aN11a_0^{-1}, \ldots, a_{N-1}^{-1}
a01=1a0a1a1=b11a1a11=1a0a1a0=b11b0a21=1a0a1a2(a0a1)=b21b1aN21=1a0a1a2aN3aN2(a0a1a2aN3)=bN21bN3aN11=1a0a1a2aN2aN1(a0a1a2aN2)=bN11bN2\begin{aligned} & a_0^{-1} = \frac{1}{a_0 \cdot a_1} \cdot a_1 = b_1^{-1} \cdot a_1 \\ & a_1^{-1} = \frac{1}{a_0 \cdot a_1} \cdot a_0 = b_1^{-1} \cdot b_0\\ & a_2^{-1} = \frac{1}{a_0 \cdot a_1 \cdot a_2} \cdot (a_0 \cdot a_1) = b_2^{-1} \cdot b_1\\ & \ldots \\ & a_{N - 2}^{-1} = \frac{1}{a_0 \cdot a_1 \cdot a_2 \cdots a_{N - 3} \cdot a_{N - 2}} \cdot (a_0 \cdot a_1 \cdot a_2 \cdots a_{N - 3} ) = b_{N - 2}^{-1} \cdot b_{N - 3} \\ & a_{N - 1}^{-1} = \frac{1}{a_0 \cdot a_1 \cdot a_2 \cdots a_{N - 2} \cdot a_{N - 1}} \cdot (a_0 \cdot a_1 \cdot a_2 \cdots a_{N - 2} ) = b_{N - 1}^{-1} \cdot b_{N - 2} \end{aligned}

复杂度为 N FmulN ~ \mathbb{F}_{\mathsf{mul}}

因此计算出逆 a01,,aN11a_0^{-1}, \ldots, a_{N-1}^{-1} 的总复杂度为 Finv+(3N3) Fmul\mathbb{F}_{\mathsf{inv}} + (3N - 3) ~ \mathbb{F}_{\mathsf{mul}}

分析 Prover Cost

在 Round 3-5 已经计算得到 [lζ(x)xH][l_{\zeta}(x)|_{x \in H}] ,下面计算 [qζ(x)xH][q_{\zeta}(x)|_{x \in H}]

因此这一步总复杂度为

Finv+(4N3) Fmul\mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}}

Round 3-8

第 8 步. 构造 DζD\zeta 上的消失多项式 zDζ(X)z_{D_{\zeta}}(X)

zDζ(X)=(Xζω)(Xζω2n1)(Xζ)z_{D_{\zeta}}(X) = (X-\zeta\omega)\cdots (X-\zeta\omega^{2^{n-1}})(X-\zeta)
Prover Cost 3-8

在 Round 3-6 中已经计算出消失多项 zDζ(X)z_{D_{\zeta}}(X) 的系数形式。

Round 3-9

第 9 步,构造 Quotient 多项式 qc(X)q_c(X) :

qc(X)=(c(X)c(X))(Xζ)(Xωζ)(Xω2ζ)(Xω2n1ζ)q_c(X) = \frac{(c(X) - c^*(X))}{(X-\zeta)(X-\omega\zeta)(X-\omega^2\zeta)\cdots(X-\omega^{2^{n-1}}\zeta)}
Prover Cost 3-9

这里由于分母的多项式的次数比较高,因此用点值式来进行计算会比较高效。

已有:c(X)c^*(X)zDζ(X)z_{D_{\zeta}}(X) 的系数形式,在 Round 3-6 已经计算得到。

因此这一步的总复杂度为

2 FFT(N)+Finv+(4N3) Fmul2 ~ \mathsf{FFT}(N) + \mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}}

Round 3-10

第 10 步,构造 Quotient 多项式 qωζ(X)q_{\omega\zeta}(X)

qωζ(X)=z(X)z(ω1ζ)Xω1ζq_{\omega\zeta}(X) = \frac{z(X) - z(\omega^{-1}\cdot\zeta)}{X - \omega^{-1}\cdot\zeta}
Prover Cost 3-10

方法一:用系数式进行相除。

在前面 Round 2-4 已经计算得到了 z(X)z(X) 的系数形式,那么 z(X)z(ω1ζ)z(X) - z(\omega^{-1}\cdot\zeta) 多项式的系数也很好得到,只需要改变常数项的值就行,分母的多项式为一次多项式,系数式也直接可以得到,那么这里分母除的是一个一元多项式,用线性多项式的除法,复杂度为 (N1) Fmul(N - 1) ~ \mathbb{F}_{\mathsf{mul}}

方法二:用点值式进行计算。

计算得到 [qωζ(x)xH][q_{\omega\zeta}(x)|_{x \in H}]

这种方法的总复杂度为

Finv+(4N3) Fmul\mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}}

可以看到,由于分母只是一次多项式,用方法一会更高效一些。

Round 3-11

第 11 步,发送 (Qc=[qc(τ)]1,Qζ=[qζ(τ)]1,Qωζ=[qωζ(τ)]1,)\big(Q_c = [q_c(\tau)]_1, Q_\zeta=[q_\zeta(\tau)]_1, Q_{\omega\zeta}=[q_{\omega\zeta}(\tau)]_1, \big)

Prover Cost 3-11
  1. 在 Round 3-9 得到的 [qc(x)xH][q_c(x)|_{x \in H}] ,那么
Qc=qc(ω0)A0+qc(ωN1)AN1Q_c = q_c(\omega^0) \cdot A_0 + \ldots q_c(\omega^{N - 1}) \cdot A_{N - 1}

复杂度为 msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1)

  1. 在 Round 3-7 得到 [qζ(x)xH][q_{\zeta}(x)|_{x \in H}] ,那么
Qζ=qζ(ω0)A0+qζ(ωN1)AN1Q_\zeta = q_\zeta(\omega^0) \cdot A_0 + \ldots q_\zeta(\omega^{N - 1}) \cdot A_{N - 1}

复杂度为 msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1)

  1. 在 Round 3-10
Qωζ=qωζ(0)G+qωζ(1)(τG)++qωζ(N2)(τN2G)Q_{\omega\zeta} = q_{\omega\zeta}^{(0)} \cdot G + q_{\omega\zeta}^{(1)} \cdot (\tau \cdot G) + \cdots + q_{\omega\zeta}^{(N - 2)} \cdot (\tau^{N - 2} \cdot G)

其中 GG 是椭圆曲线 G1\mathbb{G}_1 上的生成元,(G,τG,,τN2G)(G, \tau G, \ldots, \tau^{N - 2}G) 是 KZG10 的 SRS。那么这种方法的复杂度为 msm(N1,G1)\mathsf{msm}(N - 1, \mathbb{G}_1)

Qζ=qωζ(ω0)A0+qωζ(ωN1)AN1Q_\zeta = q_{\omega\zeta}(\omega^0) \cdot A_0 + \ldots q_{\omega \zeta}(\omega^{N - 1}) \cdot A_{N - 1}

复杂度为 msm(N,G1)\mathsf{msm}(N, \mathbb{G}_1)

总结上面的复杂度:

  1. 在 Round 3-10 用方法一,系数形式,复杂度为
2 msm(N,G1)+msm(N1,G1)2 ~ \mathsf{msm}(N, \mathbb{G}_1) + \mathsf{msm}(N - 1, \mathbb{G}_1)
  1. 在 Round 3-10 用方法二,点值形式,复杂度为
3 msm(N,G1)3 ~ \mathsf{msm}(N, \mathbb{G}_1)

Prover Cost Round 3

将这一轮的计算复杂度相加为

  1. 在 Round 3-10 用方法一,系数形式,复杂度为
Invalid color: '' at position 994: …inv}} + {\color{̲}̲ 2 ~ \mathsf{ms…

\begin{aligned}
& 2(n - 1) ~ \mathbb{F}_{\mathsf{mul}} + n ~\mathbb{F}_{\mathsf{mul}} + \mathsf{FFT}(N)  +  (N + 1) ~ \mathbb{F}_{\mathsf{mul}} + (12 N + 4n + 2) ~ \mathbb{F}_{\mathsf{mul}} \\
& + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}} } + \mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}} + 2 ~ \mathsf{FFT}(N) + \mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}} \\
& + {\color{red} (N - 1) ~ \mathbb{F}_{\mathsf{mul}}} + {\color{red} 2 ~ \mathsf{msm}(N, \mathbb{G}_1) + \mathsf{msm}(N - 1, \mathbb{G}_1)} \\
= & 3 ~ \mathsf{FFT}(N) + (21N + 7n - 3) ~ \mathbb{F}_{\mathsf{mul}} + 2~ \mathbb{F}_{\mathsf{inv}} + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}}  } \\
& + {\color{red} (N - 1) ~ \mathbb{F}_{\mathsf{mul}}} + {\color{red} 2 ~ \mathsf{msm}(N, \mathbb{G}_1) + \mathsf{msm}(N - 1, \mathbb{G}_1)} \\
= & 3 ~ \mathsf{FFT}(N) + (22N + 7n - 4) ~ \mathbb{F}_{\mathsf{mul}} + 2~ \mathbb{F}_{\mathsf{inv}} + {\color{} 2 ~ \mathsf{msm}(N, \mathbb{G}_1) + \mathsf{msm}(N - 1, \mathbb{G}_1)} + {\color{orange} (n + 1) \log^2(n + 1)  ~ \mathbb{F}_{\mathsf{mul}} }
\end{aligned}

这种方法要求内存中要存储 SRS (G,τG,,τN2G)(G, \tau G, \ldots, \tau^{N - 2}G) ,便于用系数形式进行多项式的承诺。

  1. 在 Round 3-10 用方法二,点值形式,复杂度为
2(n1) Fmul+n Fmul+FFT(N)+(N+1) Fmul+(12N+4n+2) Fmul+(n+1)log2(n+1) Fmul+Finv+(4N3) Fmul+2 FFT(N)+Finv+(4N3) Fmul+Finv+(4N3) Fmul+3 msm(N,G1)=3 FFT(N)+(21N+7n3) Fmul+2 Finv+(n+1)log2(n+1) Fmul+Finv+(4N3) Fmul+3 msm(N,G1)=3 FFT(N)+(25N+7n6) Fmul+3 Finv+3 msm(N,G1)+(n+1)log2(n+1) Fmul\begin{aligned} & 2(n - 1) ~ \mathbb{F}_{\mathsf{mul}} + n ~\mathbb{F}_{\mathsf{mul}} + \mathsf{FFT}(N) + (N + 1) ~ \mathbb{F}_{\mathsf{mul}} + (12 N + 4n + 2) ~ \mathbb{F}_{\mathsf{mul}} \\ & + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}} } + \mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}} + 2 ~ \mathsf{FFT}(N) + \mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}} \\ & + {\color{red} \mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}}} + {\color{red} 3 ~ \mathsf{msm}(N, \mathbb{G}_1)} \\ = & 3 ~ \mathsf{FFT}(N) + (21N + 7n - 3) ~ \mathbb{F}_{\mathsf{mul}} + 2~ \mathbb{F}_{\mathsf{inv}} + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}} } \\ & + {\color{red} \mathbb{F}_{\mathsf{inv}} + (4N - 3) ~ \mathbb{F}_{\mathsf{mul}}} + {\color{red} 3 ~ \mathsf{msm}(N, \mathbb{G}_1)} \\ = & 3 ~ \mathsf{FFT}(N) + (25N + 7n - 6) ~ \mathbb{F}_{\mathsf{mul}} + 3~ \mathbb{F}_{\mathsf{inv}} + 3 ~ \mathsf{msm}(N, \mathbb{G}_1) + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}} } \\ \end{aligned}

Round 4.

Round 4-1

Verifier 发送第二个随机挑战点 ξ$Fp\xi\leftarrow_{\$}\mathbb{F}_p

Round 4-2

Prover 构造第三个 Quotient 多项式 qξ(X)q_\xi(X)

qξ(X)=c(X)c(ξ)zDζ(ξ)qc(X)Xξq_\xi(X) = \frac{c(X) - c^*(\xi) - z_{D_\zeta}(\xi)\cdot q_c(X)}{X-\xi}
Prover Cost 4-2

因此这一步的总复杂度为

IFFT(N)+(3N+n+1) Fmul\mathsf{IFFT}(N) + (3N + n + 1) ~ \mathbb{F}_{\mathsf{mul}}

Round 4-3

Prover 计算并发送 QξQ_\xi

Qξ=KZG10.Commit(qξ(X))=[qξ(τ)]1Q_\xi = \mathsf{KZG10.Commit}(q_\xi(X)) = [q_\xi(\tau)]_1
Prover Cost 4-3

前面一步计算得到的是 qξ(X)q_\xi(X) 的系数式,因此这一步承诺的复杂度主要看多项式的次数, deg(qξ)=N2\deg(q_\xi) = N - 2 ,复杂度为 msm(N1,G1)\mathsf{msm}(N - 1, \mathbb{G}_1)

这种方法要求内存中要存储 SRS (G,τG,,τN2G)(G, \tau G, \ldots, \tau^{N - 2}G)

Prover Cost Round 4

汇总这一轮的复杂度

IFFT(N)+(3N+n+1) Fmul+msm(N1,G1)\mathsf{IFFT}(N) + (3N + n + 1) ~ \mathbb{F}_{\mathsf{mul}} + \mathsf{msm}(N - 1, \mathbb{G}_1)

Prover Cost

汇总所有轮的 Prover Cost

  1. 在 Round 3-10 用方法一,系数形式,复杂度为
Invalid color: '' at position 367: …inv}} + {\color{̲}̲ 2 ~ \mathsf{ms…

\begin{align}
 & {\color{blue} (N - 1) ~ \mathbb{F}_{\mathsf{mul}}  + \mathsf{msm}(N, \mathbb{G}_1)}  \\
& + {\color{red} 4 ~ \mathsf{FFT}(N) + 4 ~ \mathsf{IFFT}(N) + (5nN + 10N + n + 2) ~ \mathbb{F}_{\mathsf{mul}} + 2 ~ \mathsf{msm}(N, \mathbb{G}_1)}  \\
 & + 3 ~ \mathsf{FFT}(N) + (22N + 7n - 4) ~ \mathbb{F}_{\mathsf{mul}} + 2~ \mathbb{F}_{\mathsf{inv}} + {\color{} 2 ~ \mathsf{msm}(N, \mathbb{G}_1) + \mathsf{msm}(N - 1, \mathbb{G}_1)} + {\color{orange} (n + 1) \log^2(n + 1)  ~ \mathbb{F}_{\mathsf{mul}} } \\
 & + {\color{purple}\mathsf{IFFT}(N) + (3N + n + 1) ~ \mathbb{F}_{\mathsf{mul}} + \mathsf{msm}(N - 1, \mathbb{G}_1)} \\
=  & (17nN + 36N + 9n - 2) ~ \mathbb{F}_{\mathsf{mul}} + {\color{orange} (n + 1) \log^2(n + 1)  ~ \mathbb{F}_{\mathsf{mul}} } + 2~ \mathbb{F}_{\mathsf{inv}} + 5 ~ \mathsf{msm}(N, \mathbb{G}_1) + 2 ~ \mathsf{msm}(N - 1, \mathbb{G}_1)
\end{align}

这种方法要求内存中要存储 SRS (G,τG,,τN2G)(G, \tau G, \ldots, \tau^{N - 2}G) ,便于用系数形式进行多项式的承诺。

  1. 在 Round 3-10 用方法二,点值形式,复杂度为
(N1) Fmul+msm(N,G1)+4 FFT(N)+4 IFFT(N)+(5nN+10N+n+2) Fmul+2 msm(N,G1)+3 FFT(N)+(25N+7n6) Fmul+3 Finv+3 msm(N,G1)+(n+1)log2(n+1) Fmul+IFFT(N)+(3N+n+1) Fmul+msm(N1,G1)=(17nN+39N+9n4) Fmul+(n+1)log2(n+1) Fmul+3 Finv+6 msm(N,G1)+msm(N1,G1)\begin{align} & {\color{blue} (N - 1) ~ \mathbb{F}_{\mathsf{mul}} + \mathsf{msm}(N, \mathbb{G}_1)} \\ & + {\color{red} 4 ~ \mathsf{FFT}(N) + 4 ~ \mathsf{IFFT}(N) + (5nN + 10N + n + 2) ~ \mathbb{F}_{\mathsf{mul}} + 2 ~ \mathsf{msm}(N, \mathbb{G}_1)} \\ & + 3 ~ \mathsf{FFT}(N) + (25N + 7n - 6) ~ \mathbb{F}_{\mathsf{mul}} + 3~ \mathbb{F}_{\mathsf{inv}} + 3 ~ \mathsf{msm}(N, \mathbb{G}_1) + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}} } \\ & + {\color{purple}\mathsf{IFFT}(N) + (3N + n + 1) ~ \mathbb{F}_{\mathsf{mul}} + \mathsf{msm}(N - 1, \mathbb{G}_1)} \\ = & (17nN + 39N + 9n - 4) ~ \mathbb{F}_{\mathsf{mul}} + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}} } + 3~ \mathbb{F}_{\mathsf{inv}} + 6 ~ \mathsf{msm}(N, \mathbb{G}_1) + \mathsf{msm}(N - 1, \mathbb{G}_1) \end{align}

证明表示

7G17\cdot\mathbb{G}_1, (n+1)Fp(n+1)\cdot\mathbb{F}_{p}

πeval=(z(ω1ζ),c(ζ)c(ωζ),c(ω2ζ),c(ω4ζ),,c(ω2n1ζ),Cc,Ct,Cz,Qc,Qζ,Qξ,Qωζ)\begin{aligned} \pi_{eval} &= \big(z(\omega^{-1}\cdot\zeta), c(\zeta),c(\omega\cdot\zeta), c(\omega^2\cdot\zeta), c(\omega^4\cdot\zeta), \ldots, c(\omega^{2^{n-1}}\cdot\zeta), \\ & \qquad C_{c}, C_{t}, C_{z}, Q_c, Q_\zeta, Q_\xi, Q_{\omega\zeta}\big) \end{aligned}

验证过程

Step 1

  1. Verifier 计算 c(ξ)c^*(\xi) 使用预计算的 Barycentric Weights {w^i}\{\hat{w}_i\}
c(ξ)=iciw^iξxiiw^iξxic^*(\xi)=\frac{\sum_i c_i^*\frac{\hat{w}_i}{\xi-x_i}}{\sum_i \frac{\hat{w}_i}{\xi-x_i}}

再计算对应的承诺 C(ξ)=[c(ξ)]1C^*(\xi)=[c^*(\xi)]_1

Verifier Cost 1

Verifier:

  • 先分析每一项计算的复杂度,计算 w^iξxi\frac{\hat{w}_i}{\xi-x_i} ,分子 w^i\hat{w}_i 可以由预计算得到,分母 ξxi\xi-x_i 计算得到后要计算其逆元,再和 w^i\hat{w}_i 相乘,因此这里的复杂度为 Fmul+Finv\mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{inv}}
  • 计算 ciw^iξxic_i^*\frac{\hat{w}_i}{\xi-x_i} ,复杂度为 Fmul\mathbb{F}_{\mathsf{mul}}
  • 最后将分子分母得到有限域上的值相除,其实就是分母的值求逆,再和分子相乘,复杂度为 Fmul+Finv\mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{inv}}
  • 计算得到 c(ξ)c^*(\xi) 后计算其承诺 C(ξ)C^*(\xi) ,复杂度为 EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}

因此这一步的总复杂度为

>>(n+1) (Fmul+Finv)+(n+1) Fmul+Fmul+Finv+EccMulG1>=(2n+3) Fmul+(n+2) Finv+EccMulG1>>> \begin{aligned} > & (n + 1) ~ (\mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{inv}}) + (n + 1) ~ \mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{mul}} + \mathbb{F}_{\mathsf{inv}} + \mathsf{EccMul}^{\mathbb{G}_1} \\ > = & \color{orange}{(2n + 3) ~ \mathbb{F}_{\mathsf{mul}} + (n + 2) ~ \mathbb{F}_{\mathsf{inv}} + \mathsf{EccMul}^{\mathbb{G}_1}} > \end{aligned} >

Step 2

Verifier 计算 vH(ζ),L0(ζ),LN1(ζ)v_H(\zeta), L_0(\zeta), L_{N-1}(\zeta)

vH(ζ)=ζN1v_H(\zeta) = \zeta^N - 1
L0(ζ)=1NvH(ζ)ζ1L_0(\zeta) = \frac{1}{N}\cdot \frac{v_{H}(\zeta)}{\zeta-1}
LN1(ζ)=ωN1NvH(ζ)ζωN1L_{N-1}(\zeta) = \frac{\omega^{N-1}}{N}\cdot \frac{v_{H}(\zeta)}{\zeta-\omega^{N-1}}

Verifier Cost 2

Verifier:

  • vH(ζ)v_H(\zeta) : ζN\zeta^N 可以用 logN\log N 次有限域乘法计算得到,复杂度为 logN Fmul\log N ~ \mathbb{F}_{\mathsf{mul}}
  • L0(ζ)L_0(\zeta) : 1/N1/N 可以在预计算中给出。计算 ζ1\zeta-1 的逆元,涉及一次有限域中元素的求逆操作,复杂度记为 Finv\mathbb{F}_{\mathsf{inv}}ζ1\zeta-1 的逆元与 vH(ζ)v_{H}(\zeta) 相乘,涉及一次有限域中的乘法操作,为 Fmul\mathbb{F}_{\mathsf{mul}} ,其结果再与 1/N1/N 相乘,复杂度为 Fmul\mathbb{F}_{\mathsf{mul}} ,因此这一步的总复杂度为 Finv+2 Fmul\mathbb{F}_{\mathsf{inv}} + 2 ~ \mathbb{F}_{\mathsf{mul}}
  • LN1(ζ)L_{N-1}(\zeta) : ωN1/N\omega^{N-1}/N 可以在预计算中给出。计算 ζωN1\zeta-\omega^{N-1} 的逆元,涉及一次有限域中元素的求逆操作,复杂度记为 Finv\mathbb{F}_{\mathsf{inv}}ζωN1\zeta-\omega^{N-1} 的逆元与 vH(ζ)v_{H}(\zeta) 相乘,涉及一次有限域中的乘法操作,为 Fmul\mathbb{F}_{\mathsf{mul}} ,其结果再与 ωN1/N\omega^{N-1}/N 相乘,复杂度为 Fmul\mathbb{F}_{\mathsf{mul}} ,因此这一步的总复杂度为 Finv+2 Fmul\mathbb{F}_{\mathsf{inv}} + 2 ~ \mathbb{F}_{\mathsf{mul}}

因此这一步的总复杂度为 2 Finv+(logN+4) Fmul2 ~ \mathbb{F}_{\mathsf{inv}} + (\log N + 4) ~ \mathbb{F}_{\mathsf{mul}}

Step 3

Verifier 计算 s0(ζ),,sn1(ζ)s_0(\zeta), \ldots, s_{n-1}(\zeta) ,其计算方法可以采用前文提到的递推方式进行计算。

Verifier Cost 3

Step 4

Verifier 计算 zDζ(ξ)z_{D_\zeta}(\xi)

zDζ(ξ)=(ξζω)(ξζω2n1)(ξζ)z_{D_{\zeta}}(\xi) = (\xi-\zeta\omega)\cdots (\xi-\zeta\omega^{2^{n-1}})(\xi-\zeta)

Verifier Cost 4

Verifier:

ξζωi\xi-\zeta\omega^i 的计算在本轮的第 1 步已经计算得到,因此这里的复杂度主要为 nn 个有限域上的数相乘,复杂度为 (n1) Fmul(n - 1) ~ \mathbb{F}_{\mathsf{mul}}

Step 5

Verifier 计算线性化多项式的承诺 ClC_l

Cl=(((c(ζ)c0)s0(ζ)+α(un1c(ζ)(1un1)c(ω2n1ζ))s0(ζ)+α2(un2c(ζ)(1un2)c(ω2n2ζ))s1(ζ)++αn1(u1c(ζ)(1u1)c(ω2ζ))sn2(ζ)+αn(u0c(ζ)(1u0)c(ωζ))sn1(ζ))[1]1+αn+1L0(ζ)(Czc0Ca)+αn+2(ζ1)(Czz(ω1ζ)[1]1c(ζ)Ca)+αn+3LN1(ζ)(Czv[1]1)vH(ζ)Ct)\begin{split} C_l & = \Big( \Big((c(\zeta) - c_0)s_0(\zeta) \\ & + \alpha \cdot (u_{n-1}\cdot c(\zeta) - (1-u_{n-1})\cdot c(\omega^{2^{n-1}}\cdot\zeta))\cdot s_0(\zeta)\\ & + \alpha^2\cdot (u_{n-2}\cdot c(\zeta) - (1-u_{n-2})\cdot c(\omega^{2^{n-2}}\cdot\zeta))\cdot s_1(\zeta) \\ & + \cdots \\ & + \alpha^{n-1}\cdot (u_{1}\cdot c(\zeta) - (1-u_{1})\cdot c(\omega^2\cdot\zeta))\cdot s_{n-2}(\zeta)\\ & + \alpha^n\cdot (u_{0}\cdot c(\zeta) - (1-u_{0})\cdot c(\omega\cdot\zeta))\cdot s_{n-1}(\zeta) \Big) \cdot [1]_1 \\ & + \alpha^{n+1}\cdot L_0(\zeta)\cdot(C_z - c_0\cdot C_a)\\ & + \alpha^{n+2}\cdot (\zeta-1)\cdot\big(C_z - z(\omega^{-1}\cdot \zeta)\cdot [1]_1-c(\zeta)\cdot C_{a} ) \\ & + \alpha^{n+3}\cdot L_{N-1}(\zeta)\cdot(C_z - v \cdot [1]_1) \\ & - v_H(\zeta)\cdot C_t \Big) \end{split}

Verifier Cost 5

Verifier:

  • 先计算 α2,,αn+3\alpha^2, \ldots, \alpha^{n+3} ,这里涉及 n+2n + 2 次有限域乘法,复杂度为 (n+2) Fmul(n + 2) ~ \mathbb{F}_{\mathsf{mul}}
  • s0(ζ)(c(ζ)c0)s_0(\zeta) \cdot (c(\zeta) - c_0) ,涉及一次有限域乘法,复杂度为 Fmul\mathbb{F}_{\mathsf{mul}}
  • αs0(ζ)(un1c(ζ)(1un1)c(ω2n1ζ))\alpha \cdot s_0(\zeta) \cdot (u_{n-1}\cdot c(\zeta) - (1-u_{n-1})\cdot c(\omega^{2^{n-1}}\cdot\zeta)) ,复杂度为 4 Fmul4 ~ \mathbb{F}_{\mathsf{mul}} ,从第 2n+1n + 1 项都是如此,因此复杂度为 4n Fmul4n ~ \mathbb{F}_{\mathsf{mul}}
  • 将上面计算的结果相加得到一个有限域的值,再与 [1]1[1]_1 相乘,复杂度为 EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}
  • αn+1L0(ζ)(Czc0Ca)\alpha^{n+1}\cdot L_0(\zeta)\cdot(C_z - c_0\cdot C_a)
    • c0Cac_0\cdot C_a 复杂度为 EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}

    • Czc0CaC_z - c_0\cdot C_a 涉及椭圆曲线的减法,但是椭圆曲线的减法是由椭圆曲线上的加法转换的,P1P2=P1+(P2)P_1 - P_2 = P_1 + (-P_2) ,而设 P2=(x2,y2)P_2 = (x_2, y_2) ,那么 P2=(x2,y2)-P_2 = (x_2, -y_2) ,这里 x2,y2x_2, y_2 都是有限域上的值,因此相比椭圆曲线上的加法,多了一次有限域上取负数的操作,可由有限域上的加法完成,这里复杂度不做计入。因此这步的复杂度记为 EccAddG1\mathsf{EccAdd}^{\mathbb{G}_1}

      📝 关于椭圆曲线上的加法或减法 python 实现可参考 py_ecc

    • αn+1L0(ζ)\alpha^{n+1}\cdot L_0(\zeta) ,复杂度为 Fmul\mathbb{F}_{\mathsf{mul}}

    • αn+1L0(ζ)(Czc0Ca)\alpha^{n+1}\cdot L_0(\zeta)\cdot(C_z - c_0\cdot C_a) ,将上面计算的结果进行相乘,复杂度为 EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}

    • 因此计算这一步的总复杂度为 Fmul+2 EccMulG1+EccAddG1\mathbb{F}_{\mathsf{mul}} + 2 ~ \mathsf{EccMul}^{\mathbb{G}_1} + \mathsf{EccAdd}^{\mathbb{G}_1}

  • αn+2(ζ1)(Czz(ω1ζ)[1]1c(ζ)Ca)\alpha^{n+2}\cdot (\zeta-1)\cdot\big(C_z - z(\omega^{-1}\cdot \zeta)\cdot [1]_1-c(\zeta)\cdot C_{a} \big)
    • c(ζ)Cac(\zeta)\cdot C_{a} : EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}
    • z(ω1ζ)[1]1z(\omega^{-1}\cdot \zeta)\cdot [1]_1 : EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}
    • Czz(ω1ζ)[1]1c(ζ)CaC_z - z(\omega^{-1}\cdot \zeta)\cdot [1]_1-c(\zeta)\cdot C_{a} : 2 EccAddG12 ~\mathsf{EccAdd}^{\mathbb{G}_1}
    • αn+2(ζ1)\alpha^{n+2}\cdot (\zeta-1): Fmul\mathbb{F}_{\mathsf{mul}}
    • αn+2(ζ1)(Czz(ω1ζ)[1]1c(ζ)Ca)\alpha^{n+2}\cdot (\zeta-1)\cdot\big(C_z - z(\omega^{-1}\cdot \zeta)\cdot [1]_1-c(\zeta)\cdot C_{a} \big): EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}
    • 总计: Fmul+3 EccMulG1+2 EccAddG1\mathbb{F}_{\mathsf{mul}} + 3~\mathsf{EccMul}^{\mathbb{G}_1} + 2 ~\mathsf{EccAdd}^{\mathbb{G}_1}
  • αn+3LN1(ζ)(Czv[1]1)\alpha^{n+3}\cdot L_{N-1}(\zeta)\cdot(C_z - v \cdot [1]_1)
    • v[1]1v \cdot [1]_1: EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}
    • Czv[1]1C_z - v \cdot [1]_1: EccAddG1\mathsf{EccAdd}^{\mathbb{G}_1}
    • αn+3LN1(ζ)(Czv[1]1)\alpha^{n+3}\cdot L_{N-1}(\zeta)\cdot(C_z - v \cdot [1]_1): Fmul+EccMulG1\mathbb{F}_{\mathsf{mul}} + \mathsf{EccMul}^{\mathbb{G}_1}
    • 总计: Fmul+2 EccMulG1+EccAddG1\mathbb{F}_{\mathsf{mul}} + 2~\mathsf{EccMul}^{\mathbb{G}_1} + \mathsf{EccAdd}^{\mathbb{G}_1}
  • vH(ζ)Ctv_H(\zeta)\cdot C_t: EccMulG1\mathsf{EccMul}^{\mathbb{G}_1}
  • 将上面所有结果相加,涉及椭圆曲线上 4 次加法,复杂度为 4 EccAddG14 ~ \mathsf{EccAdd}^{\mathbb{G}_1}

因此,在这一步计算 lζ(X)l_{\zeta}(X) 的复杂度总计为

>>(n+2+1+4n) Fmul+EccMulG1>+Fmul+2 EccMulG1+EccAddG1>+Fmul+3 EccMulG1+2 EccAddG1>+Fmul+2 EccMulG1+EccAddG1>+EccMulG1+4 EccAddG1>=(5n+6) Fmul+9 EccMulG1+8 EccAddG1>>> \begin{aligned} > & (n + 2 + 1 + 4n) ~ \mathbb{F}_{\mathsf{mul}} + \mathsf{EccMul}^{\mathbb{G}_1} \\ > & + \mathbb{F}_{\mathsf{mul}} + 2~\mathsf{EccMul}^{\mathbb{G}_1} + \mathsf{EccAdd}^{\mathbb{G}_1} \\ > & + \mathbb{F}_{\mathsf{mul}} + 3~\mathsf{EccMul}^{\mathbb{G}_1} + 2 ~\mathsf{EccAdd}^{\mathbb{G}_1} \\ > & + \mathbb{F}_{\mathsf{mul}} + 2~\mathsf{EccMul}^{\mathbb{G}_1} + \mathsf{EccAdd}^{\mathbb{G}_1} \\ > & + \mathsf{EccMul}^{\mathbb{G}_1} + 4 ~ \mathsf{EccAdd}^{\mathbb{G}_1} \\ > = & (5n + 6) ~ \mathbb{F}_{\mathsf{mul}} + 9 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 8 ~ \mathsf{EccAdd}^{\mathbb{G}_1} > \end{aligned} >

Step 6

Verifier 产生随机数 η\eta 来合并下面的 Pairing 验证:

e(Cl+ζQζ,[1]2)=?e(Qζ,[τ]2)e(CcC(ξ)zDζ(ξ)Qc+ξQξ,[1]2)=?e(Qξ,[τ]2)e(Cz+ζQωζz(ω1ζ)[1]1,[1]2)=?e(Qωζ,[τ]2)\begin{split} e(C_l + \zeta\cdot Q_\zeta, [1]_2)\overset{?}{=}e(Q_\zeta, [\tau]_2)\\ e(C_c - C^*(\xi) - z_{D_\zeta}(\xi)\cdot Q_c + \xi\cdot Q_\xi, [1]_2) \overset{?}{=} e(Q_\xi, [\tau]_2)\\ e(C_z + \zeta\cdot Q_{\omega\zeta} - z(\omega^{-1}\cdot\zeta)\cdot[1]_1, [1]_2) \overset{?}{=} e(Q_{\omega\zeta}, [\tau]_2)\\ \end{split}

合并后的验证只需要两个 Pairing 运算。

$$ \begin{split}

P &= \Big(C_l + \zeta\cdot Q_\zeta\Big) \

& + \eta\cdot \Big(C_c - C^*(\xi) - z_{D_\zeta}(\xi)\cdot Q_c + \xi\cdot Q_\xi\Big) \

& + \eta^2\cdot\Big(C_z + \zeta\cdot Q_{\omega\zeta} - z(\omega^{-1}\cdot\zeta)\cdot[1]_1\Big)

\end{split} $$

e(P,[1]2)=?e(Qζ+ηQξ+η2Qωζ,[τ]2)e\Big(P, [1]_2\Big) \overset{?}{=} e\Big(Q_\zeta + \eta\cdot Q_\xi + \eta^2\cdot Q_{\omega\zeta}, [\tau]_2\Big)

Verifier Cost 6

Verifier:

  • 可以先计算出 η2\eta^2 ,复杂度为 Fmul\mathbb{F}_{\mathsf{mul}}

  • (Cl+ζQζ)\Big(C_l + \zeta\cdot Q_\zeta\Big): EccMulG1+EccAddG1\mathsf{EccMul}^{\mathbb{G}_1} + \mathsf{EccAdd}^{\mathbb{G}_1}

  • η(CcC(ξ)zDζ(ξ)Qc+ξQξ)\eta\cdot \Big(C_c - C^*(\xi) - z_{D_\zeta}(\xi)\cdot Q_c + \xi\cdot Q_\xi\Big) :

    >2 EccMulG1+3 EccAddG1+EccMulG1=3 EccMulG1+3 EccAddG1>> 2 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 3 ~ \mathsf{EccAdd}^{\mathbb{G}_1} + \mathsf{EccMul}^{\mathbb{G}_1} = 3 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 3 ~ \mathsf{EccAdd}^{\mathbb{G}_1} >
  • η2(Cz+ζQωζz(ω1ζ)[1]1)\eta^2\cdot\Big(C_z + \zeta\cdot Q_{\omega\zeta} - z(\omega^{-1}\cdot\zeta)\cdot[1]_1\Big): 3 EccMulG1+2 EccAddG13 ~\mathsf{EccMul}^{\mathbb{G}_1} + 2~\mathsf{EccAdd}^{\mathbb{G}_1}

  • 计算 PP ,需要将上面的结果进行相加,复杂度为 2 EccAddG12 ~ \mathsf{EccAdd}^{\mathbb{G}_1}

  • e(P,[1]2)e\Big(P, [1]_2\Big) ,涉及一次椭圆曲线 pairing 操作,记为 PP

  • Qζ+ηQξ+η2QωζQ_\zeta + \eta\cdot Q_\xi + \eta^2\cdot Q_{\omega\zeta}: 2 EccMulG1+2 EccAddG12 ~\mathsf{EccMul}^{\mathbb{G}_1} + 2 ~ \mathsf{EccAdd}^{\mathbb{G}_1}

  • e(Qζ+ηQξ+η2Qωζ,[τ]2)e\Big(Q_\zeta + \eta\cdot Q_\xi + \eta^2\cdot Q_{\omega\zeta}, [\tau]_2\Big) ,涉及一次椭圆曲线 pairing 操作,复杂度为 PP

将上面的所有结果相加,得到这一步的总复杂度为

>>Fmul+EccMulG1+EccAddG1>+3 EccMulG1+3 EccAddG1>+3 EccMulG1+2 EccAddG1>+2 EccAddG1+P+2 EccMulG1+P>=Fmul+9 EccMulG1+8 EccAddG1+2 P>>> \begin{aligned} > & \mathbb{F}_{\mathsf{mul}} + \mathsf{EccMul}^{\mathbb{G}_1} + \mathsf{EccAdd}^{\mathbb{G}_1} \\ > & + 3 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 3 ~ \mathsf{EccAdd}^{\mathbb{G}_1} \\ > & + 3 ~\mathsf{EccMul}^{\mathbb{G}_1} + 2~\mathsf{EccAdd}^{\mathbb{G}_1} \\ > & + 2 ~ \mathsf{EccAdd}^{\mathbb{G}_1} + P + 2 ~\mathsf{EccMul}^{\mathbb{G}_1} + P \\ > = & \mathbb{F}_{\mathsf{mul}} + 9 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 8 ~ \mathsf{EccAdd}^{\mathbb{G}_1} + 2 ~ P > \end{aligned} >

Verifier Cost

(2n+3) Fmul+(n+2) Finv+EccMulG1+2 Finv+(logN+4) Fmul+2(n1) Fmul+(n1) Fmul+(5n+6) Fmul+9 EccMulG1+8 EccAddG1+Fmul+9 EccMulG1+8 EccAddG1+2 P=(9n+8) Fmul+2 Finv+18 EccMulG1+16 EccAddG1+2 P+(2n+3) Fmul+(n+2) Finv+EccMulG1=(11n+11) Fmul+(n+4) Finv+19 EccMulG1+16 EccAddG1+2 P\begin{aligned} & {\color{orange} (2n + 3) ~ \mathbb{F}_{\mathsf{mul}} + (n + 2) ~ \mathbb{F}_{\mathsf{inv}} + \mathsf{EccMul}^{\mathbb{G}_1}} \\ & + 2 ~ \mathbb{F}_{\mathsf{inv}} + (\log N + 4) ~ \mathbb{F}_{\mathsf{mul}} \\ & + 2(n - 1) ~ \mathbb{F}_{\mathsf{mul}} \\ & + (n - 1) ~ \mathbb{F}_{\mathsf{mul}} \\ & + (5n + 6) ~ \mathbb{F}_{\mathsf{mul}} + 9 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 8 ~ \mathsf{EccAdd}^{\mathbb{G}_1} \\ & + \mathbb{F}_{\mathsf{mul}} + 9 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 8 ~ \mathsf{EccAdd}^{\mathbb{G}_1} + 2 ~ P \\ = & (9n + 8) ~ \mathbb{F}_{\mathsf{mul}} + 2 ~ \mathbb{F}_{\mathsf{inv}} + 18 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 16 ~ \mathsf{EccAdd}^{\mathbb{G}_1} + 2 ~ P \\ & + {\color{orange} (2n + 3) ~ \mathbb{F}_{\mathsf{mul}} + (n + 2) ~ \mathbb{F}_{\mathsf{inv}} + \mathsf{EccMul}^{\mathbb{G}_1}} \\ = & (11n + 11) ~ \mathbb{F}_{\mathsf{mul}} + (n + 4) ~ \mathbb{F}_{\mathsf{inv}} + 19 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 16 ~ \mathsf{EccAdd}^{\mathbb{G}_1} + 2 ~ P \end{aligned}

协议复杂度汇总

Commit Phase

Prover’s cost:

NlogN Fmul+msm(N,G1)N\log N ~\mathbb{F}_{\mathsf{mul}} + \mathsf{msm}(N, \mathbb{G}_1)

Evaluation Protocol

Prover’s cost:

  1. 在 Round 3-10 用方法一,系数形式,复杂度为
(17nN+36N+9n2) Fmul+(n+1)log2(n+1) Fmul+2 Finv+5 msm(N,G1)+2 msm(N1,G1)\begin{align} (17nN + 36N + 9n - 2) ~ \mathbb{F}_{\mathsf{mul}} + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}} } + 2~ \mathbb{F}_{\mathsf{inv}} + 5 ~ \mathsf{msm}(N, \mathbb{G}_1) + 2 ~ \mathsf{msm}(N - 1, \mathbb{G}_1) \end{align}

这种方法要求内存中要存储 SRS (G,τG,,τN2G)(G, \tau G, \ldots, \tau^{N - 2}G) ,便于用系数形式进行多项式的承诺。

  1. 在 Round 3-10 用方法二,点值形式,复杂度为
(17nN+39N+9n4) Fmul+(n+1)log2(n+1) Fmul+3 Finv+6 msm(N,G1)+msm(N1,G1)\begin{align} (17nN + 39N + 9n - 4) ~ \mathbb{F}_{\mathsf{mul}} + {\color{orange} (n + 1) \log^2(n + 1) ~ \mathbb{F}_{\mathsf{mul}} } + 3~ \mathbb{F}_{\mathsf{inv}} + 6 ~ \mathsf{msm}(N, \mathbb{G}_1) + \mathsf{msm}(N - 1, \mathbb{G}_1) \end{align}

Verifier’s cost:

(11n+11) Fmul+(n+4) Finv+19 EccMulG1+16 EccAddG1+2 P(11n + 11) ~ \mathbb{F}_{\mathsf{mul}} + (n + 4) ~ \mathbb{F}_{\mathsf{inv}} + 19 ~ \mathsf{EccMul}^{\mathbb{G}_1} + 16 ~ \mathsf{EccAdd}^{\mathbb{G}_1} + 2 ~ P

Proof size:

(n+1)Fp+7 G1(n + 1) \cdot \mathbb{F}_p + 7 ~ \mathbb{G}_1