// VulcanizeDB // Copyright © 2019 Vulcanize // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . package resync import ( "fmt" "time" "github.com/spf13/viper" "github.com/vulcanize/ipfs-blockchain-watcher/pkg/config" "github.com/vulcanize/ipfs-blockchain-watcher/pkg/node" "github.com/vulcanize/ipfs-blockchain-watcher/pkg/postgres" "github.com/vulcanize/ipfs-blockchain-watcher/pkg/shared" "github.com/vulcanize/ipfs-blockchain-watcher/utils" ) // Env variables const ( RESYNC_CHAIN = "RESYNC_CHAIN" RESYNC_START = "RESYNC_START" RESYNC_STOP = "RESYNC_STOP" RESYNC_BATCH_SIZE = "RESYNC_BATCH_SIZE" RESYNC_BATCH_NUMBER = "RESYNC_BATCH_NUMBER" RESYNC_CLEAR_OLD_CACHE = "RESYNC_CLEAR_OLD_CACHE" RESYNC_TYPE = "RESYNC_TYPE" RESYNC_RESET_VALIDATION = "RESYNC_RESET_VALIDATION" ) // Config holds the parameters needed to perform a resync type Config struct { Chain shared.ChainType // The type of resync to perform ResyncType shared.DataType // The type of data to resync ClearOldCache bool // Resync will first clear all the data within the range ResetValidation bool // If true, resync will reset the validation level to 0 for the given range // DB info DB *postgres.DB DBConfig config.Database IPFSPath string IPFSMode shared.IPFSMode HTTPClient interface{} // Note this client is expected to support the retrieval of the specified data type(s) NodeInfo node.Node // Info for the associated node Ranges [][2]uint64 // The block height ranges to resync BatchSize uint64 // BatchSize for the resync http calls (client has to support batch sizing) Timeout time.Duration // HTTP connection timeout in seconds BatchNumber uint64 } // NewConfig fills and returns a resync config from toml parameters func NewConfig() (*Config, error) { c := new(Config) var err error viper.BindEnv("resync.start", RESYNC_START) viper.BindEnv("resync.stop", RESYNC_STOP) viper.BindEnv("resync.clearOldCache", RESYNC_CLEAR_OLD_CACHE) viper.BindEnv("resync.type", RESYNC_TYPE) viper.BindEnv("resync.chain", RESYNC_CHAIN) viper.BindEnv("ethereum.httpPath", shared.ETH_HTTP_PATH) viper.BindEnv("bitcoin.httpPath", shared.BTC_HTTP_PATH) viper.BindEnv("resync.batchSize", RESYNC_BATCH_SIZE) viper.BindEnv("resync.batchNumber", RESYNC_BATCH_NUMBER) viper.BindEnv("resync.resetValidation", RESYNC_RESET_VALIDATION) viper.BindEnv("resync.timeout", shared.HTTP_TIMEOUT) timeout := viper.GetInt("resync.timeout") if timeout < 5 { timeout = 5 } c.Timeout = time.Second * time.Duration(timeout) start := uint64(viper.GetInt64("resync.start")) stop := uint64(viper.GetInt64("resync.stop")) c.Ranges = [][2]uint64{{start, stop}} c.ClearOldCache = viper.GetBool("resync.clearOldCache") c.ResetValidation = viper.GetBool("resync.resetValidation") c.IPFSMode, err = shared.GetIPFSMode() if err != nil { return nil, err } if c.IPFSMode == shared.LocalInterface || c.IPFSMode == shared.RemoteClient { c.IPFSPath, err = shared.GetIPFSPath() if err != nil { return nil, err } } resyncType := viper.GetString("resync.type") c.ResyncType, err = shared.GenerateDataTypeFromString(resyncType) if err != nil { return nil, err } chain := viper.GetString("resync.chain") c.Chain, err = shared.NewChainType(chain) if err != nil { return nil, err } if ok, err := shared.SupportedDataType(c.ResyncType, c.Chain); !ok { if err != nil { return nil, err } return nil, fmt.Errorf("chain type %s does not support data type %s", c.Chain.String(), c.ResyncType.String()) } switch c.Chain { case shared.Ethereum: ethHTTP := viper.GetString("ethereum.httpPath") c.NodeInfo, c.HTTPClient, err = shared.GetEthNodeAndClient(fmt.Sprintf("http://%s", ethHTTP)) if err != nil { return nil, err } case shared.Bitcoin: btcHTTP := viper.GetString("bitcoin.httpPath") c.NodeInfo, c.HTTPClient = shared.GetBtcNodeAndClient(btcHTTP) } c.DBConfig.Init() db := utils.LoadPostgres(c.DBConfig, c.NodeInfo) c.DB = &db c.BatchSize = uint64(viper.GetInt64("resync.batchSize")) c.BatchNumber = uint64(viper.GetInt64("resync.batchNumber")) return c, nil }