From 6c86075354f6db6b784dfb93298a50933bd5108a Mon Sep 17 00:00:00 2001 From: Conner Fromknecht Date: Fri, 8 Nov 2019 05:29:29 -0800 Subject: [PATCH] peer+server: use feature manager to generate feature vectors --- peer.go | 24 ++++++++++++++++-------- server.go | 39 +++++++++++++++++++++------------------ 2 files changed, 37 insertions(+), 26 deletions(-) diff --git a/peer.go b/peer.go index ade90b41..a46a1b7d 100644 --- a/peer.go +++ b/peer.go @@ -190,9 +190,16 @@ type peer struct { server *server - // localFeatures is the set of local features that we advertised to the - // remote node. - localFeatures *lnwire.RawFeatureVector + // features is the set of features that we advertised to the remote + // node. + features *lnwire.FeatureVector + + // legacyFeatures is the set of features that we advertised to the remote + // node for backwards compatibility. Nodes that have not implemented + // flat featurs will still be able to read our feature bits from the + // legacy global field, but we will also advertise everything in the + // default features field. + legacyFeatures *lnwire.FeatureVector // outgoingCltvRejectDelta defines the number of blocks before expiry of // an htlc where we don't offer an htlc anymore. @@ -234,7 +241,7 @@ var _ lnpeer.Peer = (*peer)(nil) // pointer to the main server. func newPeer(conn net.Conn, connReq *connmgr.ConnReq, server *server, addr *lnwire.NetAddress, inbound bool, - localFeatures *lnwire.RawFeatureVector, + features, legacyFeatures *lnwire.FeatureVector, chanActiveTimeout time.Duration, outgoingCltvRejectDelta uint32) ( *peer, error) { @@ -252,7 +259,8 @@ func newPeer(conn net.Conn, connReq *connmgr.ConnReq, server *server, server: server, - localFeatures: localFeatures, + features: features, + legacyFeatures: legacyFeatures, outgoingCltvRejectDelta: outgoingCltvRejectDelta, @@ -2425,7 +2433,7 @@ func (p *peer) handleInitMsg(msg *lnwire.Init) error { // // NOTE: Part of the lnpeer.Peer interface. func (p *peer) LocalGlobalFeatures() *lnwire.FeatureVector { - return p.server.globalFeatures + return p.features } // RemoteGlobalFeatures returns the set of global features that has been @@ -2441,8 +2449,8 @@ func (p *peer) RemoteGlobalFeatures() *lnwire.FeatureVector { // supported local and global features. func (p *peer) sendInitMsg() error { msg := lnwire.NewInitMessage( - p.server.globalFeatures.RawFeatureVector, - p.localFeatures, + p.legacyFeatures.RawFeatureVector, + p.features.RawFeatureVector, ) return p.writeMessage(msg) diff --git a/server.go b/server.go index b8872e9e..fbe88c26 100644 --- a/server.go +++ b/server.go @@ -35,6 +35,7 @@ import ( "github.com/lightningnetwork/lnd/channelnotifier" "github.com/lightningnetwork/lnd/contractcourt" "github.com/lightningnetwork/lnd/discovery" + "github.com/lightningnetwork/lnd/feature" "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/htlcswitch/hop" "github.com/lightningnetwork/lnd/input" @@ -232,9 +233,9 @@ type server struct { readPool *pool.Read - // globalFeatures feature vector which affects HTLCs and thus are also - // advertised to other nodes. - globalFeatures *lnwire.FeatureVector + // featureMgr dispatches feature vectors for various contexts within the + // daemon. + featureMgr *feature.Manager // currentNodeAnn is the node announcement that has been broadcast to // the network upon startup, if the attributes of the node (us) has @@ -369,6 +370,14 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB, readBufferPool, cfg.Workers.Read, pool.DefaultWorkerTimeout, ) + featureMgr, err := feature.NewManager(feature.Config{ + NoTLVOnion: cfg.LegacyProtocol.LegacyOnion(), + NoStaticRemoteKey: cfg.LegacyProtocol.LegacyCommitment(), + }) + if err != nil { + return nil, err + } + s := &server{ chanDB: chanDB, cc: cc, @@ -405,10 +414,8 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB, peerConnectedListeners: make(map[string][]chan<- lnpeer.Peer), peerDisconnectedListeners: make(map[string][]chan<- struct{}), - globalFeatures: lnwire.NewFeatureVector( - globalFeatures, lnwire.GlobalFeatures, - ), - quit: make(chan struct{}), + featureMgr: featureMgr, + quit: make(chan struct{}), } s.witnessBeacon = &preimageBeacon{ @@ -594,7 +601,7 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB, LastUpdate: time.Now(), Addresses: selfAddrs, Alias: nodeAlias.String(), - Features: s.globalFeatures, + Features: s.featureMgr.Get(feature.SetNodeAnn), Color: color, } copy(selfNode.PubKeyBytes[:], privKey.PubKey().SerializeCompressed()) @@ -2727,14 +2734,10 @@ func (s *server) peerConnected(conn net.Conn, connReq *connmgr.ConnReq, ChainNet: activeNetParams.Net, } - // With the brontide connection established, we'll now craft the local - // feature vector to advertise to the remote node. - localFeatures := lnwire.NewRawFeatureVector() - - // We'll signal that we understand the data loss protection feature, - // and also that we support the new gossip query features. - localFeatures.Set(lnwire.DataLossProtectRequired) - localFeatures.Set(lnwire.GossipQueriesOptional) + // With the brontide connection established, we'll now craft the feature + // vectors to advertise to the remote node. + initFeatures := s.featureMgr.Get(feature.SetInit) + legacyFeatures := s.featureMgr.Get(feature.SetLegacyGlobal) // Now that we've established a connection, create a peer, and it to the // set of currently active peers. Configure the peer with the incoming @@ -2743,8 +2746,8 @@ func (s *server) peerConnected(conn net.Conn, connReq *connmgr.ConnReq, // htlcs, an extra block is added to prevent the channel from being // closed when the htlc is outstanding and a new block comes in. p, err := newPeer( - conn, connReq, s, peerAddr, inbound, localFeatures, - cfg.ChanEnableTimeout, + conn, connReq, s, peerAddr, inbound, initFeatures, + legacyFeatures, cfg.ChanEnableTimeout, defaultOutgoingCltvRejectDelta, ) if err != nil {