11月下旬にCrypto GarageがBitcoinメインネット上のライトニングチャネル内でDLCによる差金決済取引を初めて成功させました。これまでDLCはオンチェーンでDLCチャネルのようなものを開設するものでしたが、これからはライトニングチャネル内のオフチェーンで繰り返し取引できるようになっていくかもしれません。
今回はその仕組みについて説明します。
DLC (Discreet Log Contracts)とは
DLCとは第三者のオラクルが発表する結果について、取引当事者間でその結果に応じて公開される鍵によって資金を配分するトランザクションを持ち合うことでトラストレス・ノンカストディアル・プライベートにビットコイン上で差金決済取引を行うプロトコルです。ライトニングチャネルに似ており、協調的に決済された場合は存在したこと自体が観測できません。オラクルさえも取引の存在を知りません。
DLCについては過去にも解説しているので、いくつか記事を貼っておきます。

DLCチャネルとはライトニングチャネルのように2者間でDLCを繰り返し取引したり更新する場合などに有効な、オフチェーンでDLCを行う仕組みです。
ライトニングチャネルとDLCチャネルの併用
今回成功したライトニングチャネルとDLCチャネルの併用とは直接ライトニングチャネルで繋がっている相手を取引相手としたもので、ライトニングチャネルとDLCに合わせて入金し、その後もライトニングチャネルを決済しないままDLCを変更したり決済したりできるものです。
このアプローチの利点はオフチェーンでDLCを何回でも作成・更新・決済できることやライトニングチャネルの開設とまとめて行えることによる手数料節約、そして将来的にはライトニングチャネルを持っていればその相手とDLCが行えるという利便性にあります。
今回Crypto Garageはあえて強制決済を行ってトランザクションの中身を見せてくれましたが、ライトニングチャネルやオンチェーンDLCと同様、協調的な決済だとただのマルチシグへの入金と2者への出金にしか見えません。
STEP 1: マルチシグに入金
まずは最初のトランザクション、入金するためのトランザクションです。下図のトランザクションの0番目のアウトプットが2-of-2マルチシグでロックされていますす。1番目のアウトプットはただのお釣りです。

STEP 2: LNチャネルとDLCチャネルに分割する
さて、通常のライトニングチャネルであればファンディングアウトプットを使ってコミットメントトランザクションを作成し、これをオフチェーンで更新していくことで多数の送金や中継を行うことができます。今回はその前にLNチャネルで使う残高とDLCチャネルで使う残高を分けるトランザクションが入ります。これをSplitトランザクションと言います。
鋭い読者はなぜここで普通にライトニングチャネルのコミットメントトランザクションの出力にDLCに入金するアウトプットを追加せずに、あらかじめ別々のトランザクションに分けるのかが気になるかもしれません。それはライトニングチャネルで支払いや中継をする際にコミットメントトランザクションを作り直すたびにDLCの全ての可能な結果についてアダプタ署名を再計算しトランザクションを再生成するのが大変だからです。

さて、簡単に考えるとこのSplitトランザクションのアウトプットをライトニングのコミットメントトランザクションとDLCチャネルの2つの入力として利用できれば良いでしょう。どちらも通常は2-of-2マルチシグから始まります。
ところがここで問題が発生します。ライトニングのコミットメントトランザクションが利用するタイムロックが複雑なため、全く同じ仕組みで強制決済できるようにDLCチャネルを実装するのが手間なのです。
ライトニングではnSequence (ブロック高)とnLockTime (時間)という2つの値を使ってコミットメントトランザクションの世代番号を管理していて、DLCチャネル側でこれと同じ仕様を再現することは技術的には可能でも実装コストが高いそうです。
そこで、ライトニングチャネルとDLCチャネルの両方を同時に同じロジックで強制決済できるようにするために、Splitトランザクションのアウトプットをそれぞれ「協調閉鎖」「Aによる強制決済」「Bによる強制決済」で支払い可能にしています。つまり、ライトニングチャネルやDLCチャネルを更新するたびにこのSplitトランザクションを作り直すことで、相手が不正な強制決済を試みた際にSplitトランザクションのアウトプットを丸ごと押収できるようにしたのです。
その代わり、ライトニングのコミットメントトランザクションやDLCの実行トランザクションとの間にもう1つずつトランザクションを挟む必要が出てきます。
STEP 3: Glueトランザクションとライトニングチャネル
先程のスプリットトランザクションのアウトプットのうち、LN側にあるものをSpendして2-of-2マルチシグに入金するのがGlueトランザクションです。そこからは通常のライトニングチャネルと同様、この2-of-2マルチシグを入力とするコミットメントトランザクションを送金や中継のたびに更新していきます。これでライトニングチャネルは完成です。

開設当初100:0だったはずのチャネルバランスが決済時にはほぼ均等になっていることがわかります。

Step 4: BufferトランザクションとDLCチャネル
DLCチャネル側ではBufferトランザクションによってDLCチャネルの働きを実現します。
DLCチャネルではオフチェーンでDLCの更新や作り変えなどが行なえます。このためにはライトニングチャネル同様、古いトランザクション(この場合はコントラクト実行トランザクションCET)を取り消す仕組みが必要になります。しかし、CET自体にこの仕組みを導入しても、取り消す順番によっては新旧両方のCETが決済できてしまうユーザーが誕生してしまい、問題となります。
そこでBufferトランザクションはSplitトランザクションのDLC側のアウトプットを使ってSplitトランザクションと同様の取り消しスキームのある出力を作ります。これによって、もし取引相手が迅速にCETの取り消しを行ってくれない場合に新しいCETへとSpendするBufferコントラクトを配信することで古いCETの配信を防ぐことができます。
以下はBufferトランザクションです。1 in 1 outのシンプルなトランザクションだとわかります。

最後にBufferトランザクションを入力とするCETが配信されています。

ここまでの全てを図にすると以下のようになります。一番左のFund Transaction以外はオフチェーンで更新されていることを考えると、よくできているなと思います。

展望
今回ライトニングチャネルとDLCチャネルの並行運用が実現しましたが、現時点では取引相手はチャネルの相手に限られ、複数のライトニングチャネルをまたいだDLCは不可能です。今後期待されるPTLCの導入か、過去に紹介したDonnerと呼ばれるライトニング上の仮想チャネルの利用が必要になります。

しかしDonnerの場合はほぼスクラッチから実装する必要が出てくるので、おそらく複数のライトニングチャネルをまたいだRouted DLCsの実現はPTLCの導入後でしょう。
ライトニングウォレットが対応するのはまだまだ先になりそうですが、ライトニングチャネルを通してDLCが取引できることは様々なユースケースにつながります。例えばライトニングチャネルの金額のヘッジ取引、ノンカストディアルな取引所や賭場の運営、RGBやTaroとの組み合わせが実現すればより多様な分散取引にもつながります。
課題としてはある程度の複雑性があるため、開発者の対応には時間がかかるかもしれないという点が挙げられます。また、DLCの利便性を鑑みて高い確率で取引に応じてくれるマーケットメイカーとのチャネル開設が進むことでライトニングネットワーク自体もそのようなノードの影響力を受けやすくなるという恐れもあります。
いずれにしてもかなり面白い実証実験だったので、DLCはこれからも注目していきたい分野の1つです。
