-
Notifications
You must be signed in to change notification settings - Fork 0
/
config.go
140 lines (129 loc) · 4.35 KB
/
config.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
package config
import (
"bytes"
"path/filepath"
"strings"
"github.com/0xPolygonHermez/zkevm-node/aggregator"
"github.com/0xPolygonHermez/zkevm-node/db"
"github.com/0xPolygonHermez/zkevm-node/etherman"
"github.com/0xPolygonHermez/zkevm-node/ethtxmanager"
"github.com/0xPolygonHermez/zkevm-node/gasprice"
"github.com/0xPolygonHermez/zkevm-node/jsonrpc"
"github.com/0xPolygonHermez/zkevm-node/log"
"github.com/0xPolygonHermez/zkevm-node/merkletree"
"github.com/0xPolygonHermez/zkevm-node/metrics"
"github.com/0xPolygonHermez/zkevm-node/pool"
"github.com/0xPolygonHermez/zkevm-node/pricegetter"
"github.com/0xPolygonHermez/zkevm-node/sequencer"
"github.com/0xPolygonHermez/zkevm-node/sequencer/broadcast"
"github.com/0xPolygonHermez/zkevm-node/state/runtime/executor"
"github.com/0xPolygonHermez/zkevm-node/synchronizer"
"github.com/mitchellh/mapstructure"
"github.com/spf13/viper"
"github.com/urfave/cli/v2"
)
const (
// FlagYes is the flag for yes.
FlagYes = "yes"
// FlagCfg is the flag for cfg.
FlagCfg = "cfg"
// FlagGenesisFile is the flag for genesis file.
FlagGenesisFile = "genesis"
// FlagAmount is the flag for amount.
FlagAmount = "amount"
// FlagRemoteMT is the flag for remote-merkletree.
FlagRemoteMT = "remote-merkletree"
// FlagComponents is the flag for components.
FlagComponents = "components"
// FlagHTTPAPI is the flag for http.api.
FlagHTTPAPI = "http.api"
// FlagKeyStorePath is the path of the key store file containing the private key of the account going to sing and approve the tokens
FlagKeyStorePath = "key-store-path"
// FlagPassword is the password needed to decrypt the key store
FlagPassword = "password"
// FlagMigrations is the flag for migrations.
FlagMigrations = "migrations"
)
// Config represents the configuration of the entire Hermez Node
type Config struct {
IsTrustedSequencer bool `mapstructure:"IsTrustedSequencer"`
DefaultForkID uint64 `mapstructure:"DefaultForkID"`
Log log.Config
Etherman etherman.Config
EthTxManager ethtxmanager.Config
Pool pool.Config
RPC jsonrpc.Config
Synchronizer synchronizer.Config
Sequencer sequencer.Config
PriceGetter pricegetter.Config
Aggregator aggregator.Config
NetworkConfig NetworkConfig
L2GasPriceSuggester gasprice.Config
Executor executor.Config
BroadcastServer broadcast.ServerConfig
MTClient merkletree.Config
StateDB db.Config
Metrics metrics.Config
}
// Default parses the default configuration values.
func Default() (*Config, error) {
var cfg Config
viper.SetConfigType("toml")
err := viper.ReadConfig(bytes.NewBuffer([]byte(DefaultValues)))
if err != nil {
return nil, err
}
err = viper.Unmarshal(&cfg, viper.DecodeHook(mapstructure.TextUnmarshallerHookFunc()))
if err != nil {
return nil, err
}
return &cfg, nil
}
// Load loads the configuration
func Load(ctx *cli.Context) (*Config, error) {
cfg, err := Default()
if err != nil {
return nil, err
}
configFilePath := ctx.String(FlagCfg)
if configFilePath != "" {
dirName, fileName := filepath.Split(configFilePath)
fileExtension := strings.TrimPrefix(filepath.Ext(fileName), ".")
fileNameWithoutExtension := strings.TrimSuffix(fileName, "."+fileExtension)
viper.AddConfigPath(dirName)
viper.SetConfigName(fileNameWithoutExtension)
viper.SetConfigType(fileExtension)
}
viper.AutomaticEnv()
replacer := strings.NewReplacer(".", "_")
viper.SetEnvKeyReplacer(replacer)
viper.SetEnvPrefix("ZKEVM_NODE")
err = viper.ReadInConfig()
if err != nil {
_, ok := err.(viper.ConfigFileNotFoundError)
if ok {
log.Infof("config file not found")
} else {
log.Infof("error reading config file: ", err)
return nil, err
}
}
decodeHooks := []viper.DecoderConfigOption{
// this allows arrays to be decoded from env var separated by ",", example: MY_VAR="value1,value2,value3"
viper.DecodeHook(mapstructure.ComposeDecodeHookFunc(mapstructure.TextUnmarshallerHookFunc(), mapstructure.StringToSliceHookFunc(","))),
}
err = viper.Unmarshal(&cfg, decodeHooks...)
if err != nil {
return nil, err
}
// Load genesis parameters
cfg.loadNetworkConfig(ctx)
/*
cfgJSON, err := json.MarshalIndent(cfg, "", " ")
if err != nil {
return nil, err
}
log.Debugf("Configuration loaded: \n%s\n", string(cfgJSON))
*/
return cfg, nil
}