arnaucube
arnaucube/hermez-nodePublic Self-hosted repository
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}