見出し画像

PLONK

 今回は、ZK-SNARKの構成要素である「適切なIOP(Interactive Oracle Proof)」のうち、「PLONK」と呼ばれるプロトコルについて確認していきます。


回路のコンパイル

計算過程の整理

 PLONKでは、回路での計算の正当性を後から検証する用に、計算過程を記録していきます。
 例として、$${(x_1+x_2)(x_2+w_1)}$$を算術回路として表現する際に、どのように計算過程を記録するかをみていきます。

(x1+x2)(x2+w1)の算術回路とその過程の整理

 まずはこれまでの記事でも確認した通り、対象の式を要素に分解し、算術回路を作成します。そして過程の整理では、ゲートに着目し、ゲートに対して左からの入力値、右からの入力値、ゲートの出力の3つを記載していきます。

算術回路の過程の整理方法

 これをすべてのゲートに対して行い、算術回路の計算過程を整理します。

多項式での表現

 次に、上記で整理したものを多項式で表現することで、計算全体をエンコードします。
 まず、ゲートの数を$${|C|}$$、入力の総数を$${|I|}$$、回路のサイズを表す指標として$${d}$$、有限群$${H}$$を以下のように定義します。
・$${|C| := }$$回路Cに含まれるゲートの総数
・$${|I| := |I_x|+|I_w|=}$$回路Cに対する入力の総数
・$${d := 3|C|+|I|}$$
・$${H = \{1,w,w^2,…,w^{d-1}\}}$$
 次に、回路内の計算過程を整理したものを、以下のように多項式で表現すると仮定します。

入力値のエンコード方法
入力以外の要素のエンコード方法

これに則り、最初に整理した表を多項式で置換すると以下のようになります。

全ての値を多項式で置換

このようにして、計算過程を多項式で整理することができます。

コミットメントの妥当性の証明

ここまで確認したプロセスについて、全ての計算過程が正しく処理されているかを証明する必要があります。
具体的には、以下の4つを証明します。
(1)  入力値のエンコード
(2) ゲートでの計算
(3) ワイヤリング
(4) 最後のゲート出力が0である

(1) 入力値のエンコード

 ここでは、回路の入力値が正しくエンコードされていることを証明します。証明者と検証者は、回路の入力値をエンコードする多項式$${v(X) \in {\mathbb F}_p^{\le |I_x|}[X]}$$を作成し、回路の入力値が正しくコンパイルされているかを確認します。

入力値が正しくエンコードされていることの証明方法

この式は、$${P(y)-v(y)}$$という多項式がある有限体$${H_{inp}}$$上のすべての点で0となると読み替えることができるため、前回登場した「ゼロテスト」を行うことで$${P(X)}$$が正しく入力をエンコードしていることが確認できます。

(2) ゲートでの計算

 ここでは、各ゲートでの計算が正しく行われていることを証明します。
まず、セレクター多項式$${S(X) \in {\mathbb F}_p^{\le d}[X]}$$を用いて、各ゲートが加算か乗算かを表現します。

多項式を用いてゲートの種類を表現

次に、これらを用いて証明者は以下の式を計算することでゲートでの計算の正しさを証明します。

ゲートの計算の正しさを証明するための式

先ほどと同様に「ゼロテスト」を行うことで、各ゲートにおいて正しく計算がされていることが確認できます。

(3) ワイヤリング

 ここまで計算過程を整理してきましたが、ゲートに着目すると「前の段のゲートの出力」が「次の段のゲートの入力」になっていることがわかります。ここでは、この制約が成立していることを証明します。
 (1)の具体例で確認すると、以下のように立式できます。

ワイヤリングを具体例で確認

 ここで、値を回転させるような多項式$${W: H \to H}$$を定義します。
$${W(w^{-2}, w^1,w^3)=(w^1,w^3,w^{-2})}$$
$${W(w^{-1},w^0)=(w^0, w^{-1})}$$
これを用いると、ワイヤリングの証明は以下のように帰着できることがわかります。

ワイヤリングの証明式

 ただし、この多項式$${W:H\to H}$$は次数が$${d^2}$$になってしまい、証明にかかる計算量が2次時間になってしまいます。($${d}$$ : 有限群$${H}$$の位数)
 そこで、新しい関数$${L(Y,Z)}$$を導入し、前回登場した「積の確認(Prod-check)」を使用することで、線形時間での証明が実現します。

線形時間でのワイヤリング証明方法

 ここで登場する$${L_1(X)}$$と見てみると、分母と分子の違いは
分母:$${y・W(x)}$$
分子:$${y・x}$$
の部分であることがわかります。これは先ほど出てきた
$${P(y)-P(W(y))=0}$$ …(*)
徐算に落とし込むことで次数$${d}$$での計算に帰着させ、(*)が成立するときには商が1となることを確かめるためにProd-checkを使用しています。

式の次数の変化
L1(x)の中身

(4) 最後のゲート出力が0である

 これは主に(多項式)=0の形に帰着させることが多いため、最後のゲートの出力が0であることを以下の式で確かめます。
$${P(w^{3|C|-1}=0}$$

このように、(1)~(4)を全て証明することで、算術回路が正しくコンパイルされていることが保証されます。

最後に

 今回は、PLONKにおける算術回路のコンパイル過程について見てきました。前回確認したSum-checkやProd-checkが実際に使用されていたり、多項式を用いて表現した入力/出力を用いて証明するポイントでした。次回は、ここまで触れたPLONKで実際にどのような計算が行われているかを手計算で確認するので、ぜひチェックしてください!

[参照]

 この記事は、『ZK Hack Whiteboard Session1 Module3: Building a SNARK, pt2 by Dan Boneh』の動画をベースに、図や説明を加えたものです。
 ZK Hackとは、ZKに関するビデオやニュースレターの発信や、イベントを開催するコミュニティです。今回のビデオは、Stanford大学のDan Boneh教授によるSNARKの入門動画になります。


いいなと思ったら応援しよう!