ゼロ知識証明:SNARKの証明を構築する(第2回/全3回)

ペアリング方程式が刻まれた一対の折り紙の鶴が、輝く焦点のビームで出会う様子

第1回の式(3)は、プログラムを1つの多項式チェックに集約した。任意のランダムな $\tau$ に対し、有効なウィットネスは次を満たす。

$$L(\tau) \cdot R(\tau) - O(\tau) = H(\tau) \cdot Z(\tau)$$

これは整った代数的な等式だが、まだ証明ではない。隙間が2つ残っている。証明者は自分が知らない $\tau$ で評価しなければならず、その評価はチェックを通すためにこしらえた適当な多項式ではなく、QAP本来の多項式から得られたものでなければならない。

この記事ではその2つの隙間を埋め、さらに途中で見つかるいくつかの隙間も埋める。最後には完全なSNARKが手に入る。曲線上の8点、5つのペアリングチェック、そしてウィットネスについて何も漏らさない証明だ。

評価を曲線上へ移す

最初の隙間は、$\tau$ を曲線上の点に隠すことで埋められる。トラステッドセットアップ・セレモニーがランダムなスカラー $\tau$ を選び、その冪を楕円曲線上の素数位数の2つの群に公開する。

$$G_1,\ \tau G_1,\ \tau^2 G_1,\ \ldots,\ \tau^d G_1$$

を $\mathbb{G}_1$ に、加えて $G_2, \tau G_2, \ldots, \tau^d G_2$ という対応する冪を $\mathbb{G}_2$ に公開し、その後スカラーそのものを破棄する。複数の参加者がそれぞれ $\tau$ にランダム性を提供し、そのうち少なくとも1人が自分の取り分を正直に破棄するかぎり、誰も復元できない。破棄されたランダム性は有害廃棄物toxic waste)と呼ばれる。残るのは上のリストの点群、すなわち共通参照文字列Common Reference String, CRS)であり、Verkle記事のトラステッドセットアップと同じ枠組みに従う。

トラステッドセットアップが τ を G₁ と G₂ の点からなるCRSのレールに焼き付け、4つの多項式係数が金色の点と組み合わさって蝋封されたコミットメント P(τ)·G₁ に収束する図

多項式 $P$ の係数を持つ者なら誰でも、$\tau$ を知らずに $P(\tau) \cdot G_1$ を計算できる。公開された各 $\tau^k G_1$ に係数 $p_k$ を掛けて足し合わせるだけだ。結果は隠された点における多項式の値へのコミットメントであり、証明者がウィットネスそのものは伏せたままウィットネス依存の値を検証者に渡せるようにする中核的な道具だ。

このCRSは、新しいチェックが新しい固定点を要求するたびに記事を通して育っていく。追加の作り方はどれも同じだ。秘密のスカラーを含む式をセレモニー中に評価し、結果は曲線上の点としてのみ公開する。

コミットメントをQAP多項式に束縛する

まず3つのコミットメントから始める。集約多項式 $L$、$R$、$O$ それぞれに1つずつだ。第1回で示したとおり、$L(\tau)$ はウィットネスで重み付けされた変数ごとの多項式 $L_i$ の和として定義され、これへのコミットメントを $\pi_A$ と呼ぶ。1

$$\pi_A = L(\tau) \cdot G_1 = \sum_i s_i \cdot L_i(\tau) \cdot G_1$$

ここで $s_i$ はウィットネスの値だ。指数の知識Knowledge of Exponent, KoE)仮定が、上の式で計算した $\pi_A$ を証明者に公開させる仕組みだ。

ペア $(P, \alpha P)$、すなわち曲線上の点と、それを未知のスカラー $\alpha$ で倍した点が与えられたとき、KoEはこう主張する。同じ倍率を持つ別のペアを作る唯一の方法は、元のペアを既知の別のスカラー $c$ で倍することだ。$(cP, c \cdot \alpha P) = (cP, \alpha \cdot cP)$ という形になる。2 KoEは線形結合に自然に拡張される。$(P_1, \alpha P_1), \ldots, (P_n, \alpha P_n)$ を公開した場合、証明者が別の α 倍されたペア $(C, \alpha C)$ を返せるのは、$C = \sum_j c_j P_j$ を満たす係数 $c_j$ を証明者が知っているとき、かつそのときに限る。

