ECDSAのアダプター署名とDLCへの応用

先日の読書会にて様々なScriptless Scriptの手法についての解説があり、中でも「Payment points without 2p-ECDSA or Schnorr」と呼ばれる手法とそのDLCへの活用事例が面白かったので、それについて復習も兼ねて紹介したいと思います。

ペイメントポイントについては以前の記事で解説しましたが、ライトニングネットワークのマルチホップペイメントではHTLCと呼ばれるコントラクトを使うことで複数ノードを中継してコインを送金しています。しかし、このHTLCでは中継ノード全員に同じシークレットが行き渡ってしまい、それにより送金経路が明らかになったり、中継ノードが結託することで攻撃ができてしまう欠点がありました。ペイメントポイントを使うことで、中継ノードそれぞれに個別のシークレット情報を渡すことが可能となり、プライバシー向上や攻撃への対処ができることを解説しました。このペイメントポイントはアダプター署名を使用していますが、シュノア署名の導入が必要であったり、既存のECDSAを使う場合でも2者間で暗号化した署名を交換しあう必要があり(これを2party ECDSA、2p-ECDSAと呼ぶ)、複雑になるという難点があります。

そこで登場したのが、2p-ECDSAやシュノア署名を使わずにアダプター署名(Scriptless Script)を実現する方法「Payment points without 2p-ECDSA or Schnorr」です。この手法はOP_CHECKMULTISIGを使うので、完全なScriptless Scriptではありませんが、既存のビットコインブロックチェーン上で実現ができます。そしてこの手法をDLCへ応用することで、従来のDLCで想定されていたトランザクションをシンプルにすることができます。以前の記事でDLCの実装ソフトNDLCについて紹介した時、なぜアダプター署名を使う必要があるのか疑問でしたが、その答えがまさにこれでした。

Payment points without 2p-ECDSA or Schnorr

アリスはボブが公開情報Tに対するシークレットtを公開すれば、1BTCを送金するという例をとって解説します。やりとりの流れは以下の通りです。

  1. お互いの公開鍵AとBを使い2 of 2マルチシグアドレス(P2SH)を作成し、そのアドレスへアリスが1BTCを送金する。
  2. アリスはボブの公開情報Tを使って公開鍵Aに対するアダプター署名を作成し、ボブへ渡す。
  3. ボブはtを使ってアダプター署名から公開鍵Aに対するECDSAの署名sAを復元し、自身の公開鍵Bに対する署名sBを作成する。そして署名sAとsBを使ってマルチシグアドレスのBTCを回収する。
  4. アリスは3でブロードキャストされたトランザクションを使うことでシークレットtを取得できる。

まずはECDSAの署名の計算式を思い出してみましょう。

ECDSAの署名

-----------------------------------

秘密鍵    k

公開鍵    P = k * G

メッセージ  m

ランダムな値 r

       R = r * G

-----------------------------------

計算式    s = (H(m) + R*k)/r

署名     (R, s)

上記フローの2番目では、アリスはボブの公開情報Tを使い、以下のアダプター署名②の計算をしています。

アリスのECDSA署名

sA = (H(m) + R*k)/r

アリスのアダプター署名

s' = (H(m) + R*t*k)/r ・・・①

   = (H(m) + r*T*k)/r ・・・②

アダプター署名の復号

sA = s'/t

①のtはボブのみが知るシークレットですが、そのtを知らなくても公開情報Tを使うことで、r*T = R*tの等式が成り立つことがポイントです。これは T= t*GとR=r*Gであることを思い出せば、以下の計算が成り立つのが分かりますね。

  r*T

=r*(t*G)

=(r*G)*t

=R*t

これでシークレットtを知らないアリスでも本来ボブしか作れなかったアダプター署名s'の作成ができるようになります。そしてボブがtを公開することで、アダプター署名を復号するかのように元のECDSAの署名sAへと復元することができるのです。

もともとアダプター署名はシークレットtを持つ人が作成するものでしたが、上記のトリックを使うことで、シークレットを知らなくてもアダプター署名が作成できるようになりました。そしてこのトリックがDLCにとって建て付けとなるのです。

DLCへの応用

アダプター署名はアトミックスワップなどに代表されるように、アリスとボブの2者間で公平にコインを交換するような場合が大半でした。従来のDLCも基本的には同じでオラクルが公開した情報をもとに、コインの送金先条件をCETとよばれるトランザクションで実行します。そのため、CETにはちょっとしたスクリプトを埋め込む必要がありました。しかし、上記のアダプター署名を作ることで、具体的にはアリスとオラクル間のアダプター署名、ボブとオラクル間のアダプター署名を作ることで、従来のCETで必要とされていたスクリプトを使用せずに、ロックされた資金をアリスまたはボブのアドレスへダイレクトに回収することができるようになります。

従来のトランザクション

  1. Funding Tx・・・両者の資金がロックされるTx
  2. CET・・・スクリプトが埋め込まれているTx
  3. ClosingTx・・・オラクルの結果よりCETのスクリプトを実行し資金を回収するTx

ECDSAのアダプター署名を使う場合、2つのトランザクション(Funding Tx, CET)で済みます。これはオラクルが予めコミットした署名Rをアダプター署名に使われる公開情報Tと見立てることで実現しています。

ECDSAのアダプター署名使用時のトランザクション

  1. Funding Tx・・・両者の資金がロックされるTx
  2. CET・・・アダプター署名によりダイレクトに資金を回収できるTx

ECDSAのアダプター署名を活用したDLCはとてもエレガントにトランザクションを実行できるので綺麗だなと思いました。

100