Skip to content

Commit f1ed476

Browse files
authored
Merge pull request #6601 from multiversx/subround-endround-v2-tests
Subround endround v2 tests
2 parents 8334c57 + 20af59a commit f1ed476

File tree

6 files changed

+203
-432
lines changed

6 files changed

+203
-432
lines changed

consensus/spos/bls/v2/export_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -271,11 +271,6 @@ func (sr *subroundEndRound) ReceivedProof(proof consensus.ProofHandler) {
271271
sr.receivedProof(proof)
272272
}
273273

274-
// IsConsensusHeaderReceived calls the unexported isConsensusHeaderReceived function
275-
func (sr *subroundEndRound) IsConsensusHeaderReceived() (bool, data.HeaderHandler) {
276-
return sr.isConsensusHeaderReceived()
277-
}
278-
279274
// IsOutOfTime calls the unexported isOutOfTime function
280275
func (sr *subroundEndRound) IsOutOfTime() bool {
281276
return sr.isOutOfTime()
@@ -340,3 +335,8 @@ func (sr *subroundSignature) SendSignatureForManagedKey(idx int, pk string) bool
340335
func (sr *subroundSignature) DoSignatureJobForManagedKeys(ctx context.Context) bool {
341336
return sr.doSignatureJobForManagedKeys(ctx)
342337
}
338+
339+
// ReceivedSignature method is called when a signature is received through the signature channel
340+
func (sr *subroundEndRound) ReceivedSignature(cnsDta *consensus.Message) bool {
341+
return sr.receivedSignature(context.Background(), cnsDta)
342+
}

consensus/spos/bls/v2/subroundEndRound.go

Lines changed: 21 additions & 156 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ type subroundEndRound struct {
3333
sentSignatureTracker spos.SentSignaturesTracker
3434
worker spos.WorkerHandler
3535
signatureThrottler core.Throttler
36-
blockCommitted bool
3736
}
3837

3938
// NewSubroundEndRound creates a subroundEndRound object
@@ -70,7 +69,6 @@ func NewSubroundEndRound(
7069
sentSignatureTracker: sentSignatureTracker,
7170
worker: worker,
7271
signatureThrottler: signatureThrottler,
73-
blockCommitted: false,
7472
}
7573
srEndRound.Job = srEndRound.doEndRoundJob
7674
srEndRound.Check = srEndRound.doEndRoundConsensusCheck
@@ -116,7 +114,7 @@ func (sr *subroundEndRound) receivedProof(proof consensus.ProofHandler) {
116114
return
117115
}
118116

119-
// no need to re-verify the proof if as it was already verified when it was added to the proofs pool
117+
// no need to re-verify the proof since it was already verified when it was added to the proofs pool
120118
log.Debug("step 3: block header final info has been received",
121119
"PubKeysBitmap", proof.GetPubKeysBitmap(),
122120
"AggregateSignature", proof.GetAggregatedSignature(),
@@ -224,11 +222,7 @@ func (sr *subroundEndRound) doEndRoundJob(_ context.Context) bool {
224222
return sr.doEndRoundJobByNode()
225223
}
226224

227-
func (sr *subroundEndRound) commitBlock(proof data.HeaderProofHandler) error {
228-
if sr.blockCommitted {
229-
return nil
230-
}
231-
225+
func (sr *subroundEndRound) commitBlock() error {
232226
startTime := time.Now()
233227
err := sr.BlockProcessor().CommitBlock(sr.GetHeader(), sr.GetBody())
234228
elapsedTime := time.Since(startTime)
@@ -242,14 +236,6 @@ func (sr *subroundEndRound) commitBlock(proof data.HeaderProofHandler) error {
242236
return err
243237
}
244238

245-
if proof != nil {
246-
err = sr.EquivalentProofsPool().AddProof(proof)
247-
if err != nil {
248-
log.Debug("doEndRoundJobByNode.AddProof", "error", err)
249-
return err
250-
}
251-
}
252-
253239
return nil
254240
}
255241

@@ -262,11 +248,21 @@ func (sr *subroundEndRound) doEndRoundJobByNode() bool {
262248
defer sr.mutProcessingEndRound.Unlock()
263249

264250
proof := sr.sendProof()
265-
err := sr.commitBlock(proof)
251+
252+
err := sr.commitBlock()
266253
if err != nil {
267254
return false
268255
}
269256

257+
// if proof not nil, it was created and broadcasted so it has to be added to the pool
258+
if proof != nil {
259+
err = sr.EquivalentProofsPool().AddProof(proof)
260+
if err != nil {
261+
log.Debug("doEndRoundJobByNode.AddProof", "error", err)
262+
return false
263+
}
264+
}
265+
270266
sr.SetStatus(sr.Current(), spos.SsFinished)
271267

272268
sr.worker.DisplayStatistics()
@@ -314,7 +310,7 @@ func (sr *subroundEndRound) sendProof() data.HeaderProofHandler {
314310
return nil
315311
}
316312

317-
// broadcast header and final info section
313+
// broadcast header proof
318314
return sr.createAndBroadcastProof(sig, bitmap)
319315
}
320316

@@ -341,6 +337,7 @@ func (sr *subroundEndRound) aggregateSigsAndHandleInvalidSigners(bitmap []byte)
341337
return nil, nil, err
342338
}
343339

340+
// the header (hash) verified here is with leader signature on it
344341
err = sr.SigningHandler().Verify(sr.GetData(), bitmap, sr.GetHeader().GetEpoch())
345342
if err != nil {
346343
log.Debug("doEndRoundJobByNode.Verify", "error", err.Error())
@@ -470,15 +467,16 @@ func (sr *subroundEndRound) handleInvalidSignersOnAggSigFail() ([]byte, []byte,
470467
return nil, nil, err
471468
}
472469

473-
invalidSigners, err := sr.getFullMessagesForInvalidSigners(invalidPubKeys)
470+
_, err = sr.getFullMessagesForInvalidSigners(invalidPubKeys)
474471
if err != nil {
475472
log.Debug("doEndRoundJobByNode.getFullMessagesForInvalidSigners", "error", err.Error())
476473
return nil, nil, err
477474
}
478475

479-
if len(invalidSigners) > 0 {
480-
sr.createAndBroadcastInvalidSigners(invalidSigners)
481-
}
476+
// TODO: handle invalid signers broadcast without flooding the network
477+
// if len(invalidSigners) > 0 {
478+
// sr.createAndBroadcastInvalidSigners(invalidSigners)
479+
// }
482480

483481
bitmap, sig, err := sr.computeAggSigOnValidNodes()
484482
if err != nil {
@@ -544,7 +542,7 @@ func (sr *subroundEndRound) createAndBroadcastProof(signature []byte, bitmap []b
544542
}
545543

546544
func (sr *subroundEndRound) createAndBroadcastInvalidSigners(invalidSigners []byte) {
547-
if !sr.IsSelfLeader() {
545+
if !sr.ShouldConsiderSelfKeyInConsensus() {
548546
return
549547
}
550548

@@ -580,115 +578,13 @@ func (sr *subroundEndRound) createAndBroadcastInvalidSigners(invalidSigners []by
580578
log.Debug("step 3: invalid signers info has been sent")
581579
}
582580

583-
func (sr *subroundEndRound) isConsensusHeaderReceived() (bool, data.HeaderHandler) {
584-
if check.IfNil(sr.GetHeader()) {
585-
return false, nil
586-
}
587-
588-
consensusHeaderHash, err := core.CalculateHash(sr.Marshalizer(), sr.Hasher(), sr.GetHeader())
589-
if err != nil {
590-
log.Debug("isConsensusHeaderReceived: calculate consensus header hash", "error", err.Error())
591-
return false, nil
592-
}
593-
594-
receivedHeaders := sr.GetReceivedHeaders()
595-
596-
var receivedHeaderHash []byte
597-
for index := range receivedHeaders {
598-
// TODO[cleanup cns finality]: remove this
599-
receivedHeader := receivedHeaders[index].ShallowClone()
600-
if !sr.EnableEpochsHandler().IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, receivedHeader.GetEpoch()) {
601-
err = receivedHeader.SetLeaderSignature(nil)
602-
if err != nil {
603-
log.Debug("isConsensusHeaderReceived - SetLeaderSignature", "error", err.Error())
604-
return false, nil
605-
}
606-
607-
err = receivedHeader.SetPubKeysBitmap(nil)
608-
if err != nil {
609-
log.Debug("isConsensusHeaderReceived - SetPubKeysBitmap", "error", err.Error())
610-
return false, nil
611-
}
612-
613-
err = receivedHeader.SetSignature(nil)
614-
if err != nil {
615-
log.Debug("isConsensusHeaderReceived - SetSignature", "error", err.Error())
616-
return false, nil
617-
}
618-
}
619-
620-
receivedHeaderHash, err = core.CalculateHash(sr.Marshalizer(), sr.Hasher(), receivedHeader)
621-
if err != nil {
622-
log.Debug("isConsensusHeaderReceived: calculate received header hash", "error", err.Error())
623-
return false, nil
624-
}
625-
626-
if bytes.Equal(receivedHeaderHash, consensusHeaderHash) {
627-
return true, receivedHeaders[index]
628-
}
629-
}
630-
631-
return false, nil
632-
}
633-
634-
func (sr *subroundEndRound) signBlockHeader(leader []byte) ([]byte, error) {
635-
headerClone := sr.GetHeader().ShallowClone()
636-
err := headerClone.SetLeaderSignature(nil)
637-
if err != nil {
638-
return nil, err
639-
}
640-
641-
marshalizedHdr, err := sr.Marshalizer().Marshal(headerClone)
642-
if err != nil {
643-
return nil, err
644-
}
645-
646-
return sr.SigningHandler().CreateSignatureForPublicKey(marshalizedHdr, leader)
647-
}
648-
649581
func (sr *subroundEndRound) updateMetricsForLeader() {
650582
// TODO: decide if we keep these metrics the same way
651583
sr.appStatusHandler.Increment(common.MetricCountAcceptedBlocks)
652584
sr.appStatusHandler.SetStringValue(common.MetricConsensusRoundState,
653585
fmt.Sprintf("valid block produced in %f sec", time.Since(sr.RoundHandler().TimeStamp()).Seconds()))
654586
}
655587

656-
func (sr *subroundEndRound) broadcastBlockDataLeader(sender []byte) error {
657-
// TODO[cleanup cns finality]: remove this method, block data was already broadcast during subroundBlock
658-
if sr.EnableEpochsHandler().IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, sr.GetHeader().GetEpoch()) {
659-
return nil
660-
}
661-
662-
miniBlocks, transactions, err := sr.BlockProcessor().MarshalizedDataToBroadcast(sr.GetHeader(), sr.GetBody())
663-
if err != nil {
664-
return err
665-
}
666-
667-
return sr.BroadcastMessenger().BroadcastBlockDataLeader(sr.GetHeader(), miniBlocks, transactions, sender)
668-
}
669-
670-
func (sr *subroundEndRound) setHeaderForValidator(header data.HeaderHandler) error {
671-
idx, pk, miniBlocks, transactions, err := sr.getIndexPkAndDataToBroadcast()
672-
if err != nil {
673-
return err
674-
}
675-
676-
go sr.BroadcastMessenger().PrepareBroadcastHeaderValidator(header, miniBlocks, transactions, idx, pk)
677-
678-
return nil
679-
}
680-
681-
func (sr *subroundEndRound) prepareBroadcastBlockDataForValidator() error {
682-
idx, pk, miniBlocks, transactions, err := sr.getIndexPkAndDataToBroadcast()
683-
if err != nil {
684-
return err
685-
}
686-
687-
go sr.BroadcastMessenger().PrepareBroadcastBlockDataValidator(sr.GetHeader(), miniBlocks, transactions, idx, pk)
688-
689-
return nil
690-
}
691-
692588
// doEndRoundConsensusCheck method checks if the consensus is achieved
693589
func (sr *subroundEndRound) doEndRoundConsensusCheck() bool {
694590
if sr.GetRoundCanceled() {
@@ -776,37 +672,6 @@ func (sr *subroundEndRound) isOutOfTime() bool {
776672
return false
777673
}
778674

779-
func (sr *subroundEndRound) getIndexPk() (int, []byte, error) {
780-
minIdx := sr.getMinConsensusGroupIndexOfManagedKeys()
781-
782-
idx, err := sr.SelfConsensusGroupIndex()
783-
if err == nil {
784-
if idx < minIdx {
785-
minIdx = idx
786-
}
787-
}
788-
789-
if minIdx == sr.ConsensusGroupSize() {
790-
return -1, nil, err
791-
}
792-
793-
return minIdx, []byte(sr.ConsensusGroup()[minIdx]), nil
794-
}
795-
796-
func (sr *subroundEndRound) getIndexPkAndDataToBroadcast() (int, []byte, map[uint32][]byte, map[string][][]byte, error) {
797-
minIdx, pk, err := sr.getIndexPk()
798-
if err != nil {
799-
return -1, nil, nil, nil, err
800-
}
801-
802-
miniBlocks, transactions, err := sr.BlockProcessor().MarshalizedDataToBroadcast(sr.GetHeader(), sr.GetBody())
803-
if err != nil {
804-
return -1, nil, nil, nil, err
805-
}
806-
807-
return minIdx, pk, miniBlocks, transactions, nil
808-
}
809-
810675
func (sr *subroundEndRound) getMinConsensusGroupIndexOfManagedKeys() int {
811676
minIdx := sr.ConsensusGroupSize()
812677

0 commit comments

Comments
 (0)