From c69a5361698ff7fb0d3e8c0c5326dbd05eb3eee0 Mon Sep 17 00:00:00 2001 From: Daniel Liu <139250065@qq.com> Date: Wed, 8 Oct 2025 13:18:57 +0800 Subject: [PATCH] engine_v2: fix unsynchronized QC verification Error, close XFN-09 (#1609) --- consensus/XDPoS/engines/engine_v2/engine.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/consensus/XDPoS/engines/engine_v2/engine.go b/consensus/XDPoS/engines/engine_v2/engine.go index eee0137d80..fb35ee9ad2 100644 --- a/consensus/XDPoS/engines/engine_v2/engine.go +++ b/consensus/XDPoS/engines/engine_v2/engine.go @@ -840,7 +840,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) { @@ -848,12 +848,12 @@ func (x *XDPoS_v2) verifyQC(blockChainReader consensus.ChainReader, quorumCert * verified, _, err := x.verifyMsgSignature(signedVoteObj, 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) @@ -861,8 +861,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