Overwrite default config with CLI input even when the input value is considered as empty

This change will fix two issues:
1. When CLI sets a flag to an empty value in Go, e.g. 0 as to Uint64, the flag will be skipped and never set correctly. This problem could be solved by using option "WithOverwriteWithEmptyValue" when merge two configs.
2. The default non-empty value in server config will be overwritten to an empty value after flag initialization. This problem is solved by explicitly providing default value to all flags that have a default value option.
This commit is contained in:
Jerry 2022-05-31 18:52:18 -07:00
parent 4cec5f01c3
commit 96ac8d16d4
3 changed files with 366 additions and 298 deletions

View file

@ -956,14 +956,9 @@ func (c *Config) buildNode() (*node.Config, error) {
func (c *Config) Merge(cc ...*Config) error { func (c *Config) Merge(cc ...*Config) error {
for _, elem := range cc { for _, elem := range cc {
if err := mergo.Merge(c, elem, mergo.WithOverride, mergo.WithAppendSlice); err != nil { if err := mergo.Merge(c, elem, mergo.WithOverwriteWithEmptyValue, mergo.WithAppendSlice); err != nil {
return fmt.Errorf("failed to merge configurations: %v", err) return fmt.Errorf("failed to merge configurations: %v", err)
} }
// override max peers
if elem.P2P.MaxPeers == 0 {
c.P2P.MaxPeers = 0
}
} }
return nil return nil
} }

View file

@ -54,14 +54,11 @@ func TestConfigMerge(t *testing.T) {
} }
expected := &Config{ expected := &Config{
Chain: "1", Chain: "1",
NoSnapshot: true, NoSnapshot: false,
RequiredBlocks: map[string]string{ RequiredBlocks: map[string]string{
"a": "b", "a": "b",
"b": "c", "b": "c",
}, },
TxPool: &TxPoolConfig{
LifeTime: 5 * time.Second,
},
P2P: &P2PConfig{ P2P: &P2PConfig{
MaxPeers: 10, MaxPeers: 10,
Discovery: &P2PDiscovery{ Discovery: &P2PDiscovery{

View file

@ -10,24 +10,28 @@ func (c *Command) Flags() *flagset.Flagset {
f := flagset.NewFlagSet("server") f := flagset.NewFlagSet("server")
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "chain", Name: "chain",
Usage: "Name of the chain to sync", Usage: "Name of the chain to sync",
Value: &c.cliConfig.Chain, Value: &c.cliConfig.Chain,
Default: c.cliConfig.Chain,
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "name", Name: "name",
Usage: "Name/Identity of the node", Usage: "Name/Identity of the node",
Value: &c.cliConfig.Name, Value: &c.cliConfig.Name,
Default: c.cliConfig.Name,
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "log-level", Name: "log-level",
Usage: "Set log level for the server", Usage: "Set log level for the server",
Value: &c.cliConfig.LogLevel, Value: &c.cliConfig.LogLevel,
Default: c.cliConfig.LogLevel,
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "datadir", Name: "datadir",
Usage: "Path of the data directory to store information", Usage: "Path of the data directory to store information",
Value: &c.cliConfig.DataDir, Value: &c.cliConfig.DataDir,
Default: c.cliConfig.DataDir,
}) })
f.SliceStringFlag(&flagset.SliceStringFlag{ f.SliceStringFlag(&flagset.SliceStringFlag{
Name: "config", Name: "config",
@ -35,14 +39,16 @@ func (c *Command) Flags() *flagset.Flagset {
Value: &c.configFile, Value: &c.configFile,
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "syncmode", Name: "syncmode",
Usage: `Blockchain sync mode ("fast", "full", or "snap")`, Usage: `Blockchain sync mode ("fast", "full", or "snap")`,
Value: &c.cliConfig.SyncMode, Value: &c.cliConfig.SyncMode,
Default: c.cliConfig.SyncMode,
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "gcmode", Name: "gcmode",
Usage: `Blockchain garbage collection mode ("full", "archive")`, Usage: `Blockchain garbage collection mode ("full", "archive")`,
Value: &c.cliConfig.GcMode, Value: &c.cliConfig.GcMode,
Default: c.cliConfig.GcMode,
}) })
f.MapStringFlag(&flagset.MapStringFlag{ f.MapStringFlag(&flagset.MapStringFlag{
Name: "requiredblocks", Name: "requiredblocks",
@ -50,21 +56,24 @@ func (c *Command) Flags() *flagset.Flagset {
Value: &c.cliConfig.RequiredBlocks, Value: &c.cliConfig.RequiredBlocks,
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "no-snapshot", Name: "no-snapshot",
Usage: `Disables the snapshot-database mode (default = false)`, Usage: `Disables the snapshot-database mode (default = false)`,
Value: &c.cliConfig.NoSnapshot, Value: &c.cliConfig.NoSnapshot,
Default: c.cliConfig.NoSnapshot,
}) })
// heimdall // heimdall
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "bor.heimdall", Name: "bor.heimdall",
Usage: "URL of Heimdall service", Usage: "URL of Heimdall service",
Value: &c.cliConfig.Heimdall.URL, Value: &c.cliConfig.Heimdall.URL,
Default: c.cliConfig.Heimdall.URL,
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "bor.withoutheimdall", Name: "bor.withoutheimdall",
Usage: "Run without Heimdall service (for testing purpose)", Usage: "Run without Heimdall service (for testing purpose)",
Value: &c.cliConfig.Heimdall.Without, Value: &c.cliConfig.Heimdall.Without,
Default: c.cliConfig.Heimdall.Without,
}) })
// txpool options // txpool options
@ -75,90 +84,104 @@ func (c *Command) Flags() *flagset.Flagset {
Group: "Transaction Pool", Group: "Transaction Pool",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "txpool.nolocals", Name: "txpool.nolocals",
Usage: "Disables price exemptions for locally submitted transactions", Usage: "Disables price exemptions for locally submitted transactions",
Value: &c.cliConfig.TxPool.NoLocals, Value: &c.cliConfig.TxPool.NoLocals,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.NoLocals,
Group: "Transaction Pool",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "txpool.journal", Name: "txpool.journal",
Usage: "Disk journal for local transaction to survive node restarts", Usage: "Disk journal for local transaction to survive node restarts",
Value: &c.cliConfig.TxPool.Journal, Value: &c.cliConfig.TxPool.Journal,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.Journal,
Group: "Transaction Pool",
}) })
f.DurationFlag(&flagset.DurationFlag{ f.DurationFlag(&flagset.DurationFlag{
Name: "txpool.rejournal", Name: "txpool.rejournal",
Usage: "Time interval to regenerate the local transaction journal", Usage: "Time interval to regenerate the local transaction journal",
Value: &c.cliConfig.TxPool.Rejournal, Value: &c.cliConfig.TxPool.Rejournal,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.Rejournal,
Group: "Transaction Pool",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "txpool.pricelimit", Name: "txpool.pricelimit",
Usage: "Minimum gas price limit to enforce for acceptance into the pool", Usage: "Minimum gas price limit to enforce for acceptance into the pool",
Value: &c.cliConfig.TxPool.PriceLimit, Value: &c.cliConfig.TxPool.PriceLimit,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.PriceLimit,
Group: "Transaction Pool",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "txpool.pricebump", Name: "txpool.pricebump",
Usage: "Price bump percentage to replace an already existing transaction", Usage: "Price bump percentage to replace an already existing transaction",
Value: &c.cliConfig.TxPool.PriceBump, Value: &c.cliConfig.TxPool.PriceBump,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.PriceBump,
Group: "Transaction Pool",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "txpool.accountslots", Name: "txpool.accountslots",
Usage: "Minimum number of executable transaction slots guaranteed per account", Usage: "Minimum number of executable transaction slots guaranteed per account",
Value: &c.cliConfig.TxPool.AccountSlots, Value: &c.cliConfig.TxPool.AccountSlots,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.AccountSlots,
Group: "Transaction Pool",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "txpool.globalslots", Name: "txpool.globalslots",
Usage: "Maximum number of executable transaction slots for all accounts", Usage: "Maximum number of executable transaction slots for all accounts",
Value: &c.cliConfig.TxPool.GlobalSlots, Value: &c.cliConfig.TxPool.GlobalSlots,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.GlobalSlots,
Group: "Transaction Pool",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "txpool.accountqueue", Name: "txpool.accountqueue",
Usage: "Maximum number of non-executable transaction slots permitted per account", Usage: "Maximum number of non-executable transaction slots permitted per account",
Value: &c.cliConfig.TxPool.AccountQueue, Value: &c.cliConfig.TxPool.AccountQueue,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.AccountQueue,
Group: "Transaction Pool",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "txpool.globalqueue", Name: "txpool.globalqueue",
Usage: "Maximum number of non-executable transaction slots for all accounts", Usage: "Maximum number of non-executable transaction slots for all accounts",
Value: &c.cliConfig.TxPool.GlobalQueue, Value: &c.cliConfig.TxPool.GlobalQueue,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.GlobalQueue,
Group: "Transaction Pool",
}) })
f.DurationFlag(&flagset.DurationFlag{ f.DurationFlag(&flagset.DurationFlag{
Name: "txpool.lifetime", Name: "txpool.lifetime",
Usage: "Maximum amount of time non-executable transaction are queued", Usage: "Maximum amount of time non-executable transaction are queued",
Value: &c.cliConfig.TxPool.LifeTime, Value: &c.cliConfig.TxPool.LifeTime,
Group: "Transaction Pool", Default: c.cliConfig.TxPool.LifeTime,
Group: "Transaction Pool",
}) })
// sealer options // sealer options
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "mine", Name: "mine",
Usage: "Enable mining", Usage: "Enable mining",
Value: &c.cliConfig.Sealer.Enabled, Value: &c.cliConfig.Sealer.Enabled,
Group: "Sealer", Default: c.cliConfig.Sealer.Enabled,
Group: "Sealer",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "miner.etherbase", Name: "miner.etherbase",
Usage: "Public address for block mining rewards (default = first account)", Usage: "Public address for block mining rewards (default = first account)",
Value: &c.cliConfig.Sealer.Etherbase, Value: &c.cliConfig.Sealer.Etherbase,
Group: "Sealer", Default: c.cliConfig.Sealer.Etherbase,
Group: "Sealer",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "miner.extradata", Name: "miner.extradata",
Usage: "Block extra data set by the miner (default = client version)", Usage: "Block extra data set by the miner (default = client version)",
Value: &c.cliConfig.Sealer.ExtraData, Value: &c.cliConfig.Sealer.ExtraData,
Group: "Sealer", Default: c.cliConfig.Sealer.ExtraData,
Group: "Sealer",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "miner.gaslimit", Name: "miner.gaslimit",
Usage: "Target gas ceiling for mined blocks", Usage: "Target gas ceiling for mined blocks",
Value: &c.cliConfig.Sealer.GasCeil, Value: &c.cliConfig.Sealer.GasCeil,
Group: "Sealer", Default: c.cliConfig.Sealer.GasCeil,
Group: "Sealer",
}) })
f.BigIntFlag(&flagset.BigIntFlag{ f.BigIntFlag(&flagset.BigIntFlag{
Name: "miner.gasprice", Name: "miner.gasprice",
@ -169,21 +192,24 @@ func (c *Command) Flags() *flagset.Flagset {
// ethstats // ethstats
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "ethstats", Name: "ethstats",
Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)", Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)",
Value: &c.cliConfig.Ethstats, Value: &c.cliConfig.Ethstats,
Default: c.cliConfig.Ethstats,
}) })
// gas price oracle // gas price oracle
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "gpo.blocks", Name: "gpo.blocks",
Usage: "Number of recent blocks to check for gas prices", Usage: "Number of recent blocks to check for gas prices",
Value: &c.cliConfig.Gpo.Blocks, Value: &c.cliConfig.Gpo.Blocks,
Default: c.cliConfig.Gpo.Blocks,
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "gpo.percentile", Name: "gpo.percentile",
Usage: "Suggested gas price is the given percentile of a set of recent transaction gas prices", Usage: "Suggested gas price is the given percentile of a set of recent transaction gas prices",
Value: &c.cliConfig.Gpo.Percentile, Value: &c.cliConfig.Gpo.Percentile,
Default: c.cliConfig.Gpo.Percentile,
}) })
f.BigIntFlag(&flagset.BigIntFlag{ f.BigIntFlag(&flagset.BigIntFlag{
Name: "gpo.maxprice", Name: "gpo.maxprice",
@ -198,90 +224,104 @@ func (c *Command) Flags() *flagset.Flagset {
// cache options // cache options
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "cache", Name: "cache",
Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node)", Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node)",
Value: &c.cliConfig.Cache.Cache, Value: &c.cliConfig.Cache.Cache,
Group: "Cache", Default: c.cliConfig.Cache.Cache,
Group: "Cache",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "cache.database", Name: "cache.database",
Usage: "Percentage of cache memory allowance to use for database io", Usage: "Percentage of cache memory allowance to use for database io",
Value: &c.cliConfig.Cache.PercDatabase, Value: &c.cliConfig.Cache.PercDatabase,
Group: "Cache", Default: c.cliConfig.Cache.PercDatabase,
Group: "Cache",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "cache.trie", Name: "cache.trie",
Usage: "Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode)", Usage: "Percentage of cache memory allowance to use for trie caching (default = 15% full mode, 30% archive mode)",
Value: &c.cliConfig.Cache.PercTrie, Value: &c.cliConfig.Cache.PercTrie,
Group: "Cache", Default: c.cliConfig.Cache.PercTrie,
Group: "Cache",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "cache.trie.journal", Name: "cache.trie.journal",
Usage: "Disk journal directory for trie cache to survive node restarts", Usage: "Disk journal directory for trie cache to survive node restarts",
Value: &c.cliConfig.Cache.Journal, Value: &c.cliConfig.Cache.Journal,
Group: "Cache", Default: c.cliConfig.Cache.Journal,
Group: "Cache",
}) })
f.DurationFlag(&flagset.DurationFlag{ f.DurationFlag(&flagset.DurationFlag{
Name: "cache.trie.rejournal", Name: "cache.trie.rejournal",
Usage: "Time interval to regenerate the trie cache journal", Usage: "Time interval to regenerate the trie cache journal",
Value: &c.cliConfig.Cache.Rejournal, Value: &c.cliConfig.Cache.Rejournal,
Group: "Cache", Default: c.cliConfig.Cache.Rejournal,
Group: "Cache",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "cache.gc", Name: "cache.gc",
Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)", Usage: "Percentage of cache memory allowance to use for trie pruning (default = 25% full mode, 0% archive mode)",
Value: &c.cliConfig.Cache.PercGc, Value: &c.cliConfig.Cache.PercGc,
Group: "Cache", Default: c.cliConfig.Cache.PercGc,
Group: "Cache",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "cache.snapshot", Name: "cache.snapshot",
Usage: "Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode)", Usage: "Percentage of cache memory allowance to use for snapshot caching (default = 10% full mode, 20% archive mode)",
Value: &c.cliConfig.Cache.PercSnapshot, Value: &c.cliConfig.Cache.PercSnapshot,
Group: "Cache", Default: c.cliConfig.Cache.PercSnapshot,
Group: "Cache",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "cache.noprefetch", Name: "cache.noprefetch",
Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)", Usage: "Disable heuristic state prefetch during block import (less CPU and disk IO, more time waiting for data)",
Value: &c.cliConfig.Cache.NoPrefetch, Value: &c.cliConfig.Cache.NoPrefetch,
Group: "Cache", Default: c.cliConfig.Cache.NoPrefetch,
Group: "Cache",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "cache.preimages", Name: "cache.preimages",
Usage: "Enable recording the SHA3/keccak preimages of trie keys", Usage: "Enable recording the SHA3/keccak preimages of trie keys",
Value: &c.cliConfig.Cache.Preimages, Value: &c.cliConfig.Cache.Preimages,
Group: "Cache", Default: c.cliConfig.Cache.Preimages,
Group: "Cache",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "txlookuplimit", Name: "txlookuplimit",
Usage: "Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain)", Usage: "Number of recent blocks to maintain transactions index for (default = about 56 days, 0 = entire chain)",
Value: &c.cliConfig.Cache.TxLookupLimit, Value: &c.cliConfig.Cache.TxLookupLimit,
Group: "Cache", Default: c.cliConfig.Cache.TxLookupLimit,
Group: "Cache",
}) })
// rpc options // rpc options
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "rpc.gascap", Name: "rpc.gascap",
Usage: "Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite)", Usage: "Sets a cap on gas that can be used in eth_call/estimateGas (0=infinite)",
Value: &c.cliConfig.JsonRPC.GasCap, Value: &c.cliConfig.JsonRPC.GasCap,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.GasCap,
Group: "JsonRPC",
}) })
f.Float64Flag(&flagset.Float64Flag{ f.Float64Flag(&flagset.Float64Flag{
Name: "rpc.txfeecap", Name: "rpc.txfeecap",
Usage: "Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap)", Usage: "Sets a cap on transaction fee (in ether) that can be sent via the RPC APIs (0 = no cap)",
Value: &c.cliConfig.JsonRPC.TxFeeCap, Value: &c.cliConfig.JsonRPC.TxFeeCap,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.TxFeeCap,
Group: "JsonRPC",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "ipcdisable", Name: "ipcdisable",
Usage: "Disable the IPC-RPC server", Usage: "Disable the IPC-RPC server",
Value: &c.cliConfig.JsonRPC.IPCDisable, Value: &c.cliConfig.JsonRPC.IPCDisable,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.IPCDisable,
Group: "JsonRPC",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "ipcpath", Name: "ipcpath",
Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)",
Value: &c.cliConfig.JsonRPC.IPCPath, Value: &c.cliConfig.JsonRPC.IPCPath,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.IPCPath,
Group: "JsonRPC",
}) })
f.SliceStringFlag(&flagset.SliceStringFlag{ f.SliceStringFlag(&flagset.SliceStringFlag{
Name: "jsonrpc.corsdomain", Name: "jsonrpc.corsdomain",
@ -298,28 +338,32 @@ func (c *Command) Flags() *flagset.Flagset {
// http options // http options
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "http", Name: "http",
Usage: "Enable the HTTP-RPC server", Usage: "Enable the HTTP-RPC server",
Value: &c.cliConfig.JsonRPC.Http.Enabled, Value: &c.cliConfig.JsonRPC.Http.Enabled,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Http.Enabled,
Group: "JsonRPC",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "http.addr", Name: "http.addr",
Usage: "HTTP-RPC server listening interface", Usage: "HTTP-RPC server listening interface",
Value: &c.cliConfig.JsonRPC.Http.Host, Value: &c.cliConfig.JsonRPC.Http.Host,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Http.Host,
Group: "JsonRPC",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "http.port", Name: "http.port",
Usage: "HTTP-RPC server listening port", Usage: "HTTP-RPC server listening port",
Value: &c.cliConfig.JsonRPC.Http.Port, Value: &c.cliConfig.JsonRPC.Http.Port,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Http.Port,
Group: "JsonRPC",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "http.rpcprefix", Name: "http.rpcprefix",
Usage: "HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", Usage: "HTTP path path prefix on which JSON-RPC is served. Use '/' to serve on all paths.",
Value: &c.cliConfig.JsonRPC.Http.Prefix, Value: &c.cliConfig.JsonRPC.Http.Prefix,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Http.Prefix,
Group: "JsonRPC",
}) })
f.SliceStringFlag(&flagset.SliceStringFlag{ f.SliceStringFlag(&flagset.SliceStringFlag{
Name: "http.modules", Name: "http.modules",
@ -330,28 +374,32 @@ func (c *Command) Flags() *flagset.Flagset {
// ws options // ws options
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "ws", Name: "ws",
Usage: "Enable the WS-RPC server", Usage: "Enable the WS-RPC server",
Value: &c.cliConfig.JsonRPC.Ws.Enabled, Value: &c.cliConfig.JsonRPC.Ws.Enabled,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Ws.Enabled,
Group: "JsonRPC",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "ws.addr", Name: "ws.addr",
Usage: "WS-RPC server listening interface", Usage: "WS-RPC server listening interface",
Value: &c.cliConfig.JsonRPC.Ws.Host, Value: &c.cliConfig.JsonRPC.Ws.Host,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Ws.Host,
Group: "JsonRPC",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "ws.port", Name: "ws.port",
Usage: "WS-RPC server listening port", Usage: "WS-RPC server listening port",
Value: &c.cliConfig.JsonRPC.Ws.Port, Value: &c.cliConfig.JsonRPC.Ws.Port,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Ws.Port,
Group: "JsonRPC",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "ws.rpcprefix", Name: "ws.rpcprefix",
Usage: "HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths.", Usage: "HTTP path prefix on which JSON-RPC is served. Use '/' to serve on all paths.",
Value: &c.cliConfig.JsonRPC.Ws.Prefix, Value: &c.cliConfig.JsonRPC.Ws.Prefix,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Ws.Prefix,
Group: "JsonRPC",
}) })
f.SliceStringFlag(&flagset.SliceStringFlag{ f.SliceStringFlag(&flagset.SliceStringFlag{
Name: "ws.modules", Name: "ws.modules",
@ -362,24 +410,27 @@ func (c *Command) Flags() *flagset.Flagset {
// graphql options // graphql options
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "graphql", Name: "graphql",
Usage: "Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.", Usage: "Enable GraphQL on the HTTP-RPC server. Note that GraphQL can only be started if an HTTP server is started as well.",
Value: &c.cliConfig.JsonRPC.Graphql.Enabled, Value: &c.cliConfig.JsonRPC.Graphql.Enabled,
Group: "JsonRPC", Default: c.cliConfig.JsonRPC.Graphql.Enabled,
Group: "JsonRPC",
}) })
// p2p options // p2p options
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "bind", Name: "bind",
Usage: "Network binding address", Usage: "Network binding address",
Value: &c.cliConfig.P2P.Bind, Value: &c.cliConfig.P2P.Bind,
Group: "P2P", Default: c.cliConfig.P2P.Bind,
Group: "P2P",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "port", Name: "port",
Usage: "Network listening port", Usage: "Network listening port",
Value: &c.cliConfig.P2P.Port, Value: &c.cliConfig.P2P.Port,
Group: "P2P", Default: c.cliConfig.P2P.Port,
Group: "P2P",
}) })
f.SliceStringFlag(&flagset.SliceStringFlag{ f.SliceStringFlag(&flagset.SliceStringFlag{
Name: "bootnodes", Name: "bootnodes",
@ -388,78 +439,90 @@ func (c *Command) Flags() *flagset.Flagset {
Group: "P2P", Group: "P2P",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "maxpeers", Name: "maxpeers",
Usage: "Maximum number of network peers (network disabled if set to 0)", Usage: "Maximum number of network peers (network disabled if set to 0)",
Value: &c.cliConfig.P2P.MaxPeers, Value: &c.cliConfig.P2P.MaxPeers,
Group: "P2P", Default: c.cliConfig.P2P.MaxPeers,
Group: "P2P",
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "maxpendpeers", Name: "maxpendpeers",
Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", Usage: "Maximum number of pending connection attempts (defaults used if set to 0)",
Value: &c.cliConfig.P2P.MaxPendPeers, Value: &c.cliConfig.P2P.MaxPendPeers,
Group: "P2P", Default: c.cliConfig.P2P.MaxPendPeers,
Group: "P2P",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "nat", Name: "nat",
Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:<IP>)", Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:<IP>)",
Value: &c.cliConfig.P2P.NAT, Value: &c.cliConfig.P2P.NAT,
Group: "P2P", Default: c.cliConfig.P2P.NAT,
Group: "P2P",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "nodiscover", Name: "nodiscover",
Usage: "Disables the peer discovery mechanism (manual peer addition)", Usage: "Disables the peer discovery mechanism (manual peer addition)",
Value: &c.cliConfig.P2P.NoDiscover, Value: &c.cliConfig.P2P.NoDiscover,
Group: "P2P", Default: c.cliConfig.P2P.NoDiscover,
Group: "P2P",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "v5disc", Name: "v5disc",
Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism", Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism",
Value: &c.cliConfig.P2P.Discovery.V5Enabled, Value: &c.cliConfig.P2P.Discovery.V5Enabled,
Group: "P2P", Default: c.cliConfig.P2P.Discovery.V5Enabled,
Group: "P2P",
}) })
// metrics // metrics
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "metrics", Name: "metrics",
Usage: "Enable metrics collection and reporting", Usage: "Enable metrics collection and reporting",
Value: &c.cliConfig.Telemetry.Enabled, Value: &c.cliConfig.Telemetry.Enabled,
Group: "Telemetry", Default: c.cliConfig.Telemetry.Enabled,
Group: "Telemetry",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "metrics.expensive", Name: "metrics.expensive",
Usage: "Enable expensive metrics collection and reporting", Usage: "Enable expensive metrics collection and reporting",
Value: &c.cliConfig.Telemetry.Expensive, Value: &c.cliConfig.Telemetry.Expensive,
Group: "Telemetry", Default: c.cliConfig.Telemetry.Expensive,
Group: "Telemetry",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "metrics.influxdb", Name: "metrics.influxdb",
Usage: "Enable metrics export/push to an external InfluxDB database (v1)", Usage: "Enable metrics export/push to an external InfluxDB database (v1)",
Value: &c.cliConfig.Telemetry.InfluxDB.V1Enabled, Value: &c.cliConfig.Telemetry.InfluxDB.V1Enabled,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.V1Enabled,
Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.influxdb.endpoint", Name: "metrics.influxdb.endpoint",
Usage: "InfluxDB API endpoint to report metrics to", Usage: "InfluxDB API endpoint to report metrics to",
Value: &c.cliConfig.Telemetry.InfluxDB.Endpoint, Value: &c.cliConfig.Telemetry.InfluxDB.Endpoint,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.Endpoint,
Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.influxdb.database", Name: "metrics.influxdb.database",
Usage: "InfluxDB database name to push reported metrics to", Usage: "InfluxDB database name to push reported metrics to",
Value: &c.cliConfig.Telemetry.InfluxDB.Database, Value: &c.cliConfig.Telemetry.InfluxDB.Database,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.Database,
Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.influxdb.username", Name: "metrics.influxdb.username",
Usage: "Username to authorize access to the database", Usage: "Username to authorize access to the database",
Value: &c.cliConfig.Telemetry.InfluxDB.Username, Value: &c.cliConfig.Telemetry.InfluxDB.Username,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.Username,
Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.influxdb.password", Name: "metrics.influxdb.password",
Usage: "Password to authorize access to the database", Usage: "Password to authorize access to the database",
Value: &c.cliConfig.Telemetry.InfluxDB.Password, Value: &c.cliConfig.Telemetry.InfluxDB.Password,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.Password,
Group: "Telemetry",
}) })
f.MapStringFlag(&flagset.MapStringFlag{ f.MapStringFlag(&flagset.MapStringFlag{
Name: "metrics.influxdb.tags", Name: "metrics.influxdb.tags",
@ -468,41 +531,47 @@ func (c *Command) Flags() *flagset.Flagset {
Group: "Telemetry", Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.prometheus-addr", Name: "metrics.prometheus-addr",
Usage: "Address for Prometheus Server", Usage: "Address for Prometheus Server",
Value: &c.cliConfig.Telemetry.PrometheusAddr, Value: &c.cliConfig.Telemetry.PrometheusAddr,
Group: "Telemetry", Default: c.cliConfig.Telemetry.PrometheusAddr,
Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.opencollector-endpoint", Name: "metrics.opencollector-endpoint",
Usage: "OpenCollector Endpoint (host:port)", Usage: "OpenCollector Endpoint (host:port)",
Value: &c.cliConfig.Telemetry.OpenCollectorEndpoint, Value: &c.cliConfig.Telemetry.OpenCollectorEndpoint,
Group: "Telemetry", Default: c.cliConfig.Telemetry.OpenCollectorEndpoint,
Group: "Telemetry",
}) })
// influx db v2 // influx db v2
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "metrics.influxdbv2", Name: "metrics.influxdbv2",
Usage: "Enable metrics export/push to an external InfluxDB v2 database", Usage: "Enable metrics export/push to an external InfluxDB v2 database",
Value: &c.cliConfig.Telemetry.InfluxDB.V2Enabled, Value: &c.cliConfig.Telemetry.InfluxDB.V2Enabled,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.V2Enabled,
Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.influxdb.token", Name: "metrics.influxdb.token",
Usage: "Token to authorize access to the database (v2 only)", Usage: "Token to authorize access to the database (v2 only)",
Value: &c.cliConfig.Telemetry.InfluxDB.Token, Value: &c.cliConfig.Telemetry.InfluxDB.Token,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.Token,
Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.influxdb.bucket", Name: "metrics.influxdb.bucket",
Usage: "InfluxDB bucket name to push reported metrics to (v2 only)", Usage: "InfluxDB bucket name to push reported metrics to (v2 only)",
Value: &c.cliConfig.Telemetry.InfluxDB.Bucket, Value: &c.cliConfig.Telemetry.InfluxDB.Bucket,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.Bucket,
Group: "Telemetry",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "metrics.influxdb.organization", Name: "metrics.influxdb.organization",
Usage: "InfluxDB organization name (v2 only)", Usage: "InfluxDB organization name (v2 only)",
Value: &c.cliConfig.Telemetry.InfluxDB.Organization, Value: &c.cliConfig.Telemetry.InfluxDB.Organization,
Group: "Telemetry", Default: c.cliConfig.Telemetry.InfluxDB.Organization,
Group: "Telemetry",
}) })
// account // account
@ -513,46 +582,53 @@ func (c *Command) Flags() *flagset.Flagset {
Group: "Account Management", Group: "Account Management",
}) })
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "password", Name: "password",
Usage: "Password file to use for non-interactive password input", Usage: "Password file to use for non-interactive password input",
Value: &c.cliConfig.Accounts.PasswordFile, Value: &c.cliConfig.Accounts.PasswordFile,
Group: "Account Management", Default: c.cliConfig.Accounts.PasswordFile,
Group: "Account Management",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "allow-insecure-unlock", Name: "allow-insecure-unlock",
Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http",
Value: &c.cliConfig.Accounts.AllowInsecureUnlock, Value: &c.cliConfig.Accounts.AllowInsecureUnlock,
Group: "Account Management", Default: c.cliConfig.Accounts.AllowInsecureUnlock,
Group: "Account Management",
}) })
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "lightkdf", Name: "lightkdf",
Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength",
Value: &c.cliConfig.Accounts.UseLightweightKDF, Value: &c.cliConfig.Accounts.UseLightweightKDF,
Group: "Account Management", Default: c.cliConfig.Accounts.UseLightweightKDF,
Group: "Account Management",
}) })
f.BoolFlag((&flagset.BoolFlag{ f.BoolFlag((&flagset.BoolFlag{
Name: "disable-bor-wallet", Name: "disable-bor-wallet",
Usage: "Disable the personal wallet endpoints", Usage: "Disable the personal wallet endpoints",
Value: &c.cliConfig.Accounts.DisableBorWallet, Value: &c.cliConfig.Accounts.DisableBorWallet,
Default: c.cliConfig.Accounts.DisableBorWallet,
})) }))
// grpc // grpc
f.StringFlag(&flagset.StringFlag{ f.StringFlag(&flagset.StringFlag{
Name: "grpc.addr", Name: "grpc.addr",
Usage: "Address and port to bind the GRPC server", Usage: "Address and port to bind the GRPC server",
Value: &c.cliConfig.GRPC.Addr, Value: &c.cliConfig.GRPC.Addr,
Default: c.cliConfig.GRPC.Addr,
}) })
// developer // developer
f.BoolFlag(&flagset.BoolFlag{ f.BoolFlag(&flagset.BoolFlag{
Name: "dev", Name: "dev",
Usage: "Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled", Usage: "Enable developer mode with ephemeral proof-of-authority network and a pre-funded developer account, mining enabled",
Value: &c.cliConfig.Developer.Enabled, Value: &c.cliConfig.Developer.Enabled,
Default: c.cliConfig.Developer.Enabled,
}) })
f.Uint64Flag(&flagset.Uint64Flag{ f.Uint64Flag(&flagset.Uint64Flag{
Name: "dev.period", Name: "dev.period",
Usage: "Block period to use in developer mode (0 = mine only if transaction pending)", Usage: "Block period to use in developer mode (0 = mine only if transaction pending)",
Value: &c.cliConfig.Developer.Period, Value: &c.cliConfig.Developer.Period,
Default: c.cliConfig.Developer.Period,
}) })
return f return f
} }