Crypto Life

Tech in X

ブロックチェーンを中心にテクノロジーや東南アジアのスタートアップ情報を提供

Layer2解説 第2回 アトミックスワップ

前回、マイクロペイメントチャネルについて解説記事を書きました。通常の順序で行くと、次の記事はライトニングネットワークになりますが、ここではいったん寄り道をしてアトミックスワップ(atomic swap)を先にご紹介したいと思います。

cryptocoin.hatenablog.com


というのも、マイクロペイメントチャネルとアトミックスワップの仕組みは似ており、マイクロペイメントチャネルを理解していると、アトミックスワップの話がスムーズに頭に入ってくるからです。また、アトミックスワップで使われる手法はライトニングネットワークでも利用されていることから、先にアトミックスワップを理解することでライトニングネットワークの理解が容易になります。

そもそもアトミックスワップとは?

アトミックスワップとは、異なるチェーン(コイン)間でコイン交換を実現する方法です。通常、コインの交換(例えばBitcoinとLitecoinの交換)には取引所が使われますが、その場合には取引所を信頼する必要があります。例えばBitcoinからLItecoinに交換したいときに、Bitcoinを取引所に預けた後でその取引所がBitcoinを持ち逃げすると、一時的であっても預けていたBitcoinが取引所に奪われてしまいます。


また、「Bitcoinを持つAlice」と「Litecoinを持つBob」との間で相対でコイン交換をしようとしても、AliceがBitcoinをBobに渡した後で、BobがAliceにLitecoinを渡さずに逃げてしまう可能性があります。当然逆もしかりで、先にBobがAliceにLitecoinを渡したとしても、Aliceが受け取ったLitecoinを持ち逃げしてしまうおそれがあります。


この問題に対応するべく、P2P取引所のひとつであるBitsqureでは「仲介人」という仕組みを利用しています。例えば、当事者間で認識齟齬、紛争が発生した場合には、仲介人の判断で送金の実施、キャンセルができるようになっています(2 of 3マルチシグを利用)。しかし、この手法は仲介人の判断に依存しており、真にトラストレスということはできません。

注目が高まる分散型オープンソース・エクスチェンジ「Bitsquare」とは | ビットコインの最新情報 BTCN|ビットコインニュース
Bisq - The decentralized Bitcoin exchange


アトミックスワップは第三者を介さず、なおかつトラストレスにコインの交換を行うことができるため、これらの問題を解決することができます。

アトミックスワップ理解のための前提 スクリプト

「Bitcoinを送金する」とよく言いますが、実際には、Transaction Outputを送金先の人にロックすると言ったほうが今後の話を理解しやすくなります。


例えば、「AliceがBobにBitcoinを送金したい」場合、AliceはトランザクションのOutputにBobだけが解読できる情報を記載します。これで、このTransaction Outputは、誰もが使えるわけではなく、Bobに"ロック"されている状態になります。BobはBobが持っている秘密の情報を利用してトランザクションのInputに署名することで、そのTransaction Outputを利用することができるようになります。このOutputには、上記例のように「Bobだけが解読できる情報」を埋め込むこともできますし、「AliceとBobの2人が揃わないと解読できない情報(マルチシグ、2 of 2)」のような複雑な条件も埋め込むことができます。


また、このスクリプトはチューリング完全ではないものの、一種のプログラム言語として動作するので、単純な条件分岐処理を埋め込むこともできます(詳しくは、OP_IFで検索してみてください)。


スクリプトについてはこちらにまとめています
cryptocoin.hatenablog.com

アトミックスワップの仕組み

前回同様、マルチシグとタイムロックが登場します。また、先にマイクロペイメントの仕組みを理解した方が理解が早いと思うので、まだ前回の記事をお読みでない方は先にそちらを読むことをオススメします。

cryptocoin.hatenablog.com

基本的な流れ

基本的な流れは以下の通りです。

  1. AliceがBobにBitcoinを渡すトランザクションを作成する。但し、このトランザクションを使用するにはBobの署名と、Aliceが持つ秘密情報 (X)が必要 (BTC Pay Transaction)
  2. BobがAliceにLItecoinを渡すトランザクションを作成する。但し、このトランザクションを使用するにはAliceの署名と、Aliceが持つ秘密情報 (X) が必要 (LTC Pay Transaction)
  3. LTC Pay TransactionをAliceが使用して、AliceはLItecoinを手にいれる。このとき、Aliceの持つ秘密情報 (X) もブロードキャストされる
  4. BTC Pay TransactionをBobが使用して、BobはBitcoinを手にいれる


勘の良い方はお気づきかもしれませんが、秘密情報(X)がアトミックスワップの実現のために重要な鍵となります。それでは順をおって、処理の流れを見ていきましょう。

