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) Prover Cost Round 1¶
- 直接用 Zeromorph 论文 Appendix A.2 的算法能计算出 qk 在 Hypercube 上的值,即可以得到 q^k 的系数,根据论文的结论,整个算法复杂度为 (2n+1−3) Fadd 以及 (2n−2) Fmul 。这里不计入加法的复杂度,因此计算出 q^k=[[q~k]]k,0≤k<n 的复杂度为 (N−2) Fmul 。
- 计算 {[q^k(x)∣x∈D(k)]}k=0n−1 ,由于已经计算得到 q^k(X) 的系数,现在直接代入 D(k) 进行求值计算。在一个点进行求值,使用 FFT 方法进行计算。
- 由于 ∣D(k)∣=2k⋅R ,因此计算 [q^k(x)∣x∈D(k)] 的复杂度为 2kR⋅log(2kR) Fmul=2kR(k+logR) Fmul 。计算 {[q^k(x)∣x∈D(k)]}k=0n−1 的复杂度为
k=0∑n−12kR(k+logR) Fmul 由于
k=0∑n−12k=20+…+2n−1=1−220(1−2n)=2n−1 k=0∑n−1k⋅2k=(n−2)⋅2n+2 因此
k=0∑n−12kR(k+logR)=R⋅k=0∑n−1k⋅2k+RlogR⋅k=0∑n−12k=R⋅nN+(RlogR−2R)N+2R−RlogR 因此这一轮的复杂度为 (R⋅nN+(RlogR−2R)N+2R−RlogR) Fmul 。
[!summary]
这一步有 n 个多项式 q^k(X) 都需要在 D(k) 上求值,采用 FFT 的方法,复杂度为 O(NlogN) 。
- 计算承诺 cm(q^n−1,q^n−2,…,q^0)=MMCS.commit(q^n−1,q^n−2,…,q^0) ,树的高度为 2⋅log(2n−1⋅R) ,涉及到的 Hash 计算有 (2n−1+⋯+20)⋅R 个,一次 Hash 操作的复杂度记为 H 。涉及到的 Compress 操作为 2n−2⋅R+…+20⋅R+1 ,记为 (2n−2⋅R+…+20⋅R+1) C ,因此这一步的复杂度为
==MMCS.commit(2n−1⋅R,…,R)((2n−1+⋯+20)⋅R) H+(2n−2⋅R+…+20⋅R+1) C(N−1)⋅R H+((N/2−1)⋅R+1) C 总结下这一轮的总复杂度为
=(N−2) Fmul+(R⋅nN+(RlogR−2R)N+2R−RlogR) Fmul+MMCS.commit(2n−1⋅R,…,R)(R⋅nN+(RlogR−2R+1)N+2R−RlogR−2) Fmul+MMCS.commit(2n−1⋅R,…,R) Round 2¶
- Verifier 发送随机数 ζ←$F∖D
- Prover 计算并发送 f^(ζ)
- Prover 计算并发送 {q^k(ζ)}k=0n−1 。
Prover Cost Round 2¶
- 计算 f^(ζ) ,Prover 有 f^ 的系数式,现在是求在一点的值,用 Horner 方法来计算,复杂度为 N Fmul 。
这一轮的总复杂度为
N Fmul+(N−1) Fmul=(2N−1) Fmul 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) 上的值。
Prover Cost Round 3¶
- 计算 [qfζ(x)∣x∈D] 。
- 先通过 f(X) 的系数式用 FFT 计算得到 [f(x)∣x∈D] 。由于 ∣D∣=N⋅R ,因此复杂度为 (RN⋅log(RN)) Fmul=(R⋅nN+RlogR⋅N) Fmul 。
- 再计算 [qfζ(x)∣x∈D] ,每一个值涉及 Finv+Fmul+2 Fmul=3 Fmul+Finv ,总共 3R⋅N Fmul+R⋅NFinv 。
- 因此整体计算复杂度为
=(R⋅nN+RlogR⋅N) Fmul+3R⋅N Fmul+R⋅N Finv(R⋅nN+(RlogR+3R)⋅N) Fmul+R⋅N Finv [!summary]
计算 [f(x)∣x∈D] 复杂度为 O(NlogN) 。
- 计算 [qq^k(x)∣x∈D(k)] 。Round 1 已经计算出 [q^k(x)∣x∈D(k)] ,由于 ∣Dk∣=2k⋅R ,因此这一步的复杂度为
k=0∑n−12k⋅R⋅(3 Fmul+Finv)=(3R Fmul+R Finv)⋅k=0∑n−12k=(3R Fmul+R Finv)⋅(N−1)=(3R⋅N−3R) Fmul+(R⋅N−R) Finv 整理汇总 Round 3 的计算复杂度为
=(R⋅nN+(RlogR+3R)⋅N) Fmul+R⋅N Finv+(3R⋅N−3R) Fmul+(R⋅N−R) Finv(R⋅nN+(RlogR+6R)⋅N−3R) Fmul+(2R⋅N−R) Finv 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) 。
Prover Cost Round 4¶
- 对于 i=n−1,…,0
fold(i)(y)=2fold(i+1)(x)+fold(i+1)(−x)+β(i)⋅2xfold(i+1)(x)−fold(i+1)(−x) 计算方式还可以改为
fold(i)(y)=(21+2xβ(i))⋅fold(i+1)(x)+(21−2xβ(i))⋅fold(i+1)(−x) plonky3 中采用了 fold_even_odd.rs 下面这种计算方式。
#[instrument(skip_all, level = "debug")]
pub fn fold_even_odd<F: TwoAdicField>(poly: Vec<F>, beta: F) -> Vec<F> {
// We use the fact that
// p_e(x^2) = (p(x) + p(-x)) / 2
// p_o(x^2) = (p(x) - p(-x)) / (2 x)
// that is,
// p_e(g^(2i)) = (p(g^i) + p(g^(n/2 + i))) / 2
// p_o(g^(2i)) = (p(g^i) - p(g^(n/2 + i))) / (2 g^i)
// so
// result(g^(2i)) = p_e(g^(2i)) + beta p_o(g^(2i))
// = (1/2 + beta/2 g_inv^i) p(g^i)
// + (1/2 - beta/2 g_inv^i) p(g^(n/2 + i))
let m = RowMajorMatrix::new(poly, 2);
let g_inv = F::two_adic_generator(log2_strict_usize(m.height()) + 1).inverse();
let one_half = F::TWO.inverse();
let half_beta = beta * one_half;
// TODO: vectorize this (after we have packed extension fields)
// beta/2 times successive powers of g_inv
let mut powers = g_inv
.shifted_powers(half_beta)
.take(m.height())
.collect_vec();
reverse_slice_index_bits(&mut powers);
m.par_rows()
.zip(powers)
.map(|(mut row, power)| {
let (r0, r1) = row.next_tuple().unwrap();
(one_half + power) * r0 + (one_half - power) * r1
})
.collect()
}
可以先计算出 2-1 复杂度为 Finv 。
在第 i 轮,计算 2β(i)=β(i)⋅2−1 ,复杂度为 Fmul 。
对于每一个 y∈Di ,计算 fold(i)(y) ,计算 x−1 ,再相乘,复杂度为 Finv+3 Fmul ,而 ∣Di∣=2i⋅R ,这一步的复杂度为 2i⋅R Finv+3⋅2i⋅R Fmul 。
对于每一个 i ,计算的总复杂度为
(2i⋅R) Finv+(3⋅2i⋅R+1) Fmul 因此总复杂度为
Finv+i=0∑n−1((2i⋅R) Finv+(3⋅2i⋅R+1) Fmul)=(RN−R+1) Finv+(3RN+n−3R) Fmul - 如果 i>0 ,Prover 发送 [fold(i)(x)∣x∈Di] 的 Merkle Tree 承诺,这里主要是涉及 Hash 操作,树的高度为 log(2i⋅R)=i+log(R) 。如果树的叶子节点有 2k 个,那么需要进行的哈希操作有 2k−1+2k−2+…+2+1=2k−1 次。即 MT.commit(2i⋅R)=(2i⋅R−1) H 。
总结上述所有的计算,对于折叠,总共要折叠 n 次,复杂度为 (RN−R+1) Finv+(3RN+n−3R) Fmul 。对于 Merkle Tree 承诺,复杂度为
i=1∑n−1MT.commit(2i⋅R) 因此这一轮的总复杂度为
(3RN+n−3R) Fmul+(RN−R+1) Finv+i=1∑n−1MT.commit(2i⋅R) 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。

