ベースの考え方であるLSAGについて整理したので↓
techmedia-think.hatenablog.com
本丸のDLSAGとDLSAGを利用したPayment Channelの仕組みについて見ていく。
https://eprint.iacr.org/2019/595.pdf
Moneroの課題
- BitcoinがBitcoin ScriptをEthereumがSolidityなどで記述可能なコントラクトを記述出来るのに対し、Moneroにはそういったスクリプト機能が無く、コインをある秘密鍵宛に送信者を匿名化し、量を秘匿して送ることができるだけである。BitcoinやEthereumのようにどんな条件にコインがロックされ、ただどんな条件でアンロックされるのかという情報がオンチェーン上に記録され、これがFungibilityを損なう要因にもなりうる。これに対しホワイトペーパーでは、スクリプトを導入することなく、Fungibilityを担保し、インターオペラビリティを向上する仕組みを提案している。
- BitcoinやEthereumなどのパブリックチェーンと同様、スケーラビリティの課題を抱えている。Moneroのブロックは2分毎に作成されるが、リング署名の仕組みによりBitcoinなどと比べてどうしてもトランザクションサイズが大きくなり、スケーラビリティの課題はBitcoinよりも深刻と言える。ホワイトペーパーでは、このスケーラビリティに課題に対して既にBitcoinでは実現されているが、Payment Channel Networkを利用したオフチェーンスケーリングを提案している。
上記のMoneroにおけるトランザクションの表現力の欠如とスケーラビリティという2つの問題を解決するために提案されているのが新しいリング署名方式=Dual Linkable Spontaneous Anonymous Group Signature for Ad Hoc Groups (DLSAG)だ。
Dual-Key LSAG
現在のMoneroのトランザクションはインプットとアウトプットを持ち、その両者はで定義される。pkは新しい公開鍵で、COM(γ)はコインの量γへの暗号学的コミットメントを示し、はγが範囲内の値であることを証明する範囲証明を表す。トランザクションインプットは、デコイを持つため1インプットあたり複数のタプルを持つ。トランザクションアウトプットは、1アウトプットあたり1つのタプルを持つ。
これに対し、Dual-Key LSAGでは、と定義される新しいdual-key タプルフォーマットがベースになる。このタプルには(それぞれ異なるユーザーの公開鍵である)2つの公開鍵が含まれ、フラグtに応じて使用できる。このDual-Keyタプルは現在のMoneroのタプルと比べて以下の点が異なる。
- このタプルのコインを使用する可能性がある2人のユーザーを識別するため1つではなく2つの公開鍵が含まれる。
- 公開鍵間のスイッチを示す(例えば
t
がMoneroのブロックチェーン内の現在のブロック高より小さい場合にはが使われる等)追加の要素t
が含まれる。
Dual-Keyタプルフォーマットにより、払い戻し用トランザクションを作るためのロジックをエンコードできるようになる。
シグナルt
がを使わなければならいことを示す場合、アリスはとをそれぞれ含む2つの公開鍵のセットを選択し、公開鍵に対応する秘密鍵でリンク可能なリング署名を生成する。
逆にt
がを使用する必要があると示す場合、ボブはこれまでと同じ方法でリングを選択し、でリング署名を作ることでアウトプットを使用できる。
もちろん1人のユーザーが2つの公開鍵に対応する各秘密鍵を持っているのであれば、tの値に関係なくこの1人でそのDual-Keyタプルを使用できる。
Dual-Keyのリンク可能なリング署名
↑のDual-Keyのサポートにあたって必要になるのは、新しいリンク可能なリング署名の設計で、以下の課題がある。
キーイメージの仕組み
Moneroの現在のリング署名スキームでは、単一の公開鍵から構成されるキーイメージを公開することで、Linkabilityを実現している。例えばアリスはを使って署名する際は、合わせてキーイメージを公開する(ℍは曲線上の点を出力するハッシュ関数)。アリスが二重使用しようとして再度で署名しようとすると、同じキーイメージが計算され、ブロックチェーン上で既に使用済みであることを検出できる。
Dual-Keyで同様のLinkabilityをサポートする際の課題は、公開鍵のペアを一意に識別し、署名鍵の内1つだけで計算できる単一のキーイメージを定義する方法だ。
このホワイトペーパーでは、キーイメージをDual-Keyタプルの2つの公開鍵を使ってDiffie-Hellmanの鍵交換を使い、共有鍵を導出する方法提案している。つまりとして再定義している。これは以下の要件を満たす:
- の知識でを計算できる。
- が成り立つので、を一意に識別できる。
キーイメージのLinkabilityの強化
↑の新しいキーイメージの定義は公開鍵のペアのリンクを可能にする。ただし、キーイメージを公開鍵のペアに一意になるだけでなく、それらを含むアウトプットも一意にするのが重要だ。そうしないと、ユーザーの1人が、同じ公開鍵のペアを使って別のDual-Keyタプルを作成し、それ(およびそのキーイメージ)を使って署名を作成すると、Moneroでは同じキーイメージは二度と使えないので、元々のタプルのコインは使用不可能になってしまう。
署名スキームの安全性とプライバシーの保証を損なうこと無く、各アウトプットに一意の識別子を追加することでこれを軽減できる。例えば、Moneroでは全てのアウトプットを、そのアウトプットが含まれるトランザクションとアウトプットのインデックスで構成する値で識別できる。
そのため、DLSAGで使われているリングを一意のトリプルで構成されていると見なし、Dualキーイメージをと定義する。jはリング内の本当の署名の位置を表す[1, n]の値。
以上を踏まえた、新しいDLSAG署名スキームは以下のようになる。
二者がそれぞれ保持する鍵ペアをとする。 そのDual-Keyタプルのコインがロックされたトランザクションアウトプットの識別子をm
とする。
DLSAGの署名生成
Dual-Keyにロックされたコインを使用するトランザクションを作成し、そのインプットにはデコイと実際に使用するDual-Keyのタプルのリストがセットされている。
- n個ほどランダムな値をサンプリングする。
- 実際に使用する鍵と、その公開鍵とペアになる公会鍵を使ってキーイメージを計算する。ここでは公開鍵に対応する秘密鍵。
- および、を計算する。
- について以下の計算をする。
- となるようなを計算する。
- 結果、計算したが署名となる。
ホワイトペーパーに合わせたので若干前回のブログと表記は違うが、基本的な署名の仕組みはLSAGと大きく変わっておらず、キーイメージおよび、キーイメージを計算に使っているRの計算式が異なるのと、どの公開鍵によるアンロックなのか示すbが署名に追加される。
DLSAGの署名検証
検証者は以下の手順で検証する。
- について以下を計算する。
- 算出したがと一致すれば有効な署名。
これも基本的にLSAGの仕組みと大きく変わらない。
Moneroへの適用について
Dual Outputはもちろん現在のMoneroではサポートされないが、ハードフォークでMoneroに導入可能。現在の署名方式ととDLSAGを組み合わせたトランザクションを構成することが可能で、この混合トランザクションの場合、トランザクションは各インプット毎に通常にLSAGと、Dual-Key形式のDLSAGの署名が含まれる。どちらの形式でも公開鍵の数が異なり、Dual-Keyの場合追加のフィールド(フラグt)がある。このため、コミットメントおよび範囲証明に関する操作や検証についてはDLSAGとなっても互換性が残る。
Fungibility
2種類のアウトプット形式を共存させるとFungibilityが低下する可能性がある。例えばマイナーは選択したアウトプット形式によっては特定のトランザクションのマイニングを拒否するかもしれない。これを軽減するためには、シングルキーの場合も自分の鍵をもう1つ追加してDual-Key形式のトランザクションにするという方法がある。
タイムロック処理の拡張
Dual-Keyタプルにはフラグtが含まれており、このフラグはMoneroではブロック高として実装されると思われる。公開鍵のペアが与えられた場合、はブロックtがマイニングされる前に使うことができ、ブロックtがマイニングされた後はで使用できるようになる。
最近の論文に記載されているMoneroへの攻撃において、不明瞭だが、異なるtの値が敵対者にプライバシーを侵害する十分な情報を漏らす可能性がある(例えばtが現在に近い場合リングの1つめの鍵が使われる可能性が高いなど)。このため、この研究では、区別できないタイムアウトを持てるようにするタムロック処理スキームの拡張を提案している。このスキームは、Dual-KeyタプルフォーマットとDLSAG署名スキームの拡張として追加されたもので、MoneroのFungibilityを維持するのに役立つ。
提案されているタイムロック処理スキームは、tを平文のまま含めるのではなく、tの値へのPedersen Commitmentをその範囲証明と一緒に含めるというもの。tが有効期限切れになっていないかは以下のように証明できる。
- t < t' < Tとなるようなt'を選択する。Tはトランザクションをマイニングする必要があるブロックの高さ。
- 続いて、Pedersen Commitmentの準同型性を利用してコミットメント COM(t' - t) = COM(t') - COM(t)を計算する。
- t' - tが[0, 2k]の範囲あることを証明するために、範囲証明を計算する。
- Pedersenタプルはタイムロックtが期限切れになっていないことを証明する。
この仕組みにより、ユーザーはtの実際の値を隠す任意の値t'を選択できる。MoneroはすでにPedersen Commitmentとその範囲証明をサポートしているので、この機能はシームレスにMoneroに追加できる。
以上がDLSAGの大枠。次回はDLSAGを利用してPayment Channel Networkを構成する方法について見ていきたい。