Lightning-Network

非活動通道的定義是什麼?

  • September 3, 2019

在閃電網路上,自上次接收頻道更新以來經過多長時間後,頻道才被視為不活動?

如果你看一下channel_update messageBOLT 07你會發現一個節點

  • 可以創建並發送設置為 1channel_updatedisable位,以表示通道暫時不可用(例如,由於連接失去)或永久不可用(例如,在鏈上結算之前)。

+ 可以發送一個後續channel_updatedisable比特設置為 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似乎在程式碼中的三個點被呼叫。可以從那裡往下追溯,看看有沒有什麼特殊情況導致頻道被廣播為非活動狀態。

引用自:https://bitcoin.stackexchange.com/questions/90200