From 3d3f986c5b9a271ee6dda70bd3ab95e50d6c5f6f Mon Sep 17 00:00:00 2001 From: Ferran Borreguero <ferranbt@protonmail.com> Date: Wed, 20 Oct 2021 11:45:44 +0200 Subject: [PATCH] Remove pointers in config field --- command/flagset/flagset.go | 36 +-- command/server/command.go | 30 +-- command/server/config.go | 418 ++++++++++++++++------------------ command/server/config_test.go | 31 ++- command/server/flags.go | 146 ++++++------ 5 files changed, 325 insertions(+), 336 deletions(-) diff --git a/command/flagset/flagset.go b/command/flagset/flagset.go index c3c870499..4388dd03f 100644 --- a/command/flagset/flagset.go +++ b/command/flagset/flagset.go @@ -78,9 +78,10 @@ func (f *Flagset) StringFlag(b *StringFlag) { } type IntFlag struct { - Name string - Usage string - Value *int + Name string + Usage string + Value *int + Default int } func (f *Flagset) IntFlag(i *IntFlag) { @@ -88,13 +89,14 @@ func (f *Flagset) IntFlag(i *IntFlag) { Name: i.Name, Usage: i.Usage, }) - f.set.IntVar(i.Value, i.Name, *i.Value, i.Usage) + f.set.IntVar(i.Value, i.Name, i.Default, i.Usage) } type Uint64Flag struct { - Name string - Usage string - Value *uint64 + Name string + Usage string + Value *uint64 + Default uint64 } func (f *Flagset) Uint64Flag(i *Uint64Flag) { @@ -102,7 +104,7 @@ func (f *Flagset) Uint64Flag(i *Uint64Flag) { Name: i.Name, Usage: i.Usage, }) - f.set.Uint64Var(i.Value, i.Name, *i.Value, i.Usage) + f.set.Uint64Var(i.Value, i.Name, i.Default, i.Usage) } type BigIntFlag struct { @@ -169,9 +171,10 @@ func (f *Flagset) SliceStringFlag(s *SliceStringFlag) { } type DurationFlag struct { - Name string - Usage string - Value *time.Duration + Name string + Usage string + Value *time.Duration + Default time.Duration } func (f *Flagset) DurationFlag(d *DurationFlag) { @@ -179,7 +182,7 @@ func (f *Flagset) DurationFlag(d *DurationFlag) { Name: d.Name, Usage: d.Usage, }) - f.set.DurationVar(d.Value, d.Name, *d.Value, "") + f.set.DurationVar(d.Value, d.Name, d.Default, "") } type MapStringFlag struct { @@ -224,9 +227,10 @@ func (f *Flagset) MapStringFlag(m *MapStringFlag) { } type Float64Flag struct { - Name string - Usage string - Value *float64 + Name string + Usage string + Value *float64 + Default float64 } func (f *Flagset) Float64Flag(i *Float64Flag) { @@ -234,5 +238,5 @@ func (f *Flagset) Float64Flag(i *Float64Flag) { Name: i.Name, Usage: i.Usage, }) - f.set.Float64Var(i.Value, i.Name, *i.Value, "") + f.set.Float64Var(i.Value, i.Name, i.Default, "") } diff --git a/command/server/command.go b/command/server/command.go index 77bf246ca..10beeda38 100644 --- a/command/server/command.go +++ b/command/server/command.go @@ -83,7 +83,7 @@ func (c *Command) Run(args []string) int { c.config = config // start the logger - setupLogger(*config.LogLevel) + setupLogger(config.LogLevel) // load the chain genesis if err := config.loadChain(); err != nil { @@ -122,7 +122,7 @@ func (c *Command) Run(args []string) int { stack.RegisterAPIs(tracers.APIs(backend.APIBackend)) // graphql is started from another place - if *config.JsonRPC.Graphql.Enabled { + if config.JsonRPC.Graphql.Enabled { if err := graphql.New(stack, backend.APIBackend, config.JsonRPC.Cors, config.JsonRPC.Modules); err != nil { c.UI.Error(fmt.Sprintf("Failed to register the GraphQL service: %v", err)) return 1 @@ -130,8 +130,8 @@ func (c *Command) Run(args []string) int { } // register ethash service - if *config.EthStats != "" { - if err := ethstats.New(stack, backend.APIBackend, backend.Engine(), *config.EthStats); err != nil { + if config.EthStats != "" { + if err := ethstats.New(stack, backend.APIBackend, backend.Engine(), config.EthStats); err != nil { c.UI.Error(err.Error()) return 1 } @@ -142,7 +142,7 @@ func (c *Command) Run(args []string) int { { keydir := stack.KeyStoreDir() n, p := keystore.StandardScryptN, keystore.StandardScryptP - if *config.Accounts.UseLightweightKDF { + if config.Accounts.UseLightweightKDF { n, p = keystore.LightScryptN, keystore.LightScryptP } borKeystore = keystore.NewKeyStore(keydir, n, p) @@ -158,7 +158,7 @@ func (c *Command) Run(args []string) int { } // sealing (if enabled) - if *config.Sealer.Enabled { + if config.Sealer.Enabled { if err := backend.StartMining(1); err != nil { c.UI.Error(err.Error()) return 1 @@ -186,9 +186,9 @@ func (c *Command) unlockAccounts(borKeystore *keystore.KeyStore) error { // read passwords from file if possible passwords := []string{} - if *c.config.Accounts.PasswordFile != "" { + if c.config.Accounts.PasswordFile != "" { var err error - if passwords, err = readMultilineFile(*c.config.Accounts.PasswordFile); err != nil { + if passwords, err = readMultilineFile(c.config.Accounts.PasswordFile); err != nil { return err } } @@ -222,8 +222,8 @@ func (c *Command) unlockAccounts(borKeystore *keystore.KeyStore) error { } func (c *Command) setupMetrics(config *MetricsConfig) error { - metrics.Enabled = *config.Enabled - metrics.EnabledExpensive = *config.Expensive + metrics.Enabled = config.Enabled + metrics.EnabledExpensive = config.Expensive if !metrics.Enabled { // metrics are disabled, do not set up any sink @@ -233,22 +233,22 @@ func (c *Command) setupMetrics(config *MetricsConfig) error { log.Info("Enabling metrics collection") // influxdb - if v1Enabled, v2Enabled := (*config.InfluxDB.V1Enabled), (*config.InfluxDB.V2Enabled); v1Enabled || v2Enabled { + if v1Enabled, v2Enabled := (config.InfluxDB.V1Enabled), (config.InfluxDB.V2Enabled); v1Enabled || v2Enabled { if v1Enabled && v2Enabled { return fmt.Errorf("both influx v1 and influx v2 cannot be enabled") } cfg := config.InfluxDB - tags := *cfg.Tags - endpoint := *cfg.Endpoint + tags := cfg.Tags + endpoint := cfg.Endpoint if v1Enabled { log.Info("Enabling metrics export to InfluxDB (v1)") - go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, *cfg.Database, *cfg.Username, *cfg.Password, "geth.", tags) + go influxdb.InfluxDBWithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, cfg.Database, cfg.Username, cfg.Password, "geth.", tags) } if v2Enabled { log.Info("Enabling metrics export to InfluxDB (v2)") - go influxdb.InfluxDBV2WithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, *cfg.Token, *cfg.Bucket, *cfg.Organization, "geth.", tags) + go influxdb.InfluxDBV2WithTags(metrics.DefaultRegistry, 10*time.Second, endpoint, cfg.Token, cfg.Bucket, cfg.Organization, "geth.", tags) } } diff --git a/command/server/config.go b/command/server/config.go index 5f833ff15..27daab7da 100644 --- a/command/server/config.go +++ b/command/server/config.go @@ -30,66 +30,42 @@ import ( gopsutil "github.com/shirou/gopsutil/mem" ) -func mapStrPtr(m map[string]string) *map[string]string { - return &m -} - -func stringPtr(s string) *string { - return &s -} - -func float64Ptr(f float64) *float64 { - return &f -} - -func uint64Ptr(i uint64) *uint64 { - return &i -} - -func boolPtr(b bool) *bool { - return &b -} - -func durPtr(d time.Duration) *time.Duration { - return &d -} - type Config struct { chain *chains.Chain - Chain *string - Debug *bool - Whitelist *map[string]string - LogLevel *string - DataDir *string + Chain string + Debug bool + Whitelist map[string]string + LogLevel string + DataDir string P2P *P2PConfig - SyncMode *string - GcMode *string - Snapshot *bool - EthStats *string + SyncMode string + GcMode string + Snapshot bool + EthStats string Heimdall *HeimdallConfig TxPool *TxPoolConfig Sealer *SealerConfig JsonRPC *JsonRPCConfig Gpo *GpoConfig - Ethstats *string + Ethstats string Metrics *MetricsConfig Cache *CacheConfig Accounts *AccountsConfig } type P2PConfig struct { - MaxPeers *uint64 - MaxPendPeers *uint64 - Bind *string - Port *uint64 - NoDiscover *bool - NAT *string + MaxPeers uint64 + MaxPendPeers uint64 + Bind string + Port uint64 + NoDiscover bool + NAT string Discovery *P2PDiscovery } type P2PDiscovery struct { - V5Enabled *bool + V5Enabled bool Bootnodes []string BootnodesV4 []string BootnodesV5 []string @@ -99,42 +75,42 @@ type P2PDiscovery struct { } type HeimdallConfig struct { - URL *string - Without *bool + URL string + Without bool } type TxPoolConfig struct { Locals []string - NoLocals *bool - Journal *string - Rejournal *time.Duration - PriceLimit *uint64 - PriceBump *uint64 - AccountSlots *uint64 - GlobalSlots *uint64 - AccountQueue *uint64 - GlobalQueue *uint64 - LifeTime *time.Duration + NoLocals bool + Journal string + Rejournal time.Duration + PriceLimit uint64 + PriceBump uint64 + AccountSlots uint64 + GlobalSlots uint64 + AccountQueue uint64 + GlobalQueue uint64 + LifeTime time.Duration } type SealerConfig struct { - Enabled *bool - Etherbase *string - ExtraData *string - GasCeil *uint64 + Enabled bool + Etherbase string + ExtraData string + GasCeil uint64 GasPrice *big.Int } type JsonRPCConfig struct { - IPCDisable *bool - IPCPath *string + IPCDisable bool + IPCPath string Modules []string VHost []string Cors []string - GasCap *uint64 - TxFeeCap *float64 + GasCap uint64 + TxFeeCap float64 Http *APIConfig Ws *APIConfig @@ -142,74 +118,74 @@ type JsonRPCConfig struct { } type APIConfig struct { - Enabled *bool - Port *uint64 - Prefix *string - Host *string + Enabled bool + Port uint64 + Prefix string + Host string } type GpoConfig struct { - Blocks *uint64 - Percentile *uint64 + Blocks uint64 + Percentile uint64 MaxPrice *big.Int IgnorePrice *big.Int } type MetricsConfig struct { - Enabled *bool - Expensive *bool + Enabled bool + Expensive bool InfluxDB *InfluxDBConfig } type InfluxDBConfig struct { - V1Enabled *bool - Endpoint *string - Database *string - Username *string - Password *string - Tags *map[string]string - V2Enabled *bool - Token *string - Bucket *string - Organization *string + V1Enabled bool + Endpoint string + Database string + Username string + Password string + Tags map[string]string + V2Enabled bool + Token string + Bucket string + Organization string } type CacheConfig struct { - Cache *uint64 - PercGc *uint64 - PercSnapshot *uint64 - PercDatabase *uint64 - PercTrie *uint64 - Journal *string - Rejournal *time.Duration - NoPrefetch *bool - Preimages *bool - TxLookupLimit *uint64 + Cache uint64 + PercGc uint64 + PercSnapshot uint64 + PercDatabase uint64 + PercTrie uint64 + Journal string + Rejournal time.Duration + NoPrefetch bool + Preimages bool + TxLookupLimit uint64 } type AccountsConfig struct { Unlock []string - PasswordFile *string - AllowInsecureUnlock *bool - UseLightweightKDF *bool + PasswordFile string + AllowInsecureUnlock bool + UseLightweightKDF bool } func DefaultConfig() *Config { return &Config{ - Chain: stringPtr("mainnet"), - Debug: boolPtr(false), - Whitelist: mapStrPtr(map[string]string{}), - LogLevel: stringPtr("INFO"), - DataDir: stringPtr(defaultDataDir()), + Chain: "mainnet", + Debug: false, + Whitelist: map[string]string{}, + LogLevel: "INFO", + DataDir: defaultDataDir(), P2P: &P2PConfig{ - MaxPeers: uint64Ptr(30), - MaxPendPeers: uint64Ptr(50), - Bind: stringPtr("0.0.0.0"), - Port: uint64Ptr(30303), - NoDiscover: boolPtr(false), - NAT: stringPtr("any"), + MaxPeers: 30, + MaxPendPeers: 50, + Bind: "0.0.0.0", + Port: 30303, + NoDiscover: false, + NAT: "any", Discovery: &P2PDiscovery{ - V5Enabled: boolPtr(false), + V5Enabled: false, Bootnodes: []string{}, BootnodesV4: []string{}, BootnodesV5: []string{}, @@ -219,97 +195,97 @@ func DefaultConfig() *Config { }, }, Heimdall: &HeimdallConfig{ - URL: stringPtr("http://localhost:1317"), - Without: boolPtr(false), + URL: "http://localhost:1317", + Without: false, }, - SyncMode: stringPtr("fast"), - GcMode: stringPtr("full"), - Snapshot: boolPtr(true), - EthStats: stringPtr(""), + SyncMode: "fast", + GcMode: "full", + Snapshot: true, + EthStats: "", TxPool: &TxPoolConfig{ Locals: []string{}, - NoLocals: boolPtr(false), - Journal: stringPtr(""), - Rejournal: durPtr(1 * time.Hour), - PriceLimit: uint64Ptr(1), - PriceBump: uint64Ptr(10), - AccountSlots: uint64Ptr(16), - GlobalSlots: uint64Ptr(4096), - AccountQueue: uint64Ptr(64), - GlobalQueue: uint64Ptr(1024), - LifeTime: durPtr(3 * time.Hour), + NoLocals: false, + Journal: "", + Rejournal: time.Duration(1 * time.Hour), + PriceLimit: 1, + PriceBump: 10, + AccountSlots: 16, + GlobalSlots: 4096, + AccountQueue: 64, + GlobalQueue: 1024, + LifeTime: time.Duration(3 * time.Hour), }, Sealer: &SealerConfig{ - Enabled: boolPtr(false), - Etherbase: stringPtr(""), - GasCeil: uint64Ptr(8000000), + Enabled: false, + Etherbase: "", + GasCeil: 8000000, GasPrice: big.NewInt(params.GWei), - ExtraData: stringPtr(""), + ExtraData: "", }, Gpo: &GpoConfig{ - Blocks: uint64Ptr(20), - Percentile: uint64Ptr(60), + Blocks: 20, + Percentile: 60, MaxPrice: gasprice.DefaultMaxPrice, IgnorePrice: gasprice.DefaultIgnorePrice, }, JsonRPC: &JsonRPCConfig{ - IPCDisable: boolPtr(false), - IPCPath: stringPtr(""), + IPCDisable: false, + IPCPath: "", Modules: []string{"web3", "net"}, Cors: []string{"*"}, VHost: []string{"*"}, - GasCap: uint64Ptr(ethconfig.Defaults.RPCGasCap), - TxFeeCap: float64Ptr(ethconfig.Defaults.RPCTxFeeCap), + GasCap: ethconfig.Defaults.RPCGasCap, + TxFeeCap: ethconfig.Defaults.RPCTxFeeCap, Http: &APIConfig{ - Enabled: boolPtr(false), - Port: uint64Ptr(8545), - Prefix: stringPtr(""), - Host: stringPtr("localhost"), + Enabled: false, + Port: 8545, + Prefix: "", + Host: "localhost", }, Ws: &APIConfig{ - Enabled: boolPtr(false), - Port: uint64Ptr(8546), - Prefix: stringPtr(""), - Host: stringPtr("localhost"), + Enabled: false, + Port: 8546, + Prefix: "", + Host: "localhost", }, Graphql: &APIConfig{ - Enabled: boolPtr(false), + Enabled: false, }, }, - Ethstats: stringPtr(""), + Ethstats: "", Metrics: &MetricsConfig{ - Enabled: boolPtr(false), - Expensive: boolPtr(false), + Enabled: false, + Expensive: false, InfluxDB: &InfluxDBConfig{ - V1Enabled: boolPtr(false), - Endpoint: stringPtr(""), - Database: stringPtr(""), - Username: stringPtr(""), - Password: stringPtr(""), - Tags: mapStrPtr(map[string]string{}), - V2Enabled: boolPtr(false), - Token: stringPtr(""), - Bucket: stringPtr(""), - Organization: stringPtr(""), + V1Enabled: false, + Endpoint: "", + Database: "", + Username: "", + Password: "", + Tags: map[string]string{}, + V2Enabled: false, + Token: "", + Bucket: "", + Organization: "", }, }, Cache: &CacheConfig{ - Cache: uint64Ptr(1024), - PercDatabase: uint64Ptr(50), - PercTrie: uint64Ptr(15), - PercGc: uint64Ptr(25), - PercSnapshot: uint64Ptr(10), - Journal: stringPtr("triecache"), - Rejournal: durPtr(60 * time.Minute), - NoPrefetch: boolPtr(false), - Preimages: boolPtr(false), - TxLookupLimit: uint64Ptr(2350000), + Cache: 1024, + PercDatabase: 50, + PercTrie: 15, + PercGc: 25, + PercSnapshot: 10, + Journal: "triecache", + Rejournal: 60 * time.Minute, + NoPrefetch: false, + Preimages: false, + TxLookupLimit: 2350000, }, Accounts: &AccountsConfig{ Unlock: []string{}, - PasswordFile: stringPtr(""), - AllowInsecureUnlock: boolPtr(false), - UseLightweightKDF: boolPtr(false), + PasswordFile: "", + AllowInsecureUnlock: false, + UseLightweightKDF: false, }, } } @@ -330,9 +306,9 @@ func readConfigFile(path string) (*Config, error) { } func (c *Config) loadChain() error { - chain, ok := chains.GetChain(*c.Chain) + chain, ok := chains.GetChain(c.Chain) if !ok { - return fmt.Errorf("chain '%s' not found", *c.Chain) + return fmt.Errorf("chain '%s' not found", c.Chain) } c.chain = chain @@ -342,10 +318,10 @@ func (c *Config) loadChain() error { } // depending on the chain we have different cache values - if *c.Chain != "mainnet" { - c.Cache.Cache = uint64Ptr(4096) + if c.Chain != "mainnet" { + c.Cache.Cache = 4096 } else { - c.Cache.Cache = uint64Ptr(1024) + c.Cache.Cache = 1024 } return nil } @@ -358,30 +334,30 @@ func (c *Config) buildEth() (*ethconfig.Config, error) { n := ethconfig.Defaults n.NetworkId = c.chain.NetworkId n.Genesis = c.chain.Genesis - n.HeimdallURL = *c.Heimdall.URL - n.WithoutHeimdall = *c.Heimdall.Without + n.HeimdallURL = c.Heimdall.URL + n.WithoutHeimdall = c.Heimdall.Without // txpool options { - n.TxPool.NoLocals = *c.TxPool.NoLocals - n.TxPool.Journal = *c.TxPool.Journal - n.TxPool.Rejournal = *c.TxPool.Rejournal - n.TxPool.PriceLimit = *c.TxPool.PriceLimit - n.TxPool.PriceBump = *c.TxPool.PriceBump - n.TxPool.AccountSlots = *c.TxPool.AccountSlots - n.TxPool.GlobalSlots = *c.TxPool.GlobalSlots - n.TxPool.AccountQueue = *c.TxPool.AccountQueue - n.TxPool.GlobalQueue = *c.TxPool.GlobalQueue - n.TxPool.Lifetime = *c.TxPool.LifeTime + n.TxPool.NoLocals = c.TxPool.NoLocals + n.TxPool.Journal = c.TxPool.Journal + n.TxPool.Rejournal = c.TxPool.Rejournal + n.TxPool.PriceLimit = c.TxPool.PriceLimit + n.TxPool.PriceBump = c.TxPool.PriceBump + n.TxPool.AccountSlots = c.TxPool.AccountSlots + n.TxPool.GlobalSlots = c.TxPool.GlobalSlots + n.TxPool.AccountQueue = c.TxPool.AccountQueue + n.TxPool.GlobalQueue = c.TxPool.GlobalQueue + n.TxPool.Lifetime = c.TxPool.LifeTime } // miner options { n.Miner.GasPrice = c.Sealer.GasPrice - n.Miner.GasCeil = *c.Sealer.GasCeil - n.Miner.ExtraData = []byte(*c.Sealer.ExtraData) + n.Miner.GasCeil = c.Sealer.GasCeil + n.Miner.ExtraData = []byte(c.Sealer.ExtraData) - if etherbase := *c.Sealer.Etherbase; etherbase != "" { + if etherbase := c.Sealer.Etherbase; etherbase != "" { if !common.IsHexAddress(etherbase) { return nil, fmt.Errorf("etherbase is not an address: %s", etherbase) } @@ -398,7 +374,7 @@ func (c *Config) buildEth() (*ethconfig.Config, error) { // whitelist { n.Whitelist = map[uint64]common.Hash{} - for k, v := range *c.Whitelist { + for k, v := range c.Whitelist { number, err := strconv.ParseUint(k, 0, 64) if err != nil { return nil, fmt.Errorf("invalid whitelist block number %s: %v", k, err) @@ -413,9 +389,9 @@ func (c *Config) buildEth() (*ethconfig.Config, error) { // cache { - cache := *c.Cache.Cache - calcPerc := func(val *uint64) int { - return int(cache * (*val) / 100) + cache := c.Cache.Cache + calcPerc := func(val uint64) int { + return int(cache * (val) / 100) } // Cap the cache allowance @@ -437,28 +413,28 @@ func (c *Config) buildEth() (*ethconfig.Config, error) { log.Debug("Sanitizing Go's GC trigger", "percent", int(gogc)) godebug.SetGCPercent(int(gogc)) - n.TrieCleanCacheJournal = *c.Cache.Journal - n.TrieCleanCacheRejournal = *c.Cache.Rejournal + n.TrieCleanCacheJournal = c.Cache.Journal + n.TrieCleanCacheRejournal = c.Cache.Rejournal n.DatabaseCache = calcPerc(c.Cache.PercDatabase) n.SnapshotCache = calcPerc(c.Cache.PercSnapshot) n.TrieCleanCache = calcPerc(c.Cache.PercTrie) n.TrieDirtyCache = calcPerc(c.Cache.PercGc) - n.NoPrefetch = *c.Cache.NoPrefetch - n.Preimages = *c.Cache.Preimages - n.TxLookupLimit = *c.Cache.TxLookupLimit + n.NoPrefetch = c.Cache.NoPrefetch + n.Preimages = c.Cache.Preimages + n.TxLookupLimit = c.Cache.TxLookupLimit } - n.RPCGasCap = *c.JsonRPC.GasCap + n.RPCGasCap = c.JsonRPC.GasCap if n.RPCGasCap != 0 { log.Info("Set global gas cap", "cap", n.RPCGasCap) } else { log.Info("Global gas cap disabled") } - n.RPCTxFeeCap = *c.JsonRPC.TxFeeCap + n.RPCTxFeeCap = c.JsonRPC.TxFeeCap // sync mode. It can either be "fast", "full" or "snap". We disable // for now the "light" mode. - switch *c.SyncMode { + switch c.SyncMode { case "fast": n.SyncMode = downloader.FastSync case "full": @@ -466,11 +442,11 @@ func (c *Config) buildEth() (*ethconfig.Config, error) { case "snap": n.SyncMode = downloader.SnapSync default: - return nil, fmt.Errorf("sync mode '%s' not found", *c.SyncMode) + return nil, fmt.Errorf("sync mode '%s' not found", c.SyncMode) } // archive mode. It can either be "archive" or "full". - switch *c.GcMode { + switch c.GcMode { case "full": n.NoPruning = false case "archive": @@ -480,11 +456,11 @@ func (c *Config) buildEth() (*ethconfig.Config, error) { log.Info("Enabling recording of key preimages since archive mode is used") } default: - return nil, fmt.Errorf("gcmode '%s' not found", *c.GcMode) + return nil, fmt.Errorf("gcmode '%s' not found", c.GcMode) } // snapshot disable check - if *c.Snapshot { + if c.Snapshot { if n.SyncMode == downloader.SnapSync { log.Info("Snap sync requested, enabling --snapshot") } else { @@ -506,50 +482,50 @@ var ( func (c *Config) buildNode() (*node.Config, error) { ipcPath := "" - if !*c.JsonRPC.IPCDisable { + if !c.JsonRPC.IPCDisable { ipcPath = clientIdentifier + ".ipc" - if *c.JsonRPC.IPCPath != "" { - ipcPath = *c.JsonRPC.IPCPath + if c.JsonRPC.IPCPath != "" { + ipcPath = c.JsonRPC.IPCPath } } cfg := &node.Config{ Name: clientIdentifier, - DataDir: *c.DataDir, - UseLightweightKDF: *c.Accounts.UseLightweightKDF, - InsecureUnlockAllowed: *c.Accounts.AllowInsecureUnlock, + DataDir: c.DataDir, + UseLightweightKDF: c.Accounts.UseLightweightKDF, + InsecureUnlockAllowed: c.Accounts.AllowInsecureUnlock, Version: params.VersionWithCommit(gitCommit, gitDate), IPCPath: ipcPath, P2P: p2p.Config{ - MaxPeers: int(*c.P2P.MaxPeers), - MaxPendingPeers: int(*c.P2P.MaxPendPeers), - ListenAddr: *c.P2P.Bind + ":" + strconv.Itoa(int(*c.P2P.Port)), - DiscoveryV5: *c.P2P.Discovery.V5Enabled, + MaxPeers: int(c.P2P.MaxPeers), + MaxPendingPeers: int(c.P2P.MaxPendPeers), + ListenAddr: c.P2P.Bind + ":" + strconv.Itoa(int(c.P2P.Port)), + DiscoveryV5: c.P2P.Discovery.V5Enabled, }, HTTPModules: c.JsonRPC.Modules, HTTPCors: c.JsonRPC.Cors, HTTPVirtualHosts: c.JsonRPC.VHost, - HTTPPathPrefix: *c.JsonRPC.Http.Prefix, + HTTPPathPrefix: c.JsonRPC.Http.Prefix, WSModules: c.JsonRPC.Modules, WSOrigins: c.JsonRPC.Cors, - WSPathPrefix: *c.JsonRPC.Ws.Prefix, + WSPathPrefix: c.JsonRPC.Ws.Prefix, GraphQLCors: c.JsonRPC.Cors, GraphQLVirtualHosts: c.JsonRPC.VHost, } // enable jsonrpc endpoints { - if *c.JsonRPC.Http.Enabled { - cfg.HTTPHost = *c.JsonRPC.Http.Host - cfg.HTTPPort = int(*c.JsonRPC.Http.Port) + if c.JsonRPC.Http.Enabled { + cfg.HTTPHost = c.JsonRPC.Http.Host + cfg.HTTPPort = int(c.JsonRPC.Http.Port) } - if *c.JsonRPC.Ws.Enabled { - cfg.WSHost = *c.JsonRPC.Ws.Host - cfg.WSPort = int(*c.JsonRPC.Ws.Port) + if c.JsonRPC.Ws.Enabled { + cfg.WSHost = c.JsonRPC.Ws.Host + cfg.WSPort = int(c.JsonRPC.Ws.Port) } } - natif, err := nat.Parse(*c.P2P.NAT) + natif, err := nat.Parse(c.P2P.NAT) if err != nil { return nil, fmt.Errorf("wrong 'nat' flag: %v", err) } @@ -574,7 +550,7 @@ func (c *Config) buildNode() (*node.Config, error) { return nil, err } - if *c.P2P.NoDiscover { + if c.P2P.NoDiscover { // Disable networking, for now, we will not even allow incomming connections cfg.P2P.MaxPeers = 0 cfg.P2P.NoDiscovery = true diff --git a/command/server/config_test.go b/command/server/config_test.go index 386757a60..e11b02766 100644 --- a/command/server/config_test.go +++ b/command/server/config_test.go @@ -2,6 +2,7 @@ package server import ( "testing" + "time" "github.com/stretchr/testify/assert" ) @@ -20,11 +21,14 @@ func TestConfigDefault(t *testing.T) { func TestConfigMerge(t *testing.T) { c0 := &Config{ - Chain: stringPtr("0"), - Debug: boolPtr(false), - Whitelist: mapStrPtr(map[string]string{ + Chain: "0", + Debug: true, + Whitelist: map[string]string{ "a": "b", - }), + }, + TxPool: &TxPoolConfig{ + LifeTime: 5 * time.Second, + }, P2P: &P2PConfig{ Discovery: &P2PDiscovery{ StaticNodes: []string{ @@ -34,11 +38,12 @@ func TestConfigMerge(t *testing.T) { }, } c1 := &Config{ - Chain: stringPtr("1"), - Whitelist: mapStrPtr(map[string]string{ + Chain: "1", + Whitelist: map[string]string{ "b": "c", - }), + }, P2P: &P2PConfig{ + MaxPeers: 10, Discovery: &P2PDiscovery{ StaticNodes: []string{ "b", @@ -47,13 +52,17 @@ func TestConfigMerge(t *testing.T) { }, } expected := &Config{ - Chain: stringPtr("1"), - Debug: boolPtr(false), - Whitelist: mapStrPtr(map[string]string{ + Chain: "1", + Debug: true, + Whitelist: map[string]string{ "a": "b", "b": "c", - }), + }, + TxPool: &TxPoolConfig{ + LifeTime: 5 * time.Second, + }, P2P: &P2PConfig{ + MaxPeers: 10, Discovery: &P2PDiscovery{ StaticNodes: []string{ "a", diff --git a/command/server/flags.go b/command/server/flags.go index 8513e1906..d9bd01746 100644 --- a/command/server/flags.go +++ b/command/server/flags.go @@ -12,22 +12,22 @@ func (c *Command) Flags() *flagset.Flagset { f.BoolFlag(&flagset.BoolFlag{ Name: "debug", Usage: "Path of the file to apply", - Value: c.cliConfig.Debug, + Value: &c.cliConfig.Debug, }) f.StringFlag(&flagset.StringFlag{ Name: "chain", Usage: "Name of the chain to sync", - Value: c.cliConfig.Chain, + Value: &c.cliConfig.Chain, }) f.StringFlag(&flagset.StringFlag{ Name: "log-level", Usage: "Set log level for the server", - Value: c.cliConfig.LogLevel, + Value: &c.cliConfig.LogLevel, }) f.StringFlag(&flagset.StringFlag{ Name: "datadir", Usage: "Path of the data directory to store information", - Value: c.cliConfig.DataDir, + Value: &c.cliConfig.DataDir, }) f.StringFlag(&flagset.StringFlag{ Name: "config", @@ -37,34 +37,34 @@ func (c *Command) Flags() *flagset.Flagset { f.StringFlag(&flagset.StringFlag{ Name: "syncmode", Usage: `Blockchain sync mode ("fast", "full", "snap" or "light")`, - Value: c.cliConfig.SyncMode, + Value: &c.cliConfig.SyncMode, }) f.StringFlag(&flagset.StringFlag{ Name: "gcmode", Usage: `Blockchain garbage collection mode ("full", "archive")`, - Value: c.cliConfig.GcMode, + Value: &c.cliConfig.GcMode, }) f.MapStringFlag(&flagset.MapStringFlag{ Name: "whitelist", Usage: "Comma separated block number-to-hash mappings to enforce (<number>=<hash>)", - Value: c.cliConfig.Whitelist, + Value: &c.cliConfig.Whitelist, }) f.BoolFlag(&flagset.BoolFlag{ Name: "snapshot", Usage: `Enables snapshot-database mode (default = enable)`, - Value: c.cliConfig.Snapshot, + Value: &c.cliConfig.Snapshot, }) // heimdall f.StringFlag(&flagset.StringFlag{ Name: "bor.heimdall", Usage: "URL of Heimdall service", - Value: c.cliConfig.Heimdall.URL, + Value: &c.cliConfig.Heimdall.URL, }) f.BoolFlag(&flagset.BoolFlag{ Name: "bor.withoutheimdall", Usage: "Run without Heimdall service (for testing purpose)", - Value: c.cliConfig.Heimdall.Without, + Value: &c.cliConfig.Heimdall.Without, }) // txpool options @@ -76,74 +76,74 @@ func (c *Command) Flags() *flagset.Flagset { f.BoolFlag(&flagset.BoolFlag{ Name: "txpool.nolocals", Usage: "Disables price exemptions for locally submitted transactions", - Value: c.cliConfig.TxPool.NoLocals, + Value: &c.cliConfig.TxPool.NoLocals, }) f.StringFlag(&flagset.StringFlag{ Name: "txpool.journal", Usage: "Disk journal for local transaction to survive node restarts", - Value: c.cliConfig.TxPool.Journal, + Value: &c.cliConfig.TxPool.Journal, }) f.DurationFlag(&flagset.DurationFlag{ Name: "txpool.rejournal", Usage: "Time interval to regenerate the local transaction journal", - Value: c.cliConfig.TxPool.Rejournal, + Value: &c.cliConfig.TxPool.Rejournal, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.pricelimit", Usage: "Minimum gas price limit to enforce for acceptance into the pool", - Value: c.cliConfig.TxPool.PriceLimit, + Value: &c.cliConfig.TxPool.PriceLimit, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.pricebump", Usage: "Price bump percentage to replace an already existing transaction", - Value: c.cliConfig.TxPool.PriceBump, + Value: &c.cliConfig.TxPool.PriceBump, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.accountslots", Usage: "Minimum number of executable transaction slots guaranteed per account", - Value: c.cliConfig.TxPool.AccountSlots, + Value: &c.cliConfig.TxPool.AccountSlots, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.globalslots", Usage: "Maximum number of executable transaction slots for all accounts", - Value: c.cliConfig.TxPool.GlobalSlots, + Value: &c.cliConfig.TxPool.GlobalSlots, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.accountqueue", Usage: "Maximum number of non-executable transaction slots permitted per account", - Value: c.cliConfig.TxPool.AccountQueue, + Value: &c.cliConfig.TxPool.AccountQueue, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txpool.globalqueue", Usage: "Maximum number of non-executable transaction slots for all accounts", - Value: c.cliConfig.TxPool.GlobalQueue, + Value: &c.cliConfig.TxPool.GlobalQueue, }) f.DurationFlag(&flagset.DurationFlag{ Name: "txpool.lifetime", Usage: "Maximum amount of time non-executable transaction are queued", - Value: c.cliConfig.TxPool.LifeTime, + Value: &c.cliConfig.TxPool.LifeTime, }) // sealer options f.BoolFlag(&flagset.BoolFlag{ Name: "mine", Usage: "Enable mining", - Value: c.cliConfig.Sealer.Enabled, + Value: &c.cliConfig.Sealer.Enabled, }) f.StringFlag(&flagset.StringFlag{ Name: "miner.etherbase", Usage: "Public address for block mining rewards (default = first account)", - Value: c.cliConfig.Sealer.Etherbase, + Value: &c.cliConfig.Sealer.Etherbase, }) f.StringFlag(&flagset.StringFlag{ Name: "miner.extradata", Usage: "Block extra data set by the miner (default = client version)", - Value: c.cliConfig.Sealer.ExtraData, + Value: &c.cliConfig.Sealer.ExtraData, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "miner.gaslimit", Usage: "Target gas ceiling for mined blocks", - Value: c.cliConfig.Sealer.GasCeil, + Value: &c.cliConfig.Sealer.GasCeil, }) f.BigIntFlag(&flagset.BigIntFlag{ Name: "miner.gasprice", @@ -155,19 +155,19 @@ func (c *Command) Flags() *flagset.Flagset { f.StringFlag(&flagset.StringFlag{ Name: "ethstats", Usage: "Reporting URL of a ethstats service (nodename:secret@host:port)", - Value: c.cliConfig.Ethstats, + Value: &c.cliConfig.Ethstats, }) // gas price oracle f.Uint64Flag(&flagset.Uint64Flag{ Name: "gpo.blocks", Usage: "Number of recent blocks to check for gas prices", - Value: c.cliConfig.Gpo.Blocks, + Value: &c.cliConfig.Gpo.Blocks, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "gpo.percentile", 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, }) f.BigIntFlag(&flagset.BigIntFlag{ Name: "gpo.maxprice", @@ -184,74 +184,74 @@ func (c *Command) Flags() *flagset.Flagset { f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache", Usage: "Megabytes of memory allocated to internal caching (default = 4096 mainnet full node)", - Value: c.cliConfig.Cache.Cache, + Value: &c.cliConfig.Cache.Cache, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache.database", Usage: "Percentage of cache memory allowance to use for database io", - Value: c.cliConfig.Cache.PercDatabase, + Value: &c.cliConfig.Cache.PercDatabase, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache.trie", 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, }) f.StringFlag(&flagset.StringFlag{ Name: "cache.trie.journal", Usage: "Disk journal directory for trie cache to survive node restarts", - Value: c.cliConfig.Cache.Journal, + Value: &c.cliConfig.Cache.Journal, }) f.DurationFlag(&flagset.DurationFlag{ Name: "cache.trie.rejournal", Usage: "Time interval to regenerate the trie cache journal", - Value: c.cliConfig.Cache.Rejournal, + Value: &c.cliConfig.Cache.Rejournal, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache.gc", 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, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "cache.snapshot", 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, }) f.BoolFlag(&flagset.BoolFlag{ Name: "cache.noprefetch", 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, }) f.BoolFlag(&flagset.BoolFlag{ Name: "cache.preimages", Usage: "Enable recording the SHA3/keccak preimages of trie keys", - Value: c.cliConfig.Cache.Preimages, + Value: &c.cliConfig.Cache.Preimages, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "txlookuplimit", Usage: "Number of recent blocks to maintain transactions index for (default = about one year, 0 = entire chain)", - Value: c.cliConfig.Cache.TxLookupLimit, + Value: &c.cliConfig.Cache.TxLookupLimit, }) // rpc options f.Uint64Flag(&flagset.Uint64Flag{ Name: "rpc.gascap", 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, }) f.Float64Flag(&flagset.Float64Flag{ Name: "rpc.txfeecap", 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, }) f.BoolFlag(&flagset.BoolFlag{ Name: "ipcdisable", Usage: "Disable the IPC-RPC server", - Value: c.cliConfig.JsonRPC.IPCDisable, + Value: &c.cliConfig.JsonRPC.IPCDisable, }) f.StringFlag(&flagset.StringFlag{ Name: "ipcpath", Usage: "Filename for IPC socket/pipe within the datadir (explicit paths escape it)", - Value: c.cliConfig.JsonRPC.IPCPath, + Value: &c.cliConfig.JsonRPC.IPCPath, }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "jsonrpc.corsdomain", @@ -264,7 +264,7 @@ func (c *Command) Flags() *flagset.Flagset { Value: &c.cliConfig.JsonRPC.VHost, }) f.SliceStringFlag(&flagset.SliceStringFlag{ - Name: "jsonrpc.modules", + Name: "jsonrpc.modules", Usage: "API's offered over the HTTP-RPC interface", Value: &c.cliConfig.JsonRPC.Modules, }) @@ -273,61 +273,61 @@ func (c *Command) Flags() *flagset.Flagset { f.BoolFlag(&flagset.BoolFlag{ Name: "http", Usage: "Enable the HTTP-RPC server", - Value: c.cliConfig.JsonRPC.Http.Enabled, + Value: &c.cliConfig.JsonRPC.Http.Enabled, }) f.StringFlag(&flagset.StringFlag{ Name: "http.addr", Usage: "HTTP-RPC server listening interface", - Value: c.cliConfig.JsonRPC.Http.Host, + Value: &c.cliConfig.JsonRPC.Http.Host, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "http.port", Usage: "HTTP-RPC server listening port", - Value: c.cliConfig.JsonRPC.Http.Port, + Value: &c.cliConfig.JsonRPC.Http.Port, }) f.StringFlag(&flagset.StringFlag{ Name: "http.rpcprefix", 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, }) // ws options f.BoolFlag(&flagset.BoolFlag{ Name: "ws", Usage: "Enable the WS-RPC server", - Value: c.cliConfig.JsonRPC.Ws.Enabled, + Value: &c.cliConfig.JsonRPC.Ws.Enabled, }) f.StringFlag(&flagset.StringFlag{ Name: "ws.addr", Usage: "WS-RPC server listening interface", - Value: c.cliConfig.JsonRPC.Ws.Host, + Value: &c.cliConfig.JsonRPC.Ws.Host, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "ws.port", Usage: "WS-RPC server listening port", - Value: c.cliConfig.JsonRPC.Ws.Port, + Value: &c.cliConfig.JsonRPC.Ws.Port, }) f.StringFlag(&flagset.StringFlag{ Name: "ws.rpcprefix", 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, }) // graphql options f.BoolFlag(&flagset.BoolFlag{ 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.", - Value: c.cliConfig.JsonRPC.Graphql.Enabled, + Value: &c.cliConfig.JsonRPC.Graphql.Enabled, }) // p2p options f.StringFlag(&flagset.StringFlag{ Name: "bind", Usage: "Network binding address", - Value: c.cliConfig.P2P.Bind, + Value: &c.cliConfig.P2P.Bind, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "port", Usage: "Network listening port", - Value: c.cliConfig.P2P.Port, + Value: &c.cliConfig.P2P.Port, }) f.SliceStringFlag(&flagset.SliceStringFlag{ Name: "bootnodes", @@ -337,90 +337,90 @@ func (c *Command) Flags() *flagset.Flagset { f.Uint64Flag(&flagset.Uint64Flag{ Name: "maxpeers", Usage: "Maximum number of network peers (network disabled if set to 0)", - Value: c.cliConfig.P2P.MaxPeers, + Value: &c.cliConfig.P2P.MaxPeers, }) f.Uint64Flag(&flagset.Uint64Flag{ Name: "maxpendpeers", Usage: "Maximum number of pending connection attempts (defaults used if set to 0)", - Value: c.cliConfig.P2P.MaxPendPeers, + Value: &c.cliConfig.P2P.MaxPendPeers, }) f.StringFlag(&flagset.StringFlag{ Name: "nat", Usage: "NAT port mapping mechanism (any|none|upnp|pmp|extip:<IP>)", - Value: c.cliConfig.P2P.NAT, + Value: &c.cliConfig.P2P.NAT, }) f.BoolFlag(&flagset.BoolFlag{ Name: "nodiscover", Usage: "Disables the peer discovery mechanism (manual peer addition)", - Value: c.cliConfig.P2P.NoDiscover, + Value: &c.cliConfig.P2P.NoDiscover, }) f.BoolFlag(&flagset.BoolFlag{ Name: "v5disc", Usage: "Enables the experimental RLPx V5 (Topic Discovery) mechanism", - Value: c.cliConfig.P2P.Discovery.V5Enabled, + Value: &c.cliConfig.P2P.Discovery.V5Enabled, }) // metrics f.BoolFlag(&flagset.BoolFlag{ Name: "metrics", Usage: "Enable metrics collection and reporting", - Value: c.cliConfig.Metrics.Enabled, + Value: &c.cliConfig.Metrics.Enabled, }) f.BoolFlag(&flagset.BoolFlag{ Name: "metrics.expensive", Usage: "Enable expensive metrics collection and reporting", - Value: c.cliConfig.Metrics.Expensive, + Value: &c.cliConfig.Metrics.Expensive, }) f.BoolFlag(&flagset.BoolFlag{ Name: "metrics.influxdb", Usage: "Enable metrics export/push to an external InfluxDB database (v1)", - Value: c.cliConfig.Metrics.InfluxDB.V1Enabled, + Value: &c.cliConfig.Metrics.InfluxDB.V1Enabled, }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.endpoint", Usage: "InfluxDB API endpoint to report metrics to", - Value: c.cliConfig.Metrics.InfluxDB.Endpoint, + Value: &c.cliConfig.Metrics.InfluxDB.Endpoint, }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.database", Usage: "InfluxDB database name to push reported metrics to", - Value: c.cliConfig.Metrics.InfluxDB.Database, + Value: &c.cliConfig.Metrics.InfluxDB.Database, }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.username", Usage: "Username to authorize access to the database", - Value: c.cliConfig.Metrics.InfluxDB.Username, + Value: &c.cliConfig.Metrics.InfluxDB.Username, }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.password", Usage: "Password to authorize access to the database", - Value: c.cliConfig.Metrics.InfluxDB.Password, + Value: &c.cliConfig.Metrics.InfluxDB.Password, }) f.MapStringFlag(&flagset.MapStringFlag{ Name: "metrics.influxdb.tags", Usage: "Comma-separated InfluxDB tags (key/values) attached to all measurements", - Value: c.cliConfig.Metrics.InfluxDB.Tags, + Value: &c.cliConfig.Metrics.InfluxDB.Tags, }) // influx db v2 f.BoolFlag(&flagset.BoolFlag{ Name: "metrics.influxdbv2", Usage: "Enable metrics export/push to an external InfluxDB v2 database", - Value: c.cliConfig.Metrics.InfluxDB.V2Enabled, + Value: &c.cliConfig.Metrics.InfluxDB.V2Enabled, }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.token", Usage: "Token to authorize access to the database (v2 only)", - Value: c.cliConfig.Metrics.InfluxDB.Token, + Value: &c.cliConfig.Metrics.InfluxDB.Token, }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.bucket", Usage: "InfluxDB bucket name to push reported metrics to (v2 only)", - Value: c.cliConfig.Metrics.InfluxDB.Bucket, + Value: &c.cliConfig.Metrics.InfluxDB.Bucket, }) f.StringFlag(&flagset.StringFlag{ Name: "metrics.influxdb.organization", Usage: "InfluxDB organization name (v2 only)", - Value: c.cliConfig.Metrics.InfluxDB.Organization, + Value: &c.cliConfig.Metrics.InfluxDB.Organization, }) // account @@ -432,17 +432,17 @@ func (c *Command) Flags() *flagset.Flagset { f.StringFlag(&flagset.StringFlag{ Name: "password", Usage: "Password file to use for non-interactive password input", - Value: c.cliConfig.Accounts.PasswordFile, + Value: &c.cliConfig.Accounts.PasswordFile, }) f.BoolFlag(&flagset.BoolFlag{ Name: "allow-insecure-unlock", Usage: "Allow insecure account unlocking when account-related RPCs are exposed by http", - Value: c.cliConfig.Accounts.AllowInsecureUnlock, + Value: &c.cliConfig.Accounts.AllowInsecureUnlock, }) f.BoolFlag(&flagset.BoolFlag{ Name: "lightkdf", Usage: "Reduce key-derivation RAM & CPU usage at some expense of KDF strength", - Value: c.cliConfig.Accounts.UseLightweightKDF, + Value: &c.cliConfig.Accounts.UseLightweightKDF, }) return f -- GitLab