以前ペアリングが可能な楕円曲線を利用するコミットメントスキームであるKZGコミットメントについて書いた↓
techmedia-think.hatenablog.com
楕円曲線を利用したコミットメントスキームとしては、Pedersenコミットメントが有名だが、Pedersenコミットメントではコミットした値を開示する際、すべてのコミット値を開示する必要がある。それに対し、KZGコミットメントでは、コミットした値を部分的に開示することができる。↑の記事では簡単にしか書いてなかったので、今回はこの仕組みを実際に計算しながら理解していこう。
今回は4つの値をベクトルX = (135, 91, 81, 9)
にコミットするケースを考える。
Trusted Setup
KZGコミットメントでは、Trusted Setupにより秘密の値(シークレットパラメーター)s
を生成し、そこからおよび
を計算し、これらの値を共有する。そして
s
を廃棄する。s
は誰にも知られていてはならない。※G、Hなどの記述は↑の前回の記事内容を使用。
とりあえず、説明を簡単にするためs = 2で進める。※ ほんとはもっと巨大な数値。
今回4つの値にコミットするので、、
がセットアップパラメータとなる。
※ KZGコミットメントではこのTrusted Setupが発生する。このためかEthereumのVerkle Treeの実装では結局Pedersenコミットメントを採用するみたい。
コミットメントの作成
セットアップパラメータが決まったら、値をコミットする。KZGコミットメントでは、コミットするベクトル値から多項式p(x)を作る。この多項式は、ベクトルに含まれるすべての値に対して、
となるような多項式。
4つの値にコミットするので、今回は3次の多項式を作ることになる。そして、ベクトルの値から、p(0) = 135, p(1) = 91, p(2) = 81, p(3) = 9を満たす多項式になる。こういった多項式はラグランジュ補完を使って求めることができる。今回のケースだと、多項式は↓
となる。この多項式の各項の係数をとすると、多項式は以下のように表現できる。
そして、この係数と↑のセットアップパラメータを使ってコミットメントを計算する↓
↑の例で展開すると、
これはセットアップパラメータと多項式の係数
の内積であることが分かる。つまり、コミットメントCは
と等しい。
コミットメントの作成フェーズでは、コミットするベクトルを多項式に変換し、その多項式をセットアップパラメータを使って楕円曲線上の点にエンコードしている。なので、コミットする値が増えても、コミットメントのサイズは一定のまま。
プルーフの作成
↑でベクトルX = (135, 91, 81, 9)
についてのコミットメントCを作ったので、続いて、コミットした値を開示しよう。KZGコミットメントの場合、ベクトルXのすべての要素を開示する必要はなく、部分的に開示ができる。つまりX内の任意のについて開示が可能。
Xの内、を開示する。ここでは、
とする。ベクトルはコミットメントにより多項式に変換されているので、3番目のコミット値が81であることは、
(つまり、
)であることを証明すればいい。
ここで、新たに多項式q(x)を次のように定義する。
これは以下の多項式の性質を利用したもの:
↑によりについて、
が成立し、これを変形したものが↑
今回のケースだと、なので、
。
これらから、上記のようなが存在する場合、
は
で割り切れる。ということは、因数定理(多項式
が
で割り切れる場合、
が成立する)から、
、つまり
となる。
KZGプルーフは、このようなが存在し、この特性を証明するためのもの。
2022.06.30:q(x)の係数の誤りを指摘して頂いたので以下のq(x)の係数および次数を修正しました。
証明者は、多項式q(x)の各係数を計算する。この場合、q(x)の各係数は、
。
そして、この係数とセットアップパラメーターを使って以下のKZGプルーフを計算する。
今回のケースだと
これは、であることから、
であることが分かる。
コミットメントCが、プルーフ
が
という構成になっていることが分かる。2つとも未知のシークレットパラメータで評価された、異なる多項式。
検証
証明者は、y = p(2) = 81と上記のプルーフを一緒に検証者に渡す。検証者は、以下のペアリングの等価性について検証する。
つまり、
ここで、sHはセットアップパラメータの1つで定数、iHはHとiから計算できる。
↑の式は、であることから、以下のように変形できる。
の検証になる、つまり、ここで検証しているのは↑で説明したq(x)の存在とそれが満たす特性。
検証者は両多項式の各係数について知らなくても、この特性を確認することができる。この特性が確認できたということは、
つまり、
(3つめのコミット値は81)であることが検証されたことになる。
というのがKZGコミットメントで計算している内容。
ペアリング使うのは最後の検証部分のみ。最初ぱっと見た時は、Trusted Setupで生成するパラメータは、NUMSポイントとかを決定論的に生成して代替できないのか?とか思ったけど、↑のような多項式の性質使う上ではで構成されないと無理
よね。