Last updated
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}ℓ→F のような多変数多項式 (ℓ-variate polynomial)が、f~:Fℓ→F のような多重線形多項式 (multilinear polynomial)となることを指します。また、MLEの多項式内の全ての項の次数は一次以下となるのが特徴です。
f~(x)をboolean-hypercube上のどの点(∀x∈{0,1}ℓ)で評価しても全て0になることを確認するのがzero-check、全ての合計がvになることを確認するのがsum-checkになります。
検証者がこの多項式f~ を、boolean-hypercube上の全ての点で多項式を評価するのは、2ℓ回の評価が必要ですが、sum-check protocolでは、ℓ回まで減らすことができます。
この記事の前半では、CCSをMLEへ拡張したsum-checkを証明する所まで解説し、後半ではsum-checkを畳み込む方法を解説します。
MLE (Multilinear extensions)
多変数多項式 (multivariate polynomial) f:{0,1}ℓ→F をMLEにするには、次のeq~(x,e)を使います。これは、x=e のときは1を、それ以外は0となる多重線形多項式(multilinear polynomial)です。
CCSをMLEへ拡張
CCSの定義
R1CSからCCSへ
CCSからsum-checkへ
Schwartz-Zippel lemmaでΣを減らす
Sum-check protocol
sum-check protocolでは、多重線形多項式のそれぞれの変数に対して一変数多項式を作り、再帰的に証明と検証をしています。
Outer sum-check
Round 1
Round 2
内部に含まれるsum-checkは別で証明する
Inner sum-check
Round 1
Round 2
Round 3
Final check
Reference
f(x)には次数が1次以上の項が含まれているので、fをxで評価してしまった値をeq~で選ぶことで、全ての項の次数が1次以下になるようにします。次の式を見ると、fの中にある変数は∑x∈{0,1}ℓによって既に評価され展開されています。
CCSでは、次の式を満たすci, Si, Mj, zが必要となります。Mは、R1CSでのA,B,Cの行列に対応し、Sはアダマール積を行う行列のグループ、cは定数項、zはinputやwitnessなどです。
この記事では、次のような、R1CSをCCSへ変換した形を扱っていきますので、Mは[M1,M2,M3]、S=[{1,2},{3}]となります。また、M1,M2,M3は、R1CSのA,B,Cに対応しますが、MLEにするには行と列が2の倍数である必要があるので、4行目がゼロベクトルでパディングされています。
次の行列の演算を含む式をmultilinear polynomialにするには、まずMiとzを多項式として表現する必要があります。
Miはm×nなので、MiをMi(m,n): F2→{0,1}の多項式として考えます。m,nを指定すれば、それに対応する{0,1}が返ってきます。
これをMLEにするので、次のようにeq~を使ってMi~(X,Y),z~(Y)を定義します。HyperNovaでは、m=s,n=s′です。
したがって、Mi⋅zのmultivariate polynomialは、次のようになります。このとき、Yは全てのy∈{0,1}s′で展開しておきます。
Mは3つありますので、それらを合わせると、次のような多項式Gを定義できます。
ここで注意すべきは、Gの内部で多項式を掛けてしまっているので、multilinear polynomialではないということです。そこで、eq~を使ってMLEにしていきます。
全てのx∈{0,1}2でG(x)=0となることを確かめられれば、CCSの制約が成り立っていることを確認できます。Schwartz-Zippel lemmaにより、h(X1,X2)=0 となる確率が高いと分かります。
次の式では、(β1,β2)と一致する項がeq~によって残され、それが0であることが確かめられます。
これを利用すると、∑を減らすことができます。このQ(X1,X2)をsum-check protocolで証明していきます。
上のQ(x)を使って、sum-check protocolでG(x)=0を証明していくのだが、ProverとVerifierは次の2種類のsum-checkを行うことになる。
Outer sum-check: G(x)=0 for all x∈{0,1}2
Inner sum-check: Tj=∑y∈{0,1}3Mj~(r,y)⋅z~(y)
Outer sum-checkを行うときに、Gの中にもsum-checkの形が現れるので、これもinner sum-checkとして別に行う。
ProverはVerifierに次のQ1を主張する一変数多項式s1(X1)を送信します。
Q1(X1)=x2∈{0,1}∑Q(X1,x2) s1(X1)を受け取ったVerifierは、s1(0)+s1(1)=0 となることを確認します。
s1内では、Q(X1,X2)のX2を既に0,1で評価されているはずなので、s1を0,1で評価して合計が0であること確認することは、Q(x)=0. ∀x∈{0,1}2を確認したことと同じになります。
次に、Verifierにs1(r1):=∑x2∈{0,1}Q(r1,x2)であつことを主張するために、Q2(X2):=Q(r1,X2)次のQ2(X2)を主張するs2(x)をVerifierに渡します。
Q2(X2):=Q(r1,X2) s2(x)を受け取ったVerifierは、s1(r1)=s2(0)+s2(1) であることを確かめます。
s1内ではX2が0,1で既に評価され展開されているので、r1で既にX1が評価されているs2を、0,1で評価した合計は、s1(r1)と同じになるはずです。
ここまでで、Verifierはs1(x)とs2(x)が確かにQ(X1,X2)から生成されたことが確認できたので、s2(r2)によってQを二つのランダムな点で評価することができます。Q(r1,r2)=0であることは、高確率で0=G(x).∀x∈{0,1}2. となります。
Verifierがs1(x),s2(x)を評価するとき、内部には∑y∈{0,1}3M~i((X1,X2),y)⋅z~(y)の形が複数現れ、これはVerifierが直接計算しなければなりません。この計算も同じくsum-check protocolでVerifierの計算量を減らすことができます。
G((X1,X2))の内部で行われるsum-checkは複数あるので、複数のsum-checkを避けるため、sum-checkを束ねたbatch inner sum-checkを行います。
Proverは次のように、それぞれのsum-checkをVerifierから渡されたαでランダム線形結合し、この多項式をsum-checkで証明することで三つのsum-checkを証明します。
batch inner sum-checkもouter sum-checkと同様に、それぞれの変数に対しての一変数多項式をVerifierに送信し、再帰的に証明していきます。Round1では、ProverはY1以外の変数を全てのyについて評価し展開したf1(Y1)を主張するq1(Y1)をVerifierに渡します。
f1(Y1)を受け取ったVerifierは、f1(0)+f1(1)=T をすることで、Proverが主張するランダム線形結合された値 T を導けることを確認します。
次に、Verifierから受け取ったr1′でY1を評価し、Y3を0,1で評価した次の一変数多項式f2(Y2)を主張するq2(Y2)をVerifierに送信します。
q2(x)を受け取ったVerifierは、q1(r1)=q2(0)+q2(1) であることを確かめます。
q1内ではY2が0,1で既に評価され展開されているので、r1′で既にY1が評価されているq2を、0,1で評価した合計は、q1(r1′)と同じになるはずです。
Y3についての一変数多項式を作り、Verifierに送信します。
Verifierはs2(r2′)=s3(0)+s3(1)を確かめます。最終的にVerifierは次のことを確かめられます。