hermez-node/config/config.go
config/config.goRaw
1package config
2
3import (
4 "fmt"
5 "io/ioutil"
6 "time"
7
8 "github.com/BurntSushi/toml"
9 ethCommon "github.com/ethereum/go-ethereum/common"
10 "github.com/hermeznetwork/hermez-node/common"
11 "github.com/hermeznetwork/hermez-node/synchronizer"
12 "gopkg.in/go-playground/validator.v9"
13)
14
15// Duration is a wrapper type that parses time duration from text.
16type Duration struct {
17 time.Duration
18}
19
20// UnmarshalText unmarshalls time duration from text.
21func (d *Duration) UnmarshalText(data []byte) error {
22 duration, err := time.ParseDuration(string(data))
23 if err != nil {
24 return err
25 }
26 d.Duration = duration
27 return nil
28}
29
30// ServerProof is the server proof configuration data.
31type ServerProof struct {
32 URL string `validate:"required"`
33}
34
35// Coordinator is the coordinator specific configuration.
36type Coordinator struct {
37 ForgerAddress ethCommon.Address `validate:"required"`
38 ForgeLoopInterval Duration `validate:"required"`
39 ConfirmBlocks int64 `validate:"required"`
40 L2DB struct {
41 SafetyPeriod common.BatchNum `validate:"required"`
42 MaxTxs uint32 `validate:"required"`
43 TTL Duration `validate:"required"`
44 } `validate:"required"`
45 TxSelector struct {
46 Path string `validate:"required"`
47 } `validate:"required"`
48 BatchBuilder struct {
49 Path string `validate:"required"`
50 } `validate:"required"`
51 ServerProofs []ServerProof `validate:"required"`
52 EthClient struct {
53 CallGasLimit uint64 `validate:"required"`
54 DeployGasLimit uint64 `validate:"required"`
55 GasPriceDiv uint64 `validate:"required"`
56 ReceiptTimeout Duration `validate:"required"`
57 IntervalReceiptLoop Duration `validate:"required"`
58 } `validate:"required"`
59 API struct {
60 Coordinator bool
61 } `validate:"required"`
62}
63
64// Node is the hermez node configuration.
65type Node struct {
66 StateDB struct {
67 Path string
68 } `validate:"required"`
69 PostgreSQL struct {
70 Port int `validate:"required"`
71 Host string `validate:"required"`
72 User string `validate:"required"`
73 Password string `validate:"required"`
74 Name string `validate:"required"`
75 } `validate:"required"`
76 Web3 struct {
77 URL string `validate:"required"`
78 } `validate:"required"`
79 Synchronizer struct {
80 SyncLoopInterval Duration `validate:"required"`
81 StatsRefreshPeriod Duration `validate:"required"`
82 StartBlockNum synchronizer.ConfigStartBlockNum `validate:"required"`
83 InitialVariables synchronizer.SCVariables `validate:"required"`
84 } `validate:"required"`
85 SmartContracts struct {
86 Rollup ethCommon.Address `validate:"required"`
87 Auction ethCommon.Address `validate:"required"`
88 WDelayer ethCommon.Address `validate:"required"`
89 TokenHEZ ethCommon.Address `validate:"required"`
90 TokenHEZName string `validate:"required"`
91 } `validate:"required"`
92 API struct {
93 Address string
94 Explorer bool
95 UpdateMetricsInterval Duration
96 UpdateRecommendedFeeInterval Duration
97 } `validate:"required"`
98 Debug struct {
99 APIAddress string
100 }
101}
102
103// Load loads a generic config.
104func Load(path string, cfg interface{}) error {
105 bs, err := ioutil.ReadFile(path) //nolint:gosec
106 if err != nil {
107 return err
108 }
109 cfgToml := string(bs)
110 if _, err := toml.Decode(cfgToml, cfg); err != nil {
111 return err
112 }
113 validate := validator.New()
114 if err := validate.Struct(cfg); err != nil {
115 return fmt.Errorf("error validating configuration file: %w", err)
116 }
117 return nil
118}
119
120// LoadCoordinator loads the Coordinator configuration from path.
121func LoadCoordinator(path string) (*Coordinator, error) {
122 var cfg Coordinator
123 if err := Load(path, &cfg); err != nil {
124 return nil, fmt.Errorf("error loading coordinator configuration file: %w", err)
125 }
126 return &cfg, nil
127}
128
129// LoadNode loads the Node configuration from path.
130func LoadNode(path string) (*Node, error) {
131 var cfg Node
132 if err := Load(path, &cfg); err != nil {
133 return nil, fmt.Errorf("error loading node configuration file: %w", err)
134 }
135 return &cfg, nil
136}