Prover Cost Round 5¶
在查询阶段,Prover 的计算复杂度主要来自计算 s(i+1)=(s(i))2 ,但这些数都是来自 Di 中的元素,不需要再额外计算,可以通过索引值得到。
Prover Cost¶
汇总 Prover Cost,
=(R⋅nN+(RlogR−2R+1)N+2R−RlogR−2) Fmul+MMCS.commit(2n−1⋅R,…,R)+(2N−1) Fmul+(R⋅nN+(RlogR+6R)⋅N−3R) Fmul+(2R⋅N−R) Finv+(3RN+n−3R) Fmul+(RN−R+1) Finv+i=1∑n−1MT.commit(2i⋅R)+(23R⋅N+n−3R−1) Fmul+(21R⋅N−R) Finv+i=1∑n−2MT.commit(2i⋅R)(2R⋅nN+(2RlogR+7R+3)⋅N+n−RlogR−4R−3) Fmul+(3R⋅N−2R+1) Finv+MMCS.commit(2n−1⋅R,…,R)+i=1∑n−1MT.commit(2i⋅R) 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) Proof Size¶
- cm(q^n−1,q^n−2,…,q^0) ,这里承诺是用 mmcs 结构进行承诺的,发送的是一个 Hash 值,记为 H 。
- f^(ζ),q^0(ζ),…,q^n−1(ζ) ,都是有限域中的值,大小为 (n+1) F 。
计算 πqq^n,qq^n−1,…,qq^0 的大小
- cm(fold(n−1)(X)),cm(fold(n−2)(X)),…,cm(fold(1)(X)),fold(0)(y0) 的大小为 n H+F 。
重复 l 次:
- f^(t(n)),πf^(t(n)),f^(−t(n)),πf^(−t(n)) ,其中 πf^(t(n)) 与 πf^(−t(n)) 都是 Merkle Path,这里 f^ 是用 Merkle Tree 结构进行承诺的,该树的叶子节点有 2n⋅R 个。为了减少这一步打开点发送的 Merkle Path,在用 Merkle Tree 进行承诺时,这里可以将 f^(s(0)),f^(−s(0)) 放在相邻的叶子节点上,发送的哈希值有 log(2n⋅R−1) H 。这里也记发送的哈希值的个数为 (MT.open(2n⋅R)−1) H 。
其中 MT.open(x) 表示在 Merkle Tree 中承诺 x 个叶子节点时,其需要发送的 Merkle Path 中的哈希值的个数,那么
MT.open(x)=logx 因此这一步发送的证明大小为
2 F+(MT.open(2n⋅R)−1) H=2 F+(n+logR−1) H - 对于 i=n−1,…,1 ,发送 q^i(t(i)),πq^i(t(i)),fold(i)(−t(i)),πfold(i)(−t(i)) 。
对于 q^i(t(i)),πq^i(t(i)) ,这里需要发送 mmcs 结构中的 merkle path 。

