ハッシュのプリイメージの提供とコインの入手をアトミックに行うHTLCの仕組みは、LNなどのマルチホップ支払いをサポートするPayment Channel NetworkやAtomic Swapなどいろんなアプリケーションで使われている。このHTLCの安全性に関する問題提起とその問題を回避するためのソリューションとしてMAD-HTLCと呼ばれる新しいHTLCプロトコルの提案が最近発表された↓
https://arxiv.org/pdf/2006.12031.pdf
HTLCに対する攻撃
アリスとボブは、アリスがシークレットを提供したらボブはコインを支払うといったコントラクトをHTLCを使って構築できる。このようなHTLCにロックされたコインを入手する方法は、以下のいずれかになる。
- アリスがハッシュのプリイメージとなるシークレット値を提供する。
- 予め指定された期間を過ぎてもアリスがシークレット値を提供しない場合、タイムアウトとなりボブがコインを取り戻す。
シークレットの提供とコインの入手がアトミックに行えるのがHTLCのメリットだが、ボブはマイナーに賄賂を送り結託して攻撃を仕掛けることができる。
アリスがシークレット値を提供してコインを入手するトランザクションを作成し、ブロードキャストしたとする。このトランザクションの手数料よりも高い額を賄賂としてボブとマイナーが結託する場合。マイナーとしては、アリスのトランザクションをブロックに入れずに、タイムアウト時間になるの待ち、ボブの払い戻しトランザクションをブロックに格納した方が実入りが良い。この場合、シークレット自体はアリスがトランザクションをブロードキャストした際に明らかになるので、ボブはシークレット値を得ながら、かつコインも払い戻され、アリスのみが損をすることになる。
マイナーのインセンティブが経済的な合理性のみである場合、↑のような賄賂を使った攻撃も考えられる。
MAD-HTLC
不正行為ががった場合に、その当事者にペナルティを与えることで↑の賄賂攻撃に対応しようというのがMAD-HTLCの提案。ちなみにMADという名前は、冷戦時に提唱された相互確証破壊(Mutual Assured Destruction = MAD)から来てるみたい。
不正行為というのはアリスがプリイメージを公開したにも関わらずボブがコインを取り戻す行為でこれに対応する。そのため↑のHTLCに対して、ボブがタイムアウトによりコインを取り戻す際にボブのみが知るプリイメージの公開を強制し、ボブのプリイメージとアリスのプリイメージの両方が揃った場合、コインを第三者が取得できるようにする。
具体的には以下のようはHTLC(MH-Dep)を構成する。
OP_HASH160 <H(アリスのプリイメージ)> OP_EQUAL OP_SWAP OP_HASH160 <H(ボブのプリイメージ)> OP_EQUAL OP_IF OP_IF OP_1 OP_ELSE <タイムロック時間> OP_CHECKSEQUENCEVERIFY OP_DROP <ボブの公開鍵> OP_CHECKSIG OP_ENDIF OP_ELSE OP_VERIFY <アリスの公開鍵> OP_CHECKSIG OP_ENDIF
このMH-Dep HTLCスクリプトにロックされたコインをアンロックするための方法は以下の3つ。
- アリスがプリイメージと自身の秘密鍵で作成した署名を提供する。
- ボブがタイムロック時間を超えてから、ボブのプリイメージと自身の秘密鍵で作成した署名を提供する。
- アリスのプリイメージとボブのプリイメージの両方を提供する。
このスクリプトの場合、ボブがマイナーと結託しても、マイナーはアリスのプリイメージとボブのプリイメージを知っていれば、マイナー単独でMH-Dep HTLCスクリプトにロックされているコインを入手することができる。
ただMH-Dep HTLCのみだと、元々アリスのプリイメージが分かればボブはコインを支払う前提であったため、ボブはそのコインを自分が手にすることはなくても、マイナーと結託して、アリスがプリイメージを公開した後、自分のプリイメージをマイナーに公開してアリスに資金が渡らないという嫌がらせをすることが考えられる。こういったケースに対応するため、MAD-HTLCの提案では、MH-Depに加えて以下のような担保となるMH-Col HTLCスクリプトを合わせて使用する提案もしている。
<MH-Depと同じタイムロック時間> OP_CHECKSEQUENCEVERIFY OP_DROP OP_HASH160 <アリスのプリイメージ> OP_EQUAL OP_IF OP_HASH160 <ボブのプリイメージ> OP_EQUAL OP_ELSE <ボブの公開鍵> OP_CHECKSIG OP_ENDIF
このMH-Col HTLCスクリプトにロックされたコインをアンロックするための方法は以下の2つ。
- ボブがタイムロック時間を超えてから、ボブの秘密鍵で作成した署名を提供する。
- アリスのプリイメージとボブのプリイメージの両方を提供する。
これはMH-Depの担保となるHTLCで、上記のようにボブがマイナーにボブのプリイメージを公開してアリスの資金の入手を妨害した際に、ペナルティとしてMH-Colにロックされたコインをマイナーによって没収されるというもの。
HTLCを上記のスクリプトで構成することで、マイナーへの賄賂を利用したHTLCへの攻撃を回避しようというのがMAD-HTLCの提案。
MAD-HTLCの課題
MAD-HTLCによって、賄賂に対する防御が可能になる反面、MH-Colまでセットで実現すると、ボブ側のユーザーにとってはMH-Colにロックする担保のコインとそのTxの手数料分のコストが余計にかかることになる。
また、アリスがマイナーであった場合、自分のプリイメージをボブに公開しないことで、MH-DepのコインとMH-Colを総取りすることができるという指摘もある。
その他にも、アリスのプリイメージを公開したトランザクションがブロックに含まれない場合、アリスはRBFやCPFPによって本来受け取るコインを全て使ってでもボブに資金が渡らないような対抗が可能であるという指摘もある。
現状MAD-HTLCが想定する攻撃は実際に見られていないのと、↑のような指摘もあて直ぐにこういった仕組みが組み込まれるということは無いかもしれないけど、興味深い提案だと思う。