アダプター署名をもう一度理解する
異なるブロックチェーン間でのコイン交換は、ブロックチェーン業界にとっては欠かせないものです。例えば、イーサリアム上のトークンを購入したいけど、ビットコインしか持っていなかった場合、そのビットコインをイーサリアムへ交換しなければなりません。取引所を使えば簡単にできますが、もしあなたが真のブロックチェーン狂信者であれば、中央集権な取引所ではなく、分散化された取引所で相対取引をしたいと考えることでしょう。相対取引で大事なのは相手を信頼することなく、仲介者を介さずにコインの交換を公平に行うことです。この実現方法の1つとしてアトミックスワップという仕組みが存在します。アトミックスワップではHTLCとよばれるスクリプトを使う方法が以前から提案されていました(HTLCとはHash and TimeLock Contractの略名です)。また、以前書いた記事「ビットコインとイーサリアムの相互運用性」では実際に稼動しているアトミックスワップサービスをもとにその仕組みについて解説しています。
アダプター署名は、アトミックスワップによるコイン交換をHTLCのようなスクリプトを使わずに実現するための技術で、scriptless scriptと呼ばれたりします。またこのアダプター署名・scriptless scriptは、Schnorr署名を使った方法と楕円曲線DSAを使った方法のどちらでも実現可能です。今回はSchnoor署名を使ってアダプター署名を作り、クロスチェーン間でのコイン交換をする方法について見ていきます。
HTLCによるアトミックスワップ
以下では、アリスとボブが1BTCと10LTCを交換する例をもとに解説します。
- アリスはシークレットとそのハッシュ値を生成し、そのハッシュ値とボブのアドレスからHTLCというコントラクトを作り、そこへ1BTCを送金する(図の契約Tx : 1BTC)。ボブがこのBTCを回収するにはシークレットが必要
- ボブはアリスが生成したハッシュ値とアリスのアドレスからコントラクトを作り、そこへ10LTC送金する(図の契約Tx : 10LTC)。
- アリスはシークレットを使い、10LTCが送金されたコントラクトからコインを回収する。この時点でシークレットはブロックチェーン上で公開される。
- ボブはそのシークレットを使い1BTCを回収する。
このようにアトミックスワップではシークレットとそのハッシュ値を使うことで、お互いが資金の持ち逃げすることなくコインの交換をすることが可能となります。
アダプター署名によるアトミックスワップ
では次にアダプター署名によるアトミックスワプを見ていきますが、まず最初にシュノア署名のおさらいです。シュノア署名は以下のような入力をもとに計算を行い、その出力を署名としていました。
シュノア署名
-----------------------------------
秘密鍵 a
公開鍵 A = a * G
メッセージ m
ランダムな値 k
R = k * G
-----------------------------------
計算 s = k + Hash(R, m)*a
署名 (R, s)
ではアダプター署名を見てみましょう。
アダプター署名
-----------------------------------
秘密鍵 a
公開鍵 A = a * G
メッセージ m
ランダムな値 k
R = k * G
ランダムな値 t
T = t * G
-----------------------------------
計算 s' = k + t + Hash(R, m)*a
s'
署名 (R, s', T)
上記をみると t が加わっているのが分かります。この t がHTLCで使われたシークレットの役割を代替しています。この t はアダプター署名からシュノア署名を引き算することで求めることができます。
t = s' - s
この原理を使うと、先にみたHTLCによるアトミックスワップへの代替ができそうですね。以下にその手順を解説します。
- アリスとボブはマルチシグPとP'を作り、それぞれコインをデポジットする。
- アリスはシークレット t を生成し、2つのアダプター署名を生成する。
- ボブはP'に必要な署名sB'を作りアリスへ渡す。
- アリスは署名sB'を使って署名s'を作り、P'のコインを回収する。
- ボブは署名s'を使ってシークレット t を求め、そこから署名sを作り、Pのコインを回収する。
まとめ
アダプター署名はシュノア署名にシークレットを追加したもので、そのシークレットを得るにはアダプター署名とシュノア署名の引き算をすることで求めることがわかりました。この原理を使って、HTLCで使われたシークレットの代替とすることで、HTLCというスクリプトを使わずにコインの交換ができるのがアダプター署名・scriptless scriptでした。
t=sB'+sA'-s'
これはつまりシークレットtを含んた集約署名から集約署名を引き算するとシークレットtが得られるってことかな。
tが分かれば
sA+sB-t
これでPでロックされたボブの1BTCをアンロックできる集約署名sが出来て無事にボブがビットコインを得る、って感じ。