Base团队对四种领先的零知识证明(ZKP)系统(SnarkJS、Rapidsnark、Gnark和Noir)在验证基于passkey-wallet的签名性能进行了基准测试,重点关注了证明生成时间和gas成本。结果显示,Noir在证明生成速度上表现突出,但gas成本较高,而Groth16系统在gas成本方面更具优势。
Base 团队正在探索各种方法,以实现基于 智能钱包Passkey 账户的链上隐私,秉持着开放构建的精神,我们分享了最近对四个领先 ZKP 系统的深入研究:SnarkJS、Rapidsnark、Gnark 和 Noir。我们对它们在验证 Passkey 签名方面的性能进行了基准测试,并侧重于两个指标:
证明生成时间:在各种硬件配置上创建 ZKP 所需的时间。
Gas 成本:在 EVM 上验证智能合约中的证明所需的 gas。
有关基准测试设置的完整详细信息,包括脚本和配置,请参见我们的 GitHub 存储库。
零知识证明让你在不泄露你所知内容的情况下,证明你知道某些事情。它们的工作原理是构建数学证明,表明你正确地执行了计算,而没有泄露你使用的秘密输入。可以将其视为证明你已年满 18 岁,而无需显示你的确切年龄,或者证明你的账户中有足够的钱,而无需显示你的余额。
在加密领域,ZKP 正在对隐私和与扩展相关的用例产生影响。
对于隐私,Zcash 或 Iron Fish 等项目使用 ZKP 来实现完全私密的交易,其中金额、资产类型和交易参与者被隐藏,但网络仍然可以验证交易的有效性。
对于扩展,zkRollups 使用 ZKP 来离线处理数千笔交易,然后提交一个紧凑的证明,该证明在数学上保证所有这些交易都是有效的,从而节省了存储和计算成本。Risc0 和 SP1 等通用 zkVM 能够证明任意程序执行,从而开辟了超越交易处理的用例。
Passkey 是现代无密码身份验证系统。你可能已经注意到,许多主要平台(如 Google、GitHub、PayPal 和你今天使用的其他热门网站)都提供 Passkey 登录,而不是仅仅使用你的密码。
基于 Passkey 的智能钱包的工作方式类似。与用户必须记住或安全存储的传统助记词或私钥不同,Passkey 由你设备的操作系统安全地存储和管理。在许多实现中,它们可以通过 Face ID 或指纹等生物识别数据访问,从而提供更好的用户体验,并且可以通过 iCloud、1Password 或 Google Password Manager 等服务在你的设备上自动同步。
Base 账户是基于 Passkey 的智能钱包,依赖于 sec256r1 (P-256) 曲线来生成 ECDSA 签名,该标准与 Apple、Google 和 FIDO2 WebAuthn 规范使用的标准相同。 在零知识证明中验证 Passkey 签名可以实现强大的隐私功能。用户可以通过证明签名的有效性来证明公钥的所有权,而无需直接泄露其公钥,从而实现:
DAO 的匿名小组成员身份证明
敏感应用程序的私有身份验证
将证明生成委托给 relayer,同时保持隐私
请注意,在实践中,此类证明将包含两个步骤:一个步骤是证明密钥的所有权(例如,ZKP 中签名的有效性),第二个步骤是证明公钥(甚至是该公钥的承诺/哈希)位于某个集合中,例如链上 默克尔树。 对于这些基准测试,我们仅专注于在 ZKP 中验证 Passkey 签名的第一步,以验证这个想法。
虽然这些只是暂时的探索,但这是 Base 隐私小组(从 Iron Fish 收购的团队)真正热衷的一个话题。
为 Passkey 签名生成零知识证明也是一个有趣的技术问题。Passkey 对签名使用 P-256 椭圆曲线,但用于 EVM 的大多数高效和流行的 ZKP 系统使用具有不同数学域的 BN254 曲线。这会产生“曲线不匹配”问题。可以将其视为尝试进行数学运算,而你的计算器只能处理 1-100 的数字,但你需要处理 1-1000 的数字。你需要将较大的数字分解成较小的部分,并模拟你想要进行的数学运算。P-256 曲线元素不能直接表示为基于 BN254 的 ZKP 系统中的单个值。相反,它们必须通过复杂的数学运算进行“模拟”,从而产生包含大约 200 万个约束的大型电路。相比之下,Iron Fish 和 Zcash 中最复杂的 ZKP 电路大约有 10 万个约束。
我们测试了四个领先的 ZKP 框架,每个框架都有不同的优势:
SnarkJS:基于 JavaScript,在浏览器中运行,非常适合开发
Rapidsnark:C++ 优化的 SnarkJS 版本,用于提高生产速度
Gnark:基于 Go 的系统,具有强大的安全功能
Noir:基于 Rust,具有针对复杂运算的专门优化
所有这些框架都依赖于电路引擎,这些引擎将高级代码转换为 ZKP 系统可以理解的低级数学约束。每个框架都有自己表达和优化这些约束的方式。
一些 ZKP 系统有所谓的“可信设置”,每个电路都是唯一的,必须作为设置阶段的一部分生成。电路/程序越复杂,可信设置步骤的计算量就越大。Noir 使用一个 ZKP 系统,该系统依赖于“通用可信设置”,该设置只需生成一次,即可用于许多电路。无需重新生成可信设置是一个巨大的开发者体验优势。
关键技术选择:
BN254 曲线与 BLS12-381:我们选择 BN254 是为了在 EVM 环境中获得更好的性能和更少的 gas 成本
P-256 实现:由于从头开始构建 P-256 域算术超出了我们的范围,因此我们使用了现有的优化实现(称为“gadget”)
对于 Noir,我们利用了他们的“blackbox”功能,这些功能是由底层 Barretenberg 证明系统直接在优化的 C++ 代码中处理的专门操作,而不是表示为单个 ZKP 约束。
ZKP 栈 | 浏览器支持? | 语言 | 优势 | 证明系统 & 曲线 | 设置要求 |
---|---|---|---|---|---|
证明生成:<br>SnarkJS<br>电路引擎:<br>circom + p256 gadget | 是 | JavaScript | 多功能,浏览器兼容,但在大型电路上速度较慢 | Groth16<br>BN254 曲线 | 可信设置 |
证明生成: Rapidsnark<br>电路引擎:<br>circom + p256 gadget | 否 | C++ | 针对速度进行了优化 | Groth16<br>BN254 曲线 | 可信设置 |
证明生成<br>Gnark<br>电路引擎:gnark | 否 | Go | 强大的安全功能和快速证明速度 | Groth16<br>BN254 曲线 | 可信设置 |
电路引擎:<br>Noir 使用 P256 ECDSA 签名 blackbox <br>证明生成:BB (barretenberg) | 是,但 WASM 支持比原生支持慢 3.5-4 倍 <br>ℹ️ 基准测试是使用原生 Noir 完成的 | Rust | 使用 blackbox 进行自定义操作非常有效 | UltraHonk<br>BN254 曲线 | 通用可信设置 |
我们在 AWS EC2 实例上运行了基准测试,以模拟真实世界的云环境:
t4g.medium:ARM Graviton2,2 个 vCPU,4GB 内存—经济高效的 ARM
c7g.xlarge:ARM Graviton3,4 个 vCPU,8GB 内存
c7i.2xlarge:Intel,8 个 vCPU,16GB 内存
c7i.4xlarge:Intel,16 vCPU,32GB 内存
c7i.8xlarge:Intel,32 vCPU,64GB 内存
每个基准测试都涉及多次为 ECDSA 签名验证电路生成证明,以捕获最小值、平均值和最大值,以及标准偏差。Gas 成本是在 EVM 兼容的智能合约中进行链上验证时测量的。
原始数据和绘图位于我们的 results directory 中。
Noir 在速度方面占据主导地位,始终比基于 Groth16 的系统快 5-50 倍:
c7i.2xlarge(8 个 vCPU,16GB 内存):Noir ~2.1 秒,其他 40-50 秒
c7i.4xlarge(16 个 vCPU,32GB 内存):Noir ~1.1 秒,其他 20-30 秒
c7i.8xlarge(32 个 vCPU,64GB 内存):Noir ~0.6 秒,其他 15-25 秒
在 Groth16 系统中,Gnark 表现最佳,其次是 Rapidsnark 和 SnarkJS。
以下是汇总的基准测试运行(所有时间以秒为单位):
由于生成可信设置的内存开销,无法运行 SnarkJS 和 Rapidsnark
由于生成可信设置的内存开销,无法运行 SnarkJS 和 Rapidsnark
Noir 在速度方面获胜,但在 gas 成本方面却大幅落后。
Gas 成本在很大程度上取决于证明大小。Groth16 系统生成恒定大小的证明,而与电路复杂性无关。Noir 的 UltraHonk 系统生成的证明会随着电路复杂性呈对数增长:
套件 | 平均 gas 成本 | 差异 |
---|---|---|
SnarkJS | 347,665 | 基线 |
Rapidsnark | 347,665 | 基线 |
Gnark | 407,664 | +17%(额外的安全功能) |
Noir | 2,396,575 | +590%(高出 6-7 倍) |
Noir 在证明生成时间方面表现突出,在同一硬件上比 Groth16 的同类产品快 5-50 倍🙌,但在 gas 方面却贵 6-7 倍。
Noir 的速度优势主要来自其 blackbox 实现。black box 函数是由 Aztec 团队直接在其证明系统 barretenberg 中编写的手动编码的迷你电路,这些电路对特定操作使用高度专业的自定义门。具体来说,barretenberg 有一个代数门,可以直接有效地评估非原生域操作。Noir 直接调用这些自定义门,从而显着减小电路尺寸并缩短证明时间。
这些结果揭示了根本性的权衡,而不是明确的赢家。Noir 在某些操作的证明生成速度方面表现出色,使得它在某些情况下非常适合用户在移动或浏览器环境中生成客户端证明的应用程序,同时由于证明大小而具有更高的 gas 成本。它对于开发速度和迭代要求最高的场合,或者当你使用 Layer 2s 来降低 gas 成本影响时也是理想之选。对于 Noir 无法优化的复杂通用计算,或者当链上验证成本是主要约束时,Groth16 系统(如 SnarkJS、Rapidsnark 和 Gnark)会成为更好的选择。
但是,请记住,ZKP 格局在不断快速发展,每天都会出现新的创新和技术。祝你构建愉快!
有关原始数据、代码和绘图,请访问我们的 GitHub repo。欢迎提供反馈和贡献!
如果你有兴趣帮助我们构建一个能够提高创新、创造力和自由度的全球经济,we’re hiring——我们很乐意收到你的来信。
在社交媒体上关注我们,以了解最新信息:X(Base team on X)| Farcaster | Discord
- 原文链接: blog.base.dev/benchmarki...
- 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!