zk-SNARK に関する学習ノートで、主に zk-SNARK の方程式に焦点を当てています。
ZK-SNARK はゼロ知識簡潔非対話的知識の主張を意味します。
zk-SNARK の三つの特性
-
完全性:有効な証人を持つすべての命題には、検証者を納得させる証明があります。
-
健全性:無効な証人を持つ命題には、検証者を納得させる証明がありません。
-
ゼロ知識:証明は命題の有効性に関する情報のみを伝え、証明者の証人に関する情報は何も伝えません。
前提知識#
算術回路#
算術回路は多項式を計算するためのモデルです。有限体 F={0,⋯,p−1} (素数 p>2) に対して、算術回路 C:Fn→F は、ノードが加算および乗算ゲートであり、エッジがワイヤである有向非循環グラフ(DAG)です。DAG の各ノードには二つの入力と出力があります。DAG には一つの最終出力があります。
m- ゲート、n- ワイヤの算術回路において、証人はs=(s1,s2,⋯,sn)と定義され、ここでsiはi- 番目のワイヤの値です。
ランク - 1 制約 (R1CS) は次のように定義されます:一部の定数 {ui,q,vi,q,wi,q}1≤i≤n,1≤q≤m に対して、∑i=1nsiui,q⋅∑i=1nsivi,q=∑i=1nsiwi,q。例えば、図 1 では、s1⋅s2=s4は R1CS であり、ここでu1,1=1,v2,1=1,w4,1=1、他は=0です。
二次算術プログラム (QAP)#
まず、ターゲットポイントをr1,r2,⋯,tm∈Fpと定義します。各ターゲットポイントは算術回路のゲートに対応します。次に、消失関数t(x)=Πq=1m(x−rq)を定義し、t(x)=0がターゲットポイントr1,r2,⋯,tmで成り立つようにします。
二次算術プログラムはs=(s1,s2,⋯,sn)に関する関係であり、次のように表されます: ∑i=1nsiui(x)⋅∑i=1nsivi(x)−∑i=1nsiwi(x)≡0 (mod t(x))、ここでui(x),vi(x),wi(x)は次数m−1の多項式であり、1≤i≤n,1≤q≤mに対して、ui(rq)=ui,q、vi(rq)=vi,q、wi(rq)=wi,qです。
x=rqのとき、この方程式はq番目のゲートの R1CS です。したがって、この方程式をチェックすることは、mのランク - 1 制約を同時にチェックすることに相当します。
ホモモルフィックエンコーディング#
ホモモルフィックエンコーディングは、E:Fp→Gという単射ホモモルフィズムであり、E(x)が与えられたときにxを見つけるのが難しいです。
例えば、素数の順序pを持つ循環群Gがあり、gを生成元、乗算を群の演算とすると、ホモモルフィックエンコーディングはE(a)=gaです。これはホモモルフィックであり、単射です。また、離散対数問題の難しさにより、E(x)が与えられたときにxを見つけるのも難しいです。
ペアリング関数、または双線形写像#
ペアリング関数、または双線形写像は次のように定義されます:
G1,G2およびGTは素数の順序pの群であり、ペアリング関数はe:G1×G2→GTであり、次の条件を満たします:
-
g,hがそれぞれG1およびG2の生成元である場合、e(g,h)=1はGTの生成元です。
-
e(ga,hb)=e(g,h)abです。
双線形写像にはいくつかの特性があり、次のように示されます:
-
e(u,vw)=e(ga,hbhc)=e(g,h)a(b+c)=e(ga,hb)e(ga,hc)=e(u,v)e(u,w)
-
e(vw,u)=e(v,u)e(w,u)
-
e(ux,v)=e(g,h)xab=e(u,vx)
Pinocchio 実装(zk-SNARK の実装)では、対称双線形写像が使用され、G:=G1=G2です。
zk-SNARK#
証明者と検証者が事前に合意した任意の NP 計算に対して、彼らはこの計算のための算術回路を構築でき、その回路の証人は元の計算の証人となります。算術回路は QAP に還元でき、QAP の証人を検証することは算術回路の証人を検証することに相当します。したがって、QAP の証人を検証することは元の計算の証人を検証することに等しいです。
算術回路から QAP への一般的な還元#
m- ゲートおよびn- ワイヤの算術回路に対して、証人はs=(s1,s2,⋯,sn)∈Rnと定義されます。sに対する R1CS (ai,bi,ci)は次のように定義されます: (s⋅ai)×(s⋅bi)−s⋅ci=0、ここで1≤i≤mおよびai,bi,ci∈Rnです。
一般的な還元は三つのステップから成ります:
-
mの制約ベクトルをスタックして、行列A,B,C∈Rm×nを取得します。ここで
- A=a1Ta2T⋮amTB=b1Tb2T⋮bmTC=c1Tc2T⋮cmT
-
ラグランジュ補間を使用して、3つのn多項式のセット{ui}i=1n,{vi}i=1n,{wi}i=1nを見つけます。これにより
-
すべてのi∈[n]およびx∈[m]に対して
-
ui(x)vi(x)wi(x)=A[x][i]=B[x][i]=C[x][i]
-
多項式h(x)を見つけます。これにより
-
(∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)
-
ここでt(x)=(x−1)(x−2)⋯(x−n)です。
したがって、(∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)をチェックすることは、算術回路内の R1CS 関係をチェックすることに相当します。つまり、証人は各ノード内のすべての R1CS 関係を満たすことができます。
Pinocchio プロトコル#
Pinocchio プロトコルは zk-SNARK の実装です。
このプロトコルは、生成元gを持つ素数の順序pの群Gに基づいて構築されます。ホモモルフィックエンコーディングをE:Fp→G、E(x)=gxと定義します。楕円曲線の双線形写像をe:G×G→GTと定義します。証明者は証人{si}i=1nを知っており、彼は次の方程式を還元によって得ることができます: (∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)。
主なアイデアは次のとおりです:
-
Vは多項式のためにランダムポイントz∈FpでPをテストします。
-
Pはu(z)=∑i=1nsiui(z),v(z)=∑i=1nsivi(z),w(z)=∑i=1nsiwi(z)およびh(z)を計算し、これらの値をホモモルフィックにエンコードしてVに送信します。
-
Vは、ホモモルフィックにエンコードされた値が証人自体を学ぶことなく同じ方程式を満たすことを確認できます。
Pinocchio プロトコルは三つのステップから成ります: (1) 信頼できる第三者が共通参照文字列(CRS)を生成します;(2) 証明者が証明を生成します;(3) 検証者が証明をチェックし、受け入れるか拒否するかを決定します。
CRS 生成プロセスでは、信頼できる第三者がランダムなα,βu,βv,βw,γ,z∈Fp∗を選択し、CRS を公開します。その後、信頼できる第三者は生成に使用したすべてのサンプル群要素(有害廃棄物)を破棄します。CRS は証明者の評価キーと検証者の検証キーで構成されます。
評価キーは次のように定義されます:
-
{E(zi)}i=0n,{E(αzi)}i=0n
-
{E(ui(z)}i=1n,{E(αui(z)}i=1n,{E(βuui(z)}i=1n
-
{E(vi(z)}i=1n,{E(αvi(z)}i=1n,{E(βvvi(z)}i=1n
-
{E(wi(z)}i=1n,{E(αwi(z)}i=1n,{E(βwwi(z)}i=1n
検証キーは次のように定義されます:
-
E(1),E(α),E(t(z))
-
E(γ),E(βuγ),E(βvγ),E(βwγ)
証明生成プロセスでは、証明者は多項式(∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)を知っているため、最初にh(x)を計算します。次に、証明者は評価キーを使用して証明を生成します:
-
E(u(z)),E(αu(z)), where u(z)=∑i=1nsiui(z)
-
E(v(z)),E(αv(z)), where v(z)=∑i=1nsivi(z)
-
E(w(z)),E(αw(z)), where w(z)=∑i=1nsiwi(z)
-
E(h(z)),E(αh(z))
-
E(βuu(z)+βvv(z)+βww(z))
例えば、
-
E(u(z))=E(∑i=1nsiui(z))=g∑i=1nsiui(z)=Πi=1ngsiui(z)=Πi=1n(gui(z))si=Πi=1n(E(ui(z))si)
-
E(αu(z))=E(∑i=1nsiαui(z))=Πi=1n(E(αui(z))si)
-
E(h(z)): ziの線形結合は、E(zi)から計算できます。
-
E(βuu(z)+βvv(z)+βww(z))=E(βuu(z))E(βvv(z))E(βww(z))
証明検証プロセスでは、検証者は三つの検証を行います。
最初に、検証者はu(z),v(z),w(z),h(z)の項が CRS 内の項の線形結合として構築されたことを確認するために、次の方程式をチェックします:
-
e(E(u(z)),E(αu1(z)))=e(E(αu(z)),E(u1(z)))
-
e(E(v(z)),E(αv1(z)))=e(E(αv(z)),E(v1(z)))
-
e(E(w(z)),E(αw1(z)))=e(E(αw(z)),E(w1(z)))
-
e(E(h(z)),E(α))=e(E(αh(z)),E(1))
次に、検証者は各項u(z),v(z),w(z)が同じ線形係数{si}i=1nを使用して生成されたことを確認します。つまり、u(z)=∑i=1nsiui(z),v(z)=∑i=1nsivi(z),w(z)=∑i=1nsiwi(z)をチェックします。
- e(E(βuu(z)+βvv(z)+βww(z)),E(γ))=e(E(u(z)),E(βuγ))e(E(v(z)),E(βvγ))e(E(w(z)),E(βwγ))
最後に、検証者は多項式の除算基準を特徴付けるキー条件をチェックするために、次の方程式をチェックします:
-
e(E(u(z)),E(v(z)))=e(E(w(z)),E(1))⋅e(E(t(z)),E(h(z)))
-
すなわち、e(E(u(z)),E(v(z)))/e(E(w(z)),E(1))=e(E(t(z)),E(h(z)))
-
すなわち、(∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)をチェックします。
検証者は、すべてのチェックが成立すれば受け入れます。
これまでのプロセスはゼロ知識ではありません。もしVが独自の証人s′=(s1′,s2′,⋯,sn′)を考え出した場合、彼らはE(u′(z)),E(v′(z)),E(w′(z)),E(h′(z))を計算できます。これらの値がE(u(z)),E(v(z)),E(w(z)),E(h(z))と異なる場合、検証者は証明者の証人がs′ではないと結論します。
ゼロ知識は、多項式u,v,wにランダムシフトを追加することで達成できます。ランダムシフトはt(x)の倍数であるため、すべてがまだmod t(x)の下で同じです。ランダムなδ1,δ2,δ3∈Fpに対して、シフトされた多項式は次のように定義されます。
-
uz(x)=u(x)+δ1t(x)
-
vz(x)=v(x)+δ2t(x)
-
wz(x)=w(x)+δ3t(x)
その後、Pは証明内でシフトされていない項をシフトされた項に置き換えます。例えば、E(uz(x))=E(u(x)+δ1t(x))=E(u(x))E(δ1t(x))
Groth-16 プロトコル#
Groth-16 プロトコルは、zk-SNARK のより簡潔な実装です。証明のサイズと検証者の複雑さは、Groth-16 の Pinocchio よりも大幅に低くなります。
Groth-16 では、証明者が多項式(∑i=1nsiui(x))⋅(∑i=1nsivi(x))−(∑i=1nsiwi(x))=h(x)t(x)を知っているため、証明は次のように定義されます:
-
E(α+u(z))
-
E(β+v(z))
-
E(∑si×(βui(z)+αvi(z)+wi(z))+h(z)t(z))
検証者は次をチェックします: e(E(α+u(z)),E(β+v(z)))=e(E(∑si×(βui(z)+αvi(z)+wi(z))+h(z)t(z)),E(1))e(E(α),E(β))
参考文献#
zk-SNARKs のレビュー
ゼロ知識証明 MOOC