discovery/gossiper: send node anns when constructing full chan proof
In this commit, we allow the gossiper to also broadcast the corresponding node announcements, if we know of them, of a channel when constructing its full proof. We do this to ensure peers (other than our remote peer) receive all the relevant announcements for a channel. The tests changes were made to ensure the new behavior introduced works as intended. Previously, the node announcements for each test channel announcement were not processed, so they never existed from the gossiper's point of view. This also addresses an existing flake in the integration test `testNodeAnnouncement`. This problem arose due to the node announcement being sent before the connection between Dave (node announcement sender) and Alice (node announcement receiver) was initiated and the full channel proof was constructed.
This commit is contained in:
2 files changed
+323
-77
No files matched your search
@@ -2366,6 +2366,31 @@ func (d *AuthenticatedGossiper) processNetworkAnnouncement(
|
||||
})
|
||||
}
|
||||
|
||||
// We'll also send along the node announcements for each channel
|
||||
// participant if we know of them.
|
||||
node1Ann, err := d.fetchNodeAnn(chanInfo.NodeKey1Bytes)
|
||||
if err != nil {
|
||||
log.Debugf("Unable to fetch node announcement for "+
|
||||
"%x: %v", chanInfo.NodeKey1Bytes, err)
|
||||
} else {
|
||||
announcements = append(announcements, networkMsg{
|
||||
peer: nMsg.peer,
|
||||
source: nMsg.source,
|
||||
msg: node1Ann,
|
||||
})
|
||||
}
|
||||
node2Ann, err := d.fetchNodeAnn(chanInfo.NodeKey2Bytes)
|
||||
if err != nil {
|
||||
log.Debugf("Unable to fetch node announcement for "+
|
||||
"%x: %v", chanInfo.NodeKey2Bytes, err)
|
||||
} else {
|
||||
announcements = append(announcements, networkMsg{
|
||||
peer: nMsg.peer,
|
||||
source: nMsg.source,
|
||||
msg: node2Ann,
|
||||
})
|
||||
}
|
||||
|
||||
nMsg.err <- nil
|
||||
return announcements
|
||||
|
||||
@@ -2375,6 +2400,19 @@ func (d *AuthenticatedGossiper) processNetworkAnnouncement(
|
||||
}
|
||||
}
|
||||
|
||||
// fetchNodeAnn fetches the latest signed node announcement from our point of
|
||||
// view for the node with the given public key.
|
||||
func (d *AuthenticatedGossiper) fetchNodeAnn(
|
||||
pubKey [33]byte) (*lnwire.NodeAnnouncement, error) {
|
||||
|
||||
node, err := d.cfg.Router.FetchLightningNode(pubKey)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return node.NodeAnnouncement(true)
|
||||
}
|
||||
|
||||
// sendAnnSigReliably will try to send the provided local AnnounceSignatures
|
||||
// to the remote peer, waiting for it to come online if necessary. This
|
||||
// method returns after adding the message to persistent storage, such
|
||||
|
||||
Reference in new issue
Block a user