例如要打开 q^1(ω10) ,那么图中紫色的哈希值是 Prover 发送的证明。在 Verifier 进行验证阶段,其可以计算出图中绿色部分的值,最后比较树中最上端的绿色方块的值是否和 Prover 之前承诺时发送的根节点值相等。
q^i(t(i)) 所对应的 q^i(X) 承诺时有 2i⋅R 个值。那么 πq^i(t(i)) 要发送的哈希值有 2(log(2i⋅R))=2i+2logR 个。
fold(i)(x) 所在的 Merkle Tree 的树的高度为 i+logR 。对于 fold(i)(−t(i)),πfold(i)(−t(i)) ,用的是 Merkle 树承诺,树的高度为 i+logR ,那么发送的哈希值有 i+logR 个。
因此对于每一轮 i ,其大小为 2 F+(3i+3logR) H 。总复杂度为
==i=1∑n−1(2 F+(3i+3logR) H)(2n−2) F+(23(n−1)n+3(n−1)logR) H(2n−2) F+(23n2+(3logR−23)n−3logR) H - 对于 q^0(t(0)),πq^0(t(0)) ,依然是 mmcs 结构打开,πq^0(t(0)) 要发送的哈希值有 2(log(20⋅R))=2logR 个 ,因此总复杂度为
F+2logR H 因此 πqq^n,…,qq^0 的大小为
n H+F+l⋅(2 F+(n+logR−1) H)+l⋅((2n−2) F+(23n2+(3logR−23)n−3logR) H)+l⋅(F+2logR H)=(2l⋅n+3l−1) F+(23l⋅n2+(3logRl−21l+1)n−l) H 因此 proof size 总大小为
=H+(n+1) F+(2l⋅n+3l−1) F+(23l⋅n2+(3logRl−21l+1)n−l) H((2l+1)⋅n+3l) F+(23l⋅n2+(3logRl−21l+1)n−l+1) H Verification¶
Verifier:
Step 1¶
- 对 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 f^ Merkle 数的高度为 2n⋅R 。Merkle Path 中发送了 n+logR−1 个哈希值,这里按 bit reverse 方式将相差一个符号的两个点的值放在相邻的两个叶子节点上,因此这里要验证计算时复杂度为
MTV(2n⋅R)=(n+logR−1) H 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^(ζ) 复杂度为 5 Fmul+2 Finv 。
复杂度为 2 Finv+4 Fmul
- 对于 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 会根据 Prover 发送的证明来计算哈希值进行验证,Prover 发送的哈希值有 2i+2logR 个,由于 Verifier 还会计算 q^i(t(i) 的哈希值,因此复杂度为 (2i+2logR) C+H 。
Verifier 计算
qq^i(t(i))=(1+λ⋅t(i))⋅t(i)−ζq^i(t(i))−q^i(ζ)
计算复杂度为 Finv+3 Fmul 。
- 更新 fold 的值为
fold=fold+qq^i(t(i)) Verifier 的计算取决于 Merkle 树的高度,Merkle 树的高度为 i+logR 。要进行的 Hash 计算为树的高度,即 (i+logR) H 。
这里 verifier 的计算复杂度为 2 Finv+4 Fmul 。
计算复杂度为 Finv+3 Fmul 。
Verifier 验证下面式子的正确性
fold(0)(y0)=?fold+qq^0(t(0))
📝 Notes
例如对于前面 Verifier 查询的例子,这里 Verifier 通过 Prover 发送的值,计算图中紫色的值,以及验证 Prover 发送的关于橙色部分的 Merkle Tree 的证明,最后 Verifier 验证自己计算得到的最后一个紫色部分的值是否等于 Prover 之前发送的值。

Verifier Cost 1¶
汇总上面 Verifier 的复杂度
=(n+logR−1) H+5 Fmul+2 Finv+2 Finv+4 Fmul+i=1∑n−1((2i+2logR) C+H+Finv+3 Fmul+(i+logR) H+2 Finv+4 Fmul)+H+C+Finv+3 Fmul(7n+5) Fmul+(3n+2) Finv+(21n2+(23+logR)n−1) H+(n2+(2logR−1)n+1−2logR) C 由于要重复 l 次,因此还要乘上 l ,复杂度为
(ln2+(2logRl−l)n+l−2logRl) C+(2ln2+(23l+logRl)n−l) H+(7ln+5l) Fmul+(3ln+2l) Finv Step 2¶
- 计算 Φn(ζ) 以及 Φn−k(ζ2k)(0≤k<n) ,由于
Φk(Xh)=1+Xh+X2h+…+X(2k−1)h 因此
Φn(ζ)=1+ζ+ζ2+…+ζ2n−1 Φn−k(ζ2k)=1+ζ2k+ζ2⋅2k+…+ζ(2n−k−1)⋅2k Verifier Cost 2¶
Verifier 计算
Φk(Xh)=1+Xh+X2h+…+X(2k−1)h=1−Xh1−(Xh)2k 因此
Φn(ζ)=1−ζ1−ζ2n Φn−k(ζ2k)=1−ζ2k1−(ζ2k)2n−k=1−ζ2k1−ζ2n - 对于 k=0,1,…,n−1 ,先计算 ζ21,ζ22,…,ζ2n−1,ζ2n ,复杂度为 n Fmul 。
- 对于 k=0,1,…,n−1 ,计算 1−ζ2k 的逆再和分子相乘,总复杂度为 n Fmul+n Finv 。
因此这一步的总复杂度为
2n Fmul+n Finv Step 3¶
验证下述等式的正确性
f^(ζ)−v⋅Φn(ζ)=k=0∑n−1(ζ2k⋅Φn−k−1(ζ2k+1)−uk⋅Φn−k(ζ2k))⋅q^k(ζ) Verifier Cost 3¶
- 计算 v⋅Φn(ζ) 复杂度为 Fmul 。
- 计算 ∑k=0n−1(ζ2k⋅Φn−k−1(ζ2k+1)−uk⋅Φn−k(ζ2k))⋅q^k(ζ) 复杂度为
k=0∑n−13 Fmul=3n Fmul 因此总复杂度为 (3n+1) Fmul 。
Verifier Cost¶
汇总 Verifier 的复杂度
=(ln2+(2logRl−l)n+l−2logRl) C+(2ln2+(23l+logRl)n−l) H+(7ln+5l) Fmul+(3ln+2l) Finv+2n Fmul+n Finv+(3n+1) Fmul(ln2+(2logRl−l)n+l−2logRl) C+(2ln2+(23l+logRl)n−l) H+((7l+5)n+5l+1) Fmul+((3l+1)n+2l) Finv 复杂度汇总¶
Prover’s Cost:
(2R⋅nN+(2RlogR+7R+3)⋅N+n−RlogR−4R−3) Fmul+(3R⋅N−2R+1) Finv+MMCS.commit(2n−1⋅R,…,R)+i=1∑n−1MT.commit(2i⋅R) Proof size:
((2l+1)⋅n+3l) F+(23l⋅n2+(3logRl−21l+1)n−l+1) H Verifier’s Cost:
(ln2+(2logRl−l)n+l−2logRl) C+(2ln2+(23l+logRl)n−l) H+((7l+5)n+5l+1) Fmul+((3l+1)n+2l) Finv