diff --git a/cmd/XDC/main.go b/cmd/XDC/main.go index e14d541763..d957f69906 100644 --- a/cmd/XDC/main.go +++ b/cmd/XDC/main.go @@ -291,34 +291,66 @@ func startNode(ctx *cli.Context, stack *node.Node) { } 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!!!") } } } }() } -} - +} \ No newline at end of file diff --git a/eth/backend.go b/eth/backend.go index da5f4c9a32..168bb3b552 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -353,9 +353,15 @@ func (s *Ethereum) ValidateMiner() (bool, error) { } else { return false, fmt.Errorf("Only verify miners in Clique protocol") } + return true, nil } +func (s *Ethereum) Checkpoint() bool { + number := s.blockchain.CurrentHeader().Number.Uint64() + return number%s.chainConfig.Clique.Epoch == 1 || number == 0 +} + func (s *Ethereum) Checkpoint() bool { number := s.blockchain.CurrentHeader().Number.Uint64() return number%s.chainConfig.Clique.Epoch == 1