HTLCの仕様がBIPとして登録されてたので見てみる↓
bips/bip-0199.mediawiki at master · bitcoin/bips · GitHub
概要
Hashed Time-Locked Contract (HTLC) は、あるユーザー間(売り手と買い手)の決済を行うコントラクトで、売り手がハッシュのプリイメージを公開することで資金を入手することを可能にし、買い手が指定期間内に売り手がプリイメージを公開せずタイムアウトになった際に、資金を取り戻すことを可能にするスクリプトである。
このスクリプトは以下のような形式になる
OP_IF [HASHOP] <digest> OP_EQUALVERIFY OP_DUP OP_HASH160 <seller pubkey hash> OP_ELSE <num> [TIMEOUTOP] OP_DROP OP_DUP OP_HASH160 <buyer pubkey hash> OP_ENDIF OP_EQUALVERIFY OP_CHECKSIG
[HASHOP]にセットするopcodeは、OP_SHA256
かOP_HASH160
のどちらか。
[TIMEOUTOP]にセットするopcodeは、OP_CHECKSEQUENCEVERIFY
かOP_CHECKLOCKTIMEVERIFY
のどちらか。
HTLCの流れ
- ビクター(買い手)とペギー(売り手)は、お互いに公開鍵を交換し、タイムアウトの閾値に合意する。続いてペギーはビクターにハッシュダイジェストを提供する。この段階で、両者はHTLCのスクリプトを構築し、そのP2SHアドレスを生成することができる。
- ビクターはそのP2SHアドレスに資金を送る。
- ビクターが送った資金は以下のいずれかで入手できる
ビクターは、べギーがプリイメージを公開しない場合、資金がロックされている時間を減らすためタイムアウトを短く設定したい。逆にペギーの方は、タイムアウトの閾値によって資金の入手できないといったリスクを減らすためタイムアウトを長く設定したい。
動機
多くのオフチェーンプロトコルでは、シークレットの開示が決済メカニズムの一部として使われている。HTLCのトランザクションは、回収前であればシークレットを公開することで確実に資金を入手でき、非協力的な取引相手から資金を回収する仕組みと合わせて、ブロックチェーンを介してシークレットとお金を交換する安全で安価な方法である。
Lightning Network
Lightning Networkでは、HTLCスクリプトを使ってペイメントチャネル間のアトミックスワップを実現している。
アリスはシークレットKを生成し、そのハッシュLを生成する。アリスはそのLのプリイメージ対するHTLCの支払いをボブに送る。ボブは同じプリイメージと金額へのHTLC支払いをキャロルに送る。アリスがプリイメージKをリリースした場合のみ価値の交換が発生する。シークレットは各ホップ毎に明らかになるので、全ての当事者の取引が補償される。いずれかの当事者が取引に非協力的になった場合は、払い戻し条件によって処理を中止することができる。
この辺の仕組みの話は↓の方が分かりやすいと思う
techmedia-think.hatenablog.com
ゼロ知識の条件付き支払い
ハッシュのプリイメージが期待する情報を導出することを保証するために使用されるさまざまな実験的なゼロ知識証明システムが存在する。一例として、ゼロ知識証明が、ハッシュのプリイメージが暗号化された数独パズルの解の復号鍵として機能することを証明するために利用されていたりする。(プロトコルの具体例は、pay-to-sudokuを参照)
HTLCトランザクションは、そのような復号鍵をリスク無しにお金と交換することができ、ゼロ知識証明で必要となる大規模で高価な検証トランザクションを必要としない。
実装
Bitcoin CoreでこのHTLCをサポートするプルリク↓が出てる。
所感
- HTLC自体は以前からある仕組みで今回のBIPで特に新しい概念や機能が加わったものではない。
- 今回のはBIP化というより、Bitcoin CoreがHTLCをサポートすることが目的かな?
- Lightning Networkはホワイトペーパーではハッシュのプリイメージの交換だったけど、現状はRevocation Keyという公開鍵を使う方式になってるのでこのBIPとはあまり関係なくなってる。