From 653d557fec9fbc50d9e0b1b4a642c387bf41429a Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Mon, 5 Aug 2019 21:34:46 -0700 Subject: [PATCH] config: add new legacy protocol build tag protected sub-config for legacy onion In this commit, we add a new build tag protected sub-config for legacy protocol features. The goal of this addition is to be able to default to new feature within lnd, but expose hooks at the config level to allow integration tests to force the old behavior to ensure that we're able to support both the old+new versions. --- config.go | 2 ++ lncfg/protocol_legacy_off.go | 16 ++++++++++++++++ lncfg/protocol_legacy_on.go | 20 ++++++++++++++++++++ server.go | 7 ++++++- 4 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 lncfg/protocol_legacy_off.go create mode 100644 lncfg/protocol_legacy_on.go diff --git a/config.go b/config.go index b22cbf2f..fdb4344d 100644 --- a/config.go +++ b/config.go @@ -328,6 +328,8 @@ type config struct { WtClient *lncfg.WtClient `group:"wtclient" namespace:"wtclient"` Watchtower *lncfg.Watchtower `group:"watchtower" namespace:"watchtower"` + + LegacyProtocol *lncfg.LegacyProtocol `group:"legacyprotocol" namespace:"legacyprotocol"` } // loadConfig initializes and parses the config using a config file and command diff --git a/lncfg/protocol_legacy_off.go b/lncfg/protocol_legacy_off.go new file mode 100644 index 00000000..6f5660e9 --- /dev/null +++ b/lncfg/protocol_legacy_off.go @@ -0,0 +1,16 @@ +// +build !dev + +package lncfg + +// LegacyProtocol is a struct that we use to be able to test backwards +// compatibility of protocol additions, while defaulting to the latest within +// lnd. +type LegacyProtocol struct { +} + +// LegacyOnion returns true if the old legacy onion format should be used when +// we're an intermediate or final hop. This controls if we set the +// TLVOnionPayloadOptional bit or not. +func (l *LegacyProtocol) LegacyOnion() bool { + return false +} diff --git a/lncfg/protocol_legacy_on.go b/lncfg/protocol_legacy_on.go new file mode 100644 index 00000000..52bd9388 --- /dev/null +++ b/lncfg/protocol_legacy_on.go @@ -0,0 +1,20 @@ +// +build dev + +package lncfg + +// LegacyProtocol is a struct that we use to be able to test backwards +// compatibility of protocol additions, while defaulting to the latest within +// lnd. +type LegacyProtocol struct { + // Onion if set to true, then we won't signal TLVOnionPayloadOptional. + // As a result, nodes that include us in the route won't use the new + // modern onion framing. + Onion bool `long:"onion" description:"force node to not advertise the new modern TLV onion format"` +} + +// LegacyOnion returns true if the old legacy onion format should be used when +// we're an intermediate or final hop. This controls if we set the +// TLVOnionPayloadOptional bit or not. +func (l *LegacyProtocol) LegacyOnion() bool { + return l.Onion +} diff --git a/server.go b/server.go index d1b89ccd..7a37e769 100644 --- a/server.go +++ b/server.go @@ -312,7 +312,12 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB, } globalFeatures := lnwire.NewRawFeatureVector() - globalFeatures.Set(lnwire.TLVOnionPayloadOptional) + + // Only if we're not being forced to use the legacy onion format, will + // we signal our knowledge of the new TLV onion format. + if !cfg.LegacyProtocol.LegacyOnion() { + globalFeatures.Set(lnwire.TLVOnionPayloadOptional) + } var serializedPubKey [33]byte copy(serializedPubKey[:], privKey.PubKey().SerializeCompressed())