techmedia-think.hatenablog.com
↑でBulletproofsの基本となる内積の証明の仕組みについて書いたので、今回はこれがCTやMimblewimbleなどで必要とされるrange proofにどう適用されるのか見ていく。
range proofとは?
CTと同様Mimblewimbleなどでもコインの量を秘匿するのに以下のような楕円曲線を利用したPedersen Commitmentが採用されている。
C = xG + aH
x
はBlinding Factor(MWでは秘密鍵に該当)で、a
がコインの量。コインの量をこのようなコミットメントC
にすることで、外部からa
の値を分からなくしている。具体的な仕組みが知りたい場合は、以前撮影したMWのGBEC動画を参照↓
このようなPedersen Commitmentを使ってコインの量を秘匿する場合には、コインの量a
が決められた正の範囲(0〜264など)にありマイナスやオーバーフローをしていないことを証明する(マイナスやオーバーフローしているとコインのインフレーション(生成)が可能になる)range proofが必要になる。
CTの初期の提案では、このrange proofにBorromean Ring Signatureを使用するものになっていた。ただしこの証明のサイズの大きさ(数百バイトのTxに対してrange proofのサイズが2.xKBなど)がCT導入のハードルとなっていた。この問題を解消するために提案されたのがBulletproofだ。
Bulletproofを利用したrange proof
Bulletproofを利用したrange proofプロトコルを表す図が↓
ぱっと見ても???なので、具体的にどういうことをやっているのか見ていこう。
range proofの内積表現
図の左上にあるように、range proofで証明したいのはある値v
が0 ≦ v < 2nの範囲内にあること。例えばn = 4
で、v = 5
の場合、5がの範囲内にあることを証明する。
証明者は最初にランダムな値γ
を選択し、値v
へのコミットメントを作成する(CTやMWのアウトプットに相当)。
vがある範囲内にあることを証明する場合、図の左上の2番めの枠のようにv
は以下の2つのベクトルの内積として表現することができる。
- vのビット表現。v = 5の場合はというベクトル
- 2nのベクトル。つまりというベクトル
この2つのベクトルの内積は、になる。(n = 4
で、v = 5
の場合、)
このような内積を使った表現をした場合、証明するステートメントは↓
- 2つのベクトルの内積が値
v
であること()。 - のベクトルの各値が0か1であること。の各要素から1を引いたベクトルをとすると、この2つのベクトルの各要素を乗算した結果のベクトルの要素は全て0になること。また、。
これが図の左上の部分。
ステートメントの結合とBlinding Factorを使った内積のブラインド
続いて、↑の1と2のステートメントをチャレンジスカラーを使って結合し、Blinding Factorを追加する。
- まずその前に、証明者がを直接公開しては意味がないので(値を公表することになる)、range proofを作成する証明者は、↑の実質
v
の値を指す へのコミットするVector Commitmentを作成する。このVector Commitment Aはランダムな値αを選択し、を計算することで作られる。 - さらに、2つのブラインドベクトルを選択し、同様にランダムな値
p
を選択してへコミットするVector Commitment を計算する。 - 証明者は、検証者にこのAとSを送信する。
- AとSを受け取った検証者はチャレンジとしてランダムな値
y
とz
を選択し、証明者に送る。
この検証者が選択したy
を使って、 内積<0n, yn> = 0であるため、上記の1と2のステートメントは暗黙的に以下のように表現できる。
さらに検証者が選択したz
を使って、上記3つのステートメントを1つのステートメントに結合できる↓
このステートメントをより単純な項を持つように分割し、再配置する↓
右辺を結合するため、両辺にを加算し、単純化すると↓
そこから内積以外の秘密の値でない項を以下のように定義すると↓
(この値は検証者が提供したyとzを使って簡単に計算できる。)これを適用した最終的なステートメントは、
となる。この式の右辺の内積は、左の要素にを持ち、右の要素にを持つ。そしてこの式の各パーツを以下のように定義する。
ただこの段階ではl(x)とr(x)はブラインドされていない。つまり、このステートメントを証明する際にl(x)とr(x)の情報をそのまま送るとv
の値が検証者に分かってしまうので、↑で選択したブラインドファクターを使用して、l(x)とr(x)を以下のようなブラインド多項式にする。
がそれぞれに置き換わっただけ。とはxの多項式として表現した場合の式で、はxの多項式の次数0の項を、は次数1の項をそれぞれ表している。ここでブラインドファクターに対してのみx
が乗算されているため、がブラインドされていない内積の左右の要素となる。つまり、
である。このような式変形をすると以下のような多項式表現ができる↓
この多項式の各項()はKaratsuba法を使うと以下のように表現できる↓
ここでであるので、証明者が検証者にアンブラインドした内積の式が成立することを証明するためには、t(x)の定数項がであることと、t(x)が正しい多項式であることを証明すればいい。
ここまでが図の真ん中上部の緑の枠の部分(長かった。。)。
の正しさの証明
続いて、↑のであることを証明する。
まず証明者はt(x)の係数へのコミットメントを作成し、チャレンジポイントx
を使って多項式を評価することで、コミットメントが正しいt(x)へのコミットメントであることを検証者に証明する。
値v
に対するコミットメントVは既に作ってあり、それがへのコミットメントにもなるので、新たにへのコミットメントを作成し、検証者に送信する。この時には以下の関係がある。
t(x)をPedersen Commitmentにマッピングするのに、点Bを使用してまず値へのコミットメントを作る。
続いて、別の点を使ってブラインドファクターとなる部分を作る。
ここではそれぞれのブラインドファクター。そしてとを加算してt(x)のPedersen Commitmentが作成できる↓
なので検証者に送るはブラインドファクターを含んでいる。
検証者にt(x)がであることを納得させるために、証明者はを検証者に開示する。そして検証者は、以下が成立するか検証する。
上記が成立すると、検証者はであることを納得する。
これが図の右上の部分。
t(x)が正しい多項式であることの証明
続いてt(x)が正しい多項式であること、つまりt(x) = <l(x), r(x)>であることを証明する。
証明者は既に、↑ですでにへのコミットメントとを検証者と共有している。そしてAは以下のように表現できる。
ここで、とするとl(x)とGの内積は
となり、r(x)とH'の内積は
となる。l(x), r(x)とコミットメントA、Sを関連付けるには、を使って以下を計算すると、↓
となり、これは
つまり
になる。これが合成ブラインドファクターe
を持つl(x)とr(x)へのVector Pedersen Commitmentとなる。ここまでが図の右下の部分。証明者が検証者にe
を送ることでこのコミットメントを計算することができる。
↑の式は要素の数n
のベクトルになるので、内積の証明と同様、ベクトルの要素が1つのスカラー値になるまで圧縮する。ここが図の中央の部分。
そしてとt(x) = <l(x), r(x)>の関係が成立するかどうかを検証するために、Pとt(x)を入力して冒頭のBulleptproofsの内積の証明を利用する。この関係性が証明できれば結果的にrange proofの証明になる。