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
  • Idea
  • SumFold
  • ZeroFold
  • Lookup関係のFolding
  • 改善できそうなポイント
  • Reference
  1. Folding Scheme

NeutronNova

NeutronNovaはZeroCheck関係を畳み込むFolding Schemeの一種です。ZeroCheck関係を畳み込むことでJoltのようなLookup関係やSumcheck Protocolなどの色々な関係も畳み込むことができます。

Incrementally Verifiable Computation(IVC)だけでなくProof Carrying Data (PCD)も実現することができるため並列処理が可能で、n個の任意の関係を一つに畳み込むことができます。また、Movaと同じくコミットメントを作成せずに証明できるという性質を持っています。

Idea

NeutronNovaはzkVMをより効率的に設計するための提案です。既存提案であるJoltは時間効率が良く、Nexusは空間効率が良いことで知られていますが、NeutronNovaはそれらを両立させることを目標としています。そのためのアイデアとして、Joltで用いられている命令ステップごとに存在するLookup関係を1つに畳み込むことで効率化しています。

ZeroCheck関係とは、ある多項式f(x, w)があるとき、いくつかの点xにおいて多項式の評価が0であることを証明するための関係 {f, x, w} のことを指します。

NeutronNovaでは、以下のプロセスでLookup関係を畳み込みます。

  1. Lookup関係(LKP)を4つのGrand Product関係(GP)に変換

  2. GPをZeroCheck関係(ZC)に変換

  3. ZCをNested SumCheck関係(NSC)とPowerCheck関係(PC)に変換

  4. NSCとPCを畳み込み

4のプロセスをSumFoldといい、3と4のプロセスを合わせてZeroFoldといいます。

SumFold

以下のようなSumCheck証明があるとします。

T=∑x∈{0,1}lQ(xi,w)=∑x∈{0,1}lF(G(xi,w))T =\sum _{x \in \{ 0,1 \}^l} Q(x_i, w) = \sum _{x \in \{ 0,1 \}^l} F(G(x_i, w)) T=x∈{0,1}l∑​Q(xi​,w)=x∈{0,1}l∑​F(G(xi​,w))

このとき、Q(x,w)=F(G(x,w))で表せる構造的な多項式であると仮定します。これをSumCheck関係で表すと以下のようになります。ppはprover parameter、uはインスタンス、xとwはインプットです。

SC={pp,(F,G),(T,u⃗,x⃗),w⃗}\text{SC} = \{ pp, (F,G), (T, \vec{u}, \vec{x}), \vec{w} \}SC={pp,(F,G),(T,u,x),w}

この関係を畳み込むには、Gに着目します。Gは複数の出力を持つ多項式なので、以下のようにgを用いて定義します。これを簡単にランダム線形結合を用いて畳み込むことはできません。そこで、畳み込みの結果の多項式をラグランジュ補完によって求めます。

G(x,w)={g0(x),g1(x),...,gt−1(x)}G(x,w) = \{g_0(x),g_1(x),...,g_{t-1}(x)\}G(x,w)={g0​(x),g1​(x),...,gt−1​(x)}

まず、ゴールはある2つのSumCheck関係にあるGをgとhとおいたとき、それを一つのfという関数に畳み込むことです。まず、それをするために以下のようなfを定義します。これはb=0のときにgを、b=1のときにhを表現します。

f(b,x)=(1−b)⋅g(x)+b⋅h(x)f(b,x) = (1-b) \cdot g(x) + b \cdot h(x)f(b,x)=(1−b)⋅g(x)+b⋅h(x)

そうすると証明すべきことは以下の2つのSumCheckに置き換え可能です。

T0=∑x∈{0,1}lf(0,x)T_0 = \sum _{x \in \{ 0,1 \}^l} f(0,x)T0​=x∈{0,1}l∑​f(0,x)
T1=∑x∈{0,1}lf(1,x)T_1 = \sum _{x \in \{ 0,1 \}^l} f(1,x)T1​=x∈{0,1}l∑​f(1,x)

この2つの式をラグランジュ係数として埋め込むと、SumCheckは以下のようになります。

T′=∑x∈{0,1}leq(X,b)⋅Tb=∑beq(X,b)⋅∑xf(b,x)T' = \sum _{x \in \{ 0,1 \}^l} eq(X,b) \cdot T_b = \sum _{b} eq(X,b) \cdot \sum _{x} f(b,x)T′=x∈{0,1}l∑​eq(X,b)⋅Tb​=b∑​eq(X,b)⋅x∑​f(b,x)

この法則に従ってu,x,wなども畳み込むことができます。Schwarz-Zippelの補題により、実際にはランダムなβをxの中から選んでチェックします。

ZeroFold

上記のSumFoldを用いてZeroCheck関係(ZC)を畳み込みます。

どうように以下の様なZeroCheckの証明があるとします。

0=Q(xi,w)=F(G(xi,w))0=Q(x_i, w) = F(G(x_i, w)) 0=Q(xi​,w)=F(G(xi​,w))

このときのZeroCheck関係は以下のようになります。