1. AliceがBobにBitcoinを渡すトランザクションを作成する (BTC Pay Transaction)

Aliceは、BobにBitcoinを渡すトランザクションを作成します。正確に言うと、Aliceは、以下の情報のいずれかがないと解読できないTransaction Outputを作成します。


BTC Pay Transactionの利用条件
1) BobとAliceの両方の署名(マルチシグ、2 of 2)
2) Bobの署名とAliceだけが知るXという情報


f:id:steinith310:20170514232212p:plain


利用条件2)で登場したXは、Aliceが任意に選ぶことができる乱数です。AliceはこのXを公開せずに、手元にとっておきます。最終的にこのXという情報をBobが署名とともにブロードキャストすると、BobはこのTransaction Outputを利用することができます。


以下の引用は、具体的なTransaction Outputの例になります。以下のスクリプトの6行目 (OP_HASH160から始まる行)のように、Xにハッシュをかけた値 (H(x))を、Transaction Outputに埋め込んでおきます。このトランザクションを利用したいBobは自分の署名とともにXをTransaction Inputに埋め込みます。もし、Xにハッシュをかけた値がH(x)となれば、Bobはこのトランザクションを利用できるということになります。

OP_IF
// Refund for A
2 <pubkeyAlice> <pubkeyBob> 2 OP_CHECKMULTISIGVERIFY
OP_ELSE
// Ordinary claim for B
OP_HASH160 <H(x)> OP_EQUAL <pubkeyBob> OP_CHECKSIGVERIFY
OP_ENDIF

Alt chains and atomic transfers


さて、このトランザクションをマイクロペイメントでいう「Deposit」としてブロードキャストするわけですが、Bobが失踪してもAliceがDepositした金額を回収できるように、ブロードキャストの前にRefund Transactionを作成する必要があります。もちろん、AliceがDepositしたBitcoinをすぐには引き出せないように、Refund TransactionにはTimeLockをかけておきます。


Refund TransactionにAliceとBobが署名することで、BTC Pay Transactionの利用条件1)を満たしますので、もしBTC Pay Transactionが利用されずにTimeLock期限が到来したら、AliceはいつでもこのDepositした金額を回収することができます。


f:id:steinith310:20170514222349p:plain

2. BobがAliceにLitecoinを渡すトランザクションを作成する (LTC Pay Transaction)

続いて先ほどとは逆に、BobがAliceにLitecoinを渡すトランザクションを作成します。手順1. とほぼ同じことを実施するのですが、一点だけ注意が必要です。それは、Bobがトランザクションを作成する際にも、BTC Pay Transactionで利用したのと同じH(x)を条件式に利用することです。

OP_IF
// Refund for A
2 <pubkeyAlice> <pubkeyBob> 2 OP_CHECKMULTISIGVERIFY
OP_ELSE
// Ordinary claim for B
OP_HASH160 <H(x)> OP_EQUAL <pubkeyAliceb> OP_CHECKSIGVERIFY
OP_ENDIF


ハッシュ関数は一方向関数であり、元の数字からハッシュ値を導くことは容易にできますが、ハッシュ値から元の数字を導くことは(ほぼ)不可能です。つまり、H(x)からXを導くことはできませんから、Aliceは安心してH(x)をBobに伝えることができます。


f:id:steinith310:20170514222725p:plain

3. LTC Pay TransactionをAliceが使用する

1.で見た通り、AliceはXという値を知っています。そのためAliceは、LTC Pay Transactionを即座に利用可能です。


f:id:steinith310:20170514223520p:plain

4. BTC Pay TransactionをBobが使用する

3.でAliceがLTC Pay Transactionを使用するまで、BobはBTC Pay Transactionを使用することはできませんでした。しかし、3.でAliceがLTC Pay Transactionを使用したことで、BobはXの値を知ることができたので、BobもBTC Pay Transactionを使用することができます。


f:id:steinith310:20170514223641p:plain


以上の通り、AliceとBobはお互いを信頼することなく(トラストレスに)、お互いが持っていたBTCとLTCを交換することができました。

まとめ

マルチシグとXという秘密情報を導入することで、二者間でトラストレスに通貨の交換ができました。今回登場したXという秘密情報を利用するアイデアは、最近話題のライトニングネットワークでも鍵となる考え方です。


ライトニングネットワークの場合は第三者を中継してBitcoinを送金するため、途中でBitcoinを中継者に持ち逃げされてしまうおそれがあります。Xという秘密情報を導入することで、最終的な受取人にBitcoinが渡った後でないと、中継者はBitcoinを受け取れないという仕組みにしています。詳細は次回!