よくわからないけどjoltを動かす

# はじめに

zkVMってなにそれおいしいの？ってレベル感ですが、こういうものがあるよと聞いたので、動かしてみます。

https://github.com/a16z/jolt

# 環境

Windows 11です。wsl2でubuntu22.04上で実行します。

# 動かす

```bash
> wsl
```

https://jolt.a16zcrypto.com/usage/quickstart.html#quickstart

rustはインストールされています。では一つ目のコマンドを入力。

```bash
$ cargo +nightly install --git https://github.com/a16z/jolt --force --bins jolt
error: toolchain 'nightly-x86_64-unknown-linux-gnu' is not installed
```

nightly版？のrustが必要みたいです。

```bash
$ rustup install nightly
...
  nightly-x86_64-unknown-linux-gnu installed - rustc 1.83.0-nightly (6b9676b45 2024-10-12)
$ rustup default nightly
...
  nightly-x86_64-unknown-linux-gnu unchanged - rustc 1.83.0-nightly (6b9676b45 2024-10-12)
$ rustup toolchain list
stable-x86_64-unknown-linux-gnu
nightly-x86_64-unknown-linux-gnu (default)
```

これでインストールされたハズなので、一つ目のコマンド再度入力。

```bash
$ cargo +nightly install --git https://github.com/a16z/jolt --force --bins jolt
    Updating git repository `https://github.com/a16z/jolt`
error: failed to clone into:

Caused by:
  failed to authenticate when downloading repository: git@github.com:a16z/jolt

  * attempted ssh-agent authentication, but no usernames succeeded: `git`

  if the git CLI succeeds then `net.git-fetch-with-cli` may help here
  https://doc.rust-lang.org/cargo/reference/config.html#netgit-fetch-with-cli

Caused by:
  no authentication methods succeeded
```

失敗しました。`net.git-fetch-with-cli`のコンフィグを見ろ、ということでしたので、これを設定します。

```bash
$ vi ~/.cargo/config.toml
```

```toml:config.toml
[net]
git-fetch-with-cli = true
```

さてもう一度一つ目のコマンドを入力します（三回目）。

```bash
$ cargo +nightly install --git https://github.com/a16z/jolt --force --bins jolt
...
  run pkg_config fail: Could not run `PKG_CONFIG_ALLOW_SYSTEM_CFLAGS=1 pkg-config --libs --cflags openssl`
  The pkg-config command could not be found.
...
error: failed to compile
```

パッケージをインストールします。

```bash
$ sudo apt update
sudo apt install pkg-config libssl-dev
```

（四回目）一つ目のコマンドを入力します。

```bash
$ cargo +nightly install --git https://github.com/a16z/jolt --force --bins jolt
...
Installed package `jolt v0.1.0 (https://github.com/a16z/jolt#8f28f258)` (executable `jolt`)
```

成功！

```bash
$ jolt new hello-jolt
$ cd hello-jolt
```

`guest/src/lib.rs`には、フィボナッチ数列のコードが書いてあるみたいです。

```bash
$ cargo run --release
...
Trace length: 1393
output: 12586269025
valid: true
```

50番目のフィボナッチ数列を計算するコードが走ると、結果と証明が出力されるみたいです。
コンソールにはその結果と、検証結果が表示されました。

# 動かしてから調べる

zkVMというのは、ざっくりですが、何かしらの計算を定義すると、SNARKsを使って計算結果とその証明を出力する実行環境なんだと理解しました。

SNARKsというのはzkSNARKsとは違うのか？

`for RISC-V`という記述があるけど、TEE関連の技術ですよね、どうしてここでそれが出てくるのだろうか。

`via Lookups`という記述もあるが、これは複雑な回路を実装するのを回避するために、事前にインプットとアウトプットの組を計算しておく技術だと理解しています。

# WASMビルドして、ブラウザで検証ができるらしい（動かなかった）

https://jolt.a16zcrypto.com/usage/wasm_support.html

wasmオプションを付けてプロジェクトを作成する。

```bash
$ jolt new hello-jolt-wasm --wasm
$ cd hello-jolt-wasm
```

guestの方の編集個所はこんな感じだと思う。

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

- #[jolt::provable]
+ #[jolt::provable(wasm)]
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
}
```

それで、ビルドコマンドを入れる。

```bash
$ jolt build-wasm
Building the project with wasm-pack...
thread 'main' panicked at src/build_wasm.rs:285:10:
Failed to execute wasm-pack command: Os { code: 2, kind: NotFound, message: "No such file or directory" }
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
```

動かなかった。とりあえず、プロジェクトルートには`index.html`はできました。ただ、その中でインポートしている`./pkg/hello_jolt_wasm.js`は作られなかったので、このhtmlは動かせない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/581c59b2-2c44-80bd-42a4-f1760601f59f.png)

ただ、`cargo run -r`は動いた。ドキュメントにあるように`main.rs`を編集して、

```rust:main.rs
use jolt::Serializable;
pub fn main() {
    let (prove_fib, _verify_fib) = guest::build_fib();

    let (_output, proof) = prove_fib(50);

    proof
        .save_to_file("proof.bin")
        .expect("Failed to save proof to file");
}
```

実行する。

```bash
$ cargo run -r
    Finished `release` profile [optimized + debuginfo] target(s) in 1.58s
     Running `target/release/hello-jolt-wasm`
Trace length: 1393
```

warningもいっぱい出た。とりあえずwarningなので気にしない。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/172833/571dbecd-9435-b2df-353e-83d538ede854.png)

`proof.bin`も出力されていた。303KBか。

```bash
$ ls -l proof.bin
-rw-r--r-- 1 ubuntu ubuntu 309808 Oct 13 15:56 proof.bin
```

このissueがそれなのだろうか。

https://github.com/a16z/jolt/issues/472

# おわりに

マジで何もわからない