技术深度解析
Halo2的架构堪称密码学工程的典范。其核心是Halo协议,该协议通过利用内积论证(IPA)进行多项式承诺,实现了无需可信设置的递归证明组合。与Groth16(每个电路需要一次性可信设置)不同,Halo2使用透明设置:证明者和验证者只需要声明和电路描述。这消除了可信设置仪式被攻破的风险——这一漏洞曾困扰Zcash和Filecoin等项目。
该库实现了Plonkish算术化,这是PLONK协议的扩展。在PLONK中,电路被表示为单个多项式等式约束系统。Halo2通过允许自定义门和查找论证对其进行了泛化。自定义门是用户定义的多项式约束,作用于一组固定的导线(例如,椭圆曲线点加法的约束)。查找允许证明一个值元组属于预计算表,这对于高效的范围检查或SHA-256哈希至关重要。这种灵活性正是Halo2成为ZK-EVM首选证明系统的原因:EVM操作码如`ADD`、`MUL`或`SLOAD`可以编码为自定义门,而内存和存储访问则可以通过查找来处理。
递归证明组合是Halo2真正大放异彩之处。单个Halo2证明可以在其内部验证另一个Halo2证明。这是通过将验证者的算法实现为Halo2电路来实现的。用于多项式承诺的内积论证特别适合递归,因为其验证者非常轻量——只需要几次标量乘法和哈希计算。结果是无论递归深度如何,证明大小都是恒定的(约1 KB)。这使得证明聚合成为可能:Rollup无需向L1提交数千个单独的交易证明,而是可以通过递归将它们组合成一个证明,从而大幅降低Gas成本。
性能基准测试揭示了其中的权衡。在单证明者场景下,Halo2比Groth16慢,但在递归和灵活性方面表现出色。
| 证明系统 | 证明时间(100万门) | 证明大小 | 是否需要可信设置 | 递归支持 |
|---|---|---|---|---|
| Groth16 | ~5秒 | 192字节 | 是 | 否(原生) |
| PLONK(标准) | ~20秒 | ~1 KB | 否(透明) | 有限 |
| Halo2 | ~30秒 | ~1 KB | 否 | 原生、高效 |
| Circom + Groth16 | ~8秒 | 192字节 | 是 | 否 |
数据要点: Halo2以相比Groth16慢6倍的证明时间,换取了可信设置的消除和原生递归。对于ZK-EVM等应用,电路复杂且递归至关重要,这种权衡是可以接受的。对于简单的单证明应用(例如,私人支付),Groth16仍然更快。
该库使用Rust编写,依赖于`halo2_proofs` crate。GitHub仓库`privacy-scaling-explorations/halo2`是主要分支,拥有247颗星和每日提交。一个值得注意的子项目是`halo2_gadgets`,它提供了可重用的电路组件(例如,SHA-256、椭圆曲线运算)。`halo2_curves` crate处理椭圆曲线算术,支持BLS12-381和BN254。对内部机制感兴趣的开发者应查看`circuit.rs`和`plonk.rs`文件,这些文件定义了核心约束系统和证明者。
关键参与者与案例研究
Halo2的开发由隐私以太坊小组(前身为以太坊基金会的隐私扩容探索团队)推动。主要贡献者包括Ying Tong、Koh Wei Jie和John David Pressman,他们贡献了大部分提交。该项目与Zcash中的原始Halo实现不同,尽管它与Sean Bowe的工作有共同渊源。
案例研究1:Scroll – Scroll,一个基于zkEVM的Layer 2,使用Halo2作为其证明后端。Scroll的架构由一个证明EVM执行轨迹的zkEVM电路组成。该团队选择Halo2而非Gnark或Circom等替代方案,是因为其Plonkish算术化,这使他们能够高效地编码EVM基于操作码的状态机。Scroll的测试网已处理超过100万笔交易,Halo2证明平均大小为1.2 KB,每个区块的证明时间约为45秒。该团队公开表示,Halo2缺乏文档是一个主要障碍,迫使他们构建内部工具。
案例研究2:Polygon zkEVM – Polygon的zkEVM最初使用自定义PLONK实现,但后来迁移到基于Halo2的证明系统用于其主网测试版。迁移的动机是Halo2卓越的递归支持,Polygon使用它来聚合批量证明。Polygon团队已向Halo2贡献了多项优化,包括使用CUDA内核的更快多标量乘法(MSM)。
案例研究3:Taiko – Taiko,一个完全去中心化的zkRollup,在其证明系统中使用Halo2。