diff --git a/cmd/XDC/main.go b/cmd/XDC/main.go index a2190cf698..d6fa3ebdee 100644 --- a/cmd/XDC/main.go +++ b/cmd/XDC/main.go @@ -289,6 +289,14 @@ func startNode(ctx *cli.Context, stack *node.Node) { if err := stack.Service(ðereum); err != nil { utils.Fatalf("Ethereum service not running: %v", err) } + + // Mining only enabled for validator nodes + if ok, err := ethereum.ValidateMiner(); err != nil { + utils.Fatalf("Can't verify validator permission: %v", err) + } else if !ok { + utils.Fatalf("Only validator can mine blocks") + } + // Use a reduced number of threads if requested if threads := ctx.GlobalInt(utils.MinerThreadsFlag.Name); threads > 0 { type threaded interface { diff --git a/eth/backend.go b/eth/backend.go index 94aad23101..716e676192 100644 --- a/eth/backend.go +++ b/eth/backend.go @@ -334,6 +334,26 @@ func (self *Ethereum) SetEtherbase(etherbase common.Address) { self.miner.SetEtherbase(etherbase) } +func (s *Ethereum) ValidateMiner() (bool, error) { + eb, err := s.Etherbase() + if err != nil { + return false, err + } + if c, ok := s.engine.(*clique.Clique); !ok { + return false, fmt.Errorf("Only verify miners in Clique protocol") + } else { + //check if miner's wallet is in set of validators + snap, err := c.GetSnapshot(s.blockchain, s.blockchain.CurrentHeader()) + if err != nil { + return false, fmt.Errorf("Can't verify miner: %v", err) + } + if _, authorized := snap.Signers[eb]; !authorized { + return false, fmt.Errorf("This miner doesn't belong to set of validators") + } + } + return true, nil +} + func (s *Ethereum) StartMining(local bool) error { eb, err := s.Etherbase() if err != nil { @@ -428,4 +448,4 @@ func (s *Ethereum) Stop() error { close(s.shutdownChan) return nil -} +} \ No newline at end of file