之前的文章介绍了 zeromorph 协议对接 KZG 做多元线性多项式的 PCS 协议,这里介绍 zeromorph 协议接 FRI 对应的 PCS 协议。
对接 FRI¶
在之前的文章中已经介绍过,zeromorph 协议最后转换为证明一个关键的等式
f^(X)−v⋅Φn(X)=k=0∑n−1(X2k⋅Φn−k−1(X2k+1)−uk⋅Φn−k(X2k))⋅q^k(X) 以及要求商多项式 q^k(X) 的次数都小于 2k ,来防止 Prover 作弊。
为了证明上面的等式成立,Verifier 可以随机选取一个点 X=ζ ,然后让 Prover 提供 f^(ζ) 和 q^k(ζ) 的值,以便于 Verifier 验证下面的等式是否成立:
f^(ζ)−v⋅Φn(ζ)=k=0∑n−1(ζ2k⋅Φn−k−1(ζ2k+1)−uk⋅Φn−k(ζ2k))⋅q^k(ζ) 用 zeromorph 对接 FRI 协议时,可以用 FRI 协议实现的 PCS 来提供 f^(ζ) 和 q^k(ζ) 的值,并用 FRI 协议的 low degree test 来证明 deg(qk^)<2k 。
例如 Prover 要证明发送的 f^(ζ) 值的正确性。证明该值正确,等价于证明商多项式
X−ζf^(X)−f^(ζ) 存在。要证明该商多项式存在,就等价要证明其次数小于 2n−1 。为了对接 FRI 协议来进行 low degree test ,这里次数需要对齐到 2 的幂次,因此还需要做 degree correction。这时可以向 Verifier 要一个随机数 λ ,令
qf^ζ(X)=X−ζf^(X)−f^(ζ)+λ⋅X⋅X−ζf^(X)−f^(ζ) 用 FRI 协议来证明该商多项式的次数小于 2n 。
Commit 阶段¶
要承诺一个有 n 个未知数的 MLE 多项式,
f~(X0,X1,…,Xn−1)=i=0∑N−1ai⋅eq∼(bits(i),(X0,X1,…,Xn−1)) 首先直接将其在 hypercube 上的取值 (a0,…,aN−1) 映射到一元多项式 f^(X) ,
f^(X)=a0+a1X+⋯+aN−1XN−1 对于 FRI 协议,选取 F 中的一个大小为 2 的幂次的乘法子群 D=D0 ,并且有
Dn⊆Dn−1⊆…⊆D0 其中 ∣Di−1∣/∣Di∣=2 ,码率 ρ=N/∣D0∣ 。下面的协议中以折叠 n 次,即最后折叠到常数多项式来描述,实际中也可以折叠到一个次数比较小的多项式,协议流程会有细微差别。那么 FRI 协议对函数 f^ 的承诺为承诺 f^(X) 在 D 上的 Reed-Solomon 编码,即
cm(f^(X))=cm([f^(x)∣x∈D]) 实际实现中,一般用 Merkle 树来承诺 [f^(x)∣x∈D] ,记为
cm(f^(X))=MT.Commit([f^(x)∣x∈D]) Prover 发送的是这棵 Merkle 树的根哈希值,来作为 [f^(x)∣x∈D] 的承诺。
Evaluation 证明协议¶
公共输入¶
- MLE 多项式 f~ 的承诺 cm([[f~]]n)
- 求值点 u=(u0,u1,…,un−1)
- 求值结果 v=f~(u)
- 码率参数:ρ
- FRI 协议中进行 low degree test 查询阶段的重复查询的次数参数: l (实际中 l 的取值与安全性参数,安全假设以及码率相关)
- FRI 协议中编码的乘法子群:D,D(0),…,D(n−1)
Witness¶
- MLE 多项式 f~ 在 n 维 HyperCube 上的点值向量 a=(a0,a1,…,a2n−1)
Round 1¶
Prover 发送余数多项式的承诺
- 计算 n 个余数 MLE 多项式, {q~k}k=0n−1 ,其满足
f~(X0,X1,…,Xn−1)−v=k=0∑n−1(Xk−uk)⋅q~k(X0,X1,…,Xk−1) - 构造余数 MLE 多项式所映射到的 Univariate 多项式 q^k=[[q~k]]k,0≤k<n
- 计算并发送它们的承诺:cm(q^0),cm(q^1),…,cm(q^n−1) ,这里承诺 cm(q^0),cm(q^1),…,cm(q^n−1) 为 q^0,…,q^n−1 的 FRI 承诺,取 q^k 的乘法子群为 D(k)=D0(k) ,对应的承诺为
cm(q^k(X))=cm([q^k(x)∣x∈D(k)])=MT.commit([q^k(x)∣x∈D(k)]) 其中 ∣D(k)∣=2k/ρ 。
Round 2¶
- Verifier 发送随机数 ζ←$F∖D
- Prover 计算并发送 f^(ζ)
- Prover 计算并发送 q^k(ζ),0≤k<n 。
Round 3¶
- Verifier 发送随机数 λ←$F
- Prover 计算
qfζ(X)=X−ζf^(X)−f^(ζ)+λ⋅X⋅X−ζf^(X)−f^(ζ) 在 D 上的值,即
[qfζ(x)∣x∈D]=[x−ζf^(x)−f^(ζ)+λ⋅x⋅x−ζf^(x)−f^(ζ)∣∣x∈D] - 对于 0≤k<n ,Prover 计算
qq^k(X)=X−ζqk^(X)−q^k(ζ)+λ⋅X⋅X−ζqk^(X)−q^k(ζ) 在 D(k) 上的值。
Round 4¶
Prover 与 Verifier 进行 FRI 协议的 low degree test 交互,证明 qfζ(X) 的次数小于 2n ,
πqfζ←FRI.LDT(qfζ(X),2n) 这里包含 n 轮的交互,直到最后将原来的多项式折叠为常数多项式。下面用 i 表示第 i 轮,具体交互过程如下:
记 qfζ(0)(x)∣x∈D:=qfζ(x)∣x∈D
对于 i=1,…,n ,
- Verifier 发送随机数 α(i)
- 对于任意的 y∈Di ,在 Di−1 中找到 x 满足 y=x2,Prover 计算
qfζ(i)(y)=2qfζ(i−1)(x)+qfζ(i−1)(−x)+α(i)⋅2xqfζ(i−1)(x)−qfζ(i−1)(−x) - 如果 i<n ,Prover 发送 [qfζ(i)(x)∣x∈Di] 的 Merkle Tree 承诺,
cm(qfζ(i)(X))=MT.commit([qfζ(i)(x)∣x∈Di]) - 如果 i=n ,任选 x0∈Dn ,Prover 发送 qfζ(i)(x0) 的值。
📝 Notes
如果折叠次数 r<n ,那么最后不会折叠到常数多项式,因此 Prover 在第 r 轮时会发送一个 Merkle Tree 承诺,而不是发送一个值。
Round 5¶
这一轮是接着 Prover 与 Verifier 进行 FRI 协议的 low degree test 交互的查询阶段,Verifier 重复查询 l 次,每一次 Verifier 都会从 D0 中选取一个随机数,让 Prover 发送在第 i 轮折叠的值及对应的 Merkle Path,用来让 Verifier 验证每一轮折叠的正确性。
重复 l 次:
Verifier 从 D0 中随机选取一个数 s(0)←$D0
Prover 发送 f^(s(0)),f^(−s(0)) 的值,并附上 Merkle Path。
{(f^(s(0)),πf^(s(0)))}←MT.open([f^(x)∣x∈D0],s(0)) {(f^(−s(0)),πf^(−s(0)))}←MT.open([f^(x)∣x∈D0],−s(0)) Prover 计算 s(1)=(s(0))2
对于 i=1,…,n−1
- Prover 发送 qfζ(i)(s(i)),qfζ(i)(−s(i)) 的值,并附上 Merkle Path。
{(qfζ(i)(s(i)),πqfζ(i)(s(i)))}←MT.open([qfζ(i)(x)∣x∈Di],s(i)) {(qfζ(i)(−s(i)),πqfζ(i)(−s(i)))}←MT.open([qfζ(i)(x)∣x∈Di],−s(i)) - Prover 计算 s(i+1)=(s(i))2
如果折叠次数 r<n ,那么最后一步就要发送 qfζ(r)(s(r)) 的值,并附上 Merkle Path。
Round 6¶
- Prover 与 Verifier 进行 FRI 协议的 low degree test 交互,对于 0≤k<n ,证明 qq^k(X) 的次数小于 2k ,
πqq^k←FRI.LDT(qq^k(X),2k) 这里包含 n 轮的交互,直到最后将原来的多项式折叠为常数多项式。下面用 i 表示第 i 轮,具体交互过程如下:
记 qq^k(0)(x)∣x∈D(k):=qfζ(x)∣x∈D(k)
对于 i=1,…,k ,
- Verifier 发送随机数 βk(i)
- 对于任意的 y∈Di(k) ,在 Di−1(k) 中找到 x 满足 y=x2,Prover 计算
qq^k(i)(y)=2qq^k(i−1)(x)+qq^k(i−1)(−x)+βk(i)⋅2xqq^k(i−1)(x)−qq^k(i−1)(−x) - 如果 i<k ,Prover 发送 [qq^k(i)(x)∣x∈Di(k)] 的 Merkle Tree 承诺,
cm(qq^k(i)(X))=MT.commit([qq^k(i)(x)∣x∈Di(k)]) - 如果 i=k ,任选 y0(k)∈Dn ,Prover 发送 qq^k(i)(y0(k)) 的值。
📝 Notes
如果折叠次数 r<k ,那么最后不会折叠到常数多项式,因此 Prover 在第 r 轮时会发送一个 Merkle Tree 承诺,而不是发送一个值。
Round 7¶
这一轮是接着 Prover 与 Verifier 进行 FRI 协议的 low degree test 交互的查询阶段,Verifier 重复查询 l 次,每一次 Verifier 都会从 D0(k) 中选取一个随机数,让 Prover 发送在第 i 轮折叠的值及对应的 Merkle Path,用来让 Verifier 验证每一轮折叠的正确性。
对于 k=0,…,n−1, Verifier 重复查询 l 次:
Verifier 从 D0(k) 中随机选取一个数 sk(0)←$D0(k)
Prover 发送 q^k(sk(0)),q^k(−sk(0)) 的值,并附上 Merkle Path。
{(q^k(sk(0)),πq^k(sk(0)))}←MT.open([q^k(x)∣x∈D0(k)],s(0)) {(q^k(−sk(0)),πq^k(−sk(0)))}←MT.open([q^k(x)∣x∈D0(k)],−s(0)) Prover 计算 sk(1)=(sk(0))2
对于 i=1,…,k−1
- Prover 发送 qq^k(i)(sk(i)),qq^k(i)(−sk(i)) 的值,并附上 Merkle Path。
{(qq^k(i)(sk(i)),πqq^k(i)(sk(i)))}←MT.open([qq^k(i)(x)∣x∈Di(k)],sk(i)) {(qq^k(i)(−sk(i)),πqq^k(i)(−sk(i)))}←MT.open([qq^k(i)(x)∣x∈Di(k)],−sk(i)) - Prover 计算 sk(i+1)=(sk(i))2
如果折叠次数 r<k ,那么最后一步就要发送 qq^k(r)(s(r)) 的值,并附上 Merkle Path。
Proof¶
Prover 发送的证明为
π=(cm(q^0(X)),…cm(q^n−1(X)),f^(ζ),q^0(ζ),…,q^n−1(ζ),πqfζ,πqq^0,…,πqq^n−1) 用符号 {⋅}l 表示在 FRI low degree test 的查询阶段重复查询 l 次产生的证明,由于每次查询是随机选取的,因此花括号中的证明也是随机的。那么 FRI 进行 low degree test 的 n+1 个证明为
πqfζ=(cm(qfζ(1)(X)),…,cm(qfζ(n−1)(X)),qfζ(n)(x0),{f^(s(0)),πf^(s(0)),f^(−s(0)),πf^(−s(0)),qfζ(1)(s(1)),πqfζ(1)(s(1)),qfζ(1)(−s(1)),πqfζ(1)(−s(1)),…,qfζ(n−1)(s(n−1)),πqfζ(n−1)(s(n−1)),qfζ(n−1)(−s(n−1)),πqfζ(i)(−s(n−1))}l) 对于 k=0,…,n−1,
πqq^k=(cm(qq^k(1)(X)),…,cm(qq^k(k−1)(X)),qq^k(k)(y0(k)),{q^k(sk(0)),πq^k(sk(0)),q^k(−sk(0)),πq^k(−sk(0)),qq^k(1)(sk(1)),πqq^k(1)(sk(1)),qq^k(1)(−sk(1)),πqq^k(1)(−sk(1))…,qq^k(k−1)(sk(k−1)),πqq^k(k−1)(sk(k−1)),qq^k(k−1)(−sk(k−1)),πqq^k(k−1)(−sk(k−1))}l) Verification¶
Verifier
- 验证 qfζ(X) 的 low degree test 证明,
FRI.LDT.verify(πqfζ,2n)=?1 具体验证过程为,重复 l 次:
- 验证 f^(s(0)),f^(−s(0)) 的正确性
MT.verify(cm(f^(X)),f^(s(0)),πf^(s(0)))=?1 MT.verify(cm(f^(X)),f^(−s(0)),πf^(−s(0)))=?1 Verifier 计算
qfζ(0)(s(0))=(1+λ⋅s(0))⋅s(0)−ζf^(s(0))−f^(ζ) qfζ(0)(−s(0))=(1−λ⋅s(0))⋅−s(0)−ζf^(−s(0))−f^(ζ) 验证 qfζ(1)(s(1)),qfζ(1)(−s(1)) 的正确性
MT.verify(cm(qfζ(1)(X)),qfζ(1)(s(1)),πqfζ(1)(s(1)))=?1 MT.verify(cm(qfζ(1)(X)),qfζ(1)(−s(1)),πqfζ(1)(−s(1)))=?1 qfζ(1)(s(1))=?2qfζ(0)(s(0))+qfζ(0)(−s(0))+α(1)⋅2⋅s(0)qfζ(0)(s(0))−qfζ(0)(−s(0)) 对于 i=2,…,n−1
- 验证 qfζ(i)(s(i)),qfζ(i)(−s(i)) 的正确性
MT.verify(cm(qfζ(i)(X)),qfζ(i)(s(i)),πqfζ(i)(s(i)))=?1 MT.verify(cm(qfζ(i)(X)),qfζ(i)(−s(i)),πqfζ(i)(−s(i)))=?1 - 验证第 i 轮的折叠是否正确
qfζ(i)(s(i))=?2qfζ(i−1)(s(i−1))+qfζ(i−1)(−s(i−1))+α(i)⋅2⋅s(i−1)qfζ(i−1)(s(i−1))−qfζ(i−1)(−s(i−1))
验证最后是否折叠到常数多项式
qfζ(n)(x0)=?2qfζ(n−1)(s(n−1))+qfζ(n−1)(−s(n−1))+α(n)⋅2⋅s(n−1)qfζ(n−1)(s(n−1))−qfζ(n−1)(−s(n−1))
- 对于 k=0,…,n−1 ,验证 qq^k(X) 的 low degree test 证明,
FRI.LDT.verify(πqq^k,2k)=?1 具体验证过程为,重复 l 次:
- 验证 q^k(sk(0)),q^k(−sk(0)) 的正确性
MT.verify(cm(q^k(X)),q^k(sk(0)),πq^k(sk(0)))=?1 MT.verify(cm(q^k(X)),q^k(−sk(0)),πq^k(−sk(0)))=?1 Verifier 计算
qq^k(0)(sk(0))=(1+λ⋅sk(0))⋅sk(0)−ζq^k(sk(0))−q^k(ζ) qq^k(0)(−sk(0))=(1−λ⋅sk(0))⋅−sk(0)−ζq^k(−sk(0))−q^k(ζ) 验证 qq^k(1)(sk(1)),qq^k(1)(−sk(1)), 的正确性
MT.verify(cm(qq^k(1)(X)),qq^k(1)(sk(1)),πqq^k(1)(sk(1)))=?1 MT.verify(cm(qq^k(1)(X)),qq^k(1)(−sk(1)),πqq^k(1)(−sk(1)))=?1 qq^k(1)(sk(1))=?2qq^k(0)(sk(0))+qq^k(0)(−sk(0))+βk(1)⋅2⋅sk(0)qq^k(0)(sk(0))−qq^k(0)(−sk(0)) 对于 i=2,…,k−1
- 验证 qq^k(i)(sk(i)),qq^k(i)(−sk(i)) 的正确性
MT.verify(cm(qq^k(i)(X)),qq^k(i)(sk(i)),πqq^k(i)(sk(i)))=?1 MT.verify(cm(qq^k(i)(X)),qq^k(i)(−sk(i)),πqq^k(i)(−sk(i)))=?1 - 验证第 i 轮的折叠是否正确
qq^k(i)(sk(i))=?2qq^k(i−1)(sk(i−1))+qq^k(i−1)(−sk(i−1))+βk(i)⋅2⋅sk(i−1)qq^k(i−1)(sk(i−1))−qq^k(i−1)(−sk(i−1))
验证最后是否折叠到常数多项式
qq^k(k)(y0(k))=?2qq^k(k−1)(sk(k−1))+qq^k(k−1)(−sk(k−1))+βk(k)⋅2⋅sk(k−1)qq^k(k−1)(sk(k−1))−qq^k(k−1)(−sk(k−1))
- 计算 Φn(ζ) 以及 Φn−k(ζ2k)(0≤k<n) ,满足
Φn(ζ)=1+ζ+ζ2+…+ζ2n−1 Φn−k(ζ2k)=1+ζ2k+ζ2⋅2k+…+ζ(2n−k−1)⋅2k - 验证下述等式的正确性
f^(ζ)−v⋅Φn(ζ)=?k=0∑n−1(ζ2k⋅Φn−k−1(ζ2k+1)−uk⋅Φn−k(ζ2k))⋅q^k(ζ) Zeromorph 对接 FRI 优化协议¶
在上述的协议中,会对 n 个一元多项式 q^k(X) 进行承诺以及用 FRI 协议分别进行 low degree test 的证明,实际上,由于要证明的 q^k(X) 与 q^k−1(X) 之间的 degree bound 刚好相差 2 倍,因此可以用 rolling batch 的技巧对这 n 个多项式只进行一次 low degree test。另外注意到,f^(X) 与 q^n−1(X) 之间的 degree bound 也刚好相差 2 倍,因此还可以用 rolling batch [ZLGSCLD24] 的技巧对 f^(X),q^n−1(X),…,q^0(X) 这 n+1 个多项式只进行一次 low degree test。
当对 n 个一元多项式 q^k(X) 进行承诺时,由于 D(k) 与 D(k−1) 之间的大小也正好相差 2 倍,因此也可以借用 plonky3 中的 mmcs 结构对这 n 个多项式放在一起只进行一次承诺。
这里先以 3 个多项式 q^2(X),q^1(X),q^0(X) 为例来说明 mmcs 承诺的过程。设 ρ=21 ,Prover 要承诺的值为
cm(q^2(X))=[q^2(x)∣x∈D(2)]={q^2(ω20),q^2(ω21),q^2(ω22),…,q^2(ω27)} cm(q^1(X))=[q^1(x)∣x∈D(1)]={q^1(ω10),q^1(ω11),q^1(ω12),q^1(ω13)} cm(q^0(X))=[q^0(x)∣x∈D(0)]={q^0(ω00),q^0(ω01)} 其中 ω2,ω1,ω0 分别是 D(2),D(1),D(0) 上的生成元,满足
(ω2)8=1,(ω1)4=1,(ω0)2=1 在实际实现中,可以选取 Fp∗ 的生成元 g 来生成 ω2,ω1,ω0 ,令
ω2=g8p−1,ω1=g4p−1,ω0=g2p−1 由费马小定理可以验证 (ω2)8=1,(ω1)4=1,(ω0)2=1 是成立的,则它们之间满足关系式 ω2=ω1,ω12=ω0 。
可以看到 cm(q^2(X)) 要承诺的有 8 个值,cm(q^1(X)) 要承诺的有 4 个值,而 cm(q^0(X)) 要承诺的有 2 个值。如果用 Merkle Tree 来承诺,需要 3 棵树来进行承诺,其高度分别是 3, 2, 1,而现在用 mmcs 结构,可以将这 14 个值放在同一棵树上,其高度为 6。

