Boltzなどでの利用が広がり当たり前のような存在になった結果、本稿では何年も登場していないSubmarine Swapですが、そもそもSubmarine SwapってAtomic Swapとどう違うんだろう?という疑問をお持ちの読者も多いかと思います。

今日はSubmarine Swapについて、定義の違いを切り口にビットコインを使ったAtomic Swap系のプロトコルについてまとめてみました。また、Submarine Swapを使ったサービスとして代表的なBoltzですが、本当にトラストレスな仕組みになっているか検証してみます。

・Submarine Swapについてのおさらい

・Coinswapとは?

・Boltzって本当にトラストレスなの?確かめ方

Submarine Swapについてのおさらい

まず定義から始めると、従来からあるAtomic Swapとは異なるブロックチェーン間でオンチェーンのコインをトラストレスに交換するプロトコルです。ライトニングの送金にも使われるHTLCのような仕組みをつかって、例えばビットコイン↔ライトコインを交換するときに使えます。片方の取引がうまくいかなければもう片方の取引をキャンセルできるのがポイントです。

💡
この「両方とも成功するか、両方とも失敗する」性質をAtomicityというので、Atomic Swapと名がつきました。

他方、Submarine Swapとは入口または出口のどちらかがライトニングネットワークで、もう片方がオンチェーンであるAtomic Swapのことを言います。オンチェーンといっても、ビットコインのサイドチェーンやアルトコインのブロックチェーンの可能性だってあります。つまり技術的な差はほとんどありません。

厳密な定義だと、Submarine Swapは依頼者がライトニングインボイスを発行し、そのプリイメージでロックされたアドレスにBTCを送金し、その後取引相手がライトニング送金を完了するとプリイメージでロックされたBTCを受け取れるというものです。もしLNでの送金が失敗したら、依頼者は一定時間後にオンチェーンでBTCを回収することができます。

Reverse Submarine Swapでは依頼者がプリイメージを生成し、そのハッシュ値を取引相手に伝え、取引相手はそれを使ってライトニングインボイスを作ります。ユーザーはLNで送金しますが、取引相手はまだプリイメージを知らないので決済を保留します。取引相手は同じハッシュ値でロックされたアドレスにBTCを送金し、ユーザーがプリイメージを使ってそのBTCを回収すると取引相手はLN送金も受け取ることができます。

💡
どちらも仕組みはほぼ同じですが、依頼者が最初に送りつけるものがライトニングのインボイスなのか、ただのプリイメージなのかという違いがあります。また、Submarine Swapではもし取引相手がBTC送金した後にユーザーが取引をキャンセルすると、取引相手は手数料分損してしまいます。

ところで、例えばブロックチェーンやネットワークをまたがず、ビットコインブロックチェーン内でAtomic Swapを実行するとなんと呼ばれるのでしょうか?この場合はミキシングやAtomic Swapではなく、Coinswapと言います。

Coinswapとは?

Coinswapでは、ビットコインネットワーク上の異なるトランザクションでコインがHTLCなどのな仕組みを使って交換されます。

ミキシングの一種であるCoinjoinでは1つのトランザクション内で様々なコインの持ち主が入れ替わりますが、弱点としてトランザクションの特徴から明らかにCoinjoin(ミキシング)であるというわかってしまいます。取引所などはミキシングされたコインを受け取ってくれない場合があり、最悪アカウントを凍結してきます。

一方、Coinswapでは完全に別々のトランザクションでコインの所有権を入れ替えるため、それぞれの送金は通常の送金に見えます。(特にTaprootを使っていれば使用したScriptを公開しなくてよいため。)

まだ広く使われているとはいえませんが、Atomic Swapの仲間にプライバシー改善を目的としたものもあることは知っておいて損しないでしょう。

Boltzって本当にトラストレスなの?確かめ方

さて、今日の本題ですが、Boltzは本当にトラストレスなのでしょうか?

Boltz
Boltz is a Non-Custodial Bitcoin Bridge, Connecting Different Layers of Bitcoin.

先述した利用フローだと、ユーザー(依頼者)が先にインボイスやプリイメージを送りつける必要がありそうです。しかし、インボイスはともかく、LN→BTCにスワップする際にプリイメージを入力する欄なんてありません。自分のウォレットと接続するわけでもありません。どうやって必要な情報をやり取りしているのでしょうか?

実はBoltzのウェブアプリ(フロントエンド)がウォレットの一部の機能を持っており、必要な処理を行ってくれています。フロントエンド自体がオープンソースになっているので、トラストレス性を求める場合はこれを監査して実行すればよいというわけです。

また、おもしろい工夫として、Boltz利用時のオンチェーンのトランザクションはすべてTaprootのマルチシグによってユーザーとBoltzと協力すればプリイメージなどなしでもすぐにClaim TransactionあるいはRefund Transactionが出せるようになっています。(協力できない場合はHTLCのScript Pathを指定して使うことになります)

​したがって、例えばReverse Submarine Swapのときは、Boltzの視点だとユーザーにプリイメージを教えてもらったからといってオンチェーンでロックされている資金をHTLCを展開してユーザー(の指定した宛先)に送金する必要はなく、ユーザーの協力さえ得られればTaprootのマルチシグを使って普通に送金できるわけです。(確かに、依頼者も損するわけではないどころか、Boltz側に協力してあげたほうが長い目で見るとBoltzの利用コストが下がるメリットがありそうです)

通常のSubmarine Swapに関しても、BoltzはLN送金で得たプリイメージを使ってオンチェーンでHTLCを展開して資金を回収することもできますが、ウェブアプリで決済が確認できれば(Boltzが提出されたインボイスのプリイメージを持っていることをユーザーに示せれば)ユーザーと協力してマルチシグでBoltzへの支払いを完了させられます。こちらも同様、Boltz側にとってコスト削減になり、ユーザーも損しません。

💡
この「協力したほうがコストが安くなる」構造のミソは、各トランザクションのTaprootのKeyspend Pathがマルチシグになっている設計です。

このように、Boltzはフロントエンド内でユーザーとマルチシグを操作することで、プリイメージを入力したりという煩雑な手順をスキップしてシンプルな使用感のままトラストレス性を実現していました。こういう工夫は賢い上に協力のインセンティブになるため、個人的にとても好きです。