Scaling Bitcoin 2018復習シリーズ。今回は10/7のThomas Eizinger(COMITプロトコル開発してる人みたい)が発表した「The State of Atomic Swaps」の内容について見てみる↓
書き起こしは↓
http://diyhpl.us/wiki/transcripts/scalingbitcoin/tokyo-2018/atomic-swaps/
Atomic Swap
Atomic Swapはチェーン間で相手を信用することなく、アトミックにコインを交換するのに使用されるプロトコル。一般的なプロトコルとしてはHTLCが利用される。
アリスがBitcoinを持ち、ボブがLitecoinを持っている状態でアリスとボブはそれぞれBitcoinとLitecoinを交換したい場合、以下のような手順で相手を信用することなく各チェーンのコインをアトミックに交換できる。
- アリスはシークレットAをランダムに選択し、そのハッシュ値H(A)をボブに伝える。
- アリスは自分のBitcoinを以下のいずれかの条件でアンロック可能なスクリプト宛に送金するトランザクションを作成しBitcoinネットワークにブロードキャストする。
- H(A)のプリイメージを提供すればボブの鍵でアンロック可能。
- 2日後アリスの鍵でアンロック可能
- ボブは自分のLitecoinを以下のいずれかの条件でアンロック可能なスクリプト宛に送金するトランザクションを作成しLitecoinネットワークにブロードキャストする。
- H(A)のプリイメージを提供すればアリスの鍵でアンロック可能。
- 1日後ボブの鍵でアンロック可能
- アリスはシークレットAを使って3のボブのLitecoinを入手するトランザクションを作成しLitecoinネットワークにブロードキャストする。
- ボブはLitecoinのブロックチェーン上で4のトランザクションを確認することでシークレットAの値がわかる。
- ボブはシークレットAの値を使って2のアリスのBitcoinを入手するトランザクションを作成しBitcoinネットワークにブロードキャストする。
このようにシークレットとそのハッシュ値、タイムロックの仕組みを使って相手を信用することなくコインを交換するHTLCプロトコルが構成できる。
これを上記のようなBitcoin Scriptを使うことなく、署名技術を使って実現するScriptless Scriptというアプローチもある。
HTLCを使ったスワップの不公平
上記のようなHTLCを使ったAtomic Swapには1点、不公平な部分がある。
シークレットを生成した側のアリスには、シークレットを公開しない=HTLCをセットアップしたけど交換はしないというアドバンテージがある。この場合、タイムロックの期間が過ぎるとコインは自分の元に戻ってくる。コインの交換レートに合意して、両方のチェーン上でHTLCにコインをロックした後に、市場の取引レートが劇的に変わると、アリスはセットアップ時のレートで取引したくなくなり、HTLCを実行することなくタイムロックを待ち払い戻しを選択する可能性がある。この場合、取引相手のボブも払い戻し用のトランザクションを発行する。ボブにとっては、最初に合意したレートでのコインの交換ができず、セットアップと払い出し用の2つのトランザクションの手数料を負担しただけになる。
Atomic Swapプロトコルの修正
↑の不公平な状態を解消するため、Atomic Swapプロトコルにペナルティを導入する。重要なのは正しく罰することで、上記のケースではシークレットを公開しなかったアリスを罰することになる。アリスが正しい行動をしなかった場合=シークレットを公開しなかった場合に、アリスから担保を奪うようにする。
公正なAtomic Swap リビジョン1
リビジョン1で導入するのは、2つめのHTLCもしくは条件付き支払いを追加する。これはアリスがBitcoin上でボブに支払う代わりに、Litecoinのチェーン上に資金を償還した際に戻ってくる担保を作る。
担保設計
担保は条件付き支払いで、支払いパスが逆なだけで、他のHTLCで使われているのと同じプリイメージとハッシュを使用する。シークレットが明らかになった場合、その資金はアリスが手にし、タイムアウト後はボブが資金を入手できる。アリスがタイムロックを経過するまだ待っていたら、この担保はボブに渡る。これによりアリスがボブにプリイメージを明らかにするインセンティブができる。
ただ今度はアリスからボブへのトラストが発生する。アリスが2つめの担保用のHTLCトランザクションをブロックチェーンにブロードキャスト後、ボブがHTLCトランザクションを発行せずアリスの担保用のHTLCのタイムアウトまで待つと、ボブは何もせずにアリスの担保分のコインを入手できてしまう。そのためこれは理想的なプロトコルではない。
公正なAtomic Swap リビジョン2
上記問題を解消するには、ボブがAtomic Swapの条件にコミットしていない状態にある時、アリスの担保は正しくアリスに戻ってくるようにする必要がある。そのためにアリスの担保とボブのHTLCの2つを以下のように1トランザクションで構成する。
- アリスはBitcoinをボブに支払うHTLCトランザクションを作成しブロードキャストする。
- アリスは自身の担保を入れたLitecoin用の担保トランザクションを構成する。アリスの担保をインプットとし、アウトプットの量は「ボブがアリスに支払うLitecoinの量」+ 「アリスの担保分のLitecoin」。
- 2で作成した担保トランザクションにアリスの署名を付与し、ボブに渡す。
- ボブは受け取った担保トランザクションのインプットに自分の資金をセットし、署名を付与しブロードキャストする。
トランザクションがLitecoinのネットワークにブロードキャストされると、アリスは担保があるためそれを手に入れるインセンティブが発生する。アリスがLitecoinを入手すると、ボブはBitcoinを入手するのに必要なシークレットが手に入る。
アリスがシークレットを明らかにせず、タイムアウト期間を過ぎると、HTLCの条件からボブは自分のLitecoinとアリスの担保分Litecoinを手にする。
3の後に4でボブがトランザクションをブロードキャストする前までであれば、アリスは担保トランザクションのインプットにセットしたUTXOを別のトランザクションで使用すればキャンセルが可能。なので3の後にボブから応答がない場合はアリスはAtomic Swapをキャンセルして担保金を取り戻せる。
プライバシー
上記のような公平なAtomic Swapプロトコルが考案したのでプライバシーについて考える。Atomic Swapをプライベートにする方法としてはScriptless Scriptを利用する方法がある。Scriptless Scriptはシークレットとハッシュ値を署名技術にエンコードできるのでチェーン上で他のトランザクションと区別がつかなくなる。
セットアップ
アリスとボブはそれぞれ鍵ペア(アリス:xa、ボブ:xb)を持ち、アリスだけ別にシークレット tを用意する。アリスはボブの秘密鍵とtを含むアドレスを計算する。このアドレスはボブの公開鍵とtG
を加算した楕円曲線上の点をアドレスとしてエンコードすることで計算できる。ボブは資金を償還するのに2人の秘密鍵を必要とするマルチシグにLitecoinをロックする。この段階でアリスはボブの秘密鍵を知らないので、アリスがロックされた資金をアンロックできない。ボブはボブでシークレットtを知らないのでボブも資金をアンロックできない。ということでアリスもボブもこの段階ではどちらも資金をアンロックできない。
コインのアンロック
- ボブはLitecoin側のマルチシグにロックされているコインをアンロックするのに必要なAdaptor Signatureを作成する。これはコインをアンロックするのに必要な署名の一部で、これを完全な署名にするには、アリスが署名に
t
の値を含めるようにしないといけないよう設計されてる。 - アリスはボブの部分署名を完成させ、litecoinを入手するために必要な完全な署名を得る。これによりアリスの
t
は明らかになる。そしてボブがt
を知り、t
を自分の秘密鍵に加算してBitcoinをアンロックする署名を作成することができる。
Adaptor Signature使った署名のエンコード方法の詳細は触れられていないが、初期にAndrew Poelstraが発表したプロトコルは両方のチェーンでマルチシグにコインをロックするタイプだったので↓、そのアプローチとは異なるアプローチになってる。確かにt
が分かればアンロック可能であれば、片側のロック条件はマルチシグじゃなくて良い。
techmedia-think.hatenablog.com
重要なのはこの仕組みがHTLCと同じ特性を持っているということ。アリスは最初に彼女だけが知っているシークレットを持ち、その値を明らかにすることなくボブの資金を手にすることはできない。また開始前にお互いにnLocktime付きのトランザクションに署名しておくことで、両者は資金を取り戻すことができる。
公正なAtomic Swapという意味でや↑のトランザクションは担保が無い。その点については特に言及されてないけど、担保を付与する場合は、おそらくLitecoin側のトランザクションにはアリスの担保分のインプットが追加され、マルチシグにロックされる。そしてnLocktime付きのトランザクションでタイムアウト後、その取り分がボブに全部いくよう設計しておくようなパターンになると思われる。