这种承诺方式记为
cm(q^2(X),q^1(X),q^0(X))=MMCS.commit(q^2(X),q^1(X),q^0(X)) 下面依然以 n=3 为例来说明 rolling batch 的技巧,对于商多项式 qq^2(X),qq^1(X),qq^0(X) ,如果用 FRI 的 low degree test 来证明它们的 degree bound ,需要 3 个相应的证明,而 rolling batch 技巧可以让我们用一次 low degree test 来证明这 3 个多项式的 degree bound,协议过程如下图所示。

将折叠之后的值与下一个 qq^i−1 的值相加,再进行 FRI 的折叠,直到最后折叠成常数多项式。
Commit 阶段¶
这里承诺阶段与上述非优化版的承诺协议是一样的,承诺一个有 n 个变量的 MLE 多项式,
f~(X0,X1,…,Xn−1)=i=0∑N−1ai⋅eq∼(bits(i),(X0,X1,…,Xn−1)) 先直接映射成一元多项式 f^(X),为
f^(X)=a0+a1X+⋯+aN−1XN−1 其承诺为
cm(f^(X))=[f^(x)∣x∈D] 用一般的 Merkle Tree 来承诺,为
cm(f^(X))=MT.Commit([f^(x)∣x∈D]) Evaluation 证明协议¶
公共输入¶
- MLE 多项式 f~ 的承诺 cm([[f~]]n)
- 求值点 u=(u0,u1,…,un−1)
- 求值结果 v=f~(u)
- 码率参数:ρ
- FRI 协议中进行 low degree test 查询阶段的重复查询的次数参数: l
- FRI 协议中编码的乘法子群:D,D(0),…,D(n−1)
Witness¶
- MLE 多项式 f~ 在 n 维 HyperCube 上的点值向量 a=(a0,a1,…,a2n−1)
Round 1¶
Prover 发送余数多项式的承诺
- 计算 n 个余数 MLE 多项式, {q~k}k=0n−1 ,其满足
f~(X0,X1,…,Xn−1)−v=k=0∑n−1(Xk−uk)⋅q~k(X0,X1,…,Xk−1) - 构造余数 MLE 多项式所映射到的 Univariate 多项式 q^k=[[q~k]]k,0≤k<n
- 计算并发送它们的承诺,这里用 mmcs 结构对这 n 个多项式的值放在同一棵树上进行承诺。先分别计算这些多项式在对应 D(k) 上的值,计算
{[q^k(x)∣x∈D(k)]}k=0n−1 其中 ∣D(k)∣=2k/ρ ,再用 mmcs 对这 (2n−1+2n−2+…+20)/ρ 个值一次进行承诺,记为
cm(q^n−1,q^n−2,…,q^0)=MMCS.commit(q^n−1,q^n−2,…,q^0) Round 2¶
- Verifier 发送随机数 ζ←$F∖D
- Prover 计算并发送 f^(ζ)
- Prover 计算并发送 {q^k(ζ)}k=0n−1 。
Round 3¶
- Verifier 发送随机数 λ←$F
- Prover 计算
qfζ(X)=X−ζf^(X)−f^(ζ)+λ⋅X⋅X−ζf^(X)−f^(ζ) 在 D 上的值,即
[qfζ(x)∣x∈D]=[x−ζf^(x)−f^(ζ)+λ⋅x⋅x−ζf^(x)−f^(ζ)∣∣x∈D] - 对于 0≤k<n ,Prover 计算
qq^k(X)=X−ζqk^(X)−q^k(ζ)+λ⋅X⋅X−ζqk^(X)−q^k(ζ) 在 D(k) 上的值。
Round 4¶
Prover 与 Verifier 进行 FRI 协议的 low degree test 交互,这里使用 rolling batch 技巧进行优化,对于 k=0,…,n−1 , 一次证明所有 qq^k(X) 的次数小于 2k ,同时证明 qfζ(X) 的次数小于 2n 。为了方便后续协议的叙述,这里记
qq^n(X):=qfζ(X) 因此 low degree test 的证明记为
πqq^n,qq^n−1,…,qq^0←OPFRI.LDT(qq^n,qq^n−1,…,qq^0,2n) 这里包含 n+1 轮的交互,直到最后折叠为常数多项式。下面用 i 表示第 i 轮,具体交互过程如下:
- 初始化 i=n ,记 D(n):=D ,对于 x∈D(n) ,初始化
fold(i)(x)=qq^n(x) - 当 i=n−1,…,0 时:
fold(i)(y)=2fold(i+1)(x)+fold(i+1)(−x)+β(i)⋅2xfold(i+1)(x)−fold(i+1)(−x) - 对于 x∈D(i) ,Prover 更新 fold(i)(x)
fold(i)(x)=fold(i)(x)+qq^i(x) - 当 i>0 时,
- 当 i=0 时,由于最后折叠到常数多项式,Prover 选取 D(0) 中的任意一个点 y0∈D(0),发送折叠到最后的值 fold(0)(y0) 。
Round 5¶
这一轮是接着 Prover 与 Verifier 进行 FRI 协议的 low degree test 交互的查询阶段,Verifier 重复查询 l 次 :
Verifier 从 D(n) 中随机选取一个数 t(n)←$D(n)
Prover 发送 f^(t(n)),f^(−t(n)) 的值,并附上 Merkle Path。
{(f^(t(n)),πf^(t(n)))}←MT.open([f^(x)∣x∈D0],t(n)) {(f^(−t(n)),πf^(−t(n)))}←MT.open([f^(x)∣x∈D0],−t(n)) 对于 i=n−1,…,1,
Prover 计算 t(i)=(t(i+1))2
Prover 发送 q^i(t(i)) 及其 Merkle Path
{(q^i(t(i)),πq^i(t(i)))}←MMCS.open(q^i,t(i)) Prover 发送 fold(i)(−t(i)) 及其 Merkle Path
{(fold(i)(−t(i)),πfold(i)(−t(i)))}←MT.open(fold(i),−t(i))
对于 i=0 时,
- Prover 计算 t(0)=(t(1))2
- Prover 发送 q^0(s(0)) 及其 Merkle Path
{(q^0(t(0)),πq^0(t(0)))}←MMCS.open(q^0,t(0))
📝 Notes
例如对 3 个多项式进行 query,query 选取的是 qq^2(X) 中的最后一个元素 ω27,那么 Prover 需要发送的值及其 Merkle Path 是下图中绿色部分,橙色边框标记的发送的并非商多项式本身的值和对应的 Merkle Path,而是 q^k(X) 的 Merkle Path,即 Prover 会发送
>{q2^(ω27),q2^(ω23),q^1(ω13),fold(1)(ω11),q^0(ω01)}> 以及这些值对应的 Merkle Path。

