构建 Jolt:一个快速、易于使用的 zkVM

  • a16z
  • 更新于 2024-07-23 16:38
  • 阅读 507

Jolt:一个快速、易于使用的 zkVM

作者:Michael ZhuSam Ragsdale

2024/04/09,a16z加密研究和工程团队发布了Jolt的初始实现,这是一种新的SNARK设计方法,比现有技术快2倍,而且还有更多改进。请查看此文章,了解这项工作的概述,以及关于SNARK设计的这篇文章以及Jolt如何打破常规的内容;还有关于Jolt架构和性能的技术细节,请参阅此FAQ

Jolt

可验证计算(俗称ZK)是一项非常强大的技术,适用于区块链和非区块链用途。它使一个计算机(验证者)能够将计算委托给另一台更强大的计算机(证明者),并有效地验证计算是否正确执行。

在加密行业中,可验证计算(特别是SNARKs,或Succinct Non-interactive Arguments of Knowledge)的应用包括:

  • 使用SNARKs的第2层(L2)区块链,以保证其状态转换的完整性
  • 使用SNARKs的跨链桥梁,证明在一个链上的存款/提款到另一个链上
  • “ZK协处理器”(由Axiom定义)使用SNARKs证明一些链下计算,这些计算在智能合约中本地计算成本太高

还有许多有趣且相对未被探索的非区块链用例。例如,云服务提供商可以向其客户证明他们正确地运行了委托给其服务器的某些计算。像npmcrates.io这样的软件注册表可以证明某个二进制文件是从特定源代码编译而来,从而减轻软件供应链攻击的风险。或者可以证明他们的工具辅助速通(TAS)超级马里奥兄弟打破了世界纪录(RISC Zero也写过这个想法)。

许多这些应用涉及的程序太复杂,无法转换为电路DSL(领域特定语言)- 想象一下,例如在Circom中重写整个编译器或NES模拟器。但是,如果程序编译成zkVM支持的指令集,就不需要手工编写电路或DSL转换:程序员只需使用他们选择的高级编程语言编写程序,zkVM会处理其余部分。

因此,剩下的挑战是zkVM证明者的性能:它需要足够快才能派上用场。这对于区块链用例尤为重要,因为证明者时间会影响延迟,从而影响用户体验。

长期以来,可验证计算一直被吹捧为区块链可扩展性的潜在终极解决方案,但该技术面临三个采用障碍:

  • 性能:证明程序执行引入了与本地执行相比几个数量级的开销。
  • 复杂性:SNARKs的复杂性引发了对其实现安全性的担忧,这可能保护着数十亿美元的链上资产。
  • 可用性:像Circom这样的领域特定语言(DSL)需要具有大多数软件开发人员无法接触的专业知识。

零知识虚拟机(zkVMs)的发展克服了这第三个可用性障碍,因为zkVM允许开发人员使用Rust或Go等高级编程语言编写程序 - 而无需了解将证明其执行的底层SNARK。但是,zkVM的改进可用性是以显著性能开销(8至9个数量级)和复杂实现为代价的。

去年,Jolt论文介绍了一种新的zkVM范式,承诺克服这两个挑战 - 性能开销和实现复杂性。Jolt源自与STARK为基础的现有技术不同的理论谱系。通过利用Lasso查找参数和其他基于sumcheck的技术,Jolt使证明程序变得比以往更快,并且更容易实现新的VM指令。

今天,我们很高兴发布Jolt 的开源实现 for the RV32I (RISC-V 32-bit base integer) 指令集,实现了Jolt论文的承诺。

  • Jolt 快速:我们的实现比RISC Zero快5倍以上,并且在初步基准测试中比刚发布的SP1快2倍。
  • 而且(相对)简单:整个代码库不到25,000行Rust代码(比可比较的zkVM少一半),每个CPU指令的实现代码只有50行左右。

下面,我们分享展示Jolt作为最新zkVM的性能基准的性能基准。我们还为有兴趣构建使用Jolt的应用程序的开发人员提供指引,以及为有兴趣为Jolt做出贡献的开发人员提供我们未来路线图的预览 - 我们预计在未来几个月内Jolt将变得更快更易于使用。

a16z加密工程团队坚信开源的价值。将Jolt作为一个开源公共产品构建将加速zkVM研究、更广泛的SNARK研究以及整个web3行业的进展。在封闭源代码的密码学构建中,代码无法由公众审查,这往往会给本应是无需信任的系统引入信任。

性能

从历史上看,与本地执行相比,zkVM引入了大约8个数量级的开销,使许多可验证计算的应用变得不可能。当前版本的Jolt将这种开销降低到6个数量级以下。

虽然我们已经实现了最先进的性能,但Jolt的基础技术(基于sumcheck协议)并没有像基于FRI的更受欢迎的技术那样受到足够的工程关注。这表明Jolt仍有很多优化空间 - 我们已经在路线图上有几个优化,我们预计还会有未发现的机会。

我们的a16z/zkvm-benchmarks存储库对Jolt、SP1和RISC Zero在各种Rust程序上进行基准测试。在一系列相同的RV32程序中,相对性能相似。图表将涉及执行一系列Sha2哈希的程序。

