以前、Andrew PoelstraがBitcoinスクリプトを書くことなくスマートコントラクトを実現するScriptless Scriptsについて紹介されていたが、これはいずれもSchnorr署名を必要とする仕組みだった。現在のBitcoinのプロトコルでサポートしているのはECDSAのみであるため、当然ながらSchnorrを必要とするScriptless Scriptsは現在のBitcoinでは使えない。ただ、Scriptless Script以外にもSchnorr署名の鍵や署名の集約機能によりトランザクションサイズを削減したり、さまざまなコントラクトへ応用が効くことからSchnorrの導入をしようという流れではある。
そんな中、先日LightningのMLにScriptless ScriptをSchnorrの代わりにECDSAを使って行う方法がポストされた。
[Lightning-dev] Scriptless Scripts with ECDSA
ホワイトペーパー「Scriptless Scripts with ECDSA」も添付されてる↓
このECDSAでScriptless Scriptを実現するためにベースとなったのが、イスラエルのバル=イラン大学のYehuda Lindellが2017年に公開した以下のホワイトペーパーだ。
https://eprint.iacr.org/2017/552.pdf
この内容について「Scriptless Scripts with ECDSA」のペーパーで簡単に説明されてたので見てみる(本家のは長かったので時間ができたら読む)。
ECDSA署名について
まずECDSAの署名方式について。アリスが秘密鍵 x とそれに対応する公開鍵 を持ち、その鍵を使ってメッセージ m に署名したい場合、アリスはメッセージ m に対して以下のように署名を計算する。
- ランダム値 k を選択する。
- を計算する。
- 計算したRの点をとし、とする。つまりrは点Rのx座標。
- 署名を計算する。ここでLSBは最下位bitの関数を表し、Hはハッシュ関数を表す。
- 署名の出力は(r, s)
効率的な二者間のECDSAプロトコル
ECDSAの主な課題の1つは効率的な2-of-2の署名プロトコルを設計することだった。最近Yehuda Lindellがこのプロトコルの効率的な構成ついて論文を発表した。ECDSAベースのScriptless Scriptsの提案はLindellのプロトコルの延長にあたるので、ここでそれについて説明する。より詳細な説明とセキュリティ分析についてオリジナルの論文を読むことを勧める。
アリスは公開鍵とナンスを、ボブは公開鍵とナンスをそれぞれ持つ。最後にアリスはボブにckey = Enc (x1)を提供する。これはアリスのみが解読可能なx1のPaillier暗号だ。このアリスとボブの2-of-2のマルチシグは以下のように動作する。
- アリスとボブは、P1、P2、R1、R2とm'について合意する。ここでm'はLSB(H(m))。また、アリスとボブは安全のためP1、P2、R1、R2についてその秘密鍵を確かに持っていことを証明するための非対話型のゼロ知識を追加で交換する必要がある。これはこの後で提案されるプロトコルにおいても同様の基本的な手順として組み込まれているが、読みやすさを優先して省略する。
- アリスはを計算し、ボブはを計算する。それぞれ計算したRから同じx座標を計算することができる。
- ボブはとを計算する。ここでは巨大な乱数を表し、qは暗号操作中に使用される剰余を表す。続いてボブはを計算する。このはPaillier暗号の加法準同型演算を表す。 したがって
となる。は言わば、ボブからのpre-signatureを暗号化したものになる。最後にボブはアリスにを送る。
4.アリスはを復号して、s'を得る。続いてを計算し、(r, s)をECDSA署名のアウトプットとする。
悪意あるボブはプロトコルから逸脱して任意の値を暗号化する可能性があるが、アリスはペア(r, s)が公開鍵Qのもとで有効なECDSA署名であることを検証することで、ボブが正しく振る舞ったかどうか判断することができる。正しくない場合アリスはプロトコルを中止することができる。
というのがホワイトペーパーに記載されている内容で、マルチシグスクリプトを構成することなくマルチシグ的なことができるようになってる。この二者間のECDSAプロトコルをベースにしているのがECDSA版のScriptless Scripts。(スクリプトレスなマルチシグという意味では↑もScriptless Scriptsと言えるだろう。)
途中で急にk1
、k2
が出てきてるけど、これは単なる書き間違いでr1
、r2
のことを指してるんだと思う。
ポイント
基本的にはECDSAの署名形式に沿ってないといけないので、アリスとボブによる署名データは乱数kから生成した点Rのx座標と、で計算される(r, s)
のペアである必要がある。
通常は1人で作る署名だけど、2つの鍵を使った2-of-2のマルチシグ的な用途のECDSA署名を↑のプロトコルで可能にしているポイントは以下の2つだと思う。
Rの計算
↑のプロトコルではまず署名に使用する点R
の算出方法が変わっていて、アリスがランダムに生成した点R1
とボブがランダムに生成した点R2
をそれぞれ共有し、その点に自分の点の秘密鍵を乗算して新しい点を計算している。アリスの場合はk1 * R2
、ボブの場合はk2 * R1
。こうして出来た点R
は同じ点を指す。
この点をECDSAの署名に使う場合、計算した点R
のx座標が署名データの1つのr
になり、s
を計算する際は、 となる。
秘密鍵を使ったsの計算
もう1つのポイントは、署名データを計算する際の秘密鍵x
の部分だけど、ここがアリスの秘密鍵x1
とボブの秘密鍵x2
をそれぞれ使って計算するようになるので、結果的にs
は、になる。
当然両者が自分の持つ秘密鍵x1
とx2
を明らかにすることはないので、お互い相手の秘密鍵を知らないままs
を計算するために、加法準同型性のあるPaillier暗号を使ってるんだと思う。
アリスはPaillier暗号の鍵ペアを生成し、公開鍵をボブに送っておく。自分の秘密鍵x1
を公開鍵を使って暗号化しボブに送る(これがckey
)。その後ボブは送ってもらったアリスの公開鍵を使って↑c1
を計算し暗号化する。さらにckey
を使ってc2
を計算し、Pailier暗号の加法特性を利用してc3
を導出し、アリスに送る。アリスはPaillier暗号の自分の秘密鍵を使ってc3
を復号すると、
が手に入るので、それにを掛けると
とお互いの秘密鍵x1
、x2
を使って計算されたどこかてみた形のs
が入手できるようになるっぽい(は最終的にmod qして消える)。いやー、よく考えるなー。
個人的に の意図がイマイチよく分かってないのと、セキュリティ周りなどちゃんと確認するにはオリジナルのホワイトペーパーの方読んだ方が良いんだろうなー。
参考
Pailier暗号については↓のサイトが分かりやすかった。