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
  • Indexed Lookup Argument
  • Table Decomposition
  • Lassoプロトコル
  • メモリ一貫性チェック
  • Reference
  1. Lookup Argument

Lasso

Previous概要とLasso以前の提案NextBackgrounds

Last updated 7 months ago

Lassoは、ルックアップテーブルTをいくつかの小さなサブテーブルに分解し、サブテーブルのみからルックアップを構築して結果を再構成することで、従来課題だった「テーブルサイズが肥大する」という課題を解決しました。

Indexed Lookup Argument

LassoではIndexed Lookup Tableをサポートします。インデックスbをテーブルTの中から検索し、結果aを取得します:

ai=T[bi]a_i = T[b_i]ai​=T[bi​]

このインデックスはスパース行列Mとして表されます。

Lassoでは、結果aが正しいことをSumCheckプロトコルによって証明します。

Verifierがランダムにピックアップしたrに対して以下の式を証明します。

~は多重線形拡張を表します。

∑y∈{0,1}logNM~(r,y)⋅T~(y)=a~(r)\sum _{y \in \{ 0,1 \}^{log N}} \tilde{M}(r,y) \cdot \tilde{T}(y)=\tilde{a}(r)y∈{0,1}logN∑​M~(r,y)⋅T~(y)=a~(r)

これはブールハイパーキューブ上で評価することで計算量を削減することができます。

∑j∈{0,1}logseq~(j,r)⋅T[nz(j)]=a~(r)\sum _{j \in \{ 0,1 \}^{log s}} \tilde{eq}(j,r) \cdot T[nz(j)]=\tilde{a}(r)j∈{0,1}logs∑​eq~​(j,r)⋅T[nz(j)]=a~(r)

nzはインデックス行列Mに対してこのように対応します。スパース行列を小さな要素のベクトルで表現しています。(Spartanのアイデアに近い)

Table Decomposition

さらに、テーブルサイズを効率的に表現するために、テーブルTをc個のサブテーブルT1, ..., Tcに分割します。そうすると、証明すべきことはこのようになります。gはサブテーブルを合成するための関数です。ADDやMULのようなオペレーションによって定義されています。

∑j∈{0,1}logseq~(j,r)⋅g(T1[nz1(j)],...,Tc[nzc(j)])=a~(r)\sum _{j \in \{ 0,1 \}^{log s}} \tilde{eq}(j,r) \cdot g(T_1[nz_1(j)], ..., T_c[nz_c(j)]) =\tilde{a}(r)j∈{0,1}logs∑​eq~​(j,r)⋅g(T1​[nz1​(j)],...,Tc​[nzc​(j)])=a~(r)

そうすると、コミットメントすべき値のサイズもN^{1/c}になるため、コミットメントコストを小さくすることができます。最終的に、このnzを多重線形表現に直したEi(j)を用いて以下のように定義されます。

∑j∈{0,1}logseq~(j,r)⋅g(E1(j),...,Ec(j))=a~(r)\sum _{j \in \{ 0,1 \}^{log s}} \tilde{eq}(j,r) \cdot g(E_1(j), ..., E_c(j)) =\tilde{a}(r)j∈{0,1}logs∑​eq~​(j,r)⋅g(E1​(j),...,Ec​(j))=a~(r)

Lassoプロトコル

上記を実際に証明するには以下のステップを必要とします。

  1. ProverがVerifierにE, read_cts, final_cts, nzのコミットメントを送る

    1. ctsはメモリチェックで使われるcounter polynomial

  2. VerifierがProverにlog(s)個の乱数を送る

  3. Primary SumCheckプロトコルを実行する

  4. メモリ一貫性チェックプロトコルを実行する

Primary SumCheckでは、上記の証明をEi(r)=viの小さな証明に落とし込むために、事前に上記を証明してしまいます。viはSumCheckの最後のラウンドに得られた値です。

しかし、そうするとviが本当にテーブルからルックアップされた値であることを保証できません。なので、それを証明するために追加でメモリ一貫性チェックを実行しています。

メモリ一貫性チェック

メモリにおけるI∪W = R∪Fを証明します。Iは初期の集合、Wは書き込みの集合、Rは読み取りの集合、Fは終了時の集合です。

Lassoではフィンガープリント(ハッシュのようなもの)を利用してこれを効率的に証明します。ある値t,v,aフィンガープリントは以下のように計算されます。これはReed-solomonフィンガープリントと呼ばれます。

hγ(t,v,a)=γ2⋅a+γ⋅v+th_{\gamma}(t,v,a)= \gamma ^2 \cdot a + \gamma \cdot v + thγ​(t,v,a)=γ2⋅a+γ⋅v+t

もしt,v,aがベクトルのときは、このようにフィンガープリントの積を計算します。

Hγ,τ(a,v,t)=Π(a,v,t)∈s(hγ(a,v,t)−τ)H_{\gamma , \tau}(a,v,t)= \Pi _{(a,v,t) \in s} (h_{\gamma}(a,v,t) - \tau) Hγ,τ​(a,v,t)=Π(a,v,t)∈s​(hγ​(a,v,t)−τ)

このフィンガープリントを用いることでI∪W = R∪Fを効率的に証明します。

Hγ,τ(I)⋅Hγ,τ(W)=Hγ,τ(R)⋅Hγ,τ(F)H_{\gamma , \tau}(I) \cdot H_{\gamma , \tau}(W) = H_{\gamma , \tau}(R) \cdot H_{\gamma , \tau}(F)Hγ,τ​(I)⋅Hγ,τ​(W)=Hγ,τ​(R)⋅Hγ,τ​(F)

多重線形拡張に直すと、R, W, I, Fは以下のようになります。

Reference

ひとつのマルチセットフィンガープリントHに注目すると、フィンガープリントhのバイナリツリーのような乗算回路として表現できます。この乗算回路の証明はを用いて証明できます。

Thaler13で提案された効率的な回路評価
https://youtu.be/iDcXj9Vx3zY?si=XECewMzri4gh_Ama
https://eprint.iacr.org/2023/1216
https://youtu.be/iDcXj9Vx3zY?si=XECewMzri4gh_Ama