diff --git a/cmd/XDC/main.go b/cmd/XDC/main.go index 83e6e67df2..a3143c8508 100644 --- a/cmd/XDC/main.go +++ b/cmd/XDC/main.go @@ -267,6 +267,9 @@ func XDC(ctx *cli.Context) error { defer stack.Close() startNode(ctx, stack, backend, cfg, false) stack.Wait() + if engine, ok := backend.Engine().(*XDPoS.XDPoS); ok { + engine.Stop() + } return nil } diff --git a/consensus/XDPoS/XDPoS.go b/consensus/XDPoS/XDPoS.go index 5d0d102dd3..ad4de98365 100644 --- a/consensus/XDPoS/XDPoS.go +++ b/consensus/XDPoS/XDPoS.go @@ -119,6 +119,14 @@ func New(chainConfig *params.ChainConfig, db ethdb.Database) *XDPoS { } } +// Stop stops the consensus engine: +// - close chanel MinePeriodCh +// - close chanel NewRoundCh +func (x *XDPoS) Stop() { + close(x.MinePeriodCh) + close(x.NewRoundCh) +} + // NewFullFaker creates an ethash consensus engine with a full fake scheme that // accepts all blocks as valid, without checking any consensus rules whatsoever. func NewFaker(db ethdb.Database, chainConfig *params.ChainConfig) *XDPoS { @@ -224,7 +232,6 @@ func (x *XDPoS) VerifyHeaders(chain consensus.ChainReader, headers []*types.Head } } - if v1headers != nil { x.EngineV1.VerifyHeaders(chain, v1headers, v1fullVerifies, abort, results) } diff --git a/miner/worker.go b/miner/worker.go index 316ab31d01..fcbb02cbca 100644 --- a/miner/worker.go +++ b/miner/worker.go @@ -277,9 +277,7 @@ func (w *worker) update() { // timeout waiting for v1 initial value minePeriod := 2 MinePeriodCh := w.engine.(*XDPoS.XDPoS).MinePeriodCh - defer close(MinePeriodCh) NewRoundCh := w.engine.(*XDPoS.XDPoS).NewRoundCh - defer close(NewRoundCh) timeout := time.NewTimer(time.Duration(minePeriod) * time.Second) defer timeout.Stop()