From 31ae48c59c5c36d5c436bfa9999e13a4806bba87 Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Fri, 19 Nov 2021 15:58:56 -0800 Subject: [PATCH] feature: if a bit is unset, then all other features that dep it should be This fixes an issue where if one tries to unset a feature like anchors, and other feature depend on it, then `lnd` fails to start as it realizes that its dependnacy set is inconsistent. Fixes https://github.com/lightningnetwork/lnd/issues/6002 --- feature/manager.go | 15 +++++++++++++++ feature/manager_internal_test.go | 10 ++++++++++ 2 files changed, 25 insertions(+) diff --git a/feature/manager.go b/feature/manager.go index 50a54d625..9d5d1cad4 100644 --- a/feature/manager.go +++ b/feature/manager.go @@ -91,6 +91,21 @@ func newManager(cfg Config, desc setDesc) (*Manager, error) { if cfg.NoAnchors { raw.Unset(lnwire.AnchorsZeroFeeHtlcTxOptional) raw.Unset(lnwire.AnchorsZeroFeeHtlcTxRequired) + + // If anchors are disabled, then we also need to + // disable all other features that depend on it as + // well, as otherwise we may create an invalid feature + // bit set. + for bit, depFeatures := range deps { + for depFeature := range depFeatures { + switch { + case depFeature == lnwire.AnchorsZeroFeeHtlcTxRequired: + fallthrough + case depFeature == lnwire.AnchorsZeroFeeHtlcTxOptional: + raw.Unset(bit) + } + } + } } if cfg.NoWumbo { raw.Unset(lnwire.WumboChannelsOptional) diff --git a/feature/manager_internal_test.go b/feature/manager_internal_test.go index 9c97bd052..2778a86d9 100644 --- a/feature/manager_internal_test.go +++ b/feature/manager_internal_test.go @@ -52,6 +52,12 @@ var managerTests = []managerTest{ NoStaticRemoteKey: true, }, }, + { + name: "anchors should disable anything dependent on it", + cfg: Config{ + NoAnchors: true, + }, + }, } // TestManager asserts basic initialazation and operation of a feature manager, @@ -104,6 +110,10 @@ func testManager(t *testing.T, test managerTest) { if test.cfg.NoStaticRemoteKey { assertUnset(lnwire.StaticRemoteKeyOptional) } + if test.cfg.NoAnchors { + assertUnset(lnwire.ScriptEnforcedLeaseRequired) + assertUnset(lnwire.ScriptEnforcedLeaseOptional) + } assertUnset(unknownFeature) }