Documentation ¶
Index ¶
Constants ¶
This section is empty.
Variables ¶
View Source
var StartNodeCmd = &cobra.Command{ Use: "start-node", Short: "Starts an instance of SSV node", Run: func(cmd *cobra.Command, args []string) { commons.SetBuildData(cmd.Parent().Short, cmd.Parent().Version) log.Printf("starting %s", commons.GetBuildData()) if err := cleanenv.ReadConfig(globalArgs.ConfigPath, &cfg); err != nil { log.Fatalf("could not read config %s", err) } if globalArgs.ShareConfigPath != "" { if err := cleanenv.ReadConfig(globalArgs.ShareConfigPath, &cfg); err != nil { log.Fatalf("could not read share config %s", err) } } loggerLevel, errLogLevel := logex.GetLoggerLevelValue(cfg.LogLevel) Logger := logex.Build(commons.GetBuildData(), loggerLevel, &logex.EncodingConfig{ Format: cfg.GlobalConfig.LogFormat, LevelEncoder: logex.LevelEncoder([]byte(cfg.LogLevelFormat)), }) if errLogLevel != nil { Logger.Warn(fmt.Sprintf("Default log level set to %s", loggerLevel), zap.Error(errLogLevel)) } cfg.DBOptions.Logger = Logger cfg.DBOptions.Ctx = cmd.Context() db, err := storage.GetStorageFactory(cfg.DBOptions) if err != nil { Logger.Fatal("failed to create db!", zap.Error(err)) } migrationOpts := migrations.Options{ Db: db, Logger: Logger, DbPath: cfg.DBOptions.Path, } err = migrations.Run(cmd.Context(), migrationOpts) if err != nil { Logger.Fatal("failed to run migrations", zap.Error(err)) } eth2Network := beaconprotocol.NewNetwork(core.NetworkFromString(cfg.ETH2Options.Network)) currentEpoch := slots.EpochsSinceGenesis(time.Unix(int64(eth2Network.MinGenesisTime()), 0)) if cfg.ForkV1Epoch > 0 { forksprotocol.SetForkEpoch(types.Epoch(cfg.ForkV1Epoch), forksprotocol.V1ForkVersion) } if cfg.ForkV2Epoch > 0 { Logger.Debug("setting v2 epoch", zap.Uint64("epoch", cfg.ForkV2Epoch)) forksprotocol.SetForkEpoch(types.Epoch(cfg.ForkV2Epoch), forksprotocol.V2ForkVersion) } ssvForkVersion := forksprotocol.GetCurrentForkVersion(currentEpoch) Logger.Info("using ssv fork version", zap.String("version", string(ssvForkVersion))) cfg.ETH2Options.Context = cmd.Context() cfg.ETH2Options.Logger = Logger cfg.ETH2Options.Graffiti = []byte("SSV.Network") cfg.ETH2Options.DB = db beaconClient, err := goclient.New(cfg.ETH2Options) if err != nil { Logger.Fatal("failed to create beacon go-client", zap.Error(err), zap.String("addr", cfg.ETH2Options.BeaconNodeAddr)) } nodeStorage := operatorstorage.NewNodeStorage(db, Logger) if err := nodeStorage.SetupPrivateKey(cfg.GenerateOperatorPrivateKey, cfg.OperatorPrivateKey); err != nil { Logger.Fatal("failed to setup operator private key", zap.Error(err)) } operatorPrivateKey, found, err := nodeStorage.GetPrivateKey() if err != nil || !found { Logger.Fatal("failed to get operator private key", zap.Error(err)) } operatorPubKey, err := rsaencryption.ExtractPublicKey(operatorPrivateKey) if err != nil { Logger.Fatal("failed to extract operator public key", zap.Error(err)) } istore := ssv_identity.NewIdentityStore(db, Logger) netPrivKey, err := istore.SetupNetworkKey(cfg.NetworkPrivateKey) if err != nil { Logger.Fatal("failed to setup network private key", zap.Error(err)) } cfg.P2pNetworkConfig.NetworkPrivateKey = netPrivKey cfg.P2pNetworkConfig.Logger = Logger cfg.P2pNetworkConfig.ForkVersion = ssvForkVersion cfg.P2pNetworkConfig.OperatorID = format.OperatorID(operatorPubKey) cfg.P2pNetworkConfig.UserAgent = forksv0.GenUserAgentWithOperatorID(cfg.P2pNetworkConfig.OperatorID) p2pNet := p2pv1.New(cmd.Context(), &cfg.P2pNetworkConfig) if err := p2pNet.Setup(); err != nil { Logger.Fatal("failed to setup network", zap.Error(err)) } ctx := cmd.Context() cfg.SSVOptions.ForkVersion = ssvForkVersion cfg.SSVOptions.Context = ctx cfg.SSVOptions.Logger = Logger cfg.SSVOptions.DB = db cfg.SSVOptions.Beacon = beaconClient cfg.SSVOptions.ETHNetwork = eth2Network cfg.SSVOptions.Network = p2pNet cfg.SSVOptions.ValidatorOptions.ForkVersion = ssvForkVersion cfg.SSVOptions.ValidatorOptions.ETHNetwork = eth2Network cfg.SSVOptions.ValidatorOptions.Logger = Logger cfg.SSVOptions.ValidatorOptions.Context = ctx cfg.SSVOptions.ValidatorOptions.DB = db cfg.SSVOptions.ValidatorOptions.Network = p2pNet cfg.SSVOptions.ValidatorOptions.Beacon = beaconClient cfg.SSVOptions.ValidatorOptions.CleanRegistryData = cfg.ETH1Options.CleanRegistryData cfg.SSVOptions.ValidatorOptions.KeyManager = beaconClient cfg.SSVOptions.ValidatorOptions.ShareEncryptionKeyProvider = nodeStorage.GetPrivateKey cfg.SSVOptions.ValidatorOptions.OperatorPubKey = operatorPubKey cfg.SSVOptions.ValidatorOptions.RegistryStorage = nodeStorage Logger.Info("using registry contract address", zap.String("addr", cfg.ETH1Options.RegistryContractAddr), zap.String("abi version", cfg.ETH1Options.AbiVersion.String())) if len(cfg.ETH1Options.RegistryContractABI) > 0 { Logger.Info("using registry contract abi", zap.String("abi", cfg.ETH1Options.RegistryContractABI)) if err = eth1.LoadABI(cfg.ETH1Options.RegistryContractABI); err != nil { Logger.Fatal("failed to load ABI JSON", zap.Error(err)) } } cfg.SSVOptions.Eth1Client, err = goeth.NewEth1Client(goeth.ClientOptions{ Ctx: cmd.Context(), Logger: Logger, NodeAddr: cfg.ETH1Options.ETH1Addr, ConnectionTimeout: cfg.ETH1Options.ETH1ConnectionTimeout, ContractABI: eth1.ContractABI(cfg.ETH1Options.AbiVersion), RegistryContractAddr: cfg.ETH1Options.RegistryContractAddr, AbiVersion: cfg.ETH1Options.AbiVersion, }) if err != nil { Logger.Fatal("failed to create eth1 client", zap.Error(err)) } if cfg.WsAPIPort != 0 { ws := api.NewWsServer(cmd.Context(), Logger, nil, http.NewServeMux(), cfg.WithPing) cfg.SSVOptions.WS = ws cfg.SSVOptions.WsAPIPort = cfg.WsAPIPort cfg.SSVOptions.ValidatorOptions.NewDecidedHandler = decided.NewStreamPublisher(Logger, ws) } validatorCtrl := validator.NewController(cfg.SSVOptions.ValidatorOptions) cfg.SSVOptions.ValidatorController = validatorCtrl operatorNode = operator.New(cfg.SSVOptions) if cfg.MetricsAPIPort > 0 { go startMetricsHandler(cmd.Context(), Logger, cfg.MetricsAPIPort, cfg.EnableProfile) } metrics.WaitUntilHealthy(Logger, cfg.SSVOptions.Eth1Client, "eth1 node") metrics.WaitUntilHealthy(Logger, beaconClient, "beacon node") if err := operatorNode.StartEth1(eth1.HexStringToSyncOffset(cfg.ETH1Options.ETH1SyncOffset)); err != nil { Logger.Fatal("failed to start eth1", zap.Error(err)) } if err := p2pNet.Start(); err != nil { Logger.Fatal("failed to start network", zap.Error(err)) } if err := operatorNode.Start(); err != nil { Logger.Fatal("failed to start SSV node", zap.Error(err)) } }, }
StartNodeCmd is the command to start SSV node
Functions ¶
This section is empty.
Types ¶
This section is empty.
Click to show internal directories.
Click to hide internal directories.