ZC={pp,(F,G),(u⃗,x⃗),w⃗}\text{ZC} = \{ pp, (F,G), (\vec{u}, \vec{x}), \vec{w} \}ZC={pp,(F,G),(u,x),w}

このZCをSumCheck関係SCに変換するために、以下のような多項式を定義します。τはランダムなチャレンジです。

e1(x1)=∑z1∈{0,1}leq(z1,x1)⋅τz1e_1(x_1) = \sum _{z_1 \in \{ 0,1 \}^l} eq(z_1,x_1) \cdot \tau ^{z_1}e1​(x1​)=z1​∈{0,1}l∑​eq(z1​,x1​)⋅τz1​
e2(x2)=∑z2∈{0,1}leq(z2,x2)⋅τ2l⋅z2e_2(x_2) = \sum _{z_2 \in \{ 0,1 \}^l} eq(z_2,x_2) \cdot \tau ^{ \sqrt{2^l} \cdot z_2}e2​(x2​)=z2​∈{0,1}l∑​eq(z2​,x2​)⋅τ2l​⋅z2​

そしてe(x)も定義します。

e(x)=e1(x1)⋅e2(x2)e(x)=e_1(x_1) \cdot e_2(x_2)e(x)=e1​(x1​)⋅e2​(x2​)

proverはe1とe2のコミットメントをを送信し、verifierはe+ρeを計算し、folded witnessを計算することができます。しかし、ここで、コミットメントにpowers of τが適切に利用されていることも追加で検証する必要が生じます。つまりZCを変換しようとすると、以下のNested SumCheck関係(NSC)とPowerCheck関係(PC)の2つに変換されます。

NSC={pp,(F,G),(T,u⃗,x⃗,eˉ),(w⃗,e)}\text{NSC} = \{ pp, (F,G), (T, \vec{u}, \vec{x}, \bar{e}), (\vec{w},e) \}NSC={pp,(F,G),(T,u,x,eˉ),(w,e)}
PC={pp,(eˉ,τ),e}\text{PC} = \{ pp, (\bar{e}, \tau),e \}PC={pp,(eˉ,τ),e}

このNSCとPCを同時にfoldingすることでZeroFoldを行なうことができます。

Lookup関係のFolding

LassoのようなIndexed Lookup Argumentがあるとします。vはベクトル、tはテーブル、aはindicesを表します。

vi=taiv_i = t_{a_i}vi​=tai​​

このためのLookup関係(LKP)は以下のようになります。

LKP={pp,(tˉ,aˉ,vˉ),(t,a,v)}\text{LKP}=\{ pp, (\bar{t}, \bar{a}, \bar{v}), (t,a,v) \}LKP={pp,(tˉ,aˉ,vˉ),(t,a,v)}

ここで、proverは、テーブルtにベクトルvが存在することを証明するために以下が成り立つcとfを計算し、そのコミットメントをverifierに送信します。

Πi∈n(i+ti⋅X−Y)⋅Πi∈m(ai+vi⋅x+(ci+1)⋅X2−Y)\Pi _{i \in n} (i + t_i \cdot X - Y) \cdot \Pi _{i \in m} (a_i + v_i \cdot x + (c_i + 1) \cdot X^2 - Y) Πi∈n​(i+ti​⋅X−Y)⋅Πi∈m​(ai​+vi​⋅x+(ci​+1)⋅X2−Y)
=Πi∈m(ai+vi⋅X+ci⋅X2−Y)⋅Π(i+ti⋅X+fi⋅X2−Y)= \Pi _{i \in m} (a_i + v_i \cdot X + c_i \cdot X^2 - Y) \cdot \Pi (i + t_i \cdot X + f_i \cdot X^2 - Y)=Πi∈m​(ai​+vi​⋅X+ci​⋅X2−Y)⋅Π(i+ti​⋅X+fi​⋅X2−Y)

これは、合計で4つのGrandProductがあると解釈することができ、簡単に4つのGrandProduct関係(GP)として表現できます。

GrandProductの証明には大きく2つの方法があります。1つはSumcheck Protocolを用いた方法で、もう1つはGKRを用いた方法です。前者はvのエントリ数だけコミットメントしなければならないというダウンサイドがあり、後者は対数回のSumcheck Protocolの呼び出しが必要というダウンサイドがあります。

NeutronNovaでは、前者のSumcheck Protocolを用いた方法に照らし合わせてGrandProduct関係(GP)をZeroCheck関係(ZC)に変換しています。そうすれば、あとはZeroFoldを用いてfoldingすることができます。

改善できそうなポイント

  • ZC→NSCのような関係の変換にはラグランジュ多項式補完を伴うため、なるべく変換回数が少なく済むように方式を改善する。

  • GrandProductを変換する際のオプションであるGKR Protocolのfoldingバージョンを提案する。

  • NebulaをZeroFoldで畳み込む。

  • ZeroFold/SumFoldの計算を並列化してO(n log d)をO(logn * logd)オーダーに削減する。

Reference

PreviousHyperNovaNextCycleFold

Last updated 7 months ago

https://eprint.iacr.org/2024/1606