在 Gemini-PCS [BCHO22] 中,一个系数式的 MLE 多项式,对应到一个一元多项式,
f~(X0,X1,…,Xn−1)=f0+f1X0+f2X1+f3X0X1+⋯+f2n−1X0X1⋯Xn−1 对应到一个一元多项式:
f(X)=f0+f1X+f2X2+⋯+f2n−1X2n−1 当我们确定一个公开的求值点 u=(u0,u1,…,un−1),MLE 多项式 f~ 在 u 处的值可以表示为下面的 Tensor Product:
f~(u0,u1,…,un−1)=⟨f,⊗i=0n−1(1,ui)⟩ 接下来,Gemini-PCS 利用 Split-and-fold 的思路,把上面的等式转换成多个一元多项式的求值的正确性,这可以利用 KZG10 来完成证明。
不过通常 MLE 多项式默认是以点值式的形式表示,
f~(X0,X1,…,Xn−1)=i=0∑2n−1ai⋅eq∼(bits(i),(X0,X1,…,Xn−1)) 为了使用 Gemini-PCS,Prover 需要先将 MLE 的点值式转换成上述的系数式,即通过 a 向量计算得到 f 向量。这个转换算法类似 FFT 运算,时间复杂度为 O(NlogN),这里 N=2n。
HyperKZG 的思路是,仍然利用 Gemini-PCS 的 Split-and-fold 的核心思路,但是不需要进行类似 FFT 的多项式转换。这初听起来似乎不可思议,但这里的关键点在于,MLE 多项式本质上是多维空间中的线性多项式,不管它是 Evaluation-form 还是 Coefficient-form,其运算过程实际上都是一个线性运算。而同时 Gemini-PCS 所采用的 Split-and-fold 的思路也是将高维空间不断降维的映射过程,因此这个 Split-and-fold 过程可以移植到 MLE 的 Evaluation-form 上,一样可以达到折叠的效果,但是却完美避开了多项式 Basis 转换的复杂计算。
1. Gemini-PCS 的原理回顾¶
Gemini [BCHO22] 给出了一种 MLE 多项式到一元多项式的映射方法。下面是一个 MLE 的定义:
f~(X0,X1,…,Xn−1)=f0+f1X0+f2X1+f3X0X1+⋯+f2n−1X0X1⋯Xn−1 如果我们用长度为 N=2n 的系数向量 f 来表示 f~,那么我们可以定义一个 Univariate 多项式 f(X),它具有和 f~(X0,…,Xn−1) 相同的系数:
f(X)=f0+f1X+f2X2+⋯+f2n−1X2n−1 我们用 X=−X 代入上面的等式,可以得到:
f(−X)=f0−f1X+f2X2−⋯−f2n−1X2n−1 那么分别把上面两个等式相加与相减,我们可以得到:
f(X)+f(−X)=2(f0+f2X2+⋯+f2n−2X2n−2) f(X)−f(−X)=2X(f1+f3X2+⋯+f2n−1X2n−2) 再观察下 f~(X0,X1,…,Xn−1) 的「部分运算」 Partial Evaluation,即只实例化一个未知数 X0=u0,即:
f~(u0,X1,…,Xn−1)=f0+f1u0+f2X1+f3u0X1+f4X2+f5u0X2+f6X1X2+f7u0X1X2+⋯+f2n−1u0X1⋯Xn−1=(f0+f1u0)+(f2+f3u0)X1+(f4+f5u0)X2+(f6+f7u0)X1X2+⋯+(f2n−2+f2n−1u0)X1⋯Xn−1=f~(1)(X1,X2,…,Xn−1) 这里 f~(1)(X1,X2,…,Xn−1) 的系数向量为
(f0+f1u0),(f2+f3u0),(f4+f5u0),(f6+f7u0),…,(f2n−2+f2n−1u0) 它正好和下面一个 UniPoly 的系数向量完全相同:
f(1)(X)=(f0+f1u0)+(f2+f3u0)X+(f4+f5u0)X2+⋯+(f2n−2+f2n−1u0)X2n−1−1 而一元多项式 f(1)(X) 加上 f(X), f(−X), 三者恰好满足下面的关系:
f(1)(X2)=(f0+f1u0)+(f2+f3u0)X2+(f4+f5u0)X4+⋯+(f2n−2+f2n−1u0)X2n−1=21(f(X)+f(−X))+u0⋅2X1(f(X)−f(−X)) 所以说,如果我们要证明 f~(1)(X1,…,Xn−1) 为 f~(X0,X1,…,Xn−1) 的 Partial Evaluation,我们只需要证明上面的等式成立即可。
同理可推,如果我们要证明 f~(X0,X1,…,Xn−1)=v,那么我们可以引入若干个中间结果,即 Partial Evaluated 的 MLE 多项式,以及他们同构映射到的一元多项式
f~(0)(X0,X1,…,Xn−1)f~(1)(u0,X1,…,Xn−1)f~(2)(u0,u1,…,Xn−1)⋮f~(n−1)(u0,u1,…,un−2,Xn−1)f~(n)(u0,u1,…,un−2,un−1)↦f(0)(X)↦f(1)(X)↦f(2)(X)↦f(n−1)(X)↦f(n)(X) 其中最后一个 f(n)(X) 是一个常数多项式,它恰好为 f~(u0,u1,…,un−1) 完全的运算结果,即 f(n)(X)=v。
并且,这些引入的一元多项式 f(0)(X),…,f(n−1)(X) ,它们相邻两项之间都满足下面的关系:
f(i+1)(X2)=2f(i)(X)+f(i)(−X)+ui⋅2Xf(i)(X)−f(i)(−X) 其中 f~(n)(u0,u1,…,un−2)=v 为最终的 MLE 运算结果,而 h(0)(X) 为与 f~ 同构的 UniPoly: h(0)(X)=f(X)。
回到我们的证明目标:f~(n)(u0,u1,…,un−1)=v,我们把这个运算过程的证明拆分为下面几个步骤:
- 构造一个 Univariate 多项式 f(X),使其系数向量等于 f~ 的系数,并构造多项式承诺 cm(f(X))
- 多项式 f~ 运算过程总共包含 n 步的部分运算,每一次中间部分运算都会产生一个新的 MLE 多项式: f~(1),f~(2),…,f~(n−1)
- 证明这些中间 MLE 所对应的 Univariate 多项式满足一个递推关系,这通过 Verifier 提供的随机数 β 来随机抽样检查:
f(i+1)(β2)=2f(i)(β)+f(i)(−β)+ui⋅2βf(i)(β)−f(i)(−β) - 证明 f(n)(β2)=v
- 证明所有的 Univariate 多项式 {f(i)(X)} 在 X=β,X=−β,X=β2 处的运算求值都正确
如果我们在 PIOP 证明系统中采用的是 MLE 的 evaluation-form,那么我们采用需要一个类似 FFT 的转换运算,将其转换成 MLE 的 coefficient-form。这个转换运算的复杂度是 O(NlogN)。
在 Nova 的实现中,Setty 给出了 HyperKZG 的改进方案。它是利用了 Gemini PCS 方案背后的一个通用技术,这个技术与 f~ 究竟是 Evaluation-form 还是 Coefficient-form 无关,只要他们能把计算过程拆分成多步的线性运算。
回顾上节介绍的 Gemini 论文中的这个 MLE 运算求值证明,它是将 f~(X0,X1,…,Xn−1) 的 Evaluation 过程分解为 logn 个步骤,然后把每一个中间 MLE 的系数向量都映射到一个 UniPoly 的系数,然后通过证明这些 UniPoly 之间的关系来保证 f~ 运算的正确性。
对一个 MLE 多项式 f~(X) 的 Evaluation-form,让我们看下它的求值运算过程:
f~(X0,X1,…,Xn−1)=a0E0(X0,X1,…,Xn−1)+a1E1(X0,X1,…,Xn−1)+⋯+a2n−1E2n−1(X0,X1,…,Xn−1) 这里 Ei(X) 为 Lagrange Polynomials,它的定义如下:
Ei(X0,X1,…,Xn−1)=j=0∏n−1(bits(i)j⋅Xj+(1−bits(i)j)(1−Xj)) 其中 bits(i)j 为 i 的二进制表示的第 j 位(注意,这里采用 Big-endian 的表示形式)。例如 i=5,它的二进制表示为 101,那么 bits(5)0=1,bits(5)1=0,bits(5)2=1。
容易通过定义得知, Ei(X) 满足下面的拆分性质(Tensor Structure):
Ei∥j(X,Y)=Ei(X)⋅Ej(Y) 其中 k=i∥j 为 k 的二进制位向量的分拆,例如,i=23,它的二进制表示为 10111,可以拆分为 10∥111,或者记为 23=2∥7。根据拆分性质,我们可以得到:
Ei∥b(X0,(X1,…,Xn−1))=Eb(X0)⋅Ei(X1,…,Xn−1) 那么我们观察下,如果 f~ 在一次 Partial Evaluation 之后的样子,令 X0=u0,X=(X1,…,Xn−1):
f~(u0,X)=a0E0(u0,X)+a1E1(u0,X)+⋯+a2n−2E2n−2(u0,X)+a2n−1E2n−1(u0,X)=(a0E0(u0))⋅E0(X)+(a1E1(u0))⋅E0(X)+⋯+(a2n−1E0(u0))⋅E2n−1−1(X)+(a2n−1E1(u0))⋅E2n−1−1(X)=(a0(1−u0))⋅E0(X)+(a1u0)⋅E0(X)+⋯+(a2n−2(1−u0))⋅E2n−1−1(X)+(a2n−1u0)⋅E2n−1−1(X)=(a0(1−u0))⋅E0(X)+(a1u0)⋅E0(X)+⋯+(a2n−2(1−u0))⋅E2n−1−1(X)+(a2n−1u0)⋅E2n−1−1(X)=(a0(1−u0)+a1u0)⋅E0(X)+⋯+(a2n−2(1−u0)+a2n−1u0)⋅E2n−1−1(X)=h~(1)(X) 可以看出,h~(1)(X) 的 Evaluation 点值向量为:
(a0(1−u0)+a1u0),(a2(1−u0)+a3u0),…,(a2n−2(1−u0)+a2n−1u0) 对比下 f~(u0,X) 的系数向量,我们会发现两者都是只有原先长度的一半,但是只是折半运算的方式不一样,前者为 ((1−u)⋅a+u⋅b),后者为 (a+u⋅b),这个新的折半运算方法并没有阻止我们采用 Gemini-PCS 的技术来保证 Split-and-fold 的正确性。
我们仍然可以引入 n−1 个部分运算的 MLE 多项式,以及将他们的 Evaluations 映射到多个 UniPoly 的系数:
h~(0)(X0,X1,…,Xn−1)h~(1)(u0,X1,…,Xn−1)h~(2)(u0,u1,…,Xn−1)⋮h~(n−1)(u0,u1,…,un−1)↦h(0)(X)↦h(1)(X)↦h(2)(X)↦h(n−1)(X) 其中 h~(0)(X)=f~(X),而 h~(n−1)(u0,u1,…,un−1)=v,
并且给出他们的 Evaluation form 之间满足一个「相似的」递推关系:
h(i+1)(X2)=(1−ui)⋅2h(i)(X)+h(i)(−X)+ui⋅2Xh(i)(X)−h(i)(−X) 因此,Verifier 接下来可以发送一个唯一的随机挑战点 X=β,来检查 {h(i)(β)} 之间是否满足上面等式所定义的递推关系。这里就可以对接上 KZG10 这个针对 Univariate 多项式的 PCS 方案。完成剩下的证明。
3. 协议描述¶
本小节给出这个协议的流程描述。协议是证明一个 MLE 多项式 f~(X0,X1,…,Xn−1) 在一个给定的点 (u0,u1,…,un−1) 处的运算求值结果等于 v。
Witness 输入:¶
- a=(a0,a1,…,a2n−1): 多项式 f(X) 的系数向量。
f(X)=a0+a1X+a2X2+⋯+a2n−1X2n−1 公共输入:¶
- Cf: MLE 多项式 f~(X0,X1,…,Xn−1) 的同构多项式 f(X) 的承诺,
Cf=KZG10.Commit(f(X)) u=(u0,u1,…,un−1): 运算求值点的坐标
v=f~(u0,u1,…,un−1): 运算求值的结果
Round 1¶
- Prover 计算 h(1)(X),h(2)(X),…,h(n−1)(X)
h(1)(X)h(2)(X)⋮h(n−1)(X)=((1−u0)a0+u0a1)+((1−u0)a2+u0a3)X+⋯+((1−u0)a2n−2+u0a2n−1)X2n−1−1=((1−u1)a0(1)+u1a1(1))+((1−u1)a2(1)+u1a3(1))X+…+((1−u1)a2n−1−2(1)+u1a2n−1−1(1))X2n−2−1=((1−un−1)a0(n−2)+un−1a1(n−2))+((1−un−1)a2(n−2)+un−1a3(n−2))X 这里 (a0(1),a1(1),…,a2n−1−1(1)) 代表 h(1)(X) 的点值向量,同理, (a0(i),…,a2n−i(i)) 代表 h(i)(X) 的点值向量。
- Prover 输出承诺 (Ch(1),Ch(2),…,Ch(n−1))
Round 2¶
Verifier 发送随机挑战数 β∈F,
Prover 计算并发送
(h(0)(β),h(0)(−β)),
(h(1)(β),h(1)(−β),h(1)(β2)),
(h(2)(β),h(2)(−β),h(2)(β2)), …,
(h(n−2)(β),h(n−2)(−β),h(n−2)(β2))
Prover 证明上述的 Evaluation 的正确性,并发送证明:(π0,β,π0,−β),
(π1,β,π1,−β,π1,β2), …, (πn−1,β,πn−1,−β,πn−1,β2)
Verification¶
- 验证 h(0),…,h(n−1) 在 X=β, X=−β 与 X=β2 处的取值是否满足递推式:
h(1)(β2)h(2)(β2)⋮h(n−1)(β2)v=?(1−u0)⋅2h(0)(β)+h(0)(−β)+u0⋅2βh(0)(β)−h(0)(−β)=?(1−u1)⋅2h(1)(β)+h(1)(−β)+u1⋅2βh(1)(β)−h(1)(−β)=?(1−un−2)⋅2h(n−2)(β)+h(n−2)(−β)+un−2⋅2βh(n−2)(β)−h(n−2)(−β)=?(1−un−1)⋅2h(n−1)(β)+h(n−1)(−β)+un−1⋅2βh(n−1)(β)−h(n−1)(−β) - 根据 Cf,Ch(1),Ch(2),…,Ch(n−1),验证多项式取值运算的正确性:
KZG10.VerifyKZG10.VerifyKZG10.VerifyKZG10.VerifyKZG10.VerifyKZG10.VerifyKZG10.VerifyKZG10.Verify(Cf,(Cf,(Ch(1),(Ch(1),(Ch(1),(Ch(n−1),(Ch(n−1),(Ch(n−1),β,−β,β,−β,β2,β,−β,β2,h(0)(β),h(0)(−β),h(1)(β),h(1)(−β),h(1)(β2),⋮h(n−1)(β),h(n−1)(−β),h(n−1)(β2),π0,β)π0,−β)π1,β)π1,−β)π1,β2)πn−1,β)πn−1,−β)πn−1,β2)=?1=?1=?1=?1=?1=?1=?1=?1 4. 协议优化¶
在上述协议中,有几个点可以优化:
- Prover 没有必要发送除 h(0)(β2) 之外的其它所有 X=β2 的运算值,因为 Verifier 可以通过下面的递推关系计算出来。这样可以减少 Prover 的通信量,同时 Verifier 在计算的过程相当于同时进行了验证,因而可以省去递推式验证过程。
h(i+1)(β2)=(1−ui)⋅2h(i)(β)+h(i)(−β)+ui⋅2βh(i)(β)−h(i)(−β) - Prover 可以通过一个随机数 γ 把 h(0)(X),…,h(n−1)(X) 聚合在一起,得到 h(X),然后证明 h(X) 在 X=β,−β,β2 处的取值。这样可以避免让 Prover 发送 3n−1 个独立的 KZG10 的 Evaluation 证明,而是只需要发送三个 Evaluation 证明。
下面是优化过后的协议描述
Round 1¶
Prover 计算 h(1)(X),h(2)(X),…,h(n−1)(X)
h(1)(X)h(2)(X)⋮h(n−1)(X)=((1−u0)a0+u0a1)+((1−u0)a2+u0a3)X+⋯+((1−u0)a2n−2+u0a2n−1)X2n−1−1=((1−u1)a0(1)+u1a1(1))+((1−u1)a2(1)+u1a3(1))X+…+((1−u1)a2n−1−2(1)+u1a2n−1−1(1))X2n−2−1=((1−un−1)a0(n−2)+un−1a1(n−2))+((1−un−1)a2(n−2)+un−1a3(n−2))X Prover 发送多项式承诺 (Ch(1),Ch(2),…,Ch(n−1))
Round 2¶
Verifier 发送随机挑战数 β∈F,
Prover 计算并发送
(h(0)(β),h(0)(−β),h(0)(β2)),
(h(1)(β),h(1)(−β)),
(h(2)(β),h(2)(−β)), …,
(h(n−1)(β),h(n−1)(−β))
Round 3¶
Verifier 发送随机挑战数 γ∈F,
Prover 计算聚合多项式 h(X),
h(X)=h(0)(X)+γ⋅h(1)(X)+⋯+γn−1⋅h(n−1)(X) - Prover 计算 vβ,v−β,vβ2
vβv−βvβ2=h(0)(β)+γ⋅h(1)(β)+⋯+γn−1⋅h(n−1)(β)=h(0)(−β)+γ⋅h(1)(−β)+⋯+γn−1⋅h(n−1)(−β)=h(0)(β2)+γ⋅h(1)(β2)+⋯+γn−1⋅h(n−1)(β2) - Prover 计算 h∗(x)
h∗(X)=h(β)⋅Lβ(X)+h(−β)⋅L−β(X)+h(β2)⋅Lβ2(X) 这里假设 Domain D={β,−β,β2},而 {Lβ(X),L−β(X),Lβ2(X)} 为 D 上的 Lagrange Polynomials。那么 h∗(X) 满足下面的等式:存在一个商多项式 q(X),使得
EQ1:h(X)−h∗(X)=q(X)⋅(X−β)(X+β)(X−β2) - Prover 计算商多项式 q(X) 并发送其多项式承诺 Cq=cm(q(X))
Round 4¶
Verifier 发送随机挑战数 ζ∈Fp
Prover 计算 EQ1 的线性化多项式 rζ(X),满足 rζ(ζ)=0,
rζ(X)=h(X)−h∗(ζ)−q(X)⋅(ζ−β)(ζ+β)(ζ−β2) Prover 发送线性化多项式的承诺 Cr=[r(x)]1
Prover 计算商多项式 w(X) 满足:
w(X)=X−ζrζ(X) Prover 发送 Cw=[w(x)]1
Verification¶
- 计算 (h(1)(β2),h(2)(β2),…,h(n−1)(β2)),
h(1)(β2)h(2)(β2)⋮h(n−1)(β2)=(1−u0)⋅2h(0)(β)+h(0)(−β)+u0⋅2βh(0)(β)−h(0)(−β)=(1−u1)⋅2h(1)(β)+h(1)(−β)+u1⋅2βh(1)(β)−h(1)(−β)=(1−un−2)⋅2h(n−2)(β)+h(n−2)(−β)+un−2⋅2βh(n−2)(β)−h(n−2)(−β) - 计算 h(β),h(−β),h(β2),
h(β)=h(0)(β)+γ⋅h(1)(β)+⋯+γn−1⋅h(n−1)(β)h(−β)=h(0)(−β)+γ⋅h(1)(−β)+⋯+γn−1⋅h(n−1)(−β)h(β2)=h(0)(β2)+γ⋅h(1)(β2)+⋯+γn−1⋅h(n−1)(β2) - 计算 c(X) 在 X=ζ 处的取值 c(ζ),
- 计算 Ch=Cf+γ⋅Ch(1)+γ2⋅Ch(2)+⋯+γn−1⋅Ch(n−1)
- 计算 Cr=[rζ(x)]1 的承诺:
Cr=[rζ(x)]1=Ch−c(ζ)⋅[1]1−(ζ−β)(ζ+β)(ζ−β2)⋅Cq - 验证 Ch 与 Cw 的关系:
e(Cr+ζ⋅Cw,[1]2)=?e(Cw,[x]2) 5. 性能分析¶
Proof size: (n+1)⋅G1 + (2n+1)⋅F
π=(Ch(1),Ch(2),…,Ch(n−1),Cq,Cw,{h(i)(β),h(i)(−β)}i=0n−1,h(0)(β2)) Verifier Cost: (2n+2)⋅EccMulG1 + (3n)⋅F+2⋅Pairing
- 2n⋅F.Mult
- 计算 h(β),h(−β),h(β2): 3n⋅F.Mult
- 计算 c(ζ): O(1)⋅F.Mult
- 计算 Ch: n⋅G1 Scalar Multiplication
- 计算 P: 2⋅G1 Scalar Multiplication
References¶