From 19e1da3c38ff91e1c1384d7fbf1eeacecc80e916 Mon Sep 17 00:00:00 2001 From: Ryan Date: Tue, 13 Sep 2022 00:06:58 -0700 Subject: [PATCH] feat(cmd): Provide ability to specify network to user (#1073) * feat(cmd): adding network flag, deprecating CELESTIA_PRIVATE_GENESIS, changing default store extension * fix(cmd): validating network passed with --node.network * feat(cmd): dynamic network list for command hint --- cmd/cel-key/node_types.go | 38 +++++++++++++++++++++----------------- cmd/cel-shed/header.go | 12 ++++++++---- cmd/celestia/bridge.go | 4 ++-- cmd/celestia/full.go | 4 ++-- cmd/celestia/light.go | 4 ++-- cmd/flags_node.go | 32 +++++++++++++++++++++++++++----- params/default.go | 16 +++++++++------- params/genesis.go | 1 - params/network.go | 14 +++++++++++++- 9 files changed, 84 insertions(+), 41 deletions(-) diff --git a/cmd/cel-key/node_types.go b/cmd/cel-key/node_types.go index f167ca345f..70c3eed76b 100644 --- a/cmd/cel-key/node_types.go +++ b/cmd/cel-key/node_types.go @@ -2,25 +2,35 @@ package main import ( "fmt" + "strings" "github.com/spf13/cobra" flag "github.com/spf13/pflag" + "github.com/celestiaorg/celestia-node/params" + sdkflags "github.com/cosmos/cosmos-sdk/client/flags" ) var ( - nodeDirKey = "node.type" - - bridgeDir = "~/.celestia-bridge/keys" - fullDir = "~/.celestia-full/keys" - lightDir = "~/.celestia-light/keys" + nodeDirKey = "node.type" + nodeNetworkKey = "node.network" ) func DirectoryFlags() *flag.FlagSet { flags := &flag.FlagSet{} - flags.String(nodeDirKey, "", "Sets key utility to use the node type's directory (e.g. "+ - "~/.celestia-light if --node.type light is passed).") + defaultNetwork := string(params.DefaultNetwork()) + + flags.String( + nodeDirKey, + "", + "Sets key utility to use the node type's directory (e.g. "+ + "~/.celestia-light-"+strings.ToLower(defaultNetwork)+" if --node.type light is passed).") + flags.String( + nodeNetworkKey, + defaultNetwork, + "Sets key utility to use the node network's directory (e.g. "+ + "~/.celestia-light-mynetwork if --node.network MyNetwork is passed).") return flags } @@ -31,17 +41,11 @@ func ParseDirectoryFlags(cmd *cobra.Command) error { return nil } + network := cmd.Flag(nodeNetworkKey).Value.String() switch nodeType { - case "bridge": - if err := cmd.Flags().Set(sdkflags.FlagKeyringDir, bridgeDir); err != nil { - return err - } - case "full": - if err := cmd.Flags().Set(sdkflags.FlagKeyringDir, fullDir); err != nil { - return err - } - case "light": - if err := cmd.Flags().Set(sdkflags.FlagKeyringDir, lightDir); err != nil { + case "bridge", "full", "light": + keyPath := fmt.Sprintf("~/.celestia-%s-%s", nodeType, strings.ToLower(network)) + if err := cmd.Flags().Set(sdkflags.FlagKeyringDir, keyPath); err != nil { return err } default: diff --git a/cmd/cel-shed/header.go b/cmd/cel-shed/header.go index c1c9e7ec99..b2e09f30cd 100644 --- a/cmd/cel-shed/header.go +++ b/cmd/cel-shed/header.go @@ -21,12 +21,12 @@ var headerCmd = &cobra.Command{ } var headerStoreInit = &cobra.Command{ - Use: "store-init [node-type] [height]", + Use: "store-init [node-type] [network] [height]", Short: `Forcefully initialize header store head to be of the given height. Requires the node being stopped. Custom store path is not supported yet.`, SilenceUsage: true, RunE: func(cmd *cobra.Command, args []string) error { - if len(args) != 2 { + if len(args) != 3 { return fmt.Errorf("not enough arguments") } @@ -35,12 +35,16 @@ Custom store path is not supported yet.`, return fmt.Errorf("invalid node-type") } - height, err := strconv.Atoi(args[1]) + network := args[1] + + height, err := strconv.Atoi(args[2]) if err != nil { return fmt.Errorf("invalid height: %w", err) } - s, err := node.OpenStore(fmt.Sprintf("~/.celestia-%s", strings.ToLower(tp.String()))) + s, err := node.OpenStore( + fmt.Sprintf("~/.celestia-%s-%s", strings.ToLower(tp.String()), strings.ToLower(network)), + ) if err != nil { return err } diff --git a/cmd/celestia/bridge.go b/cmd/celestia/bridge.go index 04491866e4..e5d73e6d32 100644 --- a/cmd/celestia/bridge.go +++ b/cmd/celestia/bridge.go @@ -13,7 +13,7 @@ import ( func init() { bridgeCmd.AddCommand( cmdnode.Init( - cmdnode.NodeFlags(node.Bridge), + cmdnode.NodeFlags(), cmdnode.P2PFlags(), cmdnode.CoreFlags(), cmdnode.MiscFlags(), @@ -21,7 +21,7 @@ func init() { cmdnode.KeyFlags(), ), cmdnode.Start( - cmdnode.NodeFlags(node.Bridge), + cmdnode.NodeFlags(), cmdnode.P2PFlags(), cmdnode.CoreFlags(), cmdnode.MiscFlags(), diff --git a/cmd/celestia/full.go b/cmd/celestia/full.go index a30c761898..7cd7c7f3c7 100644 --- a/cmd/celestia/full.go +++ b/cmd/celestia/full.go @@ -14,7 +14,7 @@ import ( func init() { fullCmd.AddCommand( cmdnode.Init( - cmdnode.NodeFlags(node.Full), + cmdnode.NodeFlags(), cmdnode.P2PFlags(), cmdnode.HeadersFlags(), cmdnode.MiscFlags(), @@ -25,7 +25,7 @@ func init() { cmdnode.KeyFlags(), ), cmdnode.Start( - cmdnode.NodeFlags(node.Full), + cmdnode.NodeFlags(), cmdnode.P2PFlags(), cmdnode.HeadersFlags(), cmdnode.MiscFlags(), diff --git a/cmd/celestia/light.go b/cmd/celestia/light.go index 72bbbfd269..3635a8bd0a 100644 --- a/cmd/celestia/light.go +++ b/cmd/celestia/light.go @@ -14,7 +14,7 @@ import ( func init() { lightCmd.AddCommand( cmdnode.Init( - cmdnode.NodeFlags(node.Light), + cmdnode.NodeFlags(), cmdnode.P2PFlags(), cmdnode.HeadersFlags(), cmdnode.MiscFlags(), @@ -25,7 +25,7 @@ func init() { cmdnode.KeyFlags(), ), cmdnode.Start( - cmdnode.NodeFlags(node.Light), + cmdnode.NodeFlags(), cmdnode.P2PFlags(), cmdnode.HeadersFlags(), cmdnode.MiscFlags(), diff --git a/cmd/flags_node.go b/cmd/flags_node.go index 9d3ad72dfa..f4a5aed8f4 100644 --- a/cmd/flags_node.go +++ b/cmd/flags_node.go @@ -9,20 +9,22 @@ import ( flag "github.com/spf13/pflag" "github.com/celestiaorg/celestia-node/node" + "github.com/celestiaorg/celestia-node/params" ) var ( - nodeStoreFlag = "node.store" - nodeConfigFlag = "node.config" + nodeStoreFlag = "node.store" + nodeConfigFlag = "node.config" + nodeNetworkFlag = "node.network" ) // NodeFlags gives a set of hardcoded Node package flags. -func NodeFlags(tp node.Type) *flag.FlagSet { +func NodeFlags() *flag.FlagSet { flags := &flag.FlagSet{} flags.String( nodeStoreFlag, - fmt.Sprintf("~/.celestia-%s", strings.ToLower(tp.String())), + "", "The path to root/home directory of your Celestia Node Store", ) flags.String( @@ -30,13 +32,33 @@ func NodeFlags(tp node.Type) *flag.FlagSet { "", "Path to a customized node config TOML file", ) + flags.String( + nodeNetworkFlag, + "", + "The name of the network to connect to, e.g. "+params.ListProvidedNetworks(), + ) return flags } // ParseNodeFlags parses Node flags from the given cmd and applies values to Env. func ParseNodeFlags(ctx context.Context, cmd *cobra.Command) (context.Context, error) { - ctx = WithStorePath(ctx, cmd.Flag(nodeStoreFlag).Value.String()) + network := cmd.Flag(nodeNetworkFlag).Value.String() + if network != "" { + err := params.SetDefaultNetwork(params.Network(network)) + if err != nil { + return ctx, err + } + } else { + network = string(params.DefaultNetwork()) + } + + store := cmd.Flag(nodeStoreFlag).Value.String() + if store == "" { + tp := NodeType(ctx) + store = fmt.Sprintf("~/.celestia-%s-%s", strings.ToLower(tp.String()), strings.ToLower(network)) + } + ctx = WithStorePath(ctx, store) nodeConfig := cmd.Flag(nodeConfigFlag).Value.String() if nodeConfig != "" { diff --git a/params/default.go b/params/default.go index 68caa39e8f..0915bc7f67 100644 --- a/params/default.go +++ b/params/default.go @@ -7,8 +7,7 @@ import ( ) const ( - EnvCustomNetwork = "CELESTIA_CUSTOM" - EnvPrivateGenesis = "CELESTIA_PRIVATE_GENESIS" + EnvCustomNetwork = "CELESTIA_CUSTOM" ) // defaultNetwork defines a default network for the Celestia Node. @@ -19,6 +18,14 @@ func DefaultNetwork() Network { return defaultNetwork } +func SetDefaultNetwork(net Network) error { + if err := net.Validate(); err != nil { + return err + } + defaultNetwork = net + return nil +} + func init() { // check if custom network option set // format: CELESTIA_CUSTOM=:: @@ -52,9 +59,4 @@ func init() { bootstrapList[Network(netID)] = bs } } - // check if private network option set - if genesis, ok := os.LookupEnv(EnvPrivateGenesis); ok { - defaultNetwork = Private - genesisList[Private] = strings.ToUpper(genesis) - } } diff --git a/params/genesis.go b/params/genesis.go index 6880c8dbed..8c6c778662 100644 --- a/params/genesis.go +++ b/params/genesis.go @@ -4,7 +4,6 @@ import "fmt" // GenesisFor reports a hash of a genesis block for a given network. // Genesis is strictly defined and can't be modified. -// To run a custom genesis private network use CELESTIA_PRIVATE_GENESIS env var. func GenesisFor(net Network) (string, error) { if err := net.Validate(); err != nil { return "", err diff --git a/params/network.go b/params/network.go index 21467c8ebd..af8bdc9e16 100644 --- a/params/network.go +++ b/params/network.go @@ -13,7 +13,6 @@ const ( // Mamaki testnet. See: celestiaorg/networks. Mamaki Network = "mamaki" // Private can be used to set up any private network, including local testing setups. - // Use CELESTIA_PRIVATE_GENESIS env var to enable Private by specifying its genesis block hash. Private Network = "private" ) @@ -40,3 +39,16 @@ var networksList = map[Network]struct{}{ Mamaki: {}, Private: {}, } + +// ListProvidedNetworks provides a string listing all known long-standing networks for things like command hints. +func ListProvidedNetworks() string { + var networks string + for net := range networksList { + // "private" network isn't really a choosable option, so skip + if net != Private { + networks += string(net) + ", " + } + } + // chop off trailing ", " + return networks[:len(networks)-2] +}