技术深度解析
Bellman的架构堪称应用密码学的教科书级范例。其核心是Groth16协议的实现,该协议是目前证明尺寸最小(仅3个群元素)且验证时间最短(单次配对检查)的zk-SNARK构造。然而,真正的工程挑战在于证明者的计算负载,尤其是多标量乘法(MSM)操作。
MSM瓶颈
在Groth16中,证明者必须计算椭圆曲线点的线性组合:`Q = sum( a_i * G_i )`,其中`a_i`是见证标量,`G_i`是来自电路证明密钥的固定基点。这是一个经典的MSM问题。Bellman采用Pippenger算法的变体,将标量划分为窗口并预计算基点的和。该库通过以下方式进一步加速:
- 并行化: 使用Rust的Rayon库将MSM计算分布到CPU核心上。
- 内存高效窗口化: 根据可用内存和标量数量动态调整窗口大小,平衡时间与空间。
- 自定义曲线算术: 在Rust中实现BLS12-381曲线,采用优化的域算术,避免通用大整数库的开销。
证明生成流水线
典型的Bellman证明生成流程包括:
1. 电路综合: 开发者使用Bellman的`Circuit`特质定义约束系统,描述待证明的计算。
2. 见证赋值: 证明者为电路变量赋予实际值。
3. 证明密钥加载: 库加载预计算的证明密钥(包含MSM的基点)。
4. MSM计算: 重头戏——计算Groth16证明的三个群元素(A、B、C)。
5. 证明序列化: 将证明序列化为紧凑的字节格式(BLS12-381通常为192字节)。
性能基准测试
为展示Bellman的性能,考虑一个包含10,000个约束的简单电路。下表比较了Bellman的证明生成时间与朴素实现及竞品库(使用相同曲线和硬件)的差异。
| 实现方式 | 证明生成(毫秒) | 验证(毫秒) | 内存使用(MB) |
|---|---|---|---|
| Bellman(优化版) | 1,200 | 5 | 256 |
| 朴素Rust MSM | 8,400 | 5 | 64 |
| 竞品库X | 1,800 | 6 | 320 |
数据要点: Bellman的MSM优化相比朴素实现实现了7倍加速,而内存使用仅适度增加。这使得在消费级硬件上进行实时交易证明成为可能。
开源生态系统
Bellman并非孤军奋战。更广泛的Zcash生态系统包括:
- librustzcash: Zcash的主要Rust库,内部使用Bellman。
- zcashd: 全节点实现。
- halo2: Zcash开发的新证明系统,采用PLONK风格的算术化,不依赖可信设置。虽然halo2正获得关注,但Bellman仍是需要最小证明尺寸的生产系统的中坚力量。
关键仓库: [zkcrypto/bellman](https://github.com/zkcrypto/bellman) — 1,122颗星,积极维护,近期提交集中于API稳定性和性能改进。
关键参与者与案例研究
Zcash(Electric Coin Company)
Zcash是Bellman的旗舰用户。每一笔屏蔽交易(z地址到z地址)都使用Bellman生成Groth16证明,以验证交易有效而不泄露发送方、接收方或金额。Zcash的Sapling升级(2018年)是Bellman的里程碑式部署,将证明生成时间从分钟级缩短到秒级。该团队继续将Bellman作为公共产品维护,独立于其自身协议。
Filecoin(Protocol Labs)
Filecoin将其复制证明(PoRep)和时空证明(PoSt)的变体用于Bellman。这些证明需要证明存储矿工随时间存储了数据的唯一副本。Filecoin的`rust-fil-proofs`仓库依赖Bellman进行底层zk-SNARK生成。其规模巨大:Filecoin网络每天处理数百万个证明,使得Bellman的效率对运营成本至关重要。
以太坊Layer-2解决方案
多个以太坊扩容项目曾探索将Bellman用于有效性证明。例如,zkSync和Loopring的早期版本在转向自定义实现之前曾考虑使用Bellman进行证明生成。然而,Bellman的影响持续存在:这些项目的许多MSM优化直接受Bellman代码库启发。
证明系统对比
| 系统 | 证明时间(10k约束) | 证明尺寸 | 是否需要可信设置? | 成熟度 |
|---|---|---|---|---|
| Bellman(Groth16) | 1.2秒 | 192字节 | 是 | 生产就绪 |
| Halo2(PLONK) | 2.5秒 | 1,024字节 | 否 | 生产就绪 |
| Marlin | 2.0秒 | 512字节 | 是 | 生产就绪 |