From bf9dab62425e68efe0938937c20e7dc2edb7462e Mon Sep 17 00:00:00 2001 From: Olaoluwa Osuntokun Date: Sat, 8 Jun 2024 20:10:27 -0700 Subject: [PATCH] multi: hook up new aux interfaces --- config_builder.go | 9 +++++---- contractcourt/chain_arbitrator.go | 19 +++++++++++++++---- contractcourt/chain_watcher.go | 4 +--- funding/manager.go | 7 +++++++ lnwallet/channel.go | 3 ++- peer/brontide.go | 13 +++++++++++-- server.go | 17 ++++++++++++----- sweep/fee_bumper.go | 4 ++-- sweep/sweeper.go | 4 ++++ 9 files changed, 59 insertions(+), 21 deletions(-) diff --git a/config_builder.go b/config_builder.go index a1b596fa0..d34b217df 100644 --- a/config_builder.go +++ b/config_builder.go @@ -50,6 +50,7 @@ import ( "github.com/lightningnetwork/lnd/rpcperms" "github.com/lightningnetwork/lnd/signal" "github.com/lightningnetwork/lnd/sqldb" + "github.com/lightningnetwork/lnd/sweep" "github.com/lightningnetwork/lnd/walletunlocker" "github.com/lightningnetwork/lnd/watchtower" "github.com/lightningnetwork/lnd/watchtower/wtclient" @@ -188,13 +189,13 @@ type AuxComponents struct { // modify the way a coop-close transaction is constructed. AuxChanCloser fn.Option[chancloser.AuxChanCloser] + // AuxSweeper is an optional interface that can be used to modify the + // way sweep transaction are generated. + AuxSweeper fn.Option[sweep.AuxSweeper] + // AuxContractResolver is an optional interface that can be used to // modify the way contracts are resolved. AuxContractResolver fn.Option[lnwallet.AuxContractResolver] - - // AuxSweeper is an optional interface that can be used to modify the - // way sweep transaction are generated. - AuxSweeper fn.Option[lnwallet.AuxContractResolver] } // DefaultWalletImpl is the default implementation of our normal, btcwallet diff --git a/contractcourt/chain_arbitrator.go b/contractcourt/chain_arbitrator.go index d61e47901..b81003156 100644 --- a/contractcourt/chain_arbitrator.go +++ b/contractcourt/chain_arbitrator.go @@ -225,6 +225,10 @@ type ChainArbitratorConfig struct { // AuxSigner is an optional signer that can be used to sign auxiliary // leaves for certain custom channel types. AuxSigner fn.Option[lnwallet.AuxSigner] + + // AuxResolver is an optional interface that can be used to modify the + // way contracts are resolved. + AuxResolver fn.Option[lnwallet.AuxContractResolver] } // ChainArbitrator is a sub-system that oversees the on-chain resolution of all @@ -314,6 +318,9 @@ func (a *arbChannel) NewAnchorResolutions() (*lnwallet.AnchorResolutions, a.c.cfg.AuxSigner.WhenSome(func(s lnwallet.AuxSigner) { chanOpts = append(chanOpts, lnwallet.WithAuxSigner(s)) }) + a.c.cfg.AuxResolver.WhenSome(func(s lnwallet.AuxContractResolver) { + chanOpts = append(chanOpts, lnwallet.WithAuxResolver(s)) + }) chanMachine, err := lnwallet.NewLightningChannel( a.c.cfg.Signer, channel, nil, chanOpts..., @@ -367,6 +374,9 @@ func (a *arbChannel) ForceCloseChan() (*lnwallet.LocalForceCloseSummary, error) a.c.cfg.AuxSigner.WhenSome(func(s lnwallet.AuxSigner) { chanOpts = append(chanOpts, lnwallet.WithAuxSigner(s)) }) + a.c.cfg.AuxResolver.WhenSome(func(s lnwallet.AuxContractResolver) { + chanOpts = append(chanOpts, lnwallet.WithAuxResolver(s)) + }) // Finally, we'll force close the channel completing // the force close workflow. @@ -1198,10 +1208,11 @@ func (c *ChainArbitrator) WatchNewChannel(newChan *channeldb.OpenChannel) error // that we detect any relevant on chain events. chainWatcher, err := newChainWatcher( chainWatcherConfig{ - chanState: newChan, - notifier: c.cfg.Notifier, - signer: c.cfg.Signer, - isOurAddr: c.cfg.IsOurAddress, + chanState: newChan, + notifier: c.cfg.Notifier, + signer: c.cfg.Signer, + isOurAddr: c.cfg.IsOurAddress, + auxResolver: c.cfg.AuxResolver, contractBreach: func( retInfo *lnwallet.BreachRetribution) error { diff --git a/contractcourt/chain_watcher.go b/contractcourt/chain_watcher.go index 52947412e..19bfd8b70 100644 --- a/contractcourt/chain_watcher.go +++ b/contractcourt/chain_watcher.go @@ -193,10 +193,8 @@ type chainWatcherConfig struct { // auxLeafStore can be used to fetch information for custom channels. auxLeafStore fn.Option[lnwallet.AuxLeafStore] - // auxResolver... + // auxResolver is used to supplement contract resolution. auxResolver fn.Option[lnwallet.AuxContractResolver] - - // TODO(roasbeef): always set in config ^ } // chainWatcher is a system that's assigned to every active channel. The duty diff --git a/funding/manager.go b/funding/manager.go index 77fba3072..d679d40b0 100644 --- a/funding/manager.go +++ b/funding/manager.go @@ -558,6 +558,10 @@ type Config struct { // AuxSigner is an optional signer that can be used to sign auxiliary // leaves for certain custom channel types. AuxSigner fn.Option[lnwallet.AuxSigner] + + // AuxResolver is an optional interface that can be used to modify the + // way contracts are resolved. + AuxResolver fn.Option[lnwallet.AuxContractResolver] } // Manager acts as an orchestrator/bridge between the wallet's @@ -1090,6 +1094,9 @@ func (f *Manager) advanceFundingState(channel *channeldb.OpenChannel, f.cfg.AuxSigner.WhenSome(func(s lnwallet.AuxSigner) { chanOpts = append(chanOpts, lnwallet.WithAuxSigner(s)) }) + f.cfg.AuxResolver.WhenSome(func(s lnwallet.AuxContractResolver) { + chanOpts = append(chanOpts, lnwallet.WithAuxResolver(s)) + }) // We create the state-machine object which wraps the database state. lnChannel, err := lnwallet.NewLightningChannel( diff --git a/lnwallet/channel.go b/lnwallet/channel.go index f5eacba76..fbbf27cc4 100644 --- a/lnwallet/channel.go +++ b/lnwallet/channel.go @@ -1467,7 +1467,8 @@ func WithAuxSigner(signer AuxSigner) ChannelOpt { } } -// WithAuxResolver... +// WithAuxResolver is used to specify a custom aux contract resolver for the +// channel. func WithAuxResolver(resolver AuxContractResolver) ChannelOpt { return func(o *channelOpts) { o.auxResolver = fn.Some[AuxContractResolver](resolver) diff --git a/peer/brontide.go b/peer/brontide.go index 9f6536837..311ff0cf3 100644 --- a/peer/brontide.go +++ b/peer/brontide.go @@ -395,6 +395,10 @@ type Config struct { // leaves for certain custom channel types. AuxSigner fn.Option[lnwallet.AuxSigner] + // AuxResolver is an optional interface that can be used to modify the + // way contracts are resolved. + AuxResolver fn.Option[lnwallet.AuxContractResolver] + // PongBuf is a slice we'll reuse instead of allocating memory on the // heap. Since only reads will occur and no writes, there is no need // for any synchronization primitives. As a result, it's safe to share @@ -982,8 +986,6 @@ func (p *Brontide) loadActiveChannels(chans []*channeldb.OpenChannel) ( } } - // TODO(roasbeef): also make aux resolver here - var chanOpts []lnwallet.ChannelOpt p.cfg.AuxLeafStore.WhenSome(func(s lnwallet.AuxLeafStore) { chanOpts = append(chanOpts, lnwallet.WithLeafStore(s)) @@ -991,6 +993,10 @@ func (p *Brontide) loadActiveChannels(chans []*channeldb.OpenChannel) ( p.cfg.AuxSigner.WhenSome(func(s lnwallet.AuxSigner) { chanOpts = append(chanOpts, lnwallet.WithAuxSigner(s)) }) + p.cfg.AuxResolver.WhenSome(func(s lnwallet.AuxContractResolver) { //nolint:lll + chanOpts = append(chanOpts, lnwallet.WithAuxResolver(s)) + }) + lnChan, err := lnwallet.NewLightningChannel( p.cfg.Signer, dbChan, p.cfg.SigPool, chanOpts..., ) @@ -4163,6 +4169,9 @@ func (p *Brontide) addActiveChannel(c *lnpeer.NewChannel) error { p.cfg.AuxSigner.WhenSome(func(s lnwallet.AuxSigner) { chanOpts = append(chanOpts, lnwallet.WithAuxSigner(s)) }) + p.cfg.AuxResolver.WhenSome(func(s lnwallet.AuxContractResolver) { + chanOpts = append(chanOpts, lnwallet.WithAuxResolver(s)) + }) // If not already active, we'll add this channel to the set of active // channels, so we can look it up later easily according to its channel diff --git a/server.go b/server.go index 406c9bd0d..2dbc85d63 100644 --- a/server.go +++ b/server.go @@ -1094,10 +1094,11 @@ func newServer(cfg *Config, listenAddrs []net.Addr, ) s.txPublisher = sweep.NewTxPublisher(sweep.TxPublisherConfig{ - Signer: cc.Wallet.Cfg.Signer, - Wallet: cc.Wallet, - Estimator: cc.FeeEstimator, - Notifier: cc.ChainNotifier, + Signer: cc.Wallet.Cfg.Signer, + Wallet: cc.Wallet, + Estimator: cc.FeeEstimator, + Notifier: cc.ChainNotifier, + AuxSweeper: s.implCfg.AuxSweeper, }) s.sweeper = sweep.New(&sweep.UtxoSweeperConfig{ @@ -1115,6 +1116,7 @@ func newServer(cfg *Config, listenAddrs []net.Addr, Aggregator: aggregator, Publisher: s.txPublisher, NoDeadlineConfTarget: cfg.Sweeper.NoDeadlineConfTarget, + AuxSweeper: s.implCfg.AuxSweeper, }) s.utxoNursery = contractcourt.NewUtxoNursery(&contractcourt.NurseryConfig{ @@ -1292,6 +1294,7 @@ func newServer(cfg *Config, listenAddrs []net.Addr, }, AuxLeafStore: implCfg.AuxLeafStore, AuxSigner: implCfg.AuxSigner, + AuxResolver: implCfg.AuxContractResolver, }, dbs.ChanStateDB) // Select the configuration and funding parameters for Bitcoin. @@ -1540,6 +1543,8 @@ func newServer(cfg *Config, listenAddrs []net.Addr, AliasManager: s.aliasMgr, IsSweeperOutpoint: s.sweeper.IsSweeperOutpoint, AuxFundingController: implCfg.AuxFundingController, + AuxSigner: implCfg.AuxSigner, + AuxResolver: implCfg.AuxContractResolver, }) if err != nil { return nil, err @@ -1627,7 +1632,8 @@ func newServer(cfg *Config, listenAddrs []net.Addr, br, err := lnwallet.NewBreachRetribution( channel, commitHeight, 0, nil, - implCfg.AuxLeafStore, implCfg.AuxSweeper, + implCfg.AuxLeafStore, + implCfg.AuxContractResolver, ) if err != nil { return nil, 0, err @@ -3975,6 +3981,7 @@ func (s *server) peerConnected(conn net.Conn, connReq *connmgr.ConnReq, AuxSigner: s.implCfg.AuxSigner, MsgRouter: s.implCfg.MsgRouter, AuxChanCloser: s.implCfg.AuxChanCloser, + AuxResolver: s.implCfg.AuxContractResolver, } copy(pCfg.PubKeyBytes[:], peerAddr.IdentityKey.SerializeCompressed()) diff --git a/sweep/fee_bumper.go b/sweep/fee_bumper.go index d659ededa..c5c875ed2 100644 --- a/sweep/fee_bumper.go +++ b/sweep/fee_bumper.go @@ -258,8 +258,8 @@ type TxPublisherConfig struct { // Notifier is used to monitor the confirmation status of the tx. Notifier chainntnfs.ChainNotifier - // AuxSweeper is an optional interface that can be used to shape the - // way the final sweep transaction is generated. + // AuxSweeper is an optional interface that can be used to modify the + // way sweep transaction are generated. AuxSweeper fn.Option[AuxSweeper] } diff --git a/sweep/sweeper.go b/sweep/sweeper.go index b0c2cd1f8..4fdb9d359 100644 --- a/sweep/sweeper.go +++ b/sweep/sweeper.go @@ -361,6 +361,10 @@ type UtxoSweeperConfig struct { // NoDeadlineConfTarget is the conf target to use when sweeping // non-time-sensitive outputs. NoDeadlineConfTarget uint32 + + // AuxSweeper is an optional interface that can be used to modify the + // way sweep transaction are generated. + AuxSweeper fn.Option[AuxSweeper] } // Result is the struct that is pushed through the result channel. Callers can