コミットメントスキーム自体は、いろんなスキームがあり、さまざまなところで使われている(Confidential Transactionなどで登場するPedersen Commitmentや、ゼロ知識で範囲証明を提供するBulletproofsなど)。身近なところだと、ブロックチェーンでよく使用されるデータ構造の一種であるマークルツリーを使ったコミットメントなんかも。
例えば高さ4のマークルツリーには24個の要素を持つが、これは各要素のリストをベクトルとし、マークルルートをそのベクトルとベクトルコミットメントとして扱うことができる。このコミットメントにある要素が含まれているかどうかは、4個のハッシュ(マークルプルーフ)を使って証明することができる。
Kate(KZG) commitmentは、KateおよびZaverucha、Goldbergによって発表された多項式コミットメントスキームで(↑のマークルツリーを使ったコミットメントはベクトルコミットメント)、最近、Ethereumで現状のマークルツリーベースのステートプルーフを、よりコンパクトにするために多項式コミットメントの導入が検討されてることもあって注目されてる。今回はこのKate commitmentの仕組みについて見ていく。
多項式の性質
次数nの多項式は、と表現できる。この多項式にコミットするのが多項式コミットメント。多項式コミットメントの説明に入る前に、多項式の性質について。
- 多項式p(x)において、p(z) = 0になるようなzを多項式の根と呼ぶ。
- そして、p(x)を因数分解してp(x) = q(x)(x - z)となるようなq(x)が成立すると仮定し、そのq(x)の根が同じzである場合、zはp(x) = q'(x)(x - z)kとなる重複度kを持つ。
- 多項式p(x)を二項一次多項式(x - z)で割った余りはp(z)となるという多項式の剰余の定理から、p(a) = yとなる場合、p(x) = q(x)(x - a) + p(a)が成立する。
- 多項式a(x)を多項式b(x)で除算すると、商q(x)と剰余r(x)は、a(x) = q(x)b(x) + r(x)と定義することができる。
- n次の多項式は、多項式の代入値と結果のペア(x, y)がn + 1個あれば、ラグランジュ補完公式を使って多項式を復元することができる(シャミアの秘密分散などで使われてる)。
マークルツリーを使った多項式コミットメント
ちなみに、マークルツリーを使って多項式コミットメントを作るとどうなるか?ベクトルコミットメントの場合は、ベクトルの要素をリーフノードとして配置してマークルツリーを構成したけど、多項式コミットメントの場合は、n次の多項式であればリーフノードにn + 1個の各係数を配置すれば多項式にコミットしたことになる。
ただ、問題として証明者が多項式p(x)にコミットしていることを証明するためには、検証者に全ての係数を公開する必要がある。コミットメントのサイズ自体はマークルルートなので一定サイズだが、それを証明するプルーフのサイズは多項式の次数に比例する。
Kate commitment
Kate commitmentは、ペアリングが可能な楕円曲線を利用するコミットメントスキームで、多項式p(x)にコミットし、y = p(a)となるyとそれがコミットとした多項式にaを代入して得られた値であることを証明するプルーフを用いて多項式をデコミットする。特徴としては、コミットメントは1つの楕円曲線グループの要素で、プルーフも多項式の次数に関係なく1つの楕円曲線グループの要素となり、プルーフが一定サイズになる。
ペアリングが可能な楕円曲線
Kate commitmentは、ペアリングが可能な楕円曲線を必要とする。位数pの2つの楕円曲線をとし、とする。そして、GとHをそれぞれのジェネレーターとする。
ペアリングが可能ため、任意のについて、となる双線形性を持つ。
Trusted Setup
n次の多項式をコミットする場合、n + 1個*1のランダムシークレット(sとする)が必要になる。このランダムシークレットの値は誰にも知られない必要があるため、通常このTrusted SetupはMPCなどを用いて実行する必要がある。
ランダムシークレットsを使って、n + 1個のを計算する。
コミットメントの作成
n次の多項式のコミットメントはTrusted Setupで生成した各要素を使って、
を計算することで得られる。これは、Trusted Setupで生成した楕円曲線上の点を各次数にマッピングし、各次数の点に多項式の係数()を乗算(つまり楕円曲線のスカラー倍算)し、それらを合算(楕円曲線の点と点の加算)したものである。つまりコミットメントCも楕円曲線上の点で、サイズは固定だ。
任意の値での多項式の評価
コミットされた多項式p(x)について、x = a(y = p(a))で評価する場合、以下の多項式を計算する↓
続いて、この多項式q(x)について、
を計算する。は多項式q(x)の各係数で、はTrusted Setupで生成した要素。
コミットメントのデコミット
コミットした多項式p(x)について、証明者は、検証者に値y = p(a)と、↑のを提供することで、任意の値(x = a)でこのコミットメントを解くことができる。検証者は以下のペアリングの等価性を利用してこの関係を検証する。
これらは、ペアリングの双線形性から、
と変形でき、つまり、
の検証をしていることになる。
↑の多項式の剰余の定理を変形するとであることから、これが成立すれば、yがp(a)の値であることが分かる。
そしてシークレット値sは実際にそのまま扱うこと無く、(s - a)H = sH - aHの値として現れるだけで、あくまでTrusted Setupの出力値を使っての検証であって、sの値を検証者が知ることはない。
と、Kate commitmentを使用すると、多項式を満たすある値の正しさを↑のように一定サイズのプルーフ(↑の)で証明することが可能になる。
Ethereumでの検討
Kate commitmentは多項式コミットメントスキームだけど、Ethereumではこれをベクトルコミットメントとして利用しようとしている。長さnのベクトルにコミットするには、n-1次の多項式にコミットするよう構成することでベクトルコミットメントにすることができる。
現状のツリーベースのコミットをKate commitmentに置き換えることで、ベクトル内の要素の証明をベクトルの長さに依存しない一定サイズのプルーフで証明できるようにするというのが目的っぽい。このコミットメントスキームを組み込もうとしてるのがVerkle triesの提案みたい。