由於 HTLC 在遠端承諾中單方面關閉
我在我的節點上執行 lnd,有時會看到如下消息:
[INF] CNCT: ChannelArbitrator(CHANPOINT): immediately failing htlc=HTLCID from remote commitment
我的節點發出的相應關閉交易不包含任何 HTLC 輸出。我想更多地了解這種情況,以及我能做些什麼來避免這種情況。
- HTLC 如何在我的對等方的送出事務中結束?
- 為什麼我的節點知道它,但在本地送出事務中沒有 HTLC?
- 為什麼沒有必要在關閉交易中收回 HTLC 資金?
- 出了什麼問題,即我怎樣才能幫助避免這種渠道關閉?
非常感謝 Rene Pickhardt,他花了一些時間和我一起研究這個。
當我的節點 A 向我的對等節點 B 發送 HTLC 時,這是使用Bolt 02
update_add_htlc
中定義的消息完成的。在此消息之後,我的節點簽署遠端的新承諾交易(其中包含 HTLC)並將其作為消息的一部分發送給B。commitment_signed
一旦節點 B 有權訪問此簽名交易,它就可以(理論上)廣播包括 HTLC 輸出的交易,並使用秘密散列來花費 HTLC 輸出。
請注意,B 可以隨時執行此操作,可能在 HTLC 超時之後很久。
如果傳出 HTLC 對應於傳入 HTLC(即,我的節點將資金從某個其他節點 X 轉發到 B),則我的節點需要在傳入 HTLC 超時之前絕對確定地使傳出 HTLC 失敗。如果傳入的 HTLC 首先超時,則傳入的 HTLC 失敗(並且我的節點沒有從 X 獲得傳入的資金),但是如果節點 B 決定廣播已簽名的交易(因此,我的節點將免費贈送資金,因為它不會從節點 X 取回金額)。
為了避免這種情況,lnd 如問題中所述強制關閉通道,以使傳出的 HTLC 絕對肯定會失敗,即剝奪節點 B 將來要求 HTLC 輸出的機會。
通常節點 B 會確認已簽名的交易並發送已簽名的交易作為回報。然而,在上述情況下,節點 B 沒有響應。日誌顯示
failing link: unable to complete dance with error: remote unresponsive
,表明節點 B 沒有按預期繼續應答。
update_add_htlc
在發送and之前檢查節點 B 的執行狀況可能會有所幫助commitment_signed
,這顯然不是 lnd 目前所做的事情。正如您在 lnd 原始碼中看到的,整個過程非常類似於節點 B 也發送一個新的簽名交易(其中包含 HTLC),然後讓 HTLC 超時的情況。