From 9eda94a40ef9bc15a4037ec5d1fc96495fd5d289 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Mon, 15 Jul 2019 14:09:42 -0700 Subject: [PATCH 1/2] peer: don't reply if peer's request `initial_graph_sync` We stopped requesting this from other nodes as it is very expensive as the graph continues to grow. In this commit we will also stop responding, as nodes are recommended to begin using the `gossip_queries` and upcoming `extended_gossip_queries` to reconcile missing graph data. --- peer.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/peer.go b/peer.go index 7cbd824eb..36a6fee72 100644 --- a/peer.go +++ b/peer.go @@ -396,16 +396,6 @@ func (p *peer) initGossipSync() { // bootstrapper to ensure we can find and connect to non-channel // peers. p.server.authGossiper.InitSyncState(p) - - // If the remote peer has the initial sync feature bit set, then we'll - // being the synchronization protocol to exchange authenticated channel - // graph edges/vertexes, but only if they don't know of the new gossip - // queries. - case p.remoteLocalFeatures.HasFeature(lnwire.InitialRoutingSync): - srvrLog.Infof("Requesting full table sync with %x", - p.pubKeyBytes[:]) - - go p.server.authGossiper.SynchronizeNode(p) } } From a4097c113a2a94dbae53ad41bb639496b93ca917 Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Mon, 15 Jul 2019 14:11:18 -0700 Subject: [PATCH 2/2] discovery/gossiper: remove unused SynchronizeNode method --- discovery/gossiper.go | 108 ------------------------------------------ 1 file changed, 108 deletions(-) diff --git a/discovery/gossiper.go b/discovery/gossiper.go index e893455f7..a3aefd48c 100644 --- a/discovery/gossiper.go +++ b/discovery/gossiper.go @@ -331,114 +331,6 @@ func New(cfg Config, selfKey *btcec.PublicKey) *AuthenticatedGossiper { return gossiper } -// SynchronizeNode sends a message to the service indicating it should -// synchronize lightning topology state with the target node. This method is to -// be utilized when a node connections for the first time to provide it with -// the latest topology update state. In order to accomplish this, (currently) -// the entire network graph is read from disk, then serialized to the format -// defined within the current wire protocol. This cache of graph data is then -// sent directly to the target node. -func (d *AuthenticatedGossiper) SynchronizeNode(syncPeer lnpeer.Peer) error { - // TODO(roasbeef): need to also store sig data in db - // * will be nice when we switch to pairing sigs would only need one ^_^ - - // We'll collate all the gathered routing messages into a single slice - // containing all the messages to be sent to the target peer. - var announceMessages []lnwire.Message - - // We'll use this map to ensure we don't send the same node - // announcement more than one time as one node may have many channel - // anns we'll need to send. - nodePubsSent := make(map[route.Vertex]struct{}) - - // As peers are expecting channel announcements before node - // announcements, we first retrieve the initial announcement, as well as - // the latest channel update announcement for both of the directed edges - // that make up each channel, and queue these to be sent to the peer. - var ( - numEdges uint32 - numNodes uint32 - ) - if err := d.cfg.Router.ForEachChannel(func(chanInfo *channeldb.ChannelEdgeInfo, - e1, e2 *channeldb.ChannelEdgePolicy) error { - - // First, using the parameters of the channel, along with the - // channel authentication proof, we'll create re-create the - // original authenticated channel announcement. If the channel - // also has known validated nodes, then we'll send that as - // well. - if chanInfo.AuthProof != nil { - chanAnn, e1Ann, e2Ann, err := CreateChanAnnouncement( - chanInfo.AuthProof, chanInfo, e1, e2, - ) - if err != nil { - return err - } - - announceMessages = append(announceMessages, chanAnn) - if e1Ann != nil { - announceMessages = append(announceMessages, e1Ann) - - // If this edge has a validated node - // announcement, that we haven't yet sent, then - // we'll send that as well. - nodePub := e1.Node.PubKeyBytes - hasNodeAnn := e1.Node.HaveNodeAnnouncement - if _, ok := nodePubsSent[nodePub]; !ok && hasNodeAnn { - nodeAnn, err := e1.Node.NodeAnnouncement(true) - if err != nil { - return err - } - - announceMessages = append( - announceMessages, nodeAnn, - ) - nodePubsSent[nodePub] = struct{}{} - - numNodes++ - } - } - if e2Ann != nil { - announceMessages = append(announceMessages, e2Ann) - - // If this edge has a validated node - // announcement, that we haven't yet sent, then - // we'll send that as well. - nodePub := e2.Node.PubKeyBytes - hasNodeAnn := e2.Node.HaveNodeAnnouncement - if _, ok := nodePubsSent[nodePub]; !ok && hasNodeAnn { - nodeAnn, err := e2.Node.NodeAnnouncement(true) - if err != nil { - return err - } - - announceMessages = append( - announceMessages, nodeAnn, - ) - nodePubsSent[nodePub] = struct{}{} - - numNodes++ - } - } - - numEdges++ - } - - return nil - }); err != nil && err != channeldb.ErrGraphNoEdgesFound { - log.Errorf("unable to sync infos with peer: %v", err) - return err - } - - log.Infof("Syncing channel graph state with %x, sending %v "+ - "vertexes and %v edges", syncPeer.PubKey(), - numNodes, numEdges) - - // With all the announcement messages gathered, send them all in a - // single batch to the target peer. - return syncPeer.SendMessageLazy(false, announceMessages...) -} - // PropagateChanPolicyUpdate signals the AuthenticatedGossiper to update the // channel forwarding policies for the specified channels. If no channels are // specified, then the update will be applied to all outgoing channels from the