Confidential Transactionなどの仕組みでは、送金額を秘匿するのに以下のようなPedersen commitmentを利用することが多い。
C = rG + vH
r:ブラインドファクター(ランダム値)v:秘匿する総金額G:楕円曲線のベースポイントH:誰もその離散対数を知らないNUMSポイント。
このように構成されたコミットメント同士は加算・減算ができるため、取引の中で送金額を秘匿したまま、金額が不正に増やされていないことを検証でき、さまざまな暗号通貨で採用されている。
ただその安全性は離散対数問題の困難性(ECDLP)に依存しているため、量子耐性を得るためには別の数学的安全性に基づく準同型コミットメントに移行する必要がある。
BDLOPコミットメント
量子耐性を持つ準同型コミットメントの設計は、格子暗号を用いるのが主流になっている。これは格子上の演算は自然に加法準同型性を持つから。そしてその1つが、格子ベースの準同型コミットメントスキームであるBDLOPコミットメント。
BDLOPコミットメントは、多項式環上で作業する。一般的に
n = 256、qは32bit前後の素数。
ランダムに生成された2つの行列を公開パラメーターとする:
:束縛用(Binding)
:秘匿用(Hiding)
この時、lはブラインドファクターrの次元、kはBinding部の出力次元、vはメッセージm(Pedersen commitmentのvに該当する部分)の次元。これらはPedersen commitmentのGやHのようなもので、一様にランダムに見える行列である必要がある。実際には公開シードなどからハッシュ関数などで行列の要素を生成するなど、決定論的に生成することになる。
実際のパラメーターは大きいけど、計算を追ってくのに以下のおもちゃのパラメーターで試してみる。
n = 2、q = 17とする。- 多項式環は
- 次元
l = 2 - 公開行列は以下の1×2の多項式の行列
コミット
値にコミットするには、まず小さな係数のブラインドファクターをランダムに選択する。小さいというのが格子ベース特有のポイントで、各係数は一様にランダムなものではなく、
{-1, 0, 1}や離散ガウス分布から選択した短いベクトルになる。
コミットメントはこのブラインドファクターを使って以下のように計算する。
上段のはブラインドファクター
rから計算され、値は含まれない。下段のは値を
というマスクで隠している部分になる。Pedersen commitmentのrG + vHに対応してる。Pedersen commitmentではGとHという2つの生成元を用いて隠していたのに対し、BDLOPでは行列
とブラインドファクターの乗算結果に対して値を直接加算する。
Pedersen commitmentでは「ECDLPの困難性」という単一の仮定がBindingとHidingの両方を担保していたけど、BDLOPではこの2つの性質をそれぞれ別々の格子問題に分離して帰着させている。
- Bindingは上段で担保される。Bindingは一度コミットした値を、後から別の値として開示できないという性質。仮に同じCに対して2通りの開示
(m, r),(m', r')を示せたとした場合、上段と下段の計算により、
が計算できることになる。ここで
rもr'も小さいベクトルなので、その差r - r'も小さいベクトルになる。つまり、に対する短いゼロ解を見つけたことになるけど、これはModule-SIS問題を解いたことに相当する。Module-SISが困難である限り、こうした2通りの開示は作れない。
- Hidingは下段で担保される。
は公開ランダム行列で、
rは小さな秘密のベクトル。この構造はModule-LWE問題そのものの構造になっており、Module-LWEが困難ならは一様にランダム値と識別できない。
このように1つのコミットメントの中で、Module-SIS(上段)とModule-LWE(下段)という2つの困難な問題を使い分けている。
簡単な例として金額v = 5をコミットしてみよう。前述したようにメッセージ多項式の定数項にこの金額を埋め込む。
ブラインドファクターrは、係数の小さな多項式ベクトルを選択する。たとえば、
各係数が{-1, 0, 1}に収まっているので「短いベクトル」の条件を満たしている。
の計算は、
となり、であることから
。また、
では
なので、
。
続いて、の計算は、
で、であることから
。
結果、コミットメントは、
このコミットメント内の の定数項
6を見ても金額が5であることは分からない。マスク の定数項 1 が乗っているので、5 + 1 = 6 になっているけど、
rを知らない人にとって、この1は完全にランダムに見える。
別の金額をコミット
別の金額v' = 3をコミットしてみよう。新しいブラインドファクターを
とする。さっきと同様の計算をすると、
となり、コミットメントは、
コミットメントの加算
2つのコミットメントを単純に加算すると、
これが本当に金額5 + 3 = 8のコミットメントになっているか検証する。
合算後のブラインドファクターは
合算後のメッセージは 。
これで、 が
のコミットメントになっているか計算すると、
となり、一致する。コミットメントの加算の結果、対応する金額の和に対するコミットメントが得られている。
無制限に加算できない
ただ、Pedersen commitmentと違って、無制限に足し合わせることはできない点に注意する必要がある。r + r'のノルムは元のrより大きくなり、これを繰り返すとrが小さいとは言えなくなってしまう。たとえば、r + r' = (2, -1 -x)の係数のノルムは既に2で、元のrの1より大きくなっている。そしてある閾値を超えると、Module-SISの短解性が崩れる。したがって、加算回数の上限を事前に見積もった上で、パラメーターを設計する必要がある。
コミットメントの開示
コミットメントを開示する場合は、mとrをそれぞれ開示することで、検証者は、以下をチェックする。
を計算して
と一致するか
が
と一致するか
rの係数が十分小さいか(ノルム上限βに対してrのノルム≦β)
サイズの課題
Pedersen commitmentの場合、コミットメントは楕円曲線上の点なのでsecp256k1などの曲線であれば33 byteのデータで表現できる。一方、BDLOPの場合は、これに比べるとコミットメントのサイズがとても大きくなる。
上記の金額5はわずか3 bitのデータであるものの、コミットメントは係数4個分(それぞれ の元)のデータになる。たとえば以下のような実用的なパラメーターの場合、
n = 256q ≈ 2^23l = 4k = 4v=1
コミットメントは、k + v = 5個のの元を持つことになり(上段
が k = 4 個、下段
が v = 1 個)、その1つあたりのサイズは、
の元は次数255までの多項式であり、係数が256個
- 各係数は
の元なので23 bit必要。
- 結果、
これが5個あるので、736×5=3680 byte(約3.6KB)。Pedersen commitmentの33 byteと比べると110倍。
さらに、実際には金額が負でないことを保証するために別途範囲証明が必要になり、これが現状数KB〜数十KBとされている。
まぁサイズの問題はあるものの、格子暗号ベースで量子耐性および準同型性のあるコミットメントスキーム自体は実現できる。