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
  • Architecture
  • Plonky3
  • Building Circuits with Plonky3
  • Interaction
  • Memory consistency
  • Aggregation Proving
  • on-chain Verification
  • 参考資料
  1. zkVM
  2. プロジェクト

SP1

SP1はRISC-V の命令セットをサポートしているzkVMです。

PreviousプロジェクトNextRISC-Zero

Last updated 7 months ago

開発者は Rust で記述した任意のプログラムを SP1 zkVM でコンパイルし、実行することでそのプログラムの excution proof を作成することができます。

例えば zkTLS(Webproof)を SP1 で実装したりできます。

Architecture

基本的な Proof システムは以下のような Risc 0 のアーキテクチャを模倣しています。

なぜ STARK Proof System なのかは次の項で説明します。

そして黄色の Proof の部分で以下の順序に従った処理が行われます。

  1. RISC-V Prooving

  2. Aggregation Prooving

  3. STARK-to-SNARK Prooving

大まかなアーキテクチャと実行順序このようになります。詳細を見ていく前に SP1 の STARK Proof System(Plonky3)について解説します。

Plonky3

Plonky3 は Plonky2 の Field size(64bit)を 32bit に小さくしたもので、ハードウェアフレンドリーなフィールドサイズを持ちながら Plonky2 と同等の安全性を保っています。

この Plonky3(および Plonky2)は Plonkish な証明システムに zk-STARKs の FRI コミットメントを適応させたものであり、R1CS とは異なる AIR(Arithmetic Intermediate Representation)という形でステートメントを表現します。

記事内で記述されている用に、繰り返し処理や条件分岐といった複雑な状態遷移を表現する上で、zk-STARKs ベースな証明システムは zkVM において zk-SNARKs よりも効率的と言えます。

Building Circuits with Plonky3

VM を構成する要素は Chip と呼ばれています。

各 chip は MachineAir Trait と依存関係を持っており、STARK Machine における実行内容を AIR のステートメントとして変換する処理が行われます。

zkEVM 開発者側から見ると zkEVM そのものを作る場合に発生する仕様変更への対応コストを削減することができるため、良いこの設計思想だと思います。

ちなみに SP1 はオープンソースなので自由に Precompiled Chip を追加できます。

Interaction

任意の命令実行に対し各 Chips は他の Chips と相互にやり取りする場合あり、CpuChip を中心にこの相互接続関係を制約しています。

ではどのように相互通信の順列を保証しているのでしょうか?

todo:Logup のページを書き上げ、リンクを貼る。

todo:permutation のページを書き上げ、リンクを貼る。

Memory consistency

命令の割り込みなどが発生していないことを保証するためには、メモリーの一貫性を保証する必要があります。

つまり「メモリが読み出すデータは前に書き込まれたデータである」という保証が欲しいのです。

Logup や Lookup を使った Permutation check は Chip の相互接続の保証だけでなく、メモリアクセスの一貫性を保証するためにも使うことができます。これはデータの読み出しと書き込みが順列化されていることを証明する問題に置き換えるというテクニックです。

moemory consistency check の項目を追加する

Aggregation Proving

実行トレースはシャード化されており、シャード内の各チップのロジックやチップ間の相互接続が正しいことを証明している。複数の異なるシーケンスの順列(Permutation)は Logup によって解消される。

on-chain Verification

参考資料

もう少し深く見ていくと下図のように Rust のプログラムをコンパイルして得られる File を元に Excution が始まります。

SP1 の STARK Proof System にはを使用しています。

このようにField Size を小さくしつつ安全性を保つというアイデアはやでも共通しており、昨今のトレンドとも言えます。

AIR や FRI の具体的な仕組みついてはをご参照ください。

ここでの Chip とはハードウェア的な意味ではありません。特定の機能の効率的な組み込み済み zk 実装と捉えるとわかりやすいかと思います。Halo2 に馴染みがある方であれば、ピンと来るかもです。そうではない人はを読むとイメージつくかと思います。

この図で注目して欲しいのが Precompiled Chips の存在です。 これらは EVM で言うところののような存在だと考えられます。 つまり、SP1 は汎用的な zkVM でありながら zkEVM への応用も見越しているようです。

この課題を解決しているのがという仕組みです。これは証明者が「自分の持つ秘密の値が特定のテーブルの中に存在すること」をゼロ知識証明で示すものです。元々という仕組みがあり、Logup はこれを応用しています。これは zkVM のように複雑で大規模な証明システムにおいて証明サイズ(および証明時間)の大幅な削減につながります。

どんなに複雑な Circuit でも Lookup ベースで構築可能であるというアイデアはと呼ばれており、barry whitehat が残した功績の中でも特に大きいものです。

SP1 が生成する STARK proof は on-chain で検証するにはコストがかかるため、一つの STARK proof にした上でそれを SNARK proof として再帰的に証明するテクニックが用いられています。これにより STARK proof は groth16 もしくは Plonk の SNARK proof に変換され、on-chain で現実的なコストで検証できるようになります。このように、SNARK proof でラップするテクニックは始まりでも採用されています。

SP1 では gnark を用いて SNARK proof に変換しています。は Groth16/Plonk とそれらの Solidity Verifier をサポートした Go 実装のライブラリであり Polygon zkEVM で採用されているです。

SP1 では Ethereum などのスマートコントラクトを使って onchain で Proof 検証できるようにしています。この機能自体は Circom などでも広くサポートされている機能であり、一般的にこれは必要とします。

SP1 ではと呼ばれる GPU-accelerated なライブラリをすることで、prooving time のさらなる高速化を目指しています。に書いてある通り、gnark+ICICLE の組み合わせは現時点のベストプラクティスに思えます。

しかし SP1(および Plonky3)は Rust 実装なので Rust->Go のを実行する必要があり、オーバーヘッドが Prooving Time に影響する可能性がありそうです。

ELF
Plonky3
Binius
Circle STARK
こちらの記事
この記事
Precompiled Contact
Logup(Log Derivative Lookup Argument)
Lookup Argument
Lookup Singularity
Polygon zkEVM
Intmax
gnark
Circom 実装よりも高速
Solidity Verifier
ICICLE
採用
この記事
FFI
https://docs.succinct.xyz/introduction.html
https://github.com/succinctlabs/sp1
https://trapdoortech.medium.com/zero-knowledge-proof-introduction-to-sp1-zkvm-source-code-d26f88f90ce4
https://x.com/CremaLabs/status/1847182768306053583
https://risczero.com/blog/designing-high-performance-zkVMs#aa7a0ec142e844d899a4482066cf33f1
https://risczero.com/blog/designing-high-performance-zkVMs
https://miro.medium.com/v2/resize:fit:1400/format:webp/1*aLbVUC4L_EG9i0sctxnplQ.jpeg
https://miro.medium.com/v2/resize:fit:1400/format:webp/1*bii5A9CF8-JIgLoSy5oThQ.jpeg