1. 引言
前序博客有:
微软团队2021年论文 《Nova: Recursive Zero-Knowledge Arguments from Folding Schemes》。
开源代码见:
- https://github.com/Microsoft/Nova(Rust)
- https://github.com/privacy-scaling-explorations/Nova(Rust)【除Nova之外,当前还在实现CCS(Customizable Constraint System)+HyperNova】
作者视频讲解见:
- 2022年2月 Nova: Recursive Zero-Knowledge Arguments from Folding Schemes - Srinath Setty
- 2022年8月在Session at Crypto 2022上分享 Nova: Recursive Zero-Knowledge Arguments from Folding Schemes - Abhiram Kothapalli
- 2023年5月 zkStudyClub: Supernova (Srinath Setty - MS Research)
Nova为:
- a SNARK for iterative computations:用于证明
y
=
F
(
F
(
F
(
F
(
F
(
x
)
)
)
)
)
y=F(F(F(F(F(x)))))
y=F(F(F(F(F(x))))),其中:
- F F F为(potentially non-deterministic)computation
- x x x为输入, y y y为输出
Nova这样的iterative computation SNARK的应用场景有:
- VDFs:此时 F F F为某delay function,如MinRoot,计算某有限域内的cube root 或 fifth root。
- Rollups: F F F的输入为:state Merkle root,以及,某些交易(non-deterministically),执行交易,输出:updated Merkle root。
- Turing-complete SNARK语言(如Lurk)的后端: F F F为执行a “step” of the program。
Nova的关键特性为:
- 无需trusted setup
- 所采用的vector commitment方案必须具有加法同态属性
- 仅针对R1CS instance,Fold scheme会将2个R1CS instance合并为1个R1CS instance。这些R1CS instance 必须具有完全相同的电路,即具有完全相同的 ( A , B , C ) (A, B, C) (A,B,C)矩阵。
- 无需(如,通过FFT运算)做多项式除法和多项式乘法运算,可使用DLOG为hard的任意cycles of elliptic curves:
- 可基于任意cycles of curves,如secp/secq。【详情见Spartan-ECDSA:最快的浏览器内 ZK secp256k1 ECDSA中的“附录:Secp256k1/Secq256k1曲线cycle”。】
- 也可基于任意FFT-friendly cycles of curves,如Pasta(Pallas/Vesta)。【详情见:Halo2学习笔记——背景资料之Elliptic curves(5) 和 Mina中的Pasta(Pallas和Vesta)曲线。】
- F F F运算指定为R1CS表示
- 为理论上最简单的证明系统,同时提供了state-of-the-art efficiency:
- Prover time:由2个size为
O
(
C
)
O(C)
O(C)的multiexps主导,其中,
C
=
∣
F
∣
C=|F|
C=∣F∣
- Nova的证明速度要比Groth16/PLONK/Halo等快5~50倍。
- 具有最小的单个step prover time:约为2个 |F|+c size multi-exp。对应100万个gate,用时1.1秒。
- 具有Constant-sized verifier circuit(主要由2个scalar multiplication运算主导):Nova的verifier circuit具有约2万个R1CS约束,是当前文献上记录的最小verifier circuit,意味着具有lowest recursion threshold。Nova的recursion开销比Halo的低7倍+,比Bunz等人2020年论文《Proof-carrying data without succinct arguments》方案低2倍+。
- 具有最小的递归开销 c(约为2次scalar multiplication运算),对应2万个gate。
- 具有最小的递归开销 c(约为2次scalar multiplication运算),对应2万个gate。
- 压缩proof size为: O ( log C ) O(\log C) O(logC)个group elements:实际上只有数KB。【借助Spartan等zkSNARK方案对线性size的IVC proof进行压缩,对于100万个gate,压缩proof size为8KB。】
- Prover time:由2个size为
O
(
C
)
O(C)
O(C)的multiexps主导,其中,
C
=
∣
F
∣
C=|F|
C=∣F∣
实用succinct argument方案衍化路径为:
- 1)基于Linear PCPs + Linear-only encodings方案:具有最短的proof size,但需要per-circuit trusted setup。
- 1.1)Pepper和Ginger等:最差情况下具有quadratic Prover。
- 1.2)[GGPR13]、Zaatar、Pinocchio、[Groth16]等:采用QAP-based linear PCP,具有quasilinear Prover。
- 2)基于Polynomial IOPs + Polynomial commitment方案:可具有universal setup或untrusted setup——具体取决于所采用的多项式承诺方案;可具有可定制化电路——可降低Prover开销。
- 2.1)[CMT12]、Aurora、vSQL、Hyrax、Stark等:最差情况下,具有non-succinct Verifier,即Verifier需自己读取整个电路描述。
- 2.2)Spartan、Qaurks、HyperPlonk、SuperSpartan等基于multilinear多项式的方案,以及Sonic、Plonk、Marlin、SuperMarlin等基于单变量多项式的方案:通过引入computation commitments或holography,具有succinct Verifier,即Verifier仅需读取“电路的succinct encoding”。
- 3)基于Folding scheme方案:对递增电路具有最快的Prover、Prover易于并行化,且具有“基于Polynomial IOPs + Polynomial commitment方案”的所有优点——如universal setup或untrusted setup、可定制化电路等。
- 3.1)[BCTV14]、Halo等:为(S)NARK recursion。
- 3.2)Nova、SuperNova、Sangria(又名“PlonkNova”)、HyperNova等:为(S)NARK-less recursion。
现有IVC方案对比:
为证明 y = F ( n ) ( x ) y=F^{(n)}(x) y=F(n)(x):
- 1)直观方法为:
-
将 F F F的 n n n个迭代展开为一个电路
-
对该单一电路应用某state-of-the-art SNARK来生成证明
直观方法的缺陷为:
- Prover所需内存为: Ω ( n ∗ ∣ F ∣ ) \Omega(n*|F|) Ω(n∗∣F∣)
- proof 不是 incrementally updatable
- 取决于具体的SNARK方案,Verifier time可能会依赖具体的 n n n值(即,迭代次数)
-
- 2)Incrementally verifiable computation(IVC)[Val08, BCTV14]
之前IVC方案 与 Nova对比为:【其中[Set19]对应Spartan论文】
- 1)Valiant的原始IVC方案[Val08, BCTV14]为:
Valiant的原始IVC方案[Val08, BCTV14]的缺陷为:- 1.1)[BCTV14]中的SNARKs具有constant time verifier,但其需要昂贵的pairing-friendly cycle curves,并需要trusted setup。
- 1.2)使用无需trusted setup的SNARKs需要更大的verifier circuits。
- 2)Halo系列IVC方案[BGH19, BCLMS20]:Partially Verify Proofs,将一些昂贵的运算推迟验证,从而可避免使用昂贵pairing-friendly cycle curves以及trusted setup的要求:【累加器acc的size不会随时间增长,同时验证最后的acc值,即相当于验证所有(推迟到)已累加的acc值。】
Halo系列IVC方案[BGH19, BCLMS20]的缺陷为:- 2.1)Partially checking π i \pi_i πi in-circuit仍是昂贵的。
- 2.2)Generating π i \pi_i πi is concretely and asymptotically expensive,即生成每个step的 π i \pi_i πi 仍是昂贵的。
- 3)Nova方案:不做任何proof验证,而仅是reduce claims:【Fold将 “对2个instance的check” 减为 “对1个instance的check”。这些instance具有相同的结构和相同的size。】
Nova 与 Bunz等人2021年论文BCLMS21 Proof-Carrying Data without Succinct Arguments中的“split accumulation”相关:
- Nova效率更高、更直接,且提供了a “native” scheme for proof compression。
Nova的秘密武器在于:Folding Schemes for NP:【下图的NP instance均为R1CS instance】
Nova的关键贡献在于:
- 不使用SNARKs 所实现的folding scheme for NP
R1CS回顾:
为实现R1CS的folding scheme,最直观但却错误的方式为:
即以上方案,对于
Z
=
(
W
,
x
,
1
)
Z=(W,x,1)
Z=(W,x,1),找不到相应的
r
r
r,使得
A
Z
∘
B
Z
=
C
Z
AZ\circ BZ= CZ
AZ∘BZ=CZ,原因在于:
Nova的创新之一在于其所实现的Relaxed R1CS:【当
u
=
1
,
E
=
0
⃗
u=1,E=\vec{0}
u=1,E=0时,标准R1CS实例 为 Relaxed R1CS实例 的特例情况。】
针对Relaxed R1CS的folding scheme为:【即通过引入public input
u
u
u和witness
E
E
E来实现消减,以保证folding后仍能满足相同的relation关系】
根据relaxed R1CS的folding scheme所实现的IVC直观方案为:
不过,以上naive方案,IVC proof size为:
O
(
∣
F
′
∣
)
O(|F'|)
O(∣F′∣)个group elements。且存在以下2个问题:
- Proofs are large, both asymptotically and concretely
- Proofs are not zero-knowledge
原则上:借助zkSNARKs, P P P可证明the knowledge of a valid IVC proof,从而提供了succinctness和zero-knowledge。但是,借助zkSNARKs的方案是expensive的:
- P P P必须证明,如,其知道 W W W对应承诺值 W ^ \hat{W} W^,以及其他信息
为此,Nova创新之二是进行了proof压缩:
- 将对vectors的承诺值,解析为,对multilinear多项式的多项式承诺值
- 使用Spartan的变种,来直接证明承诺值 W ^ \hat{W} W^满足相应的relaxed R1CS。
- 压缩后的proof size,由 O ( ∣ F ′ ∣ ) O(|F'|) O(∣F′∣)个group elements,降低为 O ( log ∣ F ′ ∣ ) O(\log |F'|) O(log∣F′∣)个group elements
也可以使用IPA(Inner Product Argument)来证明承诺值 W ^ \hat{W} W^满足相应的relaxed R1CS:
- proof size可降低约5倍(可避免Spartan中的sum-check protocol,但在生成final proof时,会引入稍微高一点的开销)
Navo的缺陷有:
- zero-knowledge被限制在单个prover的context(zero-knowledge属性不是必须的)
当前的情况为:
- IVC proof size为: O ( ∣ F ′ ∣ ) O(|F'|) O(∣F′∣)个group elements。
- 压缩的proof size为: O ( log ∣ F ′ ∣ ) O(\log |F'|) O(log∣F′∣)个group elements,但是其不可incremental。
因此,一个open question为:
- 保持Nova其它特性的同时,能否构建具有succinct proof的IVC方案?
Nova的一些优秀特性有:- smallest verifier circuit
- efficient prover等等
当前的一些进展以及规划为:
最终的committed relaxed R1CS的folding scheme为:
借助Fiat-Shamir transform,将上述interactive folding scheme转换为non-interactive folding scheme:
所谓Nova,是指:
- 根据non-interactive folding scheme设计的IVC(Incrementally Verifiable Computation)方案。
- 借助具有简洁承诺值的任意加法同态承诺方案(如Pedersen commitment)来实例化。
- 额外使用某高效zkSNARK变种(如Spartan的变种)来证明knowledge of valid IVC proof,这样就具备了简洁性和零知识性,可提供简洁的、零知识的knowledge of valid IVC proof。
- 注意Nova是不具备零知识属性的IVC方案。 因为对于零知识IVC方案,其要求IVC proof具备零知识属性。但是Nova中的IVC proof并不会隐藏与incremental computation steps相关的witnesses信息。
对于单个Prover的情况下,这种差异问题不大,因为可借助Nova中的辅助zkSNARK来提供zero-knowledge proof of knowledge of a valid IVC proof。
- 注意Nova是不具备零知识属性的IVC方案。 因为对于零知识IVC方案,其要求IVC proof具备零知识属性。但是Nova中的IVC proof并不会隐藏与incremental computation steps相关的witnesses信息。
假设需构建一个基于folding scheme的IVC方案,其Prover需证明 z n = F n ( z 0 ) z_n=F^{n}(z_0) zn=Fn(z0),基于初始输入 z 0 z_0 z0,重复执行某函数 F F F n n n次之后,输出结果为 z n z_n zn。与SNARK-based IVC类似,基于folding scheme的IVC方案中,Prover使用扩展函数 F ′ F' F′,其包括:
- 调用函数 F F F
- 记录之前对 F ′ F' F′函数调用的fold proofs
F
′
F'
F′的输入有:
- 2个committed relaxed R1CS instance
u
i
u_i
ui和
U
i
U_i
Ui
- U i U_i Ui表示调用 F ′ F' F′ 第 1 , ⋯ , i − 1 1,\cdots,i-1 1,⋯,i−1次的正确执行
- u i u_i ui表示调用 F ′ F' F′ 第 i i i次的正确执行
F ′ F' F′主要执行2个任务:
-
1)执行递归计算中的一步(一个step):
F ′ F' F′可使用instance u i u_i ui中所包含的 z i z_i zi来输出 z i + 1 = F ( z i ) z_{i+1}=F(z_i) zi+1=F(zi) -
2) F ′ F' F′调用non-interactive folding scheme的Verifier,将:
- checking u i u_i ui task
- 和 checking U i U_i Ui task
fold为对单个instance U i + 1 U_{i+1} Ui+1的checking task。
然后,IVC Prover会计算新的instance
u
i
+
1
u_{i+1}
ui+1,用于证明对
F
′
F'
F′第
i
+
1
i+1
i+1次调用执行的正确性,即IVC Prover会计算新的instance
u
i
+
1
u_{i+1}
ui+1来证明
z
i
+
1
=
F
(
z
i
)
z_{i+1}=F(z_i)
zi+1=F(zi)。
至此,有:
- U i + 1 U_{i+1} Ui+1:表示调用 F ′ F' F′ 第 1 , ⋯ , i − 1 , i 1,\cdots,i-1,i 1,⋯,i−1,i 次的正确执行
- u i + 1 u_{i+1} ui+1:调用 F ′ F' F′ 第 i + 1 i+1 i+1次的正确执行
以上描述掩盖了一个细微的差异:
- 因为 F ′ F' F′必须输出running instance U i + 1 U_{i+1} Ui+1供下次调用使用, U i + 1 U_{i+1} Ui+1包含在 u i + 1 . x u_{i+1}.x ui+1.x(即为 u i + 1 u_{i+1} ui+1的public IO公共输入输出)中。
- 但是在下一次迭代时, F ′ F' F′必须将 u i + 1 . x u_{i+1}.x ui+1.x fold into U i + 1 . x U_{i+1}.x Ui+1.x,即意味着 F ′ F' F′将陷入squeeze U i + 1 U_{i+1} Ui+1 into U i + 1 . x U_{i+1}.x Ui+1.x的困境。
为解决这种不一致性, F ′ F' F′不再直接输出 U i + 1 U_{i+1} Ui+1,而是修改 F ′ F' F′的输出为其public IO的抗碰撞哈希值,这样可确保 F ′ F' F′的public IO为常量个有限域元素。下一次调用 F ′ F' F′时,额外将该哈希值的preimage作为non-deterministic advice。可假设该哈希函数还会额外输入一个随机值以提供hiding属性,不过为便于表示这里不明确描述。
以不存在witness的标准R1CS特例情况为例:【即
E
为
0
向量,
W
为
0
向量,
x
为
0
向量,
u
为
0
E为0向量,W为0向量,x为0向量,u为0
E为0向量,W为0向量,x为0向量,u为0】
令
(
u
⊥
,
w
⊥
)
(u_{\perp},w_{\perp})
(u⊥,w⊥)为trivially satisfying instance-witness pair,其中
E
,
W
,
x
E,W,x
E,W,x为appropriately-sized zero vectors,
r
E
=
0
,
r
W
=
0
r_E=0,r_W=0
rE=0,rW=0,
E
ˉ
和
W
ˉ
\bar{E}和\bar{W}
Eˉ和Wˉ分别为
E
,
W
E, W
E,W的承诺值。
在第
i
+
1
i+1
i+1次迭代时,IVC Prover运行
F
′
F'
F′,计算
u
i
+
1
和
U
i
+
1
u_{i+1}和U_{i+1}
ui+1和Ui+1的同时,还会计算
w
i
+
1
和
W
i
+
1
w_{i+1}和W_{i+1}
wi+1和Wi+1.。由于
u
i
+
1
和
U
i
+
1
u_{i+1}和U_{i+1}
ui+1和Ui+1证明了对
F
′
F'
F′的
i
+
1
i+1
i+1次调用的正确性(进而间接证明了对
F
F
F的
i
+
1
i+1
i+1次调用的正确性),相应的IVC proof为
(
U
i
+
1
,
W
i
+
1
)
,
(
u
i
+
1
,
w
i
+
1
)
(U_{i+1},W_{i+1}),(u_{i+1},w_{i+1})
(Ui+1,Wi+1),(ui+1,wi+1)。其简洁性由底层的folding scheme提供。
具体的IVC构建为:
因为
F
′
F'
F′可 以polynomial time计算,可将
F
′
F'
F′表示为一个committed relaxed R1CS structure
s
F
′
s_{F'}
sF′。令:
(
u
i
+
1
,
w
i
+
1
)
←
trace
(
F
′
,
(
v
k
,
U
i
,
u
i
,
(
i
,
z
0
,
z
i
)
,
w
i
,
T
ˉ
)
)
(u_{i+1},w_{i+1})\leftarrow \text{trace}(F',(vk,U_i,u_i,(i,z_0,z_i),w_i,\bar{T}))
(ui+1,wi+1)←trace(F′,(vk,Ui,ui,(i,z0,zi),wi,Tˉ))
表示基于non-deterministic advice
(
v
k
,
U
i
,
u
i
,
(
i
,
z
0
,
z
i
)
,
w
i
,
T
ˉ
)
(vk,U_i,u_i,(i,z_0,z_i),w_i,\bar{T})
(vk,Ui,ui,(i,z0,zi),wi,Tˉ)运行
F
′
F'
F′的satisfying committed relaxed R1CS instance-witness pair
(
u
i
+
1
,
w
i
+
1
)
(u_{i+1},w_{i+1})
(ui+1,wi+1)。
具体的IVC方案
(
G
,
K
,
P
,
V
)
(\mathcal{G,K,P,V})
(G,K,P,V)定义如下:
以上IVC方案
(
G
,
K
,
P
,
V
)
(\mathcal{G,K,P,V})
(G,K,P,V)的efficiency为:
不过,以上IVC proof:
- 不具有零知识性:因以上IVC proof没有隐藏Prover的non-deterministic inputs。
- 不具有简洁性:因以上IVC proof size与 F F F size呈线性关系。
接下来,是使用zkSNARKs来压缩IVC proof:
- 用于证明其知道 Π i \Pi_i Πi,使得IVC Verifier V \mathcal{V} V accepts for statement ( i , z 0 , z i ) (i,z_0,z_i) (i,z0,zi)。
- 借助zkSNARKs生成的proof,具有与zkSNARKs对应的简洁性和零知识性。
使用zkSNARKs来证明the knowledge of a valid IVC proof的基本原理为:
2. 使用Spartan变种来压缩Nova IVC proof
不过在实例化时,需要针对committed relaxed R1CS的zkSNARK方案,来证明the knowledge of a valid IVC proof succinctly and in zero-knowledge。
Spartan具有无需FFT运算和trusted setup的特性,在Nova论文中,采用了Spartan的改写版zkSNARK方案来实现IVC proof压缩。
2.1 Spartan背景知识
- polynomial extension定义:每个函数
f
:
{
0
,
1
}
l
→
F
f:\{0,1\}^l\rightarrow\mathbb{F}
f:{0,1}l→F具有唯一的MLE,反之,每个基于
F
\mathbb{F}
F的
l
l
l-变量multilinear多项式 唯一 extends 某个唯一函数mapping
{
0
,
1
}
l
→
F
\{0,1\}^l\rightarrow\mathbb{F}
{0,1}l→F。本文以
f
~
\tilde{f}
f~来表示
f
f
f的唯一MLE。
- sum-check protocol协议:
2.2 针对Idealized Relaxed R1CS的polynomial IOP
Nova论文中基于Spartan,将Spartan的 polynomial IOP for R1CS 逐字改编为 polynomial IOP for relaxed R1CS:
针对Idealized Relaxed R1CS的polynomial IOP具体为:
注意:
- 对上面的Equation(2)应用sum-check protocol的soundness error至多为 O ( log m ) / ∣ F ∣ O(\log m)/|\mathbb{F}| O(logm)/∣F∣。
- 共使用了4次sum-check protocol,其中有3次可并行调用,且可合并为一个sum-check protocol。每次调用sum-check protocol时,相应的多项式在每个变量的degree最多为3,且变量数为 s = log m s=\log m s=logm,因此该polynomial IOP的round复杂度为 O ( log m ) O(\log m) O(logm)。由于每个多项式的每个变量degree至多为3,总的communication cost为 O ( log m ) O(\log m) O(logm)个field elements。
- Verifier runtime与sum-check protocol Verifier runtime一致。 e q ~ \tilde{eq} eq~ evaluate at任意input ( τ , r x ) ∈ F 2 s (\tau,r_x)\in\mathbb{F}^{2s} (τ,rx)∈F2s仅需 O ( log m ) O(\log m) O(logm)次filed运算。
- 与Spartan的Prover在polynomial IOP的工作量一致,采用Libra等之前的技术,仅需要 O ( n ) O(n) O(n)次基于 F \mathbb{F} F的运算。
2.3 将Polynomial IOPs编译为zkSNARKs
与SuperSonic、Marlin、Spartan中类似,借助多项式承诺方案和Fiat-Shamir transform来将Polynomial IOPs编译为zkSNARKs。
关键点有:
-
1)将向量承诺解析为multilinear多项式承诺:
可将 m m m-sized 向量 看成是 log m \log m logm-变量multilinear多项式在 { 0 , 1 } log m \{0,1\}^{\log m} {0,1}logm的evaluation值集合。现有的针对 log m \log m logm-变量multilinear多项式 承诺方案有:【二者主要差别在于Verifier time】- 1.1)
P
C
B
P
PC_{BP}
PCBP:采用Pedersen多项式承诺方案来对向量进行承诺,与Hyrax中类似,Bulletproofs可提供合适的inner product证明协议。基于的安全假设为DLOG。对于
log
m
\log m
logm-变量multilinear多项式,承诺用时
O
λ
(
m
)
O_{\lambda}(m)
Oλ(m),生成的承诺值长度为
O
λ
(
1
)
O_{\lambda}(1)
Oλ(1)。Prover开销为
O
λ
(
m
)
O_{\lambda}(m)
Oλ(m),proof size为
O
λ
(
log
m
)
O_{\lambda}(\log m)
Oλ(logm),Verifier验证用时为
O
λ
(
m
)
O_{\lambda}(m)
Oλ(m)。注意
P
C
B
P
PC_{BP}
PCBP为Hyrax多项式承诺的特例情况。
- 1.2) P C D o r y PC_{Dory} PCDory:将向量承诺看成是对2层矩阵承诺值的承诺,详细见[19, 34]论文中的例子。基于SXDH安全假设。Dory [34]提供了所需的inner product argument。承诺用时 O λ ( m ) O_{\lambda}(m) Oλ(m),生成的承诺值长度为 O λ ( 1 ) O_{\lambda}(1) Oλ(1)。Prover开销为 O λ ( m ) O_{\lambda}(m) Oλ(m),proof size为 O λ ( log m ) O_{\lambda}(\log m) Oλ(logm),Verifier验证用时为 O λ ( log m ) O_{\lambda}(\log m) Oλ(logm)。
- 1.1)
P
C
B
P
PC_{BP}
PCBP:采用Pedersen多项式承诺方案来对向量进行承诺,与Hyrax中类似,Bulletproofs可提供合适的inner product证明协议。基于的安全假设为DLOG。对于
log
m
\log m
logm-变量multilinear多项式,承诺用时
O
λ
(
m
)
O_{\lambda}(m)
Oλ(m),生成的承诺值长度为
O
λ
(
1
)
O_{\lambda}(1)
Oλ(1)。Prover开销为
O
λ
(
m
)
O_{\lambda}(m)
Oλ(m),proof size为
O
λ
(
log
m
)
O_{\lambda}(\log m)
Oλ(logm),Verifier验证用时为
O
λ
(
m
)
O_{\lambda}(m)
Oλ(m)。注意
P
C
B
P
PC_{BP}
PCBP为Hyrax多项式承诺的特例情况。
-
2)针对sparse multilinear多项式的多项式承诺方案:不过,本文实际需要的是可高效处理sparse multilinear多项式的多项式承诺方案。Spartan论文中第7章和Quarks论文第6章中,提供了将现有 “multilinear多项式的多项式承诺方案” 编译为 “sparse multilinear多项式的多项式承诺方案” 的通用编译器。从而可将 P C B P PC_{BP} PCBP和 P C D o r y PC_{Dory} PCDory分别编译为“Sparse- P C B P PC_{BP} PCBP”和“Sparse- P C D o r y PC_{Dory} PCDory”。从而分别有:
-
基于“Sparse- P C B P PC_{BP} PCBP”的zkSNARK:
-
基于“Sparse- P C D o r y PC_{Dory} PCDory”的zkSNARK:
-