discovery/gossiper: move zombie handling to helper
This commit is contained in:
parent
60250f0a04
commit
4baee9537b
@ -1881,44 +1881,13 @@ func (d *AuthenticatedGossiper) processNetworkAnnouncement(
|
|||||||
break
|
break
|
||||||
|
|
||||||
case channeldb.ErrZombieEdge:
|
case channeldb.ErrZombieEdge:
|
||||||
// Since we've deemed the update as not stale above,
|
err = d.processZombieUpdate(chanInfo, msg)
|
||||||
// before marking it live, we'll make sure it has been
|
|
||||||
// signed by the correct party. The least-significant
|
|
||||||
// bit in the flag on the channel update tells us which
|
|
||||||
// edge is being updated.
|
|
||||||
var pubKey *btcec.PublicKey
|
|
||||||
switch {
|
|
||||||
case msg.ChannelFlags&lnwire.ChanUpdateDirection == 0:
|
|
||||||
pubKey, _ = chanInfo.NodeKey1()
|
|
||||||
case msg.ChannelFlags&lnwire.ChanUpdateDirection == 1:
|
|
||||||
pubKey, _ = chanInfo.NodeKey2()
|
|
||||||
}
|
|
||||||
|
|
||||||
err := routing.VerifyChannelUpdateSignature(msg, pubKey)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err := fmt.Errorf("unable to verify channel "+
|
log.Warn(err)
|
||||||
"update signature: %v", err)
|
|
||||||
log.Error(err)
|
|
||||||
nMsg.err <- err
|
nMsg.err <- err
|
||||||
return nil, false
|
return nil, false
|
||||||
}
|
}
|
||||||
|
|
||||||
// With the signature valid, we'll proceed to mark the
|
|
||||||
// edge as live and wait for the channel announcement to
|
|
||||||
// come through again.
|
|
||||||
err = d.cfg.Router.MarkEdgeLive(msg.ShortChannelID)
|
|
||||||
if err != nil {
|
|
||||||
err := fmt.Errorf("unable to remove edge with "+
|
|
||||||
"chan_id=%v from zombie index: %v",
|
|
||||||
msg.ShortChannelID, err)
|
|
||||||
log.Error(err)
|
|
||||||
nMsg.err <- err
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
|
|
||||||
log.Debugf("Removed edge with chan_id=%v from zombie "+
|
|
||||||
"index", msg.ShortChannelID)
|
|
||||||
|
|
||||||
// We'll fallthrough to ensure we stash the update until
|
// We'll fallthrough to ensure we stash the update until
|
||||||
// we receive its corresponding ChannelAnnouncement.
|
// we receive its corresponding ChannelAnnouncement.
|
||||||
// This is needed to ensure the edge exists in the graph
|
// This is needed to ensure the edge exists in the graph
|
||||||
@ -2447,6 +2416,45 @@ func (d *AuthenticatedGossiper) processNetworkAnnouncement(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// processZombieUpdate determines whether the provided channel update should
|
||||||
|
// resurrect a given zombie edge.
|
||||||
|
func (d *AuthenticatedGossiper) processZombieUpdate(
|
||||||
|
chanInfo *channeldb.ChannelEdgeInfo, msg *lnwire.ChannelUpdate) error {
|
||||||
|
|
||||||
|
// Since we've deemed the update as not stale above, before marking it
|
||||||
|
// live, we'll make sure it has been signed by the correct party. The
|
||||||
|
// least-significant bit in the flag on the channel update tells us
|
||||||
|
// which edge is being updated.
|
||||||
|
var pubKey *btcec.PublicKey
|
||||||
|
switch {
|
||||||
|
case msg.ChannelFlags&lnwire.ChanUpdateDirection == 0:
|
||||||
|
pubKey, _ = chanInfo.NodeKey1()
|
||||||
|
case msg.ChannelFlags&lnwire.ChanUpdateDirection == 1:
|
||||||
|
pubKey, _ = chanInfo.NodeKey2()
|
||||||
|
}
|
||||||
|
|
||||||
|
err := routing.VerifyChannelUpdateSignature(msg, pubKey)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to verify channel "+
|
||||||
|
"update signature: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// With the signature valid, we'll proceed to mark the
|
||||||
|
// edge as live and wait for the channel announcement to
|
||||||
|
// come through again.
|
||||||
|
err = d.cfg.Router.MarkEdgeLive(msg.ShortChannelID)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("unable to remove edge with "+
|
||||||
|
"chan_id=%v from zombie index: %v",
|
||||||
|
msg.ShortChannelID, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
log.Debugf("Removed edge with chan_id=%v from zombie "+
|
||||||
|
"index", msg.ShortChannelID)
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// fetchNodeAnn fetches the latest signed node announcement from our point of
|
// fetchNodeAnn fetches the latest signed node announcement from our point of
|
||||||
// view for the node with the given public key.
|
// view for the node with the given public key.
|
||||||
func (d *AuthenticatedGossiper) fetchNodeAnn(
|
func (d *AuthenticatedGossiper) fetchNodeAnn(
|
||||||
|
Loading…
Reference in New Issue
Block a user