1. 引言
Plonky1(又名Plonky):
- 开源代码见:https://github.com/0xPolygonZero/plonky(Rust):为基于Plonk和Halo的Recursive SNARKs。已于2021年12月9日被public archive退役了,由Plonky2取代。
Plonky2:
- 开源代码见:https://github.com/0xPolygonZero/plonky2(Rust):为基于Plonk和FRI技术的SNARK实现,其中还包含了Starky工具——高性能的STARK实现。
- Plonky2强调快速递归技术。
- Plonky2采用Goldilocks域,同时实现了secp256k1 base域和scalar域。
- Polygon Type 1 prover 使用了Plonky2。Polygon Type 1 prover:https://github.com/0xPolygonZero/zk_evm 定位为ZK-EVM证明组件,用于为以太坊区块生成proof。当前Polygon正与Toposware团队协作开发中,暂未完全实现用于Polygon CDK stack。
- Plonky2白皮书见:2022年9月8日版本 Plonky2: Fast Recursive Arguments with PLONK and FRI。
- Plonky2教程见:A Tutorial on Writing proofs with Plonky2 (Part I)
Plonky3:
- 开源代码见:https://github.com/Plonky3/Plonky3(Rust):定位为polynomial IOPs (PIOPs) toolkit。
- Plonky3致力于提供新的增强型密码库,旨在进一步提高递归ZKP的速度和效率。
- 包含针对更新CPU指令的优化。所谓更新指令,是指在老CPU处理器上不存在的指令。如x86的BMI1(Bit Mnipulation instruction Set 1)和BMI2(Bit Mnipulation instruction Set 2)、AVX2(Advanced Vector Extensions 2)、AVX-512。
- 实现了多项式IOP:如PLONK和STARKs。
- 实现了承诺方案:Brakedown、FRI
- 实现了M31、BabyBear、Goldilocks等域。
- 实现了Brakedown codes和Reed-Solomon codes。
- 实现了Rescue、Poseidon、Poseidon2、BLAKE3、Keccak-256、Monolith哈希函数。
Plonky2.5:
- 开源代码见:https://github.com/QEDProtocol/plonky2.5(Rust):定位为verify plonky3 proofs in plonky2。即在Plonky2 SNARK中验证某Plonky3 STARK proof。
1.1 时间轴
- 1)2018年:Eli Ben-Sasson和Starkware团队引入了STARKs——首个fully transparent, quantum-safe proof system with a scalable verifier。
- STARKs中指出:作为PCPs(Probabilistically Checkable Proofs)的变种——IOPs(Interactive Oracle Proofs),会比现有Groth16方案性能更优。
- 即使在STARKs发明五年后,其仍非常姜丹,引领了ZK L2领域——如StarkNet和Polygon zkEVM。
- 2)2019年:
-
DEEP-FRI论文:描述了对FRI的进一步优化,FRI为赋能STARKs的PCS(多项式承诺方案)。
- Plonky2、ethSTARK和其它(使用unique decoding radius之外的delta参数)等方案中所用的现代方案,首次在DEEP-FRI论文中描述。
-
Sean Bowe和Mary Maller发布突破性论文 Sonic:为SNARK构建提供了universal trusted setup。
-
受Sonic启发,Zac Williamson、Ariel Gabizon 和 Oana Ciobotaru发布了PLONK:取得了更大的突破,Plonk为universal trusted setup提供了更高效的SNARK。当前PLONK组件仍大量用于Polygon、zkSync等项目中。
-
自Sonic之后,研究人员发现,特定SNARKs具有2大组件:
- a)the argument/IOP
- b)the polynomial commitment scheme
受Plonk和Marlin启发,这2大组件可混合搭配,使得可将Sonic中的argument组件,替换为某更高效的变种。
-
-
DEEP-FRI论文发布6个月后,Matter Labs团队发布了Transparent Polynomial Commitment Scheme with Polylogarithmic Communication Complexity,介绍了一种使用FRI的多项式承诺方案,但该变种不够实用,且迄今为止并未被使用。
-
稍后,发布了Fractal:详细描述了在某transparent SNARK中将FRI用作多项式承诺方案。Fractal使用与Marlin相同的IOP,并使用FRI作为PCS。
-
数月后,Matter Labs发布了RedShift:很自然地将Fractal中的IOP替换为PLONK IOP。RedShift中所用的PCS之前已在DEEP-FRI论文中描述。
- RedShift采用PLONK+FRI,思路不错,但proof size大,且 proof time相比于最先进水平并未有显著改进。
- RedShift中更大的瓶颈在于(parallelize proof generation所需的)递归,不是真的可行。Fractal中对使用FRI的SNARK做了recursion benchmark,为生成单个recursive proof,用时需要约10分钟。
- 因此,在zkSync中使用RedShift性能是不够的。zkSync中持续用了约4年的PLONK+KZG,直到18个月前Plonky2的横空出世。(相比于2023年8月,即2022年2月Plonky2横空出世。)
-
- 2020年:
- Polygon团队开始尝试实现一种高效证明系统——Plonky:基于Halo,但一直在与使用cycles of elliptic curves的accumulation scheme的复杂性作斗争。
- Daniel Lubarov一直对Fractal和STARKs感兴趣,并相信使用FRI可提供一条从根本上提高prover性能的现实途径。但该观点并未让大家达成共识——因为Fractal的递归证明极其缓慢。
- 但Mir团队(即现在的Polygon Zero团队)的Daniel、William Borgeaud 和 Hamish Ivey-Law 坚信:通过仔细的优化和对如何构建在硬件上高效运行的证明系统的深入理解,可实现巨大的性能提升。
- 使用FRI有2大优势:
- a)可避免cycles of elliptic curves的accumulation scheme的复杂性。
- b)可使用small field,即可在现代硬件上运算速度快得多。
- Plonky2(PLONK + FRI),和,Starky(超性能STARKs):是数十次精心优化的结果,旨在实现最大性能。
- Plonky2之所以如此引人注目,是因为它解决了Fractal和RedShift中递归的性能问题。第一次,基于FRI的方案可以用于生成超快的递归证明——在Macbook Pro上仅需170毫秒。这消除了在生产中使用Plonky2和Starky的任何障碍。
取决于具体应用,Polygon Zero团队所构建的Plonky2和Starky,可实现10倍到100倍的性能改进。即使是自横空出世2年后,经第三方评测,Starky仍是最快的prover。
1.2 Plonky2、Starky和RedShift
Plonky2与RedShift等价么?
- 正是从这个意义上说,RedShift论文提出了PLONK+FRI的想法(尽管Fractal已经在SNARK构建中使用了FRI)。然而,Plonky2与RedShift论文中实际描述的方案完全不同,并代表了巨大的性能改进。从RedShift论文中实现Plonky2是不可能的。
Starky与RedShift等价么?
- Starky根本不是RedShift——Starky是一个STARK,与PLONK无关。
- Starky比Plonky2的性能高得多,且用于Polygon zkEVM上所有昂贵的交易级proofs。Plonky2和Starky从未声称自己是新的SNARKs或STARKs。正如其名,Plonky2和Starky分别是PLONK和STARK实现,具有超性能,代表了对先前技术状态的巨大改进。
- Plonky2和Starky是工程和应用密码学的成果,而不是学术论文。声称Plonky2只是RedShift,最大限度地减少了许多参与构建Plonxy2的人的辛勤工作。这表明,RedShift的创建者Matter Labs在论文发表后的近四年内(以及Plonky2发布后的18个多月)没有采用像RedShift这样的方案。
Boojum就是Plonky2吗?
- 当然,Boojum中使用了Plonky2中的一些相同代码。
2. Plonky1
当时团队在构建Mir——受Zexe启发的succinct区块链。
当时Coda(现在的Mina),使用Groth16和MNT curves来实现递归。
Plonky1利用了当时的前沿递归技术:
- on cycles of pairing-friendly elliptic curves
Plonky1中嵌入了当时的前沿研究:
- PLONK:succinct PIOP for circuits
- Halo:为原始的folding scheme
- Pasta curves
Plonky1最终实现的递归速度为:
- 约10秒钟。
刚速度无法满足要求,根本原因在于:
- 256-bit域通常需要分解为4个64-bit limbs
- 1次256-bit乘法运算,对应为16次64-bit limb乘法运算。每次域乘法运算,对应约80 cycles。
- 1次Montgomery乘法运算,对应3次256-bit乘法运算,从而对应48次64-bit limb乘法运算。
3. Plonky2
Plonky2的递归速度为:
- 约300毫秒。
根本原因在于:
- Plonky2中避免了使用256-bit域
Plonky2中创新使用了更小的Goldilocks域( 2 64 − 2 32 + 1 2^{64}-2^{32}+1 264−232+1),具有如下属性:
- Solinas prime结构,对应有除Montgomery reduction之外的fast reduction。
- 该域内大多数乘法运算,对应2 cycles或3 cycles。比Pasta域的80 cycles乘法运算要更便宜。
- 非常smooth: p = 2 32 ∗ 3 ∗ 5 ∗ 17 ∗ 257 ∗ 65537 p=2^{32}*3*5*17*257*65537 p=232∗3∗5∗17∗257∗65537。
- 在FFT中有很好的twiddle factors。
- 更多详情可参看:Remco 2024年3月7日博客The Goldilocks Prime
对于小域的挑战在于:
- soundness errors将变得不可忽略(non-negligible)
以多项式identity test为例,对于:
C
(
ζ
)
=
Z
H
(
ζ
)
q
(
ζ
)
C(\zeta)=Z_H(\zeta)q(\zeta)
C(ζ)=ZH(ζ)q(ζ)
根据Schwartz-Zippel,该多项式identity test具有的soundness error上限为:
deg
(
C
(
x
)
)
/
∣
F
∣
\deg(C(x))/|\mathbb{F}|
deg(C(x))/∣F∣
或,
D
n
/
∣
F
∣
D n/|\mathbb{F}|
Dn/∣F∣,其中
D
D
D为constraint degree。
3.1 提升基于Goldilocks域构建的密码学协议soundness的方法
3.1.1 以扩域来提高soundness
最简单的解决方案为:【即从Goldilocks扩域采样 ζ \zeta ζ】
- 选择更大的extension field,如约128 bit field: E = F [ X ] / ( X 2 − X − 1 ) \mathbb{E}=\mathbb{F}[X]/(X^2-X-1) E=F[X]/(X2−X−1)
通过采用Goldilocks degree 2 extension 或 degree 3 extension,即扩域至少为128 bits,从而可获得至少100-bit的安全性。
所有的密码学协议都可基于该扩域来开展。
3.1.2 以parallel repetition来提高soundness
另一解决方案为:
- 为多项式identity test,采样多个
ζ
i
∈
F
\zeta_i\in\mathbb{F}
ζi∈F,检查每个:【即仍然从Goldilocks域采样
ζ
i
\zeta_i
ζi】
C ( ζ 1 ) = Z H ( ζ 1 ) q ( ζ 1 ) C(\zeta_1)=Z_H(\zeta_1)q(\zeta_1) C(ζ1)=ZH(ζ1)q(ζ1)
C ( ζ 2 ) = Z H ( ζ 2 ) q ( ζ 2 ) C(\zeta_2)=Z_H(\zeta_2)q(\zeta_2) C(ζ2)=ZH(ζ2)q(ζ2)
C ( ζ 3 ) = Z H ( ζ 3 ) q ( ζ 3 ) C(\zeta_3)=Z_H(\zeta_3)q(\zeta_3) C(ζ3)=ZH(ζ3)q(ζ3)
根据tight parallel repetition theorem:
- repeated protocol具有error ε ′ \varepsilon' ε′。
从而有soundness error:
deg
(
C
(
x
)
)
′
/
∣
F
∣
′
\deg(C(x))'/|\mathbb{F}|'
deg(C(x))′/∣F∣′
实际需要的是non-interactive arguments,因此需要检查底层IOP的state-restoration soundness。最终仍为 ε ′ \varepsilon' ε′,但security argument是less clean的。详情可参看:
3.1.3 采用混合方式来提升soundness
Plony2中采用混合方式来提升soundness:【主要是基于工程易实现角度来选型】
环节 | 提升soundness方法 |
---|---|
permutation argument | parallel repetition |
combining constraints | parallel repetition |
polynomial identity test | extension field |
FRI protocol | extension field |
3.2 High arity “circuits”
标准PLONK电路的arity为3,即有2个输入和1个输出,形如:
而Plonky2电路中默认使用的arity为135:
- 使得单个gate可做复杂操作:如哈希或插值。原因在于:对于复杂操作,在单个大gate内,比跨多个小gate,要更简单。
- 区分了“routed” wires 和 “advice” wires。
3.3 Generalized wiring argument
标准PLONK的约束形式为:
Z
(
x
)
f
1
(
x
)
f
2
(
x
)
f
3
(
x
)
=
Z
(
g
x
)
g
1
(
x
)
g
2
(
x
)
g
3
(
x
)
Z(x)f_1(x)f_2(x)f_3(x)=Z(gx)g_1(x)g_2(x)g_3(x)
Z(x)f1(x)f2(x)f3(x)=Z(gx)g1(x)g2(x)g3(x)
从而强化
Z
Z
Z必须被更新为类似:
Z
′
=
Z
∗
(
f
1
∗
f
2
∗
f
3
)
/
(
g
1
∗
g
2
∗
g
3
)
Z'=Z*(f_1*f_2*f_3)/(g_1*g_2*g_3)
Z′=Z∗(f1∗f2∗f3)/(g1∗g2∗g3)
由于有许多routed wires,该degree将变得too high。
为降低degree,Plonky2中添加了额外的列来维护中间结果。
3.4 Easier public inputs
标准PLONK将第
i
i
i个public input置于第
i
i
i个gate:
P
I
(
X
)
:
=
∑
i
∈
[
ℓ
]
−
x
i
⋅
L
i
(
X
)
PI(X):=\sum_{i\in [\ell]}-x_i\cdot L_i(X)
PI(X):=∑i∈[ℓ]−xi⋅Li(X)
Plonky1中则相反,将public inputs置于最后几个gates。
若有大量的public inputs,有时最好将这些public inputs哈希到电路中,这样就仅需要发布单个哈希output。
Plonky2中:
- 采用了该哈希方法,哈希之后,总是准确有4个public inputs(即对应为原始public inputs的256-bit 哈希压缩结果——以4个Goldilocks域元素来表示)。
- 实际并不真的需要 P I ( X ) PI(X) PI(X)多项式,仅需要4个PI值,其在约束系统内为常量值。
3.5 “Fun” recursion problems
Plonky2专注于递归,其支持多种不同的递归模式:
- 1)标准递归为:【为最简单的方式,依赖关系是单向的】
- Circuit A:验证a proof of circuit B。
- 2)multi recursion为:
- Circuit A:验证a proof of circuit B,以及另一proof of circuit C。
- 3)conditional recursion为:【如IVC】
- Circuit A:验证a proof of circuit B,但仅当某特定wire被设置为1,才要求是valid有效的。
- 4)cyclic recursion为:【最困难,循环依赖】
- Circuit A:验证a proof of circuit A。
- 从而出现了循环依赖关系。在做recursion Gadget时,需要知道:
- size
- gates
- layout等等
- 如:使用IVC来证明某hash chain。
- 5)either-or recursion为:
- Circuit A:验证a proof of circuit A,或,a proof of circuit B。
- 可使用2个conditional recursion gadgets,来实现either-or recursion。
- 有时,需要将其合并为单个gadget。
- Circuit A:验证a proof of circuit A,或,a proof of circuit B。
- 6)STARK recursion为:
- Circuit A:验证a proof of STARK B,其length是可变的。
- 7)Polygon zero Type 1 zkEVM aggregation proof:
- Circuit A:有最多2个child proofs。每个child proof可为:
- a proof of circuit A
- 或,a proof of circuit B
- 或,empty
- Circuit A:有最多2个child proofs。每个child proof可为:
4. Plonky3
Plonky3为更灵活的PIOP toolkit,具有如下API:
- Polynomial commitment 方案
- Vector commitment方案
- Fiat-Shamir实现等等
Plonky3提供了更强大的batching:
- Merkle trees supporting matrices with mixed lengths
- FRI supporting codewords of mixed lengths
Plonky3中:
- 实现了多项式IOP:如PLONK和STARKs。
- 实现了承诺方案:Brakedown、FRI
- 实现了M31、BabyBear、Goldilocks等域。
- 实现了Brakedown codes和Reed-Solomon codes。
- 实现了Rescue、Poseidon、Poseidon2、BLAKE3、Keccak-256、Monolith哈希函数。
在Plonky3中,避免了使用parallel repetition来提升soundness,因为:
- 从安全角度来看,parallel repetition使得安全论证是less clean的。
- 而倾向于选择安全性更明显的extension field,因为这样没有caveats(警告)或待论证的事项。
参考资料
[1] 2024年3月8日,Polygon Zero团队Daniel Lubarov分享视频 Introduction to Plonky 1, 2 and 3
[2] Plonky 2 & 3
[3] Plonky2.5:在Plonky2中验证Plonky3 proof
[4] Polygon Knowledger Layer docs
[5] Polygon Zero官方2023年8月3日博客 A Short History of Plonky2