Develop with pleasure!

福岡でCloudとかBlockchainとか。

BIPとして登録されたHTLC(BIP-199)

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_SHA256OP_HASH160のどちらか。

[TIMEOUTOP]にセットするopcodeは、OP_CHECKSEQUENCEVERIFYOP_CHECKLOCKTIMEVERIFYのどちらか。

HTLCの流れ

  • ビクター(買い手)とペギー(売り手)は、お互いに公開鍵を交換し、タイムアウト閾値に合意する。続いてペギーはビクターにハッシュダイジェストを提供する。この段階で、両者はHTLCのスクリプトを構築し、そのP2SHアドレスを生成することができる。
  • ビクターはそのP2SHアドレスに資金を送る。
  • ビクターが送った資金は以下のいずれかで入手できる
    • べギーはビクターが送った資金のUTXOについて、自分が生成したハッシュのプリイメージを記載したトランザクションを作ることで資金を入手する(↑のOP_IFブランチの条件)
    • ビクターはタイムアウト時間を過ぎたので、資金を回収する(↑のOP_ELSEブランチの条件)

ビクターは、べギーがプリイメージを公開しない場合、資金がロックされている時間を減らすためタイムアウトを短く設定したい。逆にペギーの方は、タイムアウト閾値によって資金の入手できないといったリスクを減らすためタイムアウトを長く設定したい。

動機

多くのオフチェーンプロトコルでは、シークレットの開示が決済メカニズムの一部として使われている。HTLCのトランザクションは、回収前であればシークレットを公開することで確実に資金を入手でき、非協力的な取引相手から資金を回収する仕組みと合わせて、ブロックチェーンを介してシークレットとお金を交換する安全で安価な方法である。

Lightning Network

Lightning Networkでは、HTLCスクリプトを使ってペイメントチャネル間のアトミックスワップを実現している。

アリスはシークレットKを生成し、そのハッシュLを生成する。アリスはそのLのプリイメージ対するHTLCの支払いをボブに送る。ボブは同じプリイメージと金額へのHTLC支払いをキャロルに送る。アリスがプリイメージKをリリースした場合のみ価値の交換が発生する。シークレットは各ホップ毎に明らかになるので、全ての当事者の取引が補償される。いずれかの当事者が取引に非協力的になった場合は、払い戻し条件によって処理を中止することができる。

この辺の仕組みの話は↓の方が分かりやすいと思う

techmedia-think.hatenablog.com

ゼロ知識の条件付き支払い

ハッシュのプリイメージが期待する情報を導出することを保証するために使用されるさまざまな実験的なゼロ知識証明システムが存在する。一例として、ゼロ知識証明が、ハッシュのプリイメージが暗号化された数独パズルの解の復号鍵として機能することを証明するために利用されていたりする。(プロトコルの具体例は、pay-to-sudokuを参照)

HTLCトランザクションは、そのような復号鍵をリスク無しにお金と交換することができ、ゼロ知識証明で必要となる大規模で高価な検証トランザクションを必要としない。

実装

Bitcoin CoreでこのHTLCをサポートするプルリク↓が出てる。

github.com

所感

  • HTLC自体は以前からある仕組みで今回のBIPで特に新しい概念や機能が加わったものではない。
  • 今回のはBIP化というより、Bitcoin CoreがHTLCをサポートすることが目的かな?
  • Lightning Networkはホワイトペーパーではハッシュのプリイメージの交換だったけど、現状はRevocation Keyという公開鍵を使う方式になってるのでこのBIPとはあまり関係なくなってる。