routing: add vertex pruning for non-final CLTV related errors

In this commit, we add vertex pruning for any non-final CLTV error.
Before this commit, we assumed that any source of this error was due to
the local node setting the incorrect time lock. However, it’s been
recently noticed on main net that there’re a set of nodes that seem to
not be properly scanned to the chain. Without this patch, users aren’t
able to route successfully as atm, we’ll stop all path finding attempts
if we encounter this.
This commit is contained in:
Olaoluwa Osuntokun 2018-03-22 17:34:42 -07:00
parent 2326d4afeb
commit f935bd0baf
No known key found for this signature in database
GPG Key ID: 964EA263DD637C21

@ -1670,15 +1670,20 @@ func (r *ChannelRouter) SendPayment(payment *LightningPayment) ([32]byte, *Route
return preImage, nil, sendError return preImage, nil, sendError
// If we get a notice that the expiry was too soon for // If we get a notice that the expiry was too soon for
// an intermediate node, then we'll exit early as the // an intermediate node, then we'll prune out the node
// expected block height as shifted from underneath us. // that sent us this error, as it doesn't now what the
// correct block height is.
case *lnwire.FailExpiryTooSoon: case *lnwire.FailExpiryTooSoon:
update := onionErr.Update update := onionErr.Update
if err := r.applyChannelUpdate(&update); err != nil { if err := r.applyChannelUpdate(&update); err != nil {
log.Errorf("unable to apply channel "+ log.Errorf("unable to apply channel "+
"update for onion error: %v", err) "update for onion error: %v", err)
} }
return preImage, nil, sendError
pruneVertexFailure(
paySession, route, errSource, false,
)
continue
// If we hit an instance of onion payload corruption or // If we hit an instance of onion payload corruption or
// an invalid version, then we'll exit early as this // an invalid version, then we'll exit early as this
@ -1734,6 +1739,10 @@ func (r *ChannelRouter) SendPayment(payment *LightningPayment) ([32]byte, *Route
errFailedFeeChans[chanID] = struct{}{} errFailedFeeChans[chanID] = struct{}{}
continue continue
// If we get the failure for an intermediate node that
// disagrees with our time lock values, then we'll
// prune it out for now, and continue with path
// finding.
case *lnwire.FailIncorrectCltvExpiry: case *lnwire.FailIncorrectCltvExpiry:
update := onionErr.Update update := onionErr.Update
if err := r.applyChannelUpdate(&update); err != nil { if err := r.applyChannelUpdate(&update); err != nil {
@ -1741,7 +1750,10 @@ func (r *ChannelRouter) SendPayment(payment *LightningPayment) ([32]byte, *Route
"update for onion error: %v", err) "update for onion error: %v", err)
} }
return preImage, nil, sendError pruneVertexFailure(
paySession, route, errSource, false,
)
continue
// The outgoing channel that this node was meant to // The outgoing channel that this node was meant to
// forward one is currently disabled, so we'll apply // forward one is currently disabled, so we'll apply