つまり証明者は公開された $P_j$ から構築するしかなく、これこそ $\pi_A$ を $L_i$ に束縛するために必要な性質だ。$L_i$ 多項式は証明者と検証者の双方が知っているので、セットアップはそれらをCRSに焼き込める。各変数 $i$ について、秘密スカラー $\alpha_A$ を用いてペア $\big(L_i(\tau) \cdot G_1,\ \alpha_A \cdot L_i(\tau) \cdot G_1\big)$ を公開する。証明者はこれらのペアをウィットネスの重み $s_i$ で組み合わせ、シフトのかかっていない側から $\pi_A$ を、α 倍された側から $\pi_A'$ を作る。

これらの α 倍ペアと $\alpha_A \cdot G_2$ もCRSに入れておけば、検証者は $(\pi_A, \pi_A')$ が正しい倍率を持つことを確かめるペアリングチェックを実行できる。

$$e(\pi_A',\ G_2) = e(\pi_A,\ \alpha_A \cdot G_2)$$

ペアリング $e(P, Q)$ は曲線上の2点を取り、乗法的なターゲット群 $\mathbb{G}_T$ の元を出力する。双線形性により $e(aP, bQ) = e(P, Q)^{ab}$ が成り立ち、上の両辺はどちらも $e(\pi_A, G_2)^{\alpha_A}$ に簡約される。よってチェックが通るのは $\pi_A' = \alpha_A \cdot \pi_A$ のときに限る。3

新しいスカラー $\alpha_B$ と $\alpha_C$ で同じ構成を繰り返せば、$(\pi_B, \pi_B')$ と $(\pi_C, \pi_C')$ が得られる。$\pi_B$ は後で $\pi_A$ とペアにできるよう $G_1$ ではなく $G_2$ に置く。一方 $\pi_C$ は $G_1$ にとどまる。

まとめると、

$$\begin{aligned} \pi_A &= \sum_i s_i \cdot L_i(\tau) \cdot G_1 \\ \pi_B &= \sum_i s_i' \cdot R_i(\tau) \cdot G_2 \\ \pi_C &= \sum_i s_i'' \cdot O_i(\tau) \cdot G_1 \end{aligned} \tag{1}$$

そして α 倍された対応物が

$$\begin{aligned} \pi_A' &= \alpha_A \cdot \pi_A \\ \pi_B' &= \alpha_B \cdot \pi_B \\ \pi_C' &= \alpha_C \cdot \pi_C \end{aligned} \tag{2}$$

となる。まだ $s_i = s_i' = s_i''$ を強制するものは何もなく、3つの候補ウィットネスが並列に通っているだけかもしれない。

コミットメントを単一のウィットネスに束縛する

整合的なウィットネスを1つも持たないままチェックをすべて通る証明者は、何も証明したことにならない。対策は4つ目のコミットメント $\pi_K$ で、検証者はこれを使って3つのウィットネスの集合が一致しているかを確かめる。

各変数 $i$ について、CRSは秘密 $\beta$ のもとで3つの辺をひとまとめにする1点を公開する。

$$\beta \big(L_i(\tau) + R_i(\tau) + O_i(\tau)\big) \cdot G_1$$

証明者は変数ごとに1つの重み $r_i$ で各バンドルを倍し、次を作る。

$$\begin{aligned} \pi_K = \beta \cdot G_1 \cdot \sum_i r_i \cdot \big({}&L_i(\tau) + R_i(\tau) \\ &{}+ O_i(\tau)\big) \tag{3} \end{aligned}$$

CRSに $\beta \cdot G_1$ と $\beta \cdot G_2$ も加えれば、検証者は次のペアリングチェックを実行する。

$$\begin{aligned} e(\pi_K, G_2) &= e(\pi_A + \pi_C,\ \beta \cdot G_2) \\ &\quad \cdot e(\beta \cdot G_1,\ \pi_B) \end{aligned}$$

$\pi_A, \pi_C$ は $G_1$ にとどまるが、$\pi_B$ は $G_2$ に属するので別途ペアにする。双線形性により両辺とも $e(G_1, G_2)$ の同じ冪に簡約される。指数を一致させ、β を消去し、和の各項を等しくおくと、

$$\begin{aligned} &r_i \cdot \big(L_i(\tau) + R_i(\tau) + O_i(\tau)\big) \\ &\quad = s_i \cdot L_i(\tau) + s_i' \cdot R_i(\tau) \\ &\quad\quad {} + s_i'' \cdot O_i(\tau), \quad \forall i \end{aligned}$$

を得る。変数ごとの多項式 $L_i, R_i, O_i$ が線形独立だと仮定すれば、このチェックはすべての $i$ で $r_i$ を $s_i, s_i', s_i''$ それぞれに一致させ、最初の3つのコミットメントを単一のウィットネスへ収束させる。

$\alpha$ は各証明要素をQAP多項式に束縛し、$\beta$ は3つの要素を同じウィットネスに束縛する。これで証明者の整合性は確保できた。残る隙間は1つで、そのウィットネスがゲート制約を満たさなければならないという点だ。

コミットメントを制約を満たすウィットネスに束縛する

第1回で示したように、$L(t) \cdot R(t) - O(t)$ が $Z(t)$ で余りなく割り切れて商多項式 $H(t) = (L(t) \cdot R(t) - O(t)) / Z(t)$ が得られるのは、すべてのゲートが満たされるとき、かつそのときに限る。ここで $Z$ はすべてのゲート点で値0になるターゲット多項式だ。証明者は最初の節のCRSにある $\tau$ の冪を使って $H(\tau)$ にコミットする。

$$\pi_H = H(\tau) \cdot G_1 = \sum_j h_j \cdot (\tau^j \cdot G_1) \tag{4}$$

$Z(\tau) \cdot G_2$ がCRSに加われば、検証者は次を実行できる。

$$e(\pi_A,\ \pi_B) = e(\pi_H,\ Z(\tau) \cdot G_2) \cdot e(\pi_C,\ G_2)$$

両辺とも $e(G_1, G_2)$ の冪に簡約され、双線形性から指数を一致させると、

$$L(\tau) \cdot R(\tau) = H(\tau) \cdot Z(\tau) + O(\tau)$$

これは $\tau$ で評価したQAP恒等式 $L \cdot R - O = H \cdot Z$ そのものだ。Schwartz-Zippelの補題により、隠されたランダムな $\tau$ で恒等式が成立すれば、多項式としても圧倒的な確率で成立する。

動く骨組みと残る2つの隙間

式(1)から(4)までで、左に示した8つのコミットメントが揃い、右の5つのペアリングチェックに配線されている。

8つの証明要素の蝋封(金色のG₁が6つ、銀色のG₂が2つ)が5つのペアリングチェック節に配線され、ファミリーごとに色分けされている図。KoEは金、β整合性はテラコッタ、整除性は深紅

残る健全性の隙間を閉じるCRSレベルの修正を加えれば(ρ、付録で扱う)、動くSNARKが得られる。本筋に残る隙間は2つだ。

  • 公開入力。 主張された出力を検証者の期待に固定するものがまだ何もない。次の節で公開/秘密の分離を導入する。
  • ゼロ知識性。 コミットメントはウィットネスについての情報を漏らしうる。最後の節で秘匿化を導入してこの隙間を閉じる。

公開変数を固定する

よくあるSNARKの主張はこんな感じだ。「このプログラムを私の秘密入力で実行すると、この公開出力になる」。検証者は出力を持っている。その実行が正直に行われたという証明が欲しい。しかし5つのペアリングチェックはどんな整合的なウィットネスでも受け入れてしまう。証明者は好きな出力を選んでも通せてしまうのだ。

修正として、ウィットネスベクトルを分割し、検証者が公開側を持つ形にする。

$$\mathbf{s} = [\underbrace{s_0, s_1, \ldots, s_\ell}_{\text{公開}} \mid \underbrace{s_{\ell+1}, \ldots, s_n}_{\text{秘密}}]$$

公開側は定数1と検証者に見える必要がある値(通常は主張された出力)を保持し、秘密側はそれ以外をすべて保持する。

ここからは、$\pi_A$ は秘密インデックスについてのみ和を取る。一方、$\pi_B$ と $\pi_C$ は元のままでよい。公開側の固定点は1つで十分だからだ。4

$$\pi_A = \sum_{i \in \text{秘密}} s_i \cdot L_i(\tau) \cdot G_1$$

抜けた公開側は検証者に回り、CRSにはすでに必要な $L_i(\tau) \cdot G_1$ がある(KoEセットアップから来ている)。検証者は公開インデックスのものを取り出し、自分側の主張された値と組み合わせる。

$$L_\text{公開}(\tau) \cdot G_1 = \sum_{i \in \text{公開}} s_i \cdot L_i(\tau) \cdot G_1$$

検証式でこれまで $L(\tau) \cdot G_1$ 全体を使っていた箇所は、これからは $L_\text{公開}(\tau) \cdot G_1 + \pi_A$ に置き換わる。検証者の半分と証明者の半分を、曲線上で再構成する形だ。

整除性のチェックは次のようになる。

$$\begin{aligned} e\big(L_\text{公開}(\tau) \cdot G_1 + \pi_A,\ \pi_B\big) ={}& e(\pi_H,\ Z(\tau) \cdot G_2) \\ &\cdot e(\pi_C,\ G_2) \end{aligned}$$

これまでと同じ議論で $L = L_\text{公開} + L_\text{秘密}$ 上のQAP恒等式が強制される。これが成り立つのは、$\pi_A, \pi_B, \pi_C, \pi_H$ が検証者の $L_\text{公開}$ に一致するウィットネスから計算されたとき、かつそのときに限る。これで検証者は、自分が指定した出力に証明を束縛できるようになる。証明が通るのは、まさにその値に対して計算されたときだけだ。

コミットメントを秘匿化する

ここまで述べてきたものは健全だ。検証者が受け入れる証明はどれも、主張に対する有効なウィットネスが存在することを意味する。しかし健全性は秘匿性を意味しない。$\pi_A, \pi_B, \pi_C$ はウィットネスから一意に定まる関数なので、候補のウィットネスを持つ者なら誰でも、公開CRSから $\pi_A$ を再計算し、公開された証明と照合できる。一致すれば推測が確証され、不一致なら除外される。ゼロ知識性が要求するのは、証明がウィットネスについて何も漏らさないことだ。

対策は、検証式が吸収できるシフトで各コミットメントをランダム化することだ。証明者は証明ごとに新しい $\delta_L, \delta_R, \delta_O$ を選ぶ。5

$$\begin{aligned} \pi_A &= L(\tau) \cdot G_1 + \delta_L \cdot Z(\tau) \cdot G_1 \\ \pi_B &= R(\tau) \cdot G_2 + \delta_R \cdot Z(\tau) \cdot G_2 \\ \pi_C &= O(\tau) \cdot G_1 + \delta_O \cdot Z(\tau) \cdot G_1 \end{aligned}$$

整除性チェックではすでに $Z(\tau) \cdot G_2$ を使っている。CRSに $Z(\tau) \cdot G_1$ を加えると、証明者は曲線上で各シフトを構成できるようになる。

整除性は保たれる。積を展開し、裸の $LR$ 項に $L \cdot R = H \cdot Z + O$ を代入する。$O$ は $-O$ と打ち消し合い、残りはすべて $Z$ で括られる。

$$\begin{aligned} &\underbrace{(L + \delta_L Z)}_{L_{\text{新}}}\underbrace{(R + \delta_R Z)}_{R_{\text{新}}} - \underbrace{(O + \delta_O Z)}_{O_{\text{新}}} \\ &\quad = Z \cdot \underbrace{(H + \delta_L R + \delta_R L - \delta_O + \delta_L \delta_R Z)}_{H_{\text{新}}} \end{aligned}$$

証明者はここで $\pi_H = H_{\text{新}}(\tau) \cdot G_1$ を計算する。α と β のチェックも同じ仕掛けで釣り合いが取れる。CRSに対応するシフト($\alpha_A Z(\tau) G_1$、$\beta Z(\tau) G_1$ など)を加えると、対応物の要素がそれを拾う。

秘匿化なしでは同じウィットネスから3つの同一の金色蝋封コミットメントが生成され、攻撃者のレンズが一致する図と、独立した秘匿化のしずくにより3つの異なる封になり、攻撃者のレンズには候補の霧しか映らない図

固定されたウィットネスに対し、$\pi_A, \pi_B, \pi_C$ はそれぞれの群上で一様に分布する($\delta$ は一様で、$Z(\tau) \neq 0$)。候補ウィットネスから $\pi_A$ を再計算しようとした攻撃者には、もはやノイズしか見えない。曲線上の8点、5つのペアリングチェック、そしてウィットネスについての情報量は0ビットだ。

今後の展望

付録の ρ 修正と γ ゲートを組み込めば、いま導いた方式はPinocchio/BCTV14(2013–2014)になる。Zcashが2016年に最初のシールドプールに採用した構成だ。現代の改良はこのパターンをさらに先へ進めており、たとえば秘密決済の回路はおよそ10万制約から成り、その証明は数百バイトに収まる。zkEVMロールアップ、すなわちEthereumの実行を1つの証明にまとめるL2チェーンは、数千万の制約を集約しても、ラップ後はおおよそ同じサイズに収まる。6

第3回では2つの話題を取り上げる。1つ目は、現代のZK証明システムを形作った次の3つのプロトコルだ。Groth16はSNARK証明を3つのコミットメントと1つのペアリングチェックに縮め、PLONKは回路ごとのセットアップをユニバーサルなものに置き換えてzkVMの道を開く。STARKはSNARKの枠組みから完全に外れ、ペアリングをハッシュベースのコミットメントに置き換えることで、トラステッドセットアップを不要にし、耐量子セキュリティを獲得する。2つ目は、実運用のZKシステムが実際に何を証明しているかだ。Zcashのシールド送金、任意のプログラムを証明に変える汎用zkVM、検証可能なML推論、そしてZKアイデンティティシステムを取り上げる。


付録

付録は2つ。ρ($L_i, R_i, O_i$ 間の線形従属)と、論文表記でのリファレンスカードだ。

なぜ ρ が必要か

本文の β-チェックの議論は ${L_i, R_i, O_i}$ の線形独立性に依存していた。実際にはこの仮定は成り立たない。$N$ 個の変数と $d$ 個のゲートでは、$3N$ 個の変数ごとの多項式は $d$ 次元の空間に属するので、$3N > d$ となれば(ほとんどの回路がそうだ)線形関係が常態となる。

独立性が崩れると何が壊れるか。 β-チェックは次に簡約される。

$$\begin{aligned} &\sum_i (r_i - s_i) L_i(t) \\ &\quad + (r_i - s_i') R_i(t) \\ &\quad + (r_i - s_i'') O_i(t) \equiv 0 \end{aligned}$$

独立な場合、唯一の解は $s_i = s_i' = s_i'' = r_i$ で、ウィットネスは1つに定まる。従属していると非自明な解が現れる。整除性チェックは一部を弾くがすべては弾けず、両方のチェックを通過したものは、検証者が受け入れてしまう無効な証明になりうる。

ρ 修正。 2つの秘密スカラー $\rho_A$ と $\rho_B$ で3つの辺を異なる比率で倍する。各 $L_i$ は $\rho_A L_i$ に、各 $R_i$ は $\rho_B R_i$ に、各 $O_i$ は $\rho_A \rho_B O_i$ になる。コミットメントはこのタグを引き継ぐ。

$$\begin{aligned} \pi_A &= \rho_A L(\tau) \cdot G_1 \\ \pi_B &= \rho_B R(\tau) \cdot G_2 \\ \pi_C &= \rho_A \rho_B O(\tau) \cdot G_1 \end{aligned}$$

これらのタグで β-恒等式を書き直すと、

$$\begin{aligned} &\sum_i (r_i - s_i) \rho_A L_i(t) \\ &\quad + (r_i - s_i') \rho_B R_i(t) \\ &\quad + (r_i - s_i'') \rho_A \rho_B O_i(t) \equiv 0 \end{aligned}$$

となる。$\rho_A, \rho_B$ は秘密で代数的に独立なので、異なる ρ-単項式は互いに打ち消し合えない。各係数は別々に消えるしかなく、$r_i = s_i$($\rho_A$ から)、$r_i = s_i'$($\rho_B$ から)、$r_i = s_i''$($\rho_A \rho_B$ から)が強制される。単一のウィットネスが復活する。7

他のチェックは釣り合いを保つ。α-チェックは両辺が $\rho_A$ または $\rho_B$ で一様に倍されるので、KoE関係は依然として成立する。整除性チェックは両辺に共通の $\rho_A \rho_B$ 因子を拾う。CRSは $Z(\tau) \cdot G_2$ の代わりに $\rho_A \rho_B Z(\tau) \cdot G_2$ を公開し、その因子は打ち消し合う。

参考:論文表記によるBCTV14の完全仕様

論文では括弧記法 $[x]_j = x \cdot G_j$ を使い、変数ごとの多項式は $L_i, R_i, O_i$ ではなく $A_i, B_i, C_i$ と呼ぶ。ギリシャ文字スカラー($\alpha, \beta, \gamma, \rho, \delta, \tau$)は文献を通して名前を保つ。この付録では、その表記でプロトコル全体を再記述し、各部品を本文に対応づける。

ρ(前の付録)と γ が有効と仮定する。これらのもとでは、本文の式は ρ 因子を拾い(本文の $\pi_A$ は $\rho_A L_\text{秘密}(\tau) \cdot G_1$ になる)、β-チェックには γ によるゲートが入る。下の対応表は、この記事の表記を文献の表記に翻訳する。

表記の対応。 左の列がこの記事の表記、右の列がBCTV14、Groth16、その派生で目にするものだ。

この記事文献何を表すか
$L_i, R_i, O_i$$A_i, B_i, C_i$変数ごとの多項式
$L, R, O$$A, B, C$集約(ウィットネスで重み付け)多項式
$P(\tau) \cdot G_j$$[P(\tau)]_j$群 $j$ 上での $P$ へのコミットメント
$\pi_A$(秘密のみ)$[A_{\text{mid}}]_1$証明者のA側コミットメント
$\pi_B, \pi_C$$[B]_2, [C]_1$B側とC側のコミットメント
$\pi_A', \pi_B', \pi_C'$$[A'_{\text{mid}}]_1, [B']_1, [C']_1$α 倍された対応物(すべて $G_1$)
$\pi_K$$[K]_1$L, R, O 間でウィットネスを束ねる β-バンドル結合
$\pi_H$$[H]_1$商コミットメント
$L_\text{公開}(\tau) \cdot G_1$$\mathbf{vk}_x$検証者による公開入力の再構成
$\mathbf{s}$$\mathbf{a}$, $\mathbf{w}$(文献によって異なる)ウィットネス/割当ベクトル
$Z(\tau)$$Z(\tau)$, $t(\tau)$(文献によって異なる)$\tau$ におけるターゲット多項式

$\pi_B'$ について微妙な点が1つ。本文は簡潔さのために $\pi_B' = \alpha_B \pi_B \in G_2$ と書くが、BCTV14は $[B']_1$ を $G_1$ に置き、別のKoEペアを通じて検証する。両者は同じ α-倍率関係を確かめており、下のPK(プルービングキー)にはBCTV14の構成に必要な $G_1$ 要素が含まれる。

セットアップの秘密(セレモニー後に破棄):

  • $\tau$:隠された評価点
  • $\alpha_A, \alpha_B, \alpha_C$:KoE倍率
  • $\beta$:ウィットネス整合性のスカラー
  • $\gamma$:β-チェックのゲート8
  • $\rho_A, \rho_B$:L, R, O を区別してタグ付けし、β-恒等式中のファミリー間項が互いに打ち消し合えないようにする

証明者は証明ごとに新しい $\delta_L, \delta_R, \delta_O$ を選ぶ。

プルービングキー(証明者が使用):

  • $\tau$ の冪:$[\tau^k]_1, [\tau^k]_2$($k = 0, \ldots, d$)
  • 各秘密変数 $i$ について:
    • A側:$[\rho_A A_i(\tau)]_1, [\alpha_A \rho_A A_i(\tau)]_1$
    • B側:
      • $[\rho_B B_i(\tau)]_1$
      • $[\rho_B B_i(\tau)]_2$
      • $[\alpha_B \rho_B B_i(\tau)]_1$
    • C側:$[\rho_A \rho_B C_i(\tau)]_1, [\alpha_C \rho_A \rho_B C_i(\tau)]_1$
    • β-バンドル:$[\beta(\rho_A A_i(\tau) + \rho_B B_i(\tau) + \rho_A \rho_B C_i(\tau))]_1$

検証キー(検証者が使用):

  • $[1]_2$
  • $[\alpha_A]_2, [\alpha_B]_1, [\alpha_C]_2$
  • $[\gamma]_2, [\beta\gamma]_1, [\beta\gamma]_2$
  • $[\rho_A \rho_B Z(\tau)]_2$
  • 各公開変数 $i$(定数1に対応する $i = 0$ を含む)について:$\mathbf{vk}_{\text{IC},i} = [\rho_A A_i(\tau)]_1$。検証者は $\mathbf{vk}_x = \sum_{i \in \text{pub}} s_i \cdot \mathbf{vk}_{\text{IC},i}$ を作る。

証明(8つの群要素):

$$\begin{aligned} \pi = \big( &[A_{\text{mid}}]_1,\ [A'_{\text{mid}}]_1,\ [B]_2,\ [B']_1, \\ &[C]_1,\ [C']_1,\ [K]_1,\ [H]_1 \big) \end{aligned}$$

検証式(5つのペアリングチェック):

  1. A の α(KoE):$e([A'_{\text{mid}}]_1, [1]_2) = e([A_{\text{mid}}]_1, [\alpha_A]_2)$
  2. B の α(KoE):$e([B']_1, [1]_2) = e([\alpha_B]_1, [B]_2)$
  3. C の α(KoE):$e([C']_1, [1]_2) = e([C]_1, [\alpha_C]_2)$
  4. β-整合性(γ ゲート付き): $e([K]_1, [\gamma]_2) = e([A_{\text{mid}}]_1 + [C]_1, [\beta\gamma]_2) \cdot e([\beta\gamma]_1, [B]_2)$
  5. 整除性: $e(\mathbf{vk}_x + [A_{\text{mid}}]_1, [B]_2) = e([H]_1, [\rho_A \rho_B Z(\tau)]_2) \cdot e([C]_1, [1]_2)$

ZK秘匿化用の正確なCRS要素と公開入力のエンコーディングについては、libsnarkのリファレンス実装 r1cs_ppzksnark を参照。


  1. PinocchioとBCTV14は変数ごとの多項式を $A_i, B_i, C_i$ と書く。本記事では第1回および集約の $L, R, O$ との整合のため $L_i, R_i, O_i$ を用いる。

  2. KoEは標準的な離散対数の困難性を超えている。DLの困難性は「$\alpha G$ が与えられても $\alpha$ は見つからない」というもので、これは反証可能だ。つまり、誰でも試すことができる。KoEはより強い主張をする。証明者が正しく α 倍されたペア $(C, \alpha C)$ を返したときにはつねに、$C$ を構成するために証明者が用いた係数を回復できるアルゴリズム、すなわち抽出器extractor)が存在する、というものだ。これはアルゴリズムの存在に関する主張であり、計算量的な上界ではないので、いかなる実験でも反証できない。KoEが破れればSNARKも破れる。

  3. 多項式恒等式から双線形チェックへの導出を例で追う詳細は、Verkle記事の「ペアリングによる証明の検証」節を参照。

  4. 3つの辺すべてを分割すると、得るものを増やせないまま公開入力ごとのCRS点数が3倍になってしまう。

  5. 1つを使い回すのではなく、独立した3つのスカラーを使う。共有された $\delta$ ではコミットメント同士が相関してしまい、1つから $\delta$ を逆算して他のものを予測できてしまう。

  6. zkEVMはたいてい作業の大半をSTARK(高速、トラステッドセットアップ不要、証明は大きい)で証明し、そのSTARKの検証をGroth16回路の中で再証明する。「ラップ」は大きなSTARK証明をオンチェーンに乗る小さな証明へとたたみ込む処理だ。

  7. 単項ごとの恒等式は、3つのファミリー(すべての $i$ にわたる $L_i$、$R_i$、$O_i$)それぞれが内部で線形独立であることを要求する。ファミリー内部の従属(たとえば $L_i$ 同士)はあってもよいが、それが公開入力のインデックスを巻き込んだり、公開/秘密の境界をまたいだりするときだけ問題になる。これはQAPの構成が、本記事の範囲外の仕組みで排除している。

  8. γ は GGPR/Pinocchio から受け継いだ健全性還元に由来するCRS生成上の副産物であり、プロトコルレベルの防御ではない。詳しくは GGPR §5.3(EUROCRYPT 2013、ePrint 2012/215)を参照。ジェネリックグループモデルでは γ は厳密には不要だ(Gabizon 2019)。

この記事はClaudeと協力して執筆しました。