1. 引言
arkworks定位为zkSNARK编程的Rust生态。其开源代码见:
- https://github.com/arkworks-rs/
arkworks目前已广泛用于大量项目中,如:Aleo、anoma、celo、Espresso、Findora、Manta、Mina、Nimiq、penumbra等等。
参与arkworks开源实现的contributors众多:
arkworks通过通用抽象和模块化的设计,其总体工具栈架构为:
其中:
-
1)Algebra(通用有限域、曲线和多项式接口层):希望达成的效果为:很容易添加实现新的域或曲线;性能与特定手工优化的实现相当甚至更优。不希望有大量重复冗余的代码和工作量。
- 所有SNARKs都需要高效有限域运算(ark-ff),以及基于这些有限域的高效多项式运算(ark-poly)。
- 许多流行的SNARKs(如Groth16、Marlin、PLONK、Halo等)还要求实现扩域(ark-ff) 以及基于这些扩域的 椭圆曲线(ark-ec为抽象的各种traits,ark-curves为具体的椭圆曲线实现)。
基于人类工程学考虑,为实现椭圆曲线,相应的流程为:
- 1.1)实现相关的域
- 1.2)实现该曲线
- 1.2.1)指定曲线方程式系数。
- 1.2.2)指定cofactor和generator。
如上所示,arkworks抽象出的接口非常简单高效,很容易实现新曲线,如:
- 以太坊、ZCash、Algorand使用的:BLS12-381,以及相应的Jubjub和Bandersnatch曲线。
- 以太坊使用的:BN254曲线。
- Mina和ZCash使用的:Palla和Vesta 2-cycle曲线。
- Celo和Aleo使用的:BLS12-377,以及相应的BW6和CP6曲线。
- MNT6-298和MNT4-298 2-cycle曲线。
- MNT4-753和MNT6-753 2-cycle曲线。
同时arkworks模块化的设计,其通用曲线接口规范,很容易在不同曲线间切换,如:
arkworks的通用实现,与特定专业且手工优化实现,性能相当或更优:
-
2)SNARK开发(通用SNARK和约束系统接口层):主要关心的是:性能优化;数学实现;易于比较和benchmark。不关心曲线细节,以及约束生成。
模块化目的是:通过通用SNARK接口,使得易于在不同证明系统和多项式承诺方案间切换。
人类工程学考虑为:代码应与数学公式匹配,以便于审计和发现bug。如以Groth16 Verifier为例:
-
3)约束系统编程(通用SNARK应用框架):直接编写代数约束是痛苦的。有多种高级方法来编写约束系统并编译为代数约束,但需要在性能和人类工程学中做权衡。
其关注的点是:好的性能;具备人类工程需的约束编写体验。不关注的点是:SNARKs细节,以及曲线细节。
以Karatsuba乘法为例:
而arkworks的约束编写与直观算法匹配,符合人类工程学设计,易于审计:
参考问下
[1] 2022年4月视频 arkworks: Rust Ecosystem for zkSNARKs