JP ZK Learning Club
  • 貢献について
  • 前提知識
    • 暗号学
      • 決定問題
      • P/NP問題
      • 計算複雑性理論
    • 数学
      • 代数的構造
      • 離散対数問題 (DLP)
      • 楕円曲線
      • 算術回路
  • PSE-Core-Program
    • Week 1
    • Week 2 さらなる暗号技術とSNARKsとSTARKs
    • Week 5 Frontier
  • zkSNARKs
    • Spartan
  • Folding Scheme
    • Nova
    • SuperNova
    • HyperNova
    • NeutronNova
    • CycleFold
  • Lookup Argument
    • 概要とLasso以前の提案
    • Lasso
  • zkVM
    • Backgrounds
      • Multi Linear extension(MLE)
      • Folding scheme
      • Lookup Singularity
      • Cycle of Curves
      • Extension Field
      • Glossary
      • CCS
      • Switch-board (Nebula)
    • Building Blocks
      • Binius
      • GKR
      • Circle STARK
      • Sum-check Protocol
    • 動作概要
    • ゼロ知識証明
      • メモリ読み込み・書き込みの一貫性
        • Merkle-Tree
        • Spice
        • Jolt-Memory-Checking
        • Nebula
        • Proof-for-Deep-Though
      • 命令の実行
      • バイトコードから命令へのデコード
    • プロジェクト
      • SP1
      • RISC-Zero
      • Jolt
      • Valida
      • Nexus
Powered by GitBook
On this page
  • JoltにおけるRustプログラム実行と証明生成の流れ
  • Joltのコンポーネント
  • Joltの実装
  • Joltの今後の開発ロードマップ
  • 参考文献
  1. zkVM
  2. プロジェクト

Jolt

Lookup Tableを利用したzkVM

Jolt (Just one Lookup Table)はa16z CryptoのArasu Arun、Srinath Setty、Justin Thalerによって開発されたRISC-V命令セットアーキテクチャ用のゼロ知識仮想マシン(zkVM)です。SP1やRISC-Zeroと比べ実装がシンプルです。

JoltのコアアイデアはルックアップテーブルとSumcheck Protocolで、それらを組み合わせることで回路サイズを抑え、証明を高速化しています。

JoltにおけるRustプログラム実行と証明生成の流れ

Joltが証明するRISC-Vのプログラムは、Jolt自身によりコンパイルされ、内部のループでインタプリタ実行されます。ここで重要なのは、実行トレースを取る部分まではゼロ知識証明は使わず、普通のRustプログラムとして書かれており、最後の実行トレースの状態遷移を証明だけがゼロ知識証明です。

そのため、JoltはRustで書かれたプログラムに対して

  • RISC-V用のバイトコード(ELF形式)へのコンパイル

  • 内部のインタプリタによる実行トレースの取得

  • 全ての状態遷移の証明

を行う機能を提供します。

具体的には、Joltのattribute-macroは、ホスト環境へのコンパイル時にguestクレートに定義されたRustプログラムを動的にRISC-V用のELFへコンパイルして保存、その実行・証明・検証を行う関数を生成します。

例えば、次のadd/guest/src/lib.rsにはmain.rsで呼ばれているbuild_add()は定義されていませんが、この関数はマクロによってコンパイル時に定義されます。Joltを使った開発者は、証明したいプログラムに#[jolt::provable]をつけるだけで良いのです。

// add/guest/src/lib.rs
#![cfg_attr(feature = "guest", no_std)]
#![no_main]

#[jolt::provable]
fn add(a: u32, b: u32) -> u32 {
  let c = a + b;
  c
}
// add/src/main.rs
use guest::build_add;
pub fn main() {
    let (prove_add, verify_add) = build_add();
    let (output, proof) = prove_add(1, 2);
    let is_valid = verify_add(proof);
}

コンパイル時に得られたELFは、生成されたprove_hoge()内のループで1命令ずつ実行され、プログラムカウンタ・レジスタ・メモリの読み書き、が全て記録されます。これが実行トレースです。

また、各実行では、以下が命令ごとに繰り返されます。

  1. メモリのコード領域から命令をフェッチ

  2. 命令をデコード

  3. 命令を実行

  4. 実行結果をレジスタ/メモリのデータ領域に書き込み

Joltのコンポーネント

VMにおける上記の(1)~(4)の処理が正しく行われていることを証明するために、4つのコンポーネントがあります。

  1. 追加のR1CS: プログラムカウンタを更新し正しい命令をフェッチするR1CSインスタンスを用意してSpartanで証明する

  2. オフラインメモリチェック1: バイトコードのデコード結果が正しいことを保証する

  3. Lassoによる命令のルックアップ: 命令の実行結果を事前実行されたテーブルから検索して結果を返す

  4. オフラインメモリチェック2: メモリへの読み込み/書き出し一貫性を保証する

上記を3つの証明にして、それを命令ごとに繰り返しています。さらに、命令毎の状態の遷移は、オフラインメモリチェックにより一貫性が保たれます。

Joltの一番の工夫は命令のルックアップテーブルを分解可能(decomposable)にし、サブテーブルに分割したことです。これにより、命令のサイズにかかわらずテーブルのサイズを一定にすることが可能になりました。

Joltの実装

ソースコードをビルドしてローカルでSHA-3を実行してみたところ、実行時間はsetupが20s、proveが2s、verifyが0.5s程度でした。メモリ利用料は3GBほどでした。setupでの実行内容にはcommitmentサイズを定義、preprocess、commitment schemeのsetupなどがあり、ほとんどの時間はcommitment schemeのsetupに費やされていました。

Joltの今後の開発ロードマップ

  • コミットメントスキームのBiniusへの移行

    • より小さいフィールドサイズでのコミットメント実行が可能となる

    • GitHubではすでに実装している

  • プリコンパイル

    • keccakなどのEVMでよく使われる機能をプリコンパイルとして提供し、実行を高速化させる

  • GPUによる高速化

  • Recursive/Folding

  • ...

参考文献

PreviousRISC-ZeroNextValida

Last updated 6 months ago

Proveの流れを可視化した図:

を参考にしてください。

、実行時間のうち1/5はコミットメントの計算に費やされ、残りの半分はSumcheck Protocolに費やされます。そして残りの時間は、メモリ割り当て、witness生成、メモリのシリアル化などのさまざまなタスクに分散されます。

Joltは現在はしています。論文では浮動小数点の手法も紹介されています。

また、Joltはオーバーヘッドが 6 桁未満で、RISC-ZeroやSP1(8コア)よりも高速です。

https://miro.com/app/board/uXjVLHocNvY=/?share_link_id=405357987329
アーキテクチャに関する詳細はこちら
https://a16zcrypto.com/posts/article/building-on-lasso-and-jolt/
ブログによれば
32bitの整数にのみ対応
ブログによると
https://jolt.a16zcrypto.com/tasks.html
https://a16zcrypto.com/posts/article/faqs-on-jolts-initial-implementation/
https://a16zcrypto.com/posts/article/faqs-on-jolts-initial-implementation/
https://eprint.iacr.org/2023/1217
https://jolt.a16zcrypto.com/
https://a16zcrypto.com/posts/article/faqs-on-jolts-initial-implementation/
https://a16zcrypto.com/posts/article/building-on-lasso-and-jolt/
https://github.com/a16z/jolt
https://jolt.a16zcrypto.com/how/architecture.html
https://jolt.a16zcrypto.com/how/architecture.html
https://a16zcrypto.com/posts/article/building-jolt/