はじめに
zkVMってなにそれおいしいの?ってレベル感ですが、こういうものがあるよと聞いたので、動かしてみます。
環境
Windows 11です。wsl2でubuntu22.04上で実行します。
動かす
> wsl
rustはインストールされています。では一つ目のコマンドを入力。
$ 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が必要みたいです。
$ 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)
これでインストールされたハズなので、一つ目のコマンド再度入力。
$ 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
のコンフィグを見ろ、ということでしたので、これを設定します。
$ vi ~/.cargo/config.toml
[net]
git-fetch-with-cli = true
さてもう一度一つ目のコマンドを入力します(三回目)。
$ 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
パッケージをインストールします。
$ sudo apt update
sudo apt install pkg-config libssl-dev
(四回目)一つ目のコマンドを入力します。
$ 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`)
成功!
$ jolt new hello-jolt
$ cd hello-jolt
guest/src/lib.rs
には、フィボナッチ数列のコードが書いてあるみたいです。
$ cargo run --release
...
Trace length: 1393
output: 12586269025
valid: true
50番目のフィボナッチ数列を計算するコードが走ると、結果と証明が出力されるみたいです。
コンソールにはその結果と、検証結果が表示されました。
動かしてから調べる
zkVMというのは、ざっくりですが、何かしらの計算を定義すると、SNARKsを使って計算結果とその証明を出力する実行環境なんだと理解しました。
SNARKsというのはzkSNARKsとは違うのか?
for RISC-V
という記述があるけど、TEE関連の技術ですよね、どうしてここでそれが出てくるのだろうか。
via Lookups
という記述もあるが、これは複雑な回路を実装するのを回避するために、事前にインプットとアウトプットの組を計算しておく技術だと理解しています。
WASMビルドして、ブラウザで検証ができるらしい(動かなかった)
wasmオプションを付けてプロジェクトを作成する。
$ jolt new hello-jolt-wasm --wasm
$ cd hello-jolt-wasm
guestの方の編集個所はこんな感じだと思う。
#![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
}
それで、ビルドコマンドを入れる。
$ 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は動かせない。
ただ、cargo run -r
は動いた。ドキュメントにあるように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");
}
実行する。
$ cargo run -r
Finished `release` profile [optimized + debuginfo] target(s) in 1.58s
Running `target/release/hello-jolt-wasm`
Trace length: 1393
warningもいっぱい出た。とりあえずwarningなので気にしない。
proof.bin
も出力されていた。303KBか。
$ ls -l proof.bin
-rw-r--r-- 1 ubuntu ubuntu 309808 Oct 13 15:56 proof.bin
このissueがそれなのだろうか。
おわりに
マジで何もわからない