本文我们介绍circom-pairing,一种在 Circom 用于椭圆曲线配对的 zkSNARK 电路的概念验证实现。
原文标题:zkPairing: zkSNARKs for Elliptic Curve Pairings
原文作者: Jonathan W,Vincent H ,Yi Sun
原文来源:0xparc.org
配对是许多加密协议的核心组成部分。本文我们介绍circom-pairing1,一种在 Circom 用于椭圆曲线配对的 zkSNARK 电路的概念验证实现。
简介
基于配对的密码学(Pairing-based cryptography2) (PBC)建立在一个叫做椭圆曲线配对(elliptic curve pairing3)的数学对象存在的椭圆曲线密码学(elliptic curve cryptography4)之上。虽然配对的定义相对复杂,但它们是零知识密码学现代发展的许多加密对象的基础: BLS 数字签名、 KZG 多项式承诺和 zkSNARKs。
由于 ZK 生态系统中的这个关键角色,在 zkSNARKs 中实现配对极大地扩展了可寻址密码构造的范围,并增加了 SNARKs 的反射能力。特别是,我们设想的应用程序的ZK 身份(ZK Identity5) ,区块链扩容,和可编程的 SNARKs 。最后的“解锁”可能会带来一个未来,任何人都可以在运行中自由组合和联合不同的 SNARKs 。
由于配对涉及许多复杂的椭圆曲线操作,在 zkSNARK 中实现它们会带来许多挑战。首先,对于非自然域上的椭圆曲线算法,我们必须使用zk-ECDSA6 的大整数和 ECC 优化,但是要适应我们的曲线和 BLS12-381的配对涉及到在域扩展上操作的事实。其次,Miller 的计算配对算法Miller's algorithm7允许在标准计算模型中进行许多优化,我们将这些优化移植到 zkSNARK 设置中。最后,由于配对计算的复杂性,即使最终优化的电路也可能相当大,这意味着需要一些基础设施的最佳实践来适应 Circom 工具栈。
在这一系列的文章中,我们提出了一个在 BLS12-381曲线上的最优 Ate 配对的概念验证 Circom 实现,以及一个在 BLS 签名验证中的应用实例。然后,我们概述了其他潜在的应用,如递归 SNARK 和多项式承诺验证,我们认为这种方法很容易推广应用。
循环配对
我们实现了循环配对 circom-pairing8 代码库,它为 BLS12-3819 曲线上的以下操作提供未经审核的 ZK 电路:
更详细的文件,我们的电路在这里可用。这些电路没有经过审核,也不打算用作生产级应用的库。
演示
为了说明我们的电路,我们在zkpairing.xyz11 实现了一个演示,它允许用户生成任何 BLS 签名(以特定的输入格式)有效性的证明。如果用户没有一个特定的 BLS 签名他们可以指定以太坊信标链上的任何块号,并且演示会将块数据解析为适当的格式,并生成一个验证该验证者签名的证明区块。对于每个证明,我们提供所有的数据-在三个小文件中-任何人都可以用来在自己的计算机上验证证明!
基准
所有基准测试都运行在32核3.1 GHz、256G RAM、1T 硬盘和400G 交换机(AWS r5.8 xlarge 实例)上。
运行大型电路
请注意,验证和Tate 配对是非常大的电路,因此它们需要特殊的硬件和设置来运行。特别是,必须使用 C++ 生成见证服务器,使用 rapidsnark 进行证明,使用补丁版本的 Node.js而不使用垃圾收集生成密钥。所有这些都必须在具有大容量内存的机器上完成; 我们的设置工作流程在《大电路最佳实践》( Best Practices for Large Circuits12 )文档中有详细说明。
我们能用 zkPairing 做什么?
因为配对是许多加密协议的核心组成部分,所以用于配对计算的 zkSNARKs 允许我们将以下高级原语放入 SNARK 中:
很快就会看到第2部分讨论了 zkPairing 的实现技术!
致谢
该项目是在 ZKxZK Gitcoin 基金的支持下,在0xPARC 的 ZK 身份工作组期间构建的。
我们借鉴并分享了很多与 circom-ecdsa 相关的技术,特别是在大整数和椭圆曲线算法的优化方面。例如,我们使用 xJsnark 的大整数乘法优化。
我们也从最初的创作者 Jordi Baylina 和 snarkjs 的研究中获益匪浅。他教了我们很多关于 circom/snarkJS 工具栈的知识,并分享了很多关于如何有效地构建大型 ZK 电路的见解。
参考
责任编辑:Felix