Lightning-Network
非活動通道的定義是什麼?
在閃電網路上,自上次接收頻道更新以來經過多長時間後,頻道才被視為不活動?
如果你看一下
channel_update message
BOLT 07你會發現一個節點
- 可以創建並發送設置為 1
channel_update
的disable
位,以表示通道暫時不可用(例如,由於連接失去)或永久不可用(例如,在鏈上結算之前)。+ 可以發送一個後續
channel_update
的disable
比特設置為 0 以重新啟用通道。這意味著如果您正確關閉節點,則節點或對等方會將通道設置為非活動狀態並發送通道消息。特別是沒有時間(超時)編碼到協議中。
如果您的節點保持線上並且 TCP 連接保持活動狀態,則通道不會變為非活動狀態。
如果您的節點死亡,對等方可能會發送非活動消息。但是,從規範來看,尚不清楚何時以及如何發生這種情況。
一般來說,正確關閉您的節點並發送通道處於非活動狀態的事實被認為是一種很好的做法,這樣其他人就不會遇到不必要的路由錯誤。我認為
lnd
將開始收集有關失敗的路由嘗試的統計資訊,並在本地開始按節點的可靠性對節點進行排名。雖然計劃的停機時間也不如恆定的正常執行時間那麼好,但它肯定不會像在路由嘗試期間發現的停機時間那樣降低節點的等級。很抱歉,這個答案可能不像您希望的那樣令人滿意。解決此問題的另一種方法是查看實現並檢查它們何時以及如何發送
channel_update
消息。例如在 c-lightning 中send_channel_update function
被稱為 5 times。在大多數情況下啟動通道。我只能找到 2 種情況,其中頻道可能被廣播為非活動狀態:static void maybe_send_shutdown(struct peer *peer) { u8 *msg; if (!peer->send_shutdown) return; /* Send a disable channel_update so others don't try to route * over us */ send_channel_update(peer, ROUTING_FLAGS_DISABLED); msg = towire_shutdown(NULL, &peer->channel_id, peer->final_scriptpubkey); sync_crypto_write(peer->pps, take(msg)); peer->send_shutdown = false; peer->shutdown_sent[LOCAL] = true; billboard_update(peer); }
和:
static void handle_peer_shutdown(struct peer *peer, const u8 *shutdown) { struct channel_id channel_id; u8 *scriptpubkey; /* Disable the channel. */ send_channel_update(peer, ROUTING_FLAGS_DISABLED); if (!fromwire_shutdown(tmpctx, shutdown, &channel_id, &scriptpubkey)) peer_failed(peer->pps, &peer->channel_id, "Bad shutdown %s", tal_hex(peer, shutdown)); ...
最後一個
handle_peer_shutdown
是正常關閉第一個maybe_send_shutdown
似乎在程式碼中的三個點被呼叫。可以從那裡往下追溯,看看有沒有什麼特殊情況導致頻道被廣播為非活動狀態。