diff --git a/chainreg/chaincode.go b/chainreg/chaincode.go new file mode 100644 index 00000000..70fc425d --- /dev/null +++ b/chainreg/chaincode.go @@ -0,0 +1,25 @@ +package chainreg + +// ChainCode is an enum-like structure for keeping track of the chains +// currently supported within lnd. +type ChainCode uint32 + +const ( + // BitcoinChain is Bitcoin's chain. + BitcoinChain ChainCode = iota + + // LitecoinChain is Litecoin's chain. + LitecoinChain +) + +// String returns a string representation of the target ChainCode. +func (c ChainCode) String() string { + switch c { + case BitcoinChain: + return "bitcoin" + case LitecoinChain: + return "litecoin" + default: + return "kekcoin" + } +} diff --git a/chainregistry.go b/chainregistry.go index bc60d15a..94b80fb6 100644 --- a/chainregistry.go +++ b/chainregistry.go @@ -22,6 +22,7 @@ import ( "github.com/lightningnetwork/lnd/chainntnfs/bitcoindnotify" "github.com/lightningnetwork/lnd/chainntnfs/btcdnotify" "github.com/lightningnetwork/lnd/chainntnfs/neutrinonotify" + "github.com/lightningnetwork/lnd/chainreg" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/input" @@ -102,30 +103,6 @@ var defaultLtcChannelConstraints = channeldb.ChannelConstraints{ MaxAcceptedHtlcs: input.MaxHTLCNumber / 2, } -// chainCode is an enum-like structure for keeping track of the chains -// currently supported within lnd. -type chainCode uint32 - -const ( - // bitcoinChain is Bitcoin's testnet chain. - bitcoinChain chainCode = iota - - // litecoinChain is Litecoin's testnet chain. - litecoinChain -) - -// String returns a string representation of the target chainCode. -func (c chainCode) String() string { - switch c { - case bitcoinChain: - return "bitcoin" - case litecoinChain: - return "litecoin" - default: - return "kekcoin" - } -} - // chainControl couples the three primary interfaces lnd utilizes for a // particular chain together. A single chainControl instance will exist for all // the chains lnd is currently active on. @@ -167,7 +144,7 @@ func newChainControlFromConfig(cfg *Config, localDB, remoteDB *channeldb.DB, // Set the RPC config from the "home" chain. Multi-chain isn't yet // active, so we'll restrict usage to a particular chain for now. homeChainConfig := cfg.Bitcoin - if cfg.registeredChains.PrimaryChain() == litecoinChain { + if cfg.registeredChains.PrimaryChain() == chainreg.LitecoinChain { homeChainConfig = cfg.Litecoin } ltndLog.Infof("Primary chain is set to: %v", @@ -176,7 +153,7 @@ func newChainControlFromConfig(cfg *Config, localDB, remoteDB *channeldb.DB, cc := &chainControl{} switch cfg.registeredChains.PrimaryChain() { - case bitcoinChain: + case chainreg.BitcoinChain: cc.routingPolicy = htlcswitch.ForwardingPolicy{ MinHTLCOut: cfg.Bitcoin.MinHTLCOut, BaseFee: cfg.Bitcoin.BaseFee, @@ -188,7 +165,7 @@ func newChainControlFromConfig(cfg *Config, localDB, remoteDB *channeldb.DB, defaultBitcoinStaticFeePerKW, defaultBitcoinStaticMinRelayFeeRate, ) - case litecoinChain: + case chainreg.LitecoinChain: cc.routingPolicy = htlcswitch.ForwardingPolicy{ MinHTLCOut: cfg.Litecoin.MinHTLCOut, BaseFee: cfg.Litecoin.BaseFee, @@ -517,7 +494,7 @@ func newChainControlFromConfig(cfg *Config, localDB, remoteDB *channeldb.DB, // Select the default channel constraints for the primary chain. channelConstraints := defaultBtcChannelConstraints - if cfg.registeredChains.PrimaryChain() == litecoinChain { + if cfg.registeredChains.PrimaryChain() == chainreg.LitecoinChain { channelConstraints = defaultLtcChannelConstraints } @@ -592,13 +569,13 @@ var ( }) // chainMap is a simple index that maps a chain's genesis hash to the - // chainCode enum for that chain. - chainMap = map[chainhash.Hash]chainCode{ - bitcoinTestnetGenesis: bitcoinChain, - litecoinTestnetGenesis: litecoinChain, + // ChainCode enum for that chain. + chainMap = map[chainhash.Hash]chainreg.ChainCode{ + bitcoinTestnetGenesis: chainreg.BitcoinChain, + litecoinTestnetGenesis: chainreg.LitecoinChain, - bitcoinMainnetGenesis: bitcoinChain, - litecoinMainnetGenesis: litecoinChain, + bitcoinMainnetGenesis: chainreg.BitcoinChain, + litecoinMainnetGenesis: chainreg.LitecoinChain, } // chainDNSSeeds is a map of a chain's hash to the set of DNS seeds @@ -644,23 +621,25 @@ var ( type chainRegistry struct { sync.RWMutex - activeChains map[chainCode]*chainControl - netParams map[chainCode]*bitcoinNetParams + activeChains map[chainreg.ChainCode]*chainControl + netParams map[chainreg.ChainCode]*bitcoinNetParams - primaryChain chainCode + primaryChain chainreg.ChainCode } // newChainRegistry creates a new chainRegistry. func newChainRegistry() *chainRegistry { return &chainRegistry{ - activeChains: make(map[chainCode]*chainControl), - netParams: make(map[chainCode]*bitcoinNetParams), + activeChains: make(map[chainreg.ChainCode]*chainControl), + netParams: make(map[chainreg.ChainCode]*bitcoinNetParams), } } // RegisterChain assigns an active chainControl instance to a target chain -// identified by its chainCode. -func (c *chainRegistry) RegisterChain(newChain chainCode, cc *chainControl) { +// identified by its ChainCode. +func (c *chainRegistry) RegisterChain(newChain chainreg.ChainCode, + cc *chainControl) { + c.Lock() c.activeChains[newChain] = cc c.Unlock() @@ -668,7 +647,9 @@ func (c *chainRegistry) RegisterChain(newChain chainCode, cc *chainControl) { // LookupChain attempts to lookup an active chainControl instance for the // target chain. -func (c *chainRegistry) LookupChain(targetChain chainCode) (*chainControl, bool) { +func (c *chainRegistry) LookupChain(targetChain chainreg.ChainCode) ( + *chainControl, bool) { + c.RLock() cc, ok := c.activeChains[targetChain] c.RUnlock() @@ -691,7 +672,7 @@ func (c *chainRegistry) LookupChainByHash(chainHash chainhash.Hash) (*chainContr } // RegisterPrimaryChain sets a target chain as the "home chain" for lnd. -func (c *chainRegistry) RegisterPrimaryChain(cc chainCode) { +func (c *chainRegistry) RegisterPrimaryChain(cc chainreg.ChainCode) { c.Lock() defer c.Unlock() @@ -701,7 +682,7 @@ func (c *chainRegistry) RegisterPrimaryChain(cc chainCode) { // PrimaryChain returns the primary chain for this running lnd instance. The // primary chain is considered the "home base" while the other registered // chains are treated as secondary chains. -func (c *chainRegistry) PrimaryChain() chainCode { +func (c *chainRegistry) PrimaryChain() chainreg.ChainCode { c.RLock() defer c.RUnlock() @@ -709,11 +690,11 @@ func (c *chainRegistry) PrimaryChain() chainCode { } // ActiveChains returns a slice containing the active chains. -func (c *chainRegistry) ActiveChains() []chainCode { +func (c *chainRegistry) ActiveChains() []chainreg.ChainCode { c.RLock() defer c.RUnlock() - chains := make([]chainCode, 0, len(c.activeChains)) + chains := make([]chainreg.ChainCode, 0, len(c.activeChains)) for activeChain := range c.activeChains { chains = append(chains, activeChain) } diff --git a/config.go b/config.go index e576284a..dcb951f0 100644 --- a/config.go +++ b/config.go @@ -23,6 +23,7 @@ import ( "github.com/lightninglabs/neutrino" "github.com/lightningnetwork/lnd/autopilot" "github.com/lightningnetwork/lnd/build" + "github.com/lightningnetwork/lnd/chainreg" "github.com/lightningnetwork/lnd/chanbackup" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/discovery" @@ -873,7 +874,7 @@ func ValidateConfig(cfg Config, usageMessage string) (*Config, error) { switch cfg.Litecoin.Node { case "ltcd": err := parseRPCParams(cfg.Litecoin, cfg.LtcdMode, - litecoinChain, funcName, cfg.ActiveNetParams) + chainreg.LitecoinChain, funcName, cfg.ActiveNetParams) if err != nil { err := fmt.Errorf("unable to load RPC "+ "credentials for ltcd: %v", err) @@ -885,7 +886,7 @@ func ValidateConfig(cfg Config, usageMessage string) (*Config, error) { "support simnet", funcName) } err := parseRPCParams(cfg.Litecoin, cfg.LitecoindMode, - litecoinChain, funcName, cfg.ActiveNetParams) + chainreg.LitecoinChain, funcName, cfg.ActiveNetParams) if err != nil { err := fmt.Errorf("unable to load RPC "+ "credentials for litecoind: %v", err) @@ -899,11 +900,11 @@ func ValidateConfig(cfg Config, usageMessage string) (*Config, error) { cfg.Litecoin.ChainDir = filepath.Join(cfg.DataDir, defaultChainSubDirname, - litecoinChain.String()) + chainreg.LitecoinChain.String()) // Finally we'll register the litecoin chain as our current // primary chain. - cfg.registeredChains.RegisterPrimaryChain(litecoinChain) + cfg.registeredChains.RegisterPrimaryChain(chainreg.LitecoinChain) MaxFundingAmount = maxLtcFundingAmount case cfg.Bitcoin.Active: @@ -953,7 +954,7 @@ func ValidateConfig(cfg Config, usageMessage string) (*Config, error) { switch cfg.Bitcoin.Node { case "btcd": err := parseRPCParams( - cfg.Bitcoin, cfg.BtcdMode, bitcoinChain, funcName, + cfg.Bitcoin, cfg.BtcdMode, chainreg.BitcoinChain, funcName, cfg.ActiveNetParams, ) if err != nil { @@ -968,7 +969,7 @@ func ValidateConfig(cfg Config, usageMessage string) (*Config, error) { } err := parseRPCParams( - cfg.Bitcoin, cfg.BitcoindMode, bitcoinChain, funcName, + cfg.Bitcoin, cfg.BitcoindMode, chainreg.BitcoinChain, funcName, cfg.ActiveNetParams, ) if err != nil { @@ -987,11 +988,11 @@ func ValidateConfig(cfg Config, usageMessage string) (*Config, error) { cfg.Bitcoin.ChainDir = filepath.Join(cfg.DataDir, defaultChainSubDirname, - bitcoinChain.String()) + chainreg.BitcoinChain.String()) // Finally we'll register the bitcoin chain as our current // primary chain. - cfg.registeredChains.RegisterPrimaryChain(bitcoinChain) + cfg.registeredChains.RegisterPrimaryChain(chainreg.BitcoinChain) } // Ensure that the user didn't attempt to specify negative values for @@ -1312,8 +1313,9 @@ func CleanAndExpandPath(path string) string { return filepath.Clean(os.ExpandEnv(path)) } -func parseRPCParams(cConfig *lncfg.Chain, nodeConfig interface{}, net chainCode, - funcName string, netParams bitcoinNetParams) error { // nolint:unparam +func parseRPCParams(cConfig *lncfg.Chain, nodeConfig interface{}, + net chainreg.ChainCode, funcName string, + netParams bitcoinNetParams) error { // nolint:unparam // First, we'll check our node config to make sure the RPC parameters // were set correctly. We'll also determine the path to the conf file @@ -1329,11 +1331,11 @@ func parseRPCParams(cConfig *lncfg.Chain, nodeConfig interface{}, net chainCode, // Get the daemon name for displaying proper errors. switch net { - case bitcoinChain: + case chainreg.BitcoinChain: daemonName = "btcd" confDir = conf.Dir confFile = "btcd" - case litecoinChain: + case chainreg.LitecoinChain: daemonName = "ltcd" confDir = conf.Dir confFile = "ltcd" @@ -1376,11 +1378,11 @@ func parseRPCParams(cConfig *lncfg.Chain, nodeConfig interface{}, net chainCode, // Get the daemon name for displaying proper errors. switch net { - case bitcoinChain: + case chainreg.BitcoinChain: daemonName = "bitcoind" confDir = conf.Dir confFile = "bitcoin" - case litecoinChain: + case chainreg.LitecoinChain: daemonName = "litecoind" confDir = conf.Dir confFile = "litecoin" diff --git a/fundingmanager.go b/fundingmanager.go index 1f16fefc..8fcd2d4f 100644 --- a/fundingmanager.go +++ b/fundingmanager.go @@ -15,6 +15,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/go-errors/errors" "github.com/lightningnetwork/lnd/chainntnfs" + "github.com/lightningnetwork/lnd/chainreg" "github.com/lightningnetwork/lnd/chanacceptor" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/channeldb/kvdb" @@ -3060,9 +3061,9 @@ func (f *fundingManager) handleInitFundingMsg(msg *initFundingMsg) { // We'll determine our dust limit depending on which chain is active. var ourDustLimit btcutil.Amount switch f.cfg.RegisteredChains.PrimaryChain() { - case bitcoinChain: + case chainreg.BitcoinChain: ourDustLimit = lnwallet.DefaultDustLimit() - case litecoinChain: + case chainreg.LitecoinChain: ourDustLimit = defaultLitecoinDustLimit } diff --git a/lnd.go b/lnd.go index 676fb9d9..77ee8b30 100644 --- a/lnd.go +++ b/lnd.go @@ -36,6 +36,7 @@ import ( "github.com/lightningnetwork/lnd/autopilot" "github.com/lightningnetwork/lnd/build" "github.com/lightningnetwork/lnd/cert" + "github.com/lightningnetwork/lnd/chainreg" "github.com/lightningnetwork/lnd/chanacceptor" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/keychain" @@ -297,7 +298,7 @@ func Main(cfg *Config, lisCfg ListenerCfg, shutdownChan <-chan struct{}) error { // light client instance, if enabled, in order to allow it to sync // while the rest of the daemon continues startup. mainChain := cfg.Bitcoin - if cfg.registeredChains.PrimaryChain() == litecoinChain { + if cfg.registeredChains.PrimaryChain() == chainreg.LitecoinChain { mainChain = cfg.Litecoin } var neutrinoCS *neutrino.ChainService @@ -1038,7 +1039,7 @@ func waitForWalletPassword(cfg *Config, restEndpoints []net.Addr, defer grpcServer.GracefulStop() chainConfig := cfg.Bitcoin - if cfg.registeredChains.PrimaryChain() == litecoinChain { + if cfg.registeredChains.PrimaryChain() == chainreg.LitecoinChain { chainConfig = cfg.Litecoin } diff --git a/rpcserver.go b/rpcserver.go index 7a49d93d..a9821177 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -32,6 +32,7 @@ import ( proxy "github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/lightningnetwork/lnd/autopilot" "github.com/lightningnetwork/lnd/build" + "github.com/lightningnetwork/lnd/chainreg" "github.com/lightningnetwork/lnd/chanacceptor" "github.com/lightningnetwork/lnd/chanbackup" "github.com/lightningnetwork/lnd/chanfitness" @@ -4679,7 +4680,7 @@ func (r *rpcServer) AddInvoice(ctx context.Context, invoice *lnrpc.Invoice) (*lnrpc.AddInvoiceResponse, error) { defaultDelta := r.cfg.Bitcoin.TimeLockDelta - if r.cfg.registeredChains.PrimaryChain() == litecoinChain { + if r.cfg.registeredChains.PrimaryChain() == chainreg.LitecoinChain { defaultDelta = r.cfg.Litecoin.TimeLockDelta } diff --git a/server.go b/server.go index 177d0892..5d887e3a 100644 --- a/server.go +++ b/server.go @@ -27,6 +27,7 @@ import ( sphinx "github.com/lightningnetwork/lightning-onion" "github.com/lightningnetwork/lnd/autopilot" "github.com/lightningnetwork/lnd/brontide" + "github.com/lightningnetwork/lnd/chainreg" "github.com/lightningnetwork/lnd/chanacceptor" "github.com/lightningnetwork/lnd/chanbackup" "github.com/lightningnetwork/lnd/chanfitness" @@ -974,7 +975,7 @@ func newServer(cfg *Config, listenAddrs []net.Addr, chainCfg := cfg.Bitcoin minRemoteDelay := minBtcRemoteDelay maxRemoteDelay := maxBtcRemoteDelay - if primaryChain == litecoinChain { + if primaryChain == chainreg.LitecoinChain { chainCfg = cfg.Litecoin minRemoteDelay = minLtcRemoteDelay maxRemoteDelay = maxLtcRemoteDelay diff --git a/subrpcserver_config.go b/subrpcserver_config.go index 26ecc3fe..13749e4a 100644 --- a/subrpcserver_config.go +++ b/subrpcserver_config.go @@ -7,6 +7,7 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btclog" "github.com/lightningnetwork/lnd/autopilot" + "github.com/lightningnetwork/lnd/chainreg" "github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/invoices" @@ -211,7 +212,7 @@ func (s *subRPCServerConfigs) PopulateDependencies(cfg *Config, cc *chainControl reflect.ValueOf(nodeSigner), ) defaultDelta := cfg.Bitcoin.TimeLockDelta - if cfg.registeredChains.PrimaryChain() == litecoinChain { + if cfg.registeredChains.PrimaryChain() == chainreg.LitecoinChain { defaultDelta = cfg.Litecoin.TimeLockDelta } subCfgValue.FieldByName("DefaultCLTVExpiry").Set(