diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index 99dff1c73e..e643b9be21 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -732,7 +732,7 @@ func (x *XDPoS_v2) verifyQC(blockChainReader consensus.ChainReader, quorumCert * var wg sync.WaitGroup wg.Add(len(signatures)) - var haveError error + sigErrChan := make(chan error, len(signatures)) for _, signature := range signatures { go func(sig types.Signature) { @@ -743,12 +743,12 @@ func (x *XDPoS_v2) verifyQC(blockChainReader consensus.ChainReader, quorumCert * }), sig, epochInfo.Masternodes) if err != nil { log.Error("[verifyQC] Error while verfying QC message signatures", "Error", err) - haveError = errors.New("error while verfying QC message signatures") + sigErrChan <- errors.New("error while verfying QC message signatures") return } if !verified { log.Warn("[verifyQC] Signature not verified doing QC verification", "QC", quorumCert) - haveError = errors.New("fail to verify QC due to signature mis-match") + sigErrChan <- errors.New("fail to verify QC due to signature mis-match") return } }(signature) @@ -756,8 +756,8 @@ func (x *XDPoS_v2) verifyQC(blockChainReader consensus.ChainReader, quorumCert * wg.Wait() elapsed := time.Since(start) log.Debug("[verifyQC] time verify message signatures of qc", "elapsed", elapsed) - if haveError != nil { - return haveError + if len(sigErrChan) > 0 { + return <-sigErrChan } epochSwitchNumber := epochInfo.EpochSwitchBlockInfo.Number.Uint64() gapNumber := epochSwitchNumber - epochSwitchNumber%x.config.Epoch - x.config.Gap