ptarmigan
ptarmigan copied to clipboard
a corner case after the HTLC has become irrevocably committed
HTLCがirrevocably committed(以下IR)になるとき、つまりrevoke_and_ack
送受信のタイミングで、以下の処理が行われる。
revoke_and_ack
送信
- 先にRAM上を
revoke_and_ack
送信状態に更新してDBに保存 -
revoke_and_ack
送信 - IRになったupdatesに対応する
update_add_htlc
の中継データをDBから削除 - IRになったHTLCsをRAMからクリアしてDBに保存
revoke_and_ack
受信
-
revoke_and_ack
受信 - RAM上を
revoke_and_ack
送信状態に更新してDBに保存 -
update_add_htlc
の中継または、update_fulfill/fail_htlc
だったらupdate_add_htlc
の中継データを削除 - IRになったHTLCsをRAMからクリアしてDBに保存
問題になるのはいずれも最初にDBに保存して状態を確定させてから、4が完了するまでにptarmdが終了してしまうと、再起動後当該HTLCsがクリアされていない。微妙なタイミングではあるが。
現時点で発生しうる問題は、
- closingが終わらない。HTLCが残っているから(あまり影響はないだろう)
- ptarmdが終了したタイミングが3の中継データがクリアされる前の状態の場合、再度
revoke_and_ack
の送受信が発生したとき、そのときは中継データが削除されず(この処理はnew_update
フラグを見て、そのタイミングでIR状態になったupdatesにしか行われない)当該HTLCsのみがクリアされる。そうなると再び同じ中継データがロードされてしまう。update_fulfill/fail_htlc
は適用すべきHTLCが存在しないので破棄されるだろうが、update_add_htlc
はロードされ、再送信されてしまう。 - 本来存在しないHTLCが数にカウントされる(あまり影響はないだろう)
対応策) ptarmd起動時に、channelをロードするときIR状態のHTLCsについて中継データを削除した後、HTLCsをクリアしてDBに保存する。