1. 引言
前序博客:
Jolt的作者提出了用一种独特的方法来构建zkVM——lookup singularity。
- 该技术大量使用查找表来创建虚拟机电路
- 使得其性能为同类竞品的2倍+,详情见a16z crypto 2024年4月9日博客 Building Jolt: A fast, easy-to-use zkVM
早期https://github.com/a16z/jolt代码中,使用Spartan和Hyrax作为后端,从而有2大限制: - 1)Hyrax使用Pedersen commitment来构建inner product argument,需要椭圆曲线运算。
- 2)Hyrax承诺的验证时长为平方根关系 O ( N ) O(\sqrt{N}) O(N),其中 N N N为电路size。
这2大限制会导致Jolt proof的递归验证不切实际,因为在该验证电路内,需执行所有的Hyrax验证逻辑。
后期的https://github.com/a16z/jolt版本中:
- 使用Zeromorph和HyperKZG作为其承诺后端,让系统递归友好,这样递归verifier仅需执行 O ( log ( N ) ) O(\log(N)) O(log(N))运算
- 但代价是,需要trusted setup。
Cysic团队2024年7月论文《Jolt-b: recursion friendly Jolt with basefold commitment》中:
- 通过转至Goldilocks的扩域,解决了以上问题
- 所用的Basefold承诺方案,verifier time为 O ( log 2 ( N ) ) O(\log^2(N)) O(log2(N))
- 该方式类似于Plonky2加强了原始的Plonk方案。
- Plonky2中将EC域迁移至了Goldilocks域
- Plonky2中将基于EC的承诺方案,替换为了基于encoding的承诺方案。
- 借助优化版本的Basefold方案,所实现的Jolt-b:
- 以“prover减慢2.47倍”为代价,来实现原始Jolt的递归友好性。
- 比Zeromorph的Jolt变种,prover time快1.24倍。
- 比HyperKZG的Jolt变种,prover time快1.52倍。
开源代码实现见:
zkVM可执行任意大小的程序,并为证明该执行生成一个ZK proof。
支持任意大小程序的关键在于:
- 可将任意大小程序切分为多个子程序;
- 首先为每个子程序生成一个proof;
- 然后使用一个recursive proof来确认所有子程序proofs的正确性。
Jolt-b:
- 致力于改进a16z crypto所开发的Jolt zkVM的递归友好性,使其效率更高
- 与Jolt不同,采用了名为Basefold的多项式承诺方案。
- 因为Hyrax是recursion-unfriendly(递归不友好)的
- 通过使用Basefold变种,可转向更小的域
- 从而不仅带来更高效的IOP,还可加强递归友好性。
此外,Cysic团队认为:
- 以Binius作为proof后端来构建zkVM并不是一种好策略,但认为Binius有利于pre-compiles预编译。
- Binius的整个价值主张是,可为witnesses使用最小的power-of-two域,因此只需根据所需来选择域大小。为了支持u16或u32结构上的运算,需要将tower向上移动或使用lookup。这需要interpreter(解释器)仔细考虑,以决定在哪个域上工作,并为proof recursion增加了额外的复杂性。
- 最后,用Binius编写的Keccak电路,与Poseidon电路相比,仍然需要至少多两个数量级的门。
参考资料
[1] 2024年7月18日Cysci团队twitter Jolt-b