今回は、zk-SNARKs/STARKsなどゼロ知識証明系のプロトコルでよく登場するSumcheckプロトコルについて。
Sumcheckプロトコルは1992年に発表された多変数多項式を利用したプロトコル。多変数多項式は複数の変数で構成される多項式で、例えば2つの変数xとyで構成される2変数多項式であればのような式で、3変数多項式であれば
だったり。
n
個の変数で構成されるn
変数多項式をと表記する。
Sumcheckは、各変数に0か1を代入して多項式を評価し、すべての変数の組み合わせに対して評価した値の合計を効率的に検証するプロトコル。検証者は実際にすべての組み合わせで多項式を評価することなく、その合計値が正しいことを検証できるというもの。どうして変数に代入する値は0と1なのかといううと(実際には任意のセットを用いることもできるが)、多くの暗号や計算問題はブール値で定式化でき、計算も簡単になるため。
証明プロセス
証明者があるn
変数多項式のすべての変数の組み合わせの総和が
H
であることを証明したい場合(検証者は多項式については既知)、
① 証明者は、まずについて和を計算する1変数多項式
を送信する。これは、たとえば
n = 3
、という多項式の場合、
と
のすべての組み合わせに対して多項式を評価し、
その和を求めることを意味する。
② 証明者から1変数多項式を受け取った検証者は、その多項式を評価してその和を計算する。つまり
を計算し、それが証明者が主張する
n
変数多項式の和H
と等しいか検証する。上記の例だとのすべての組み合わせの和は、
で合計すると6。これに対し、は
となり一致する。結果が一致するということは、
が実際に
について和を取った多項式であることが、高い確率で確信できる。
③ 次に検証者は有限体からランダムな値
を選択し、それを証明者に送信する。
④ 証明者は、次にを計算するが、この時
には0と1ではなく検証者から受け取った
を代入する。そして計算結果の
を検証者に送信する。たとえば、
だとすると上記の例は、
で、その和を検証者に送信する。
⑤ 検証者は、が成立するか検証する。上記の例では
と
が一致するかどうかを検証する。
⑥ 検証が成功したら、検証者は再度を選択し、証明者に送信する。
⑦ 証明者は次にを計算するが、
はそれぞれ
を用いる。
とした場合、
。
これを合計n
回繰り返す。
⑧ 最終的に検証者はを選択し、
が成立するか検証する。
このようにSumcheckプロトコルは、証明者は各ステップで1つだけ変数を残して他の変数の組み合わせに対して和をとる1変数多項式を送信し、それを検証者に検証させ、最終的にn
個の変数を用いて元の多項式を評価させることで、の計算ではなくO(n)の計算で多項式の評価値の総和を検証できるようにしている。
Fiat-Shamir変換
上記は証明者と検証者の対話型のプロトコルになっているけど、Fiat-Shamir変換で非対話型にすることができる。証明者が最初の多項式を計算したら、
のハッシュ値を
とし、その次は
と計算していくことで非対話型にできる。
zk-SNARKs/STARKsなどでは、ある多項式の総和が0になることを検証する仕組みとしてこのSumcheckプロトコルを利用してるみたい。