arkworks工具栈概览

1. 引言

arkworks定位为zkSNARK编程的Rust生态。其开源代码见:

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

猜你喜欢

转载自blog.csdn.net/mutourend/article/details/132912118