LDP Seminar Week 1の備忘録
Chaincode labsが開催しているLDPというオンラインセミナーに参加しているので、そのWeek 1の復習を兼ねての備忘録。
Week 1はライトニングの基本的なプロトコルに関する内容で、事前に参加者には宿題が与えられるので当日までに解いておく。そして、当日その問題をグループ内でディスカッションする形式となっている。その中から一部抜粋してその問題を以下に記載する。
・・・
問題1
Why do we need the HTLC-Success and HTLC-Timeout transactions? Why can't we just use a sequence delay on the to_local output conditions of the HTLC itself?
回答
アリスからボブへの送金において考える。まずはアリスのコミットメントであるOffered HTLCについて。このHTLCのアウトプットの使用条件は以下の3つ
- ボブがプリイメジを使う
- CLTVによる絶対時間の経過後にアリスが自身の署名を使う
- ボブがrevocation keyを使う(アリスが古いコミットメントを送信した場合)
ただし、CLTV経過後、アリス自身が使用する場合にはto_self_delay
の相対時間も経過する必要がある(※1)。言い換えると、HTLCの有効期限が切れたのに、この相対時間分の猶予がボブに与えられることになる。これがアリスに与える影響は、アリスが受け取った上流からのHTLCをキャンセルできなくなる、また、この時間分の遅延が上流へ及ぶことになる。
そこで、このCLTVとCTVによる時間枠を1つのHTLCに含めるのではなく、HTLC-Timeoutトランザクションという2つ目のトランザクションを作り、このトランザクションの中にアリスへのto_self_delay
を入れることで、HTLCの執行猶予を無くすことができる。
※1to_self_delay
は古いコミットメントをブロードキャストした場合に相手側がrevocation keyを使い資金の没収ができるようにするための期間を設けるために必要。
次にボブのコミットメントであるReceived HTLCについて。このHTLCのアウトプットの使用条件は以下の3つ
- ボブがプリイメジを使う
- CLTVによる絶対時間の経過後にアリスが自身の署名を使う
- アリスがrevocation keyを使う(ボブが古いコミットメントを送信した場合)
ボブがプリイメジを使う場合、今度は自身のコミットメントトランザクションなので、to_self_delay
が必要になる。ここでボブがto_self_delay
時間待つことになるが、この時間がcltv_expiry
よりも長い可能性がある。そうなるとボブはプリイメジを知っているのに、CLTVの時間が経過後にアリスによって資金を回収されてしまう。
そこで、HTLC-Successトランザクションという2つ目のトランザクションを作り、このトランザクションのアウトプットにボブへのto_self_delay
を入れる。こうすることで、cltv_expiry
の有効期限が切れる前にプリイメジを使ったHTLC-Successトランザクションをブロードキャストさせる。その後、ボブへのto_self_delay
を強制させることが可能となる。
上記を要約すると、CLTVとCSVを切り離す必要があり、そのためにCLTVをコミットメントトランザクションのHTLCへ、CSVをHTLC-Timeout/Successトランザクションへセットする必要がある。
Lightningのプロトコルは、アリスとボブが持つコミットメントトランザクションは非対称で、それぞれの視点で考える必要があるので混乱しやすい。
上記のHTLC-Timeout/Successトランザクションに関してはこちらの記事が分かりやすく秀逸。
問題2
What problem do commitment transactions solve? When a revoked commitment transaction is found, what outputs need to be resolved by the penalty transaction?What happens to the HTLCs?
回答
- オフチェーンで状態を管理するため
- カウンターパーティーが消えた場合でも資金を取り出せるようにするため
to_local
をrevocation keyで回収する- HTLCsもrevocation keyで回収する
・・・
ライトニングプロトコルは複雑すぎて心が折れそうになる(笑)
・CLTVはマルチホップのために使用される。マルチホップペイメントの場合、各ホップ間でHTLCがタイムアウトする時間の軸を共通基準として持つ必要がある。そのためにCLTVによるブロック高の絶対時間を採用する。もしこれがCSVによる相対時間の場合、A→B→Cの送金時、B→CのHTLCよりもA→BのHTLCの方が先にタイムアウトすると(これはA→BのコミットメントTXのほうが先にブロックに取り込まれ、B→CのコミットメントTXがブロックに取り込まれない場合で、手数料の差異などが原因で生じる)Bが資金を失うことになる。
・CSVは不正時の資金没収期間として使用される。