From 67132d4ee350f75ae14cacce5c5582e61b17d983 Mon Sep 17 00:00:00 2001 From: Wilmer Paulino Date: Tue, 18 Jun 2019 17:32:56 -0700 Subject: [PATCH] discovery: set source of node announcement broadcast to belonging node We do this to ensure the node announcement propagates to our channel counterparty. At times, the node announcement does not propagate to them when opening our first channel due to a race condition between IsPublicNode and processing announcement signatures. This isn't necessary for channel updates and announcement signatures as we send those to our channel counterparty directly through the reliable sender. --- discovery/gossiper.go | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/discovery/gossiper.go b/discovery/gossiper.go index 288cf1a3..ba59dbfb 100644 --- a/discovery/gossiper.go +++ b/discovery/gossiper.go @@ -2382,28 +2382,38 @@ func (d *AuthenticatedGossiper) processNetworkAnnouncement( } // We'll also send along the node announcements for each channel - // participant if we know of them. + // participant if we know of them. To ensure our node + // announcement propagates to our channel counterparty, we'll + // set the source for each announcement to the node it belongs + // to, otherwise we won't send it since the source gets skipped. + // This isn't necessary for channel updates and announcement + // signatures since we send those directly to our channel + // counterparty through the gossiper's reliable sender. 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, - }) + if nodeKey1, err := chanInfo.NodeKey1(); err == nil { + announcements = append(announcements, networkMsg{ + peer: nMsg.peer, + source: nodeKey1, + 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, - }) + if nodeKey2, err := chanInfo.NodeKey2(); err == nil { + announcements = append(announcements, networkMsg{ + peer: nMsg.peer, + source: nodeKey2, + msg: node2Ann, + }) + } } nMsg.err <- nil