在第一次支付失敗後,lnd 如何確保它不會重複使用相同的路由兩次進行重試?
假設 LND 節點 A 想要向另一個節點 D 發送付款。
pathfind
基於 Dijkstra 的算法找到了一條通過 B 和 C 的路線並發起付款。它失敗了,因為 B -> C 沒有足夠的餘額/頻寬。LND 會不會付款失敗,還是會嘗試使用不同的路線再試一次?它如何記住失敗的路線?
追問:節點A能否算出,哪條邊失敗了?
編輯:為了更清楚,在我的範例中,所有通道都有 0.5BTC 作為容量,並且所有通道都具有該容量的均衡分佈(0.25,0.25),除了 B -> C,它具有(0,0.5 ),因此 B 目前無法向 C 發送任何付款。
平衡狀態(這裡:(0, 0.5))是私有的,但所有通道的容量都是公開的。
由於路由計算是在 A(源路由)中完成的,算法最初不知道餘額。如果 A 只想發送 0.001BTC,路由算法會找到路由,但無法到達目標。
所以我繼續查看這裡的 LND 實現:https ://github.com/lightningnetwork/lnd/blob/master/routing/pathfind.go這是函式 findPath 上方的註釋塊:
findPath 試圖找到從 ChannelGraph 中的源節點到能夠支持
amt
價值支付的目標節點的路徑。目前實施的方法是 Dijkstra 算法的修改版本,用於在源節點和目的地之間找到一條最短路徑。用於邊緣的距離度量與沿特定邊緣的時間鎖定+費用成本有關。如果找到路徑,則此函式返回 ChannelHop 結構的切片,該切片對從目標到源的所選路徑進行編碼。搜尋從目標節點向後執行回到源。這是為了正確累積需要沿路徑支付的費用,並根據可用頻寬準確檢查每個節點的轉發量。如果是這種情況,那麼我認為您的情況不會上演。LND 似乎不會返迴路徑 A –> B –> C –> D,因為它沒有足夠的餘額/頻寬。
實際上,在LND中尋找路徑可以描述為在加權圖上尋找“最短路徑”的過程。在 LND 中,每個頻道的權重由費用、CLTV_DELTA 和機率三部分組成。如果您熟悉閃電網路,您將了解前兩個因素,最後一個因素是該渠道從本地角度支付得起的可能性。
如果一條路由失敗,那麼容量不足的節點會主動將此資訊包含在返回消息中,只有付款方才能解鎖和看到。例如, 那麼付款人會在本地視圖中降低該通道的機率,並重新找到該路線(您可以將其視為將這條邊的權重設置為非常大)。
您可以在此處找到詳細資訊。