サブマリンスワップとは?
はじめに
今回は2019年のおさらいを兼ねて一度は耳にしたことのある「サブマリンスワップ」についての話をしたいと思います。サブマリンスワップの話を始める前に、アトミックスワップについての簡単な概要から説明し、サブマリンスワップの概要から実際のコーディングや応用についてご紹介します。
アトミックスワップとは
コインの交換を2者間で行うことです。通常は、株式の売買でも仮想通貨の売買でも取引所が売り手と買い手の仲介役となり取引を行うことが一般的です。仲介役の役割は、売買相手をマッチングさせたり、取引の執行を確実に行うことです。例えば、アリスがビットコインを売って、ライトコインを買いたい場合を想定してみましょう。まずは、取引所がライトコインを売ってビットコインを買いたい相手ボブを見つけてくれます。そして双方がそれぞれのコインを取引所に預けます。双方がコインを送金したことを確認後、取引所はアリスへライトコインを、ボブへビットコインを送金します。これがザックリとしたコイン交換の1つの方法です。しかし、もし取引所なしでこの取引を実行しようとする場合、相手を信用する必要があります。例えば、アリスがボブへビットコインを送金したのにボブがライトコインを送金してくれない場合やその逆も然り。そのリスクを回避するために第3者として取引所が仲介してくれます。
しかし、取引所はその仲介役を買って出てくれる一方で、取引の数パーセントを手数料として取ることがあります。そこで、アリスとボブの2者間で取引をする場合、相手を信頼することなく完全に取引を実行するための方法をアトミックスワップと呼び、スマートコントラクトを使うことで可能になります。
サブマリンスワップとは
では、本ブログの本題のサブマリンスワップについてです。サブマリンスワップとは、オンチェーンの資金とオフチェーンの資金を交換する方法で、Alex Bosworthによってプロトタイプが開発されました。
アリスはライトニングネットワークを使いたいと考えますが、ライトコインしか持っていません。こんな時はサブマリンスワップの出番です。アリスがライトコインを資金としてライトニングネットワークへチャージすることはできませんが、ここでサブマリンスワップを提供してくれるボブがいたとします。まず、アリスは自身のライトニングネットワーク対応ウォレットから請求書(インボイス)を作成し、ボブへ渡します。次にボブはその請求書からあるスマートコントラクトを作成し、特別なライトコインアドレスを生成し、アリスへ渡します。アリスは、その特別なライトコインアドレスへコインを入金します。ボブは、その入金を確認後(この時点ではまだライトコインはまだボブのものではありません)、アリスからもらった請求書に対しライトニングペイで支払いをします(この時点でアリスの目的は達成されました:ライトニングに資金がチャージされました)。支払いが完了するとレシートが受理できます。このレシートが重要で、これを使うことで先に生成した特別なライトコインアドレスからコインを取り出すことができるのです。これでボブもライトコインを受け取ることができ、コインの交換が完了しました。
背面下では
ボブが作成したスマートコントラクトは下記のようになります。
if(hash(preimage) == invoiceId){
checkSig(presentedSig, sendtoPubkey)
}else if(height > refundHeight){
checkSig(presentedSig, refundPubkey)
}