engine_v2: fix unsynchronized QC verification Error, close XFN-09 (#1609)

This commit is contained in:
Daniel Liu 2025-10-08 13:18:57 +08:00 committed by benjamin202410
parent f519ce8500
commit c69a536169

View file

@ -840,7 +840,7 @@ func (x *XDPoS_v2) verifyQC(blockChainReader consensus.ChainReader, quorumCert *
var wg sync.WaitGroup var wg sync.WaitGroup
wg.Add(len(signatures)) wg.Add(len(signatures))
var haveError error sigErrChan := make(chan error, len(signatures))
for _, signature := range signatures { for _, signature := range signatures {
go func(sig types.Signature) { 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) verified, _, err := x.verifyMsgSignature(signedVoteObj, sig, epochInfo.Masternodes)
if err != nil { if err != nil {
log.Error("[verifyQC] Error while verfying QC message signatures", "Error", err) 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 return
} }
if !verified { if !verified {
log.Warn("[verifyQC] Signature not verified doing QC verification", "QC", quorumCert) 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 return
} }
}(signature) }(signature)
@ -861,8 +861,8 @@ func (x *XDPoS_v2) verifyQC(blockChainReader consensus.ChainReader, quorumCert *
wg.Wait() wg.Wait()
elapsed := time.Since(start) elapsed := time.Since(start)
log.Debug("[verifyQC] time verify message signatures of qc", "elapsed", elapsed) log.Debug("[verifyQC] time verify message signatures of qc", "elapsed", elapsed)
if haveError != nil { if len(sigErrChan) > 0 {
return haveError return <-sigErrChan
} }
epochSwitchNumber := epochInfo.EpochSwitchBlockInfo.Number.Uint64() epochSwitchNumber := epochInfo.EpochSwitchBlockInfo.Number.Uint64()
gapNumber := epochSwitchNumber - epochSwitchNumber%x.config.Epoch - x.config.Gap gapNumber := epochSwitchNumber - epochSwitchNumber%x.config.Epoch - x.config.Gap