Skip to content

Commit

Permalink
Merge pull request #6683 from multiversx/subround-endround-v2-fixes
Browse files Browse the repository at this point in the history
Subround endround v2 fixes
  • Loading branch information
AdoAdoAdo authored Dec 19, 2024
2 parents 7b02128 + 5d2773f commit 7e35a87
Show file tree
Hide file tree
Showing 2 changed files with 29 additions and 18 deletions.
40 changes: 23 additions & 17 deletions consensus/spos/bls/v2/subroundEndRound.go
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,9 @@ func (sr *subroundEndRound) doEndRoundJob(_ context.Context) bool {
return false
}

sr.mutProcessingEndRound.Lock()
defer sr.mutProcessingEndRound.Unlock()

return sr.doEndRoundJobByNode()
}

Expand All @@ -240,14 +243,16 @@ func (sr *subroundEndRound) commitBlock() error {
}

func (sr *subroundEndRound) doEndRoundJobByNode() bool {
if !sr.waitForSignalSync() {
return false
if sr.shouldSendProof() {
if !sr.waitForSignalSync() {
return false
}
}

sr.mutProcessingEndRound.Lock()
defer sr.mutProcessingEndRound.Unlock()

proof := sr.sendProof()
proof, ok := sr.sendProof()
if !ok {
return false
}

err := sr.commitBlock()
if err != nil {
Expand Down Expand Up @@ -277,41 +282,42 @@ func (sr *subroundEndRound) doEndRoundJobByNode() bool {
return true
}

func (sr *subroundEndRound) sendProof() data.HeaderProofHandler {
func (sr *subroundEndRound) sendProof() (data.HeaderProofHandler, bool) {
if !sr.shouldSendProof() {
return nil
return nil, true
}

bitmap := sr.GenerateBitmap(bls.SrSignature)
err := sr.checkSignaturesValidity(bitmap)
if err != nil {
log.Debug("sendProof.checkSignaturesValidity", "error", err.Error())
return nil
return nil, false
}

// Aggregate signatures, handle invalid signers and send final info if needed
bitmap, sig, err := sr.aggregateSigsAndHandleInvalidSigners(bitmap)
if err != nil {
log.Debug("sendProof.aggregateSigsAndHandleInvalidSigners", "error", err.Error())
return nil
return nil, false
}

ok := sr.ScheduledProcessor().IsProcessedOKWithTimeout()
// placeholder for subroundEndRound.doEndRoundJobByLeader script
if !ok {
return nil
return nil, false
}

roundHandler := sr.RoundHandler()
if roundHandler.RemainingTime(roundHandler.TimeStamp(), roundHandler.TimeDuration()) < 0 {
log.Debug("sendProof: time is out -> cancel broadcasting final info and header",
"round time stamp", roundHandler.TimeStamp(),
"current time", time.Now())
return nil
return nil, false
}

// broadcast header proof
return sr.createAndBroadcastProof(sig, bitmap)
proof, err := sr.createAndBroadcastProof(sig, bitmap)
return proof, err == nil
}

func (sr *subroundEndRound) shouldSendProof() bool {
Expand Down Expand Up @@ -519,7 +525,7 @@ func (sr *subroundEndRound) computeAggSigOnValidNodes() ([]byte, []byte, error)
return bitmap, sig, nil
}

func (sr *subroundEndRound) createAndBroadcastProof(signature []byte, bitmap []byte) *block.HeaderProof {
func (sr *subroundEndRound) createAndBroadcastProof(signature []byte, bitmap []byte) (*block.HeaderProof, error) {
headerProof := &block.HeaderProof{
PubKeysBitmap: bitmap,
AggregatedSignature: signature,
Expand All @@ -531,14 +537,14 @@ func (sr *subroundEndRound) createAndBroadcastProof(signature []byte, bitmap []b

err := sr.BroadcastMessenger().BroadcastEquivalentProof(headerProof, []byte(sr.SelfPubKey()))
if err != nil {
return nil
return nil, err
}

log.Debug("step 3: block header proof has been sent",
"PubKeysBitmap", bitmap,
"AggregateSignature", signature)

return headerProof
return headerProof, nil
}

func (sr *subroundEndRound) createAndBroadcastInvalidSigners(invalidSigners []byte) {
Expand Down Expand Up @@ -710,7 +716,7 @@ func (sr *subroundEndRound) waitForSignalSync() bool {
case <-timerBetweenStatusChecks.C:
if sr.IsSubroundFinished(sr.Current()) {
log.Trace("subround already finished", "subround", sr.Name())
return false
return true
}

if sr.checkReceivedSignatures() {
Expand Down
7 changes: 6 additions & 1 deletion consensus/spos/worker.go
Original file line number Diff line number Diff line change
Expand Up @@ -312,7 +312,12 @@ func (wrk *Worker) AddReceivedHeaderHandler(handler func(data.HeaderHandler)) {

// ReceivedProof process the received proof, calling each received proof handler registered in worker instance
func (wrk *Worker) ReceivedProof(proofHandler consensus.ProofHandler) {
// TODO: add preliminary checks
if check.IfNilReflect(proofHandler) {
log.Trace("ReceivedProof: nil proof handler")
return
}

log.Trace("ReceivedProof:", "proof header", proofHandler.GetHeaderHash())

wrk.mutReceivedProofHandler.RLock()
for _, handler := range wrk.receivedProofHandlers {
Expand Down

0 comments on commit 7e35a87

Please sign in to comment.