HyperNova

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

この解説は、こちらの[SuperSpartan by Hand](https://anoma.net/research/superspartan-by-hand)と、[HyperNova by Hand](https://anoma.net/research/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} のような多変数多項式 ({\ell}-variate polynomial)が、f~:FF\tilde{f} : \mathbb{F}^{\ell} \rightarrow \mathbb{F} のような多重線形多項式 (multilinear polynomial)となることを指します。また、MLEの多項式内の全ての項の次数は一次以下となるのが特徴です。

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

検証者がこの多項式f~\tilde{f} を、boolean-hypercube上の全ての点で多項式を評価するのは、22^{\ell}回の評価が必要ですが、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} をMLEにするには、次のeq~(x,e)\tilde{eq}(x, e)を使います。これは、x=ex=e のときは11を、それ以外は00となる多重線形多項式(multilinear polynomial)です。

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

CCSをMLEへ拡張

CCSの定義

CCSでは、次の式を満たすcic_i, SiS_i, MjM_j, zzが必要となります。MMは、R1CSでのAA,BB,CCの行列に対応し、SSはアダマール積を行う行列のグループ、ccは定数項、zzはinputやwitnessなどです。

R1CSからCCSへ

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

CCSからsum-checkへ

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

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

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

したがって、MizM_i \cdot zのmultivariate polynomialは、次のようになります。このとき、YYは全てのy{0,1}sy \in \{0,1\}^{s'}で展開しておきます。

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

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

Schwartz-Zippel lemmaでΣを減らす

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

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

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

Sum-check protocol

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

  • Outer sum-check: G(x)=0G(x) = 0 for all x{0,1}2x \in \{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)

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

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

Outer sum-check

Round 1

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

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

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

s1s_1内では、Q(X1,X2)Q(X_1, X_2)X2X_2を既に0,10,1で評価されているはずなので、s1s_10,10,1で評価して合計が00であること確認することは、Q(x)=0Q(x) = 0. x{0,1}2\forall{x} \in \{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)であつことを主張するために、Q2(X2):=Q(r1,X2)Q_2(X_2) := Q(r_1, X_2)次のQ2(X2)Q_2(X_2)を主張するs2(x)s_2(x)をVerifierに渡します。

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

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

s1s_1内ではX2X_20,10,1で既に評価され展開されているので、r1r_1で既にX1X_1が評価されているs2s_2を、0,10,1で評価した合計は、s1(r1)s_1(r_1)と同じになるはずです。

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

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

Verifierがs1(x),s2(x)s_1(x), s_2(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)の形が複数現れ、これはVerifierが直接計算しなければなりません。この計算も同じくsum-check protocolでVerifierの計算量を減らすことができます。

Inner sum-check

G((X1,X2))G((X_1, X_2))の内部で行われる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_1以外の変数を全てのyyについて評価し展開したf1(Y1)f_1(Y_1)を主張するq1(Y1)q_1(Y_1)をVerifierに渡します。

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

Round 2

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

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

q1q_1内ではY2Y_20,10,1で既に評価され展開されているので、r1r_1 'で既にY1Y_1が評価されているq2q_2を、0,10,1で評価した合計は、q1(r1)q_1(r_1 ')と同じになるはずです。

Round 3

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

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

Final check

Reference

Last updated