エスクローコントラクト
アリスとボブがある商品の売買を行う場合、お互いがインターネット上でたまたま出会っただけというのはよくあることです。アマゾンや楽天、ヤフーなどのECサイトでは、そのプラットフォーマーが仲介役をしてくれます。例えば、アリスがボブの商品を購入する場合、まずアリスは支払い金をプラットフォーマーへ預託します。そして、アリスが商品を受け取った後に、預託された支払い金がボブへと支払われます。この商取引をエスクローと呼び、信頼できる第三者を仲介することで安全に取引を行えます。
このエスクローはビットコインの2 of 3マルチシグを使うことでも可能なのはご存知でしょうか?以下にその手順を解説してみます。
- アリスとボブは契約を結びその契約内容をメッセージcとする。
- アリスとボブとエスクローの公開鍵を使って2 of 3マルチシグアドレスを作り、そのアドレスへアリスが支払い金をデポジットする。ここでエスクローの公開鍵には少し細工が施してある。それはアリスとボブの契約メッセージcとエスクローの公開鍵をEを使って次のような値を鍵とする。
エスクロー鍵E' = E + h(E | c) * G - ボブはデポジットされたことを確認後、商品を発送する。
- アリスは商品を受取り後、マルチシグから預託金を引き出すための署名を作りボブへ渡す。
- ボブはその署名と自分の署名を使いマルチシグに預託されたコインを回収する
- もしアリスが商品を受け取ったのに、署名をボブへ渡さなかった場合、ボブはエスクローへその報告をする。この時に、契約メッセージcを渡す。
- ここでエスクローは仲裁に入り、どちらの言い分が正しいかを判断する。もしボブの言い分が正しければ、エスクローは契約メッセージcからエスクロー鍵E'を計算してボブへ渡すことで、ボブはマルチシグに預託されたコインを回収できる。
- もしアリスの言い分が正しければ、何もせずに、預託されたコインは一定時間後にアリスのもとへ返金される。
- もしアリスが商品を受け取ったのに、署名をボブへ渡さなかった場合、ボブはエスクローへその報告をする。この時に、契約メッセージcを渡す。
さてこのエスクローですが、以前紹介したペイメントポイントを使うことで、ライトニングネットワーク上でも取引が可能となります。既存のHTLCでもマルチホップ経由なしという制約下では可能ですが、ペイメントポイントを使うことで、マルチホップしてのエスクロー取引が可能となります。以下にその手順を解説します(※手順の簡略化のため、ホップなしでの方法を記載しています)。
セットアップ
- アリスとボブは契約を結びその契約内容をメッセージcとする。
- ボブは秘密鍵sを生成し、その公開鍵Sをアリスへ渡す。
- アリスはメッセージcを使いエスクローとDH鍵交換*1をして、共通鍵b'とその公開鍵B'を生成する。さらに、そこからS'=S+B'を求める。このS'がエスクロー取引におけるペイメントポイントとなる。アリスはこのS'へ預託金をデポジットし、ボブへ渡す。
- ボブはS'へデポジットされたことを確認後、商品を発送する。
公開フェーズ(同意あり)
- アリスは商品を受取り後、秘密鍵b'をボブへ渡す。
- ボブはその鍵b'と自分の鍵sをS'へ預託されたコインを回収する。
公開フェーズ(同意なし)
- もしアリスが商品を受け取ったのに、鍵b'をボブへ渡さなかった場合、ボブはエスクローへその報告をする。この時に、契約メッセージcとアリスの公開鍵Aを渡す。
- ここでエスクローは仲裁に入り、契約内容からどちらの言い分が正しいかを判断する。もしボブの言い分が正しければ、エスクローはDH鍵交換で共通鍵b'を計算し、ボブへ渡すことで、ボブはS'に預託されたコインを回収できる。
- もしアリスの言い分が正しければ、何もせずに、預託されたコインは一定時間後にアリスのもとへ返金される。
*1 DH鍵交換:ディフィー・ヘルマン鍵交換は、事前の共有情報なしに、共通の秘密鍵を交換する仕組み
上記のポイントはアリスとエスクローがDH鍵交換で共通鍵を生成しているところです。もしアリスとボブの両者で取引の合意が得られれば、エスクローはDH鍵交換をする必要はなく(することもできない)、エスクローはどのような取引が行われたかは分かりません。両者の合意が得られなかった場合のみ、ボブはエスクローへ報告をします。エスクローがどちらが正しいかを判断し、ボブが正しいと判断した場合は、b'をボブへ渡すことで、ボブは預託金を回収することができます。
以上がペイメントポイントを使ったライトニング上でのエスクロー取引でした。
参考サイト
https://lists.linuxfoundation.org/pipermail/lightning-dev/2019-June/002028.html