diff --git a/cmd/tomo/main.go b/cmd/tomo/main.go index 05b1404c49..52e4f1bb69 100644 --- a/cmd/tomo/main.go +++ b/cmd/tomo/main.go @@ -291,30 +291,63 @@ func startNode(ctx *cli.Context, stack *node.Node) { utils.Fatalf("Ethereum service not running: %v", err) } go func() { + started := false + ok, err := ethereum.ValidateMiner() + if err != nil { + utils.Fatalf("Can't verify validator permission: %v", err) + } + if ok { + log.Info("Validator found. Enabling mining mode...") + // Use a reduced number of threads if requested + if threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 { + type threaded interface { + SetThreads(threads int) + } + if th, ok := ethereum.Engine().(threaded); ok { + th.SetThreads(threads) + } + } + // Set the gas price to the limits from the CLI and start mining + ethereum.TxPool().SetGasPrice(utils.GlobalBig(ctx, utils.GasPriceFlag.Name)) + if err := ethereum.StartMining(true); err != nil { + utils.Fatalf("Failed to start mining: %v", err) + } + started = true + log.Info("Enabled mining node!!!") + } + for { if ethereum.Checkpoint() { - // Mining only enabled for validator nodes - if ok, err := ethereum.ValidateMiner(); err != nil { + //Checkpoint!!! It's time to reconcile node's state... + ok, err := ethereum.ValidateMiner() + if err != nil { utils.Fatalf("Can't verify validator permission: %v", err) - } else if !ok { - log.Info("Only validator can mine blocks. Cancel mining on this node") - ethereum.StopMining() - continue } - - // Use a reduced number of threads if requested - if threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 { - type threaded interface { - SetThreads(threads int) + if !ok { + log.Info("Only validator can mine blocks. Cancelling mining on this node...") + if started { + ethereum.StopMining() + started = false } - if th, ok := ethereum.Engine().(threaded); ok { - th.SetThreads(threads) + log.Info("Cancelled mining mode!!!") + } else if !started { + log.Info("Validator found. Enabling mining mode...") + // Use a reduced number of threads if requested + if threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 { + type threaded interface { + SetThreads(threads int) + } + if th, ok := ethereum.Engine().(threaded); ok { + th.SetThreads(threads) + } } - } - // Set the gas price to the limits from the CLI and start mining - ethereum.TxPool().SetGasPrice(utils.GlobalBig(ctx, utils.GasPriceFlag.Name)) - if err := ethereum.StartMining(true); err != nil { - utils.Fatalf("Failed to start mining: %v", err) + // Set the gas price to the limits from the CLI and start mining + ethereum.TxPool().SetGasPrice(utils.GlobalBig(ctx, utils.GasPriceFlag.Name)) + if err := ethereum.StartMining(true); err != nil { + utils.Fatalf("Failed to start mining: %v", err) + } + started = true + log.Info("Enabled mining node!!!") } } } diff --git a/eth/backend.go b/eth/backend.go index 9e639d144d..bd6a53c3be 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -334,6 +334,7 @@ func (self *Ethereum) SetEtherbase(etherbase common.Address) { self.miner.SetEtherbase(etherbase) } +// ValidateMiner checks if node's address is in set of validators func (s *Ethereum) ValidateMiner() (bool, error) { eb, err := s.Etherbase() if err != nil { @@ -358,7 +359,7 @@ func (s *Ethereum) ValidateMiner() (bool, error) { func (s *Ethereum) Checkpoint() bool { number := s.blockchain.CurrentHeader().Number.Uint64() - return number%s.chainConfig.Clique.Epoch == 1 + return number%s.chainConfig.Clique.Epoch == 1 || number == 0 } func (s *Ethereum) StartMining(local bool) error {