fn sha2_chain(input: [u8; 32], num_iters: u32) -> [u8; 32] {     
    let mut hash = input;     
    for _ in 0..num_iters { 
        hash = sha256(hash);     
    }      
    hash 
}

这些基准测试的结果如下所示。基准测试在拥有64个CPU核心和512 GiB DDR5 RAM的AWS r7g.16xlarge ARM机器上运行。所有基准测试仅涉及CPU。

使用continuations的系统在证明时间和证明大小之间面临权衡 - 随着证明被分割成更多的“分片”(或“段”),证明者变得更快(由于分片之间的并行化),但在递归之前具有更大的证明大小。下面显示了证明大小的基准测试结果,其中SP1的结果由分片计数参数化:SP1(shard_count)。RISC Zero具有固定的分片大小,因此其分片计数随着程序周期计数的增加而隐式增加。RISC Zero支持递归(SP1和Jolt尚未支持),但下面的基准测试考察了其在没有递归的情况下的性能。我们还没有使用“precompiles”,因此基准测试反映了核心zkVM证明系统的性能。

img

img

img

如何在 Jolt 上构建

为了使 Jolt 尽可能易于使用,Jolt SDK(由a16z crypto工程合作伙伴Noah Citron构建)提供了围绕Jolt核心功能的简单包装。你只需:

jolt_sdk::provable属性添加到你想要证明的函数中

#![cfg_attr(feature = "guest", no_std)]
#![no_main]

#[jolt::provable]
fn fib(n: u32) -> u128 {
    let mut a: u128 = 0;
    let mut b: u128 = 1;
    let mut sum: u128;
    for _ in 1..n {
        sum = a + b;
        a = b;
        b = sum;
    }
    b
}

然后,你可以使用build_* function创建证明者和验证者

pub fn main() {
    let (prove_fib, verify_fib) = guest::build_fib();

    let (output, proof) = prove_fib(50);
    let is_valid = verify_fib(proof);

    println!("output: {}", output);
    println!("valid: {}", is_valid);
}

代码库中查看完整的斐波那契示例(以及其他示例)。

要深入了解Jolt架构,Jolt Book(正在进行中)作为代码库和设计选择的实时文档,其中未在Jolt论文中记录。在未来,我们将发布更多面向对Jolt构建或理解其内部机制感兴趣的开发人员的内容。

接下来

尽管Jolt对zkVM领域是一个重要的里程碑,但我们还有很长的路要走。回顾我们的性能基准测试表明,Jolt证明者(在M3 Max上)证明一个程序的速度与100kHz处理器一样快 - 超过Apollo 11任务的板载计算能力的两倍。更令人印象深刻的是,这比TI-84图形计算器慢大约150倍

要达到计算器级别的性能,我们还有很多工作要做。我们将继续改进Jolt的性能和可用性,以便为开发人员提供最佳的开发体验。我们对路线图上以下主要任务感到兴奋:

Binius:Ben Diamond和Jim Posen最近的两项工作引入了一种多线性多项式承诺方案,对于像Jolt这样的系统特别有用,其中承诺值很小。结合Justin Thaler的small-field sumcheck算法,Binius将显著改进 Jolt的证明者性能(我们预计提高5-10倍)。

更多指令:Jolt代码库目前实现了RISC-V 32位基本整数指令集(RV32I),但Jolt构造非常灵活。我们计划添加对RISC-V“M”扩展(用于整数乘法和除法)的支持,如Jolt论文中所述。此外,Jolt可以轻松支持64位变体RV64IM。

Continuations:目前,由于内存限制,Jolt无法证明任意长的计算。我们将使用continuations将长计算拆分为较小的块,每个块都可以由Jolt证明。这将减少内存使用量,并在证明单个计算时允许额外的并行性。

证明递归:通过将Jolt与另一个证明系统组合,我们进一步减少了证明大小和验证器时间。例如,可以在Circom中实现Jolt验证器,以生成在链上可以高效验证的恒定大小的Groth16证明。

如果你是一名对Rust开发感兴趣的开发人员,或者你是一名对在Jolt上构建感兴趣的应用程序开发人员,我们很乐意与你交流 - 请通过问题和反馈与我们联系:@samrags_ @moodlezoup @eddylazzarin。越多的开发人员能够改进Jolt的性能,将有助于整个区块链社区,从基础设施到应用程序开发。


致谢: Jolt代码库是与Jolt论文的合著者Arasu Arun(NYU)、Srinath Setty(微软研究)和Justin Thaler(a16z crypto,乔治城大学)紧密合作开发的。特别感谢Arasu Arun对Jolt代码库的许多核心贡献,以及理论见解。Jolt SDK、RISC-V跟踪器和zkvm-benchmarks存储库是由Noah Citron(a16z crypto)构建的。还要感谢Tim Sullivan和Sonal Chokshi编辑本文,以及Eddy Lazzarin提供反馈。

我是 AI 翻译官,为大家转译优秀英文文章,如有翻译不通的地方,在这里修改,还请包涵~

点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
a16z
a16z
江湖只有他的大名,没有他的介绍。