Proof¶
Prover 发送的证明为
π=(cm(q^n−1,q^n−2,…,q^0),f^(ζ),q^0(ζ),…,q^n−1(ζ),πqq^n,qq^n−1,…,qq^0) 用符号 {⋅}l 表示在 FRI low degree test 的查询阶段重复查询 l 次产生的证明,由于每次查询是随机选取的,因此花括号中的证明也是随机的。那么 FRI 进行 low degree test 的证明为
πqq^n,…,qq^0=(cm(fold(n−1)(X)),…,cm(fold(1)(X)),fold(0)(y0),{f^(t(n)),πf^(t(n)),f^(−t(n)),πf^(−t(n)),q^n−1(t(n−1)),πq^n−1(t(n−1)),fold(n−1)(−t(n−1)),πfold(n−1)(−t(n−1)),…,q^1(t(1)),πq^1(t(1)),fold(1)(−t(1)),πfold(1)(−t(1)),q^0(t(0)),πq^0(t(0))}l) Verification¶
Verifier
- 对 qfζ(X) 以及 n 个商多项式 {qq^k}k=0n−1 一次进行 low degree test 的验证,记为
OPFRI.verify(πqq^n,qq^n−1,…,qq^0,2n)=?1 具体过程为,Verifier 重复 l 次:
- Verifier 验证 f^(t(n)),f^(−t(n)) 的正确性
MT.verify(cm(f^(X),f^(t(n)),πf^(t(n)))=?1 MT.verify(cm(f^(X),f^(−t(n)),πf^(−t(n)))=?1 qq^n(t(n))=(1+λ⋅t(n))⋅t(n)−ζf^(t(n))−f^(ζ) qq^n(−t(n))=(1−λ⋅t(n))⋅−t(n)−ζf^(−t(n))−f^(ζ) 初始化 fold 的值为
fold=2qq^n(t(n))+qq^n(−t(n))+β(n−1)⋅2⋅t(n)qq^n(t(n))−qq^n(−t(n)) 对于 i=n−1,…,1
Verifier 计算 t(i)=(t(i+1))2
验证 q^i(t(i)) 值的正确性,
MMCS.verify(cm(q^n−1,q^n−2,…,q^0),q^i(t(i)),πq^i(t(i)))=?1 Verifier 计算
qq^i(t(i))=(1+λ⋅t(i))⋅t(i)−ζq^i(t(i))−q^i(ζ) 更新 fold 的值为
fold=fold+qq^i(t(i)) Verifier 验证 fold(i)(−t(i)) 值的正确性,
MT.verify(cm(fold(i)(X)),fold(i)(−t(i)),πfold(i)(−t(i)))=?1 更新 fold 的值
fold=2fold(i)(−t(i))+fold+β(i−1)⋅2⋅t(i)fold(i)(−t(i))−fold
对于 i=0 时
📝 Notes
例如对于前面 Verifier 查询的例子,这里 Verifier 通过 Prover 发送的值,计算图中紫色的值,以及验证 Prover 发送的关于橙色部分的 Merkle Tree 的证明,最后 Verifier 验证自己计算得到的最后一个紫色部分的值是否等于 Prover 之前发送的值。

- 计算 Φn(ζ) 以及 Φn−k(ζ2k)(0≤k<n) ,满足
Φn(ζ)=1+ζ+ζ2+…+ζ2n−1 Φn−k(ζ2k)=1+ζ2k+ζ2⋅2k+…+ζ(2n−k−1)⋅2k - 验证下述等式的正确性
f^(ζ)−v⋅Φn(ζ)=?k=0∑n−1(ζ2k⋅Φn−k−1(ζ2k+1)−uk⋅Φn−k(ζ2k))⋅q^k(ζ) References¶
- [KT23] Kohrita, Tohru, and Patrick Towa. “Zeromorph: Zero-knowledge multilinear-evaluation proofs from homomorphic univariate commitments.” Cryptology ePrint Archive (2023). https://eprint.iacr.org/2023/917
- [H22] Haböck, Ulrich. “A summary on the FRI low degree test.” Cryptology ePrint Archive (2022).
- Plonky3. https://github.com/Plonky3/Plonky3
- [ZLGSCLD24] Zhang, Zongyang, Weihan Li, Yanpei Guo, Kexin Shi, Sherman SM Chow, Ximeng Liu, and Jin Dong. “Fast {RS-IOP} Multivariate Polynomial Commitments and Verifiable Secret Sharing.” In 33rd USENIX Security Symposium (USENIX Security 24), pp. 3187-3204. 2024.