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
  • 概要
  • MLE (Multilinear extensions)
  • CCSをMLEへ拡張
  • CCSの定義
  • R1CSからCCSへ
  • CCSからsum-checkへ
  • Schwartz-Zippel lemmaでΣを減らす
  • Sum-check protocol
  • Outer sum-check
  • Inner sum-check
  • Final check
  • Reference
  1. Folding Scheme

HyperNova

PreviousSuperNovaNextNeutronNova

Last updated 6 months ago

HyperNovaはNovaを拡張した、CCS(Customizable Constraint System)フォーマットのインスタンスを畳み込むスキームです。

この解説は、こちらの[SuperSpartan by Hand]()と、[HyperNova by Hand]()を参考にしています。

概要

HyperNovaは、CCSのMLEをSum-Check Protocolで証明する際に、内側の重いsum-checkをランダム線形結合して一番最後に一気に証明することで、各ステップの証明を減らすようなfolding-schemeです。

まずMLE (Multilinear extensions)とは、f:{0,1}ℓ→Ff: \{0,1\}^{\ell} \rightarrow \mathbb{F}f:{0,1}ℓ→F のような多変数多項式 (ℓ{\ell}ℓ-variate polynomial)が、f~:Fℓ→F\tilde{f} : \mathbb{F}^{\ell} \rightarrow \mathbb{F}f~​:Fℓ→F のような多重線形多項式 (multilinear polynomial)となることを指します。また、MLEの多項式内の全ての項の次数は一次以下となるのが特徴です。

f~(x)\tilde{f}(x)f~​(x)をboolean-hypercube上のどの点(∀x∈{0,1}ℓ\forall{x} \in \{0,1\}^{\ell}∀x∈{0,1}ℓ)で評価しても全て000になることを確認するのがzero-check、全ての合計がvvvになることを確認するのがsum-checkになります。

検証者がこの多項式f~\tilde{f}f~​ を、boolean-hypercube上の全ての点で多項式を評価するのは、2ℓ2^{\ell}2ℓ回の評価が必要ですが、sum-check protocolでは、ℓ\ellℓ回まで減らすことができます。

この記事の前半では、CCSをMLEへ拡張したsum-checkを証明する所まで解説し、後半ではsum-checkを畳み込む方法を解説します。

MLE (Multilinear extensions)

多変数多項式 (multivariate polynomial) f:{0,1}ℓ→Ff: \{0,1\}^{\ell} \rightarrow \mathbb{F}f:{0,1}ℓ→F をMLEにするには、次のeq~(x,e)\tilde{eq}(x, e)eq~​(x,e)を使います。これは、x=ex=ex=e のときは111を、それ以外は000となる多重線形多項式(multilinear polynomial)です。

f(x)f(x)f(x)には次数が1次以上の項が含まれているので、fffをxxxで評価してしまった値をeq~\tilde{eq}eq~​で選ぶことで、全ての項の次数が1次以下になるようにします。次の式を見ると、fffの中にある変数は∑x∈{0,1}ℓ\sum_{x \in \{0,1\}^{\ell}}∑x∈{0,1}ℓ​によって既に評価され展開されています。

CCSをMLEへ拡張

CCSの定義

CCSでは、次の式を満たすcic_ici​, SiS_iSi​, MjM_jMj​, zzzが必要となります。MMMは、R1CSでのAAA,BBB,CCCの行列に対応し、SSSはアダマール積を行う行列のグループ、cccは定数項、zzzはinputやwitnessなどです。

R1CSからCCSへ

この記事では、次のような、R1CSをCCSへ変換した形を扱っていきますので、MMMは[M1,M2,M3][M_1, M_2, M_3][M1​,M2​,M3​]、S=[{1,2},{3}]S = [\{1,2\}, \{3\}]S=[{1,2},{3}]となります。また、M1M_1M1​,M2M_2M2​,M3M_3M3​は、R1CSのAAA,BBB,CCCに対応しますが、MLEにするには行と列が2の倍数である必要があるので、4行目がゼロベクトルでパディングされています。

CCSからsum-checkへ

次の行列の演算を含む式をmultilinear polynomialにするには、まずMiM_iMi​とzzzを多項式として表現する必要があります。

MiM_iMi​はm×nm \times nm×nなので、MiM_iMi​をMi(m,n)M_i(m,n)Mi​(m,n): F2→{0,1}\mathbb{F}^2 \rightarrow \{0,1\}F2→{0,1}の多項式として考えます。m,nm,nm,nを指定すれば、それに対応する{0,1}\{0,1\}{0,1}が返ってきます。

これをMLEにするので、次のようにeq~\tilde{eq}eq~​を使ってMi~(X,Y),z~(Y)\tilde{M_i}(X, Y),\tilde{z}(Y)Mi​~​(X,Y),z~(Y)を定義します。HyperNovaでは、m=s,n=s′m=s, n=s'm=s,n=s′です。

したがって、Mi⋅zM_i \cdot zMi​⋅zのmultivariate polynomialは、次のようになります。このとき、YYYは全てのy∈{0,1}s′y \in \{0,1\}^{s'}y∈{0,1}s′で展開しておきます。

MMMは3つありますので、それらを合わせると、次のような多項式GGGを定義できます。

ここで注意すべきは、GGGの内部で多項式を掛けてしまっているので、multilinear polynomialではないということです。そこで、eq~\tilde{eq}eq~​を使ってMLEにしていきます。

Schwartz-Zippel lemmaでΣを減らす

全てのx∈{0,1}2x \in \{0,1\}^2x∈{0,1}2でG(x)=0G(x) = 0G(x)=0となることを確かめられれば、CCSの制約が成り立っていることを確認できます。Schwartz-Zippel lemmaにより、h(X1,X2)=0h(X1,X2)=0h(X1,X2)=0 となる確率が高いと分かります。

次の式では、(β1,β2)(\beta_1, \beta_2)(β1​,β2​)と一致する項がeq~\tilde{eq}eq~​によって残され、それが000であることが確かめられます。

これを利用すると、∑\sum∑を減らすことができます。このQ(X1,X2)Q(X_1, X_2)Q(X1​,X2​)をsum-check protocolで証明していきます。

Sum-check protocol

上のQ(x)Q(x)Q(x)を使って、sum-check protocolでG(x)=0G(x) = 0G(x)=0を証明していくのだが、ProverとVerifierは次の2種類のsum-checkを行うことになる。

  • Outer sum-check: G(x)=0G(x) = 0G(x)=0 for all x∈{0,1}2x \in \{0,1\}^2x∈{0,1}2

  • Inner sum-check: Tj=∑y∈{0,1}3Mj~(r,y)⋅z~(y)T_j = \sum_{y \in \{0,1\}^3} \tilde{M_j}(r, y) \cdot \tilde{z}(y)Tj​=∑y∈{0,1}3​Mj​~​(r,y)⋅z~(y)

Outer sum-checkを行うときに、GGGの中にもsum-checkの形が現れるので、これもinner sum-checkとして別に行う。

sum-check protocolでは、多重線形多項式のそれぞれの変数に対して一変数多項式を作り、再帰的に証明と検証をしています。

Outer sum-check

Round 1

ProverはVerifierに次のQ1Q_1Q1​を主張する一変数多項式s1(X1)s_1(X_1)s1​(X1​)を送信します。

Q1(X1)=∑x2∈{0,1}Q(X1,x2)Q_1(X_1) = \sum_{x_2 \in \{0,1\}}Q(X_1, x_2)Q1​(X1​)=x2​∈{0,1}∑​Q(X1​,x2​)

s1(X1)s_1(X_1)s1​(X1​)を受け取ったVerifierは、s1(0)+s1(1)=0s_1(0) + s_1(1) = 0s1​(0)+s1​(1)=0 となることを確認します。

s1s_1s1​内では、Q(X1,X2)Q(X_1, X_2)Q(X1​,X2​)のX2X_2X2​を既に0,10,10,1で評価されているはずなので、s1s_1s1​を0,10,10,1で評価して合計が000であること確認することは、Q(x)=0Q(x) = 0Q(x)=0. ∀x∈{0,1}2\forall{x} \in \{0,1\}^2∀x∈{0,1}2を確認したことと同じになります。

Round 2

次に、Verifierにs1(r1):=∑x2∈{0,1}Q(r1,x2)s_1(r_1) := \sum_{x_2 \in \{0,1\}} Q(r_1, x_2)s1​(r1​):=∑x2​∈{0,1}​Q(r1​,x2​)であつことを主張するために、Q2(X2):=Q(r1,X2)Q_2(X_2) := Q(r_1, X_2)Q2​(X2​):=Q(r1​,X2​)次のQ2(X2)Q_2(X_2)Q2​(X2​)を主張するs2(x)s_2(x)s2​(x)をVerifierに渡します。

Q2(X2):=Q(r1,X2)Q_2(X_2) := Q(r_1, X_2)Q2​(X2​):=Q(r1​,X2​)

s2(x)s_2(x)s2​(x)を受け取ったVerifierは、s1(r1)=s2(0)+s2(1)s_1(r_1) = s_2(0) + s_2(1)s1​(r1​)=s2​(0)+s2​(1) であることを確かめます。

s1s_1s1​内ではX2X_2X2​が0,10,10,1で既に評価され展開されているので、r1r_1r1​で既にX1X_1X1​が評価されているs2s_2s2​を、0,10,10,1で評価した合計は、s1(r1)s_1(r_1)s1​(r1​)と同じになるはずです。

ここまでで、Verifierはs1(x)s_1(x)s1​(x)とs2(x)s_2(x)s2​(x)が確かにQ(X1,X2)Q(X_1, X_2)Q(X1​,X2​)から生成されたことが確認できたので、s2(r2)s_2(r_2)s2​(r2​)によってQQQを二つのランダムな点で評価することができます。Q(r1,r2)=0Q(r_1, r_2) = 0Q(r1​,r2​)=0であることは、高確率で0=G(x).∀x∈{0,1}2.0 = G(x). \forall{x} \in \{0,1\}^2.0=G(x).∀x∈{0,1}2. となります。

内部に含まれるsum-checkは別で証明する

Verifierがs1(x),s2(x)s_1(x), s_2(x)s1​(x),s2​(x)を評価するとき、内部には∑y∈{0,1}3M~i((X1,X2),y)⋅z~(y)\sum_{y \in \{0,1\}^3} \tilde{M}i ((X_1, X_2), y) \cdot \tilde{z}(y)∑y∈{0,1}3​M~i((X1​,X2​),y)⋅z~(y)の形が複数現れ、これはVerifierが直接計算しなければなりません。この計算も同じくsum-check protocolでVerifierの計算量を減らすことができます。

Inner sum-check

G((X1,X2))G((X_1, X_2))G((X1​,X2​))の内部で行われるsum-checkは複数あるので、複数のsum-checkを避けるため、sum-checkを束ねたbatch inner sum-checkを行います。

Proverは次のように、それぞれのsum-checkをVerifierから渡されたα\alphaαでランダム線形結合し、この多項式をsum-checkで証明することで三つのsum-checkを証明します。

Round 1

batch inner sum-checkもouter sum-checkと同様に、それぞれの変数に対しての一変数多項式をVerifierに送信し、再帰的に証明していきます。Round1では、ProverはY1Y_1Y1​以外の変数を全てのyyyについて評価し展開したf1(Y1)f_1(Y_1)f1​(Y1​)を主張するq1(Y1)q_1(Y_1)q1​(Y1​)をVerifierに渡します。

f1(Y1)f_1(Y_1)f1​(Y1​)を受け取ったVerifierは、f1(0)+f1(1)=Tf_1(0) + f_1(1) = Tf1​(0)+f1​(1)=T をすることで、Proverが主張するランダム線形結合された値 TTT を導けることを確認します。

Round 2

次に、Verifierから受け取ったr1′r_1 'r1′​でY1Y_1Y1​を評価し、Y3Y_3Y3​を0,10,10,1で評価した次の一変数多項式f2(Y2)f_2(Y_2)f2​(Y2​)を主張するq2(Y2)q_2(Y_2)q2​(Y2​)をVerifierに送信します。

q2(x)q_2(x)q2​(x)を受け取ったVerifierは、q1(r1)=q2(0)+q2(1)q_1(r_1) = q_2(0) + q_2(1)q1​(r1​)=q2​(0)+q2​(1) であることを確かめます。

q1q_1q1​内ではY2Y_2Y2​が0,10,10,1で既に評価され展開されているので、r1′r_1 'r1′​で既にY1Y_1Y1​が評価されているq2q_2q2​を、0,10,10,1で評価した合計は、q1(r1′)q_1(r_1 ')q1​(r1′​)と同じになるはずです。

Round 3

Y3Y_3Y3​についての一変数多項式を作り、Verifierに送信します。

Verifierはs2(r2′)=s3(0)+s3(1)s_2(r_2 ') = s_3(0) + s_3(1)s2​(r2′​)=s3​(0)+s3​(1)を確かめます。最終的にVerifierは次のことを確かめられます。

Final check

Reference

https://eprint.iacr.org/2023/573
https://github.com/privacy-scaling-explorations/multifolding-poc
https://anoma.net/research/superspartan-by-hand
https://anoma.net/research/hypernova-by-hand