From 25040f9d4d484b4abe436372c65209ba27326e60 Mon Sep 17 00:00:00 2001 From: murraystewart96 Date: Mon, 18 May 2026 10:57:45 +0100 Subject: [PATCH 1/2] 5522: warn users when connecting watchtower client to local watchtower --- lnd.go | 8 +++++++- server.go | 4 +++- watchtower/wtclient/manager.go | 12 ++++++++++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/lnd.go b/lnd.go index 76b08a114a1..dc13e307ab8 100644 --- a/lnd.go +++ b/lnd.go @@ -19,6 +19,7 @@ import ( "sync" "time" + "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcutil" proxy "github.com/grpc-ecosystem/grpc-gateway/v2/runtime" "github.com/lightningnetwork/lnd/autopilot" @@ -623,13 +624,18 @@ func Main(cfg *Config, lisCfg ListenerCfg, implCfg *ImplementationCfg, multiAcceptor = chanacceptor.NewChainedAcceptor() } + var localTowerPubKey *btcec.PublicKey + if tower != nil { + localTowerPubKey = tower.PubKey() + } + // Set up the core server which will listen for incoming peer // connections. server, err := newServer( ctx, cfg, cfg.Listeners, dbs, activeChainControl, &idKeyDesc, activeChainControl.Cfg.WalletUnlockParams.ChansToRestore, multiAcceptor, torController, tlsManager, leaderElector, - implCfg, + implCfg, localTowerPubKey, ) if err != nil { return mkErr("unable to create server", err) diff --git a/server.go b/server.go index 45992c464cb..317d09c417b 100644 --- a/server.go +++ b/server.go @@ -617,7 +617,8 @@ func newServer(ctx context.Context, cfg *Config, listenAddrs []net.Addr, chanPredicate chanacceptor.ChannelAcceptor, torController *tor.Controller, tlsManager *TLSManager, leaderElector cluster.LeaderElector, - implCfg *ImplementationCfg) (*server, error) { + implCfg *ImplementationCfg, + localTowerPubKey *btcec.PublicKey) (*server, error) { var ( err error @@ -1830,6 +1831,7 @@ func newServer(ctx context.Context, cfg *Config, listenAddrs []net.Addr, MinBackoff: 10 * time.Second, MaxBackoff: 5 * time.Minute, MaxTasksInMemQueue: cfg.WtClient.MaxTasksInMemQueue, + LocalTowerPubKey: localTowerPubKey, }, policy, anchorPolicy, taprootPolicy, taprootFinalPolicy) if err != nil { return nil, err diff --git a/watchtower/wtclient/manager.go b/watchtower/wtclient/manager.go index 7a39c8ff73e..28d2bd78861 100644 --- a/watchtower/wtclient/manager.go +++ b/watchtower/wtclient/manager.go @@ -154,6 +154,10 @@ type Config struct { // MaxTasksInMemQueue is the maximum number of backup tasks that should // be kept in-memory. Any more tasks will overflow to disk. MaxTasksInMemQueue uint64 + + // Public key of the local tower if running local watchtower. + // Used to check if client is connecting to local node + LocalTowerPubKey *btcec.PublicKey } // Manager manages the various tower clients that are active. A client is @@ -359,6 +363,14 @@ func (m *Manager) Stop() error { // included will be considered when dialing it for session negotiations and // backups. func (m *Manager) AddTower(address *lnwire.NetAddress) error { + if m.cfg.LocalTowerPubKey != nil && + address.IdentityKey.IsEqual(m.cfg.LocalTowerPubKey) { + + log.Warnf("Connecting to local watchtower: " + + "if this node goes offline the tower will " + + "also be unavailable") + } + // We'll start by updating our persisted state, followed by the // in-memory state of each client, with the new tower. This might not // actually be a new tower, but it might include a new address at which From b2a5feb9a77b8a6c09e134c7fdd2cafca5a50950 Mon Sep 17 00:00:00 2001 From: murraystewart96 Date: Mon, 18 May 2026 11:08:54 +0100 Subject: [PATCH 2/2] 5522: improving comment --- watchtower/wtclient/manager.go | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/watchtower/wtclient/manager.go b/watchtower/wtclient/manager.go index 28d2bd78861..987272a785f 100644 --- a/watchtower/wtclient/manager.go +++ b/watchtower/wtclient/manager.go @@ -155,8 +155,10 @@ type Config struct { // be kept in-memory. Any more tasks will overflow to disk. MaxTasksInMemQueue uint64 - // Public key of the local tower if running local watchtower. - // Used to check if client is connecting to local node + // LocalTowerPubKey is the public key of the watchtower server running + // in the same process, or nil if no local tower is active. When set, + // AddTower will warn if the client attempts to register the local tower, + // since it shares the same failure domain as this node. LocalTowerPubKey *btcec.PublicKey }