mirror of
https://github.com/lightningnetwork/lnd.git
synced 2025-07-04 12:31:39 +02:00
routing/pathfind: ignore unknown required features
This commit brings us inline with recent modifications to the spec, that say we shouldn't pay nodes whose feature vectors signal unknown required features, and also that we shouldn't route through nodes signaling unknown required features. Currently we assert that invoices don't have such features during decoding, but now that users can specify feature vectors via the rpc interface, it makes sense to perform this check deeper in call stack. This will also allow us to remove the check from decoding entirely, making decodepayreq more useful for debugging.
This commit is contained in:
@ -456,8 +456,14 @@ func findPath(g *graphParams, r *RestrictParams, cfg *PathFindingConfig,
|
||||
}
|
||||
}
|
||||
|
||||
// With the destination's feature vector selected, ensure that all
|
||||
// transitive depdencies are set.
|
||||
// Ensure that the destination's features don't include unknown
|
||||
// required features.
|
||||
err = feature.ValidateRequired(features)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Ensure that all transitive dependencies are set.
|
||||
err = feature.ValidateDeps(features)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@ -752,11 +758,24 @@ func findPath(g *graphParams, r *RestrictParams, cfg *PathFindingConfig,
|
||||
|
||||
// If the node exists and has valid features, use them.
|
||||
case err == nil:
|
||||
err := feature.ValidateDeps(targetNode.Features)
|
||||
if err == nil {
|
||||
fromFeatures = targetNode.Features
|
||||
nodeFeatures := targetNode.Features
|
||||
|
||||
// Don't route through nodes that contain
|
||||
// unknown required features.
|
||||
err = feature.ValidateRequired(nodeFeatures)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
|
||||
// Don't route through nodes that don't properly
|
||||
// set all transitive feature dependencies.
|
||||
err = feature.ValidateDeps(nodeFeatures)
|
||||
if err != nil {
|
||||
break
|
||||
}
|
||||
|
||||
fromFeatures = nodeFeatures
|
||||
|
||||
// If an error other than the node not existing is hit,
|
||||
// abort.
|
||||
case err != channeldb.ErrGraphNodeNotFound:
|
||||
|
Reference in New Issue
Block a user