@@ -11,7 +11,6 @@ import (
1111
1212 "github.com/multiversx/mx-chain-core-go/core"
1313 "github.com/multiversx/mx-chain-core-go/core/check"
14- "github.com/multiversx/mx-chain-core-go/data"
1514 "github.com/multiversx/mx-chain-core-go/data/block"
1615 "github.com/multiversx/mx-chain-core-go/display"
1716
@@ -247,10 +246,36 @@ func (sr *subroundEndRound) doEndRoundJobByNode() bool {
247246 if ! sr .waitForSignalSync () {
248247 return false
249248 }
249+ sr .sendProof ()
250250 }
251251
252- proof , ok := sr .sendProof ()
253- if ! ok {
252+ return sr .finalizeConfirmedBlock ()
253+ }
254+
255+ func (sr * subroundEndRound ) waitForProof () bool {
256+ shardID := sr .ShardCoordinator ().SelfId ()
257+ headerHash := sr .GetData ()
258+ if sr .EquivalentProofsPool ().HasProof (shardID , headerHash ) {
259+ return true
260+ }
261+
262+ ctx , cancel := context .WithTimeout (context .Background (), sr .RoundHandler ().TimeDuration ())
263+ defer cancel ()
264+
265+ for {
266+ select {
267+ case <- time .After (time .Millisecond ):
268+ if sr .EquivalentProofsPool ().HasProof (shardID , headerHash ) {
269+ return true
270+ }
271+ case <- ctx .Done ():
272+ return false
273+ }
274+ }
275+ }
276+
277+ func (sr * subroundEndRound ) finalizeConfirmedBlock () bool {
278+ if ! sr .waitForProof () {
254279 return false
255280 }
256281
@@ -259,14 +284,6 @@ func (sr *subroundEndRound) doEndRoundJobByNode() bool {
259284 return false
260285 }
261286
262- // if proof not nil, it was created and broadcasted so it has to be added to the pool
263- if proof != nil {
264- ok := sr .EquivalentProofsPool ().AddProof (proof )
265- if ! ok {
266- log .Trace ("doEndRoundJobByNode.AddProof" , "added" , ok )
267- }
268- }
269-
270287 sr .SetStatus (sr .Current (), spos .SsFinished )
271288
272289 sr .worker .DisplayStatistics ()
@@ -281,42 +298,44 @@ func (sr *subroundEndRound) doEndRoundJobByNode() bool {
281298 return true
282299}
283300
284- func (sr * subroundEndRound ) sendProof () (data. HeaderProofHandler , bool ) {
301+ func (sr * subroundEndRound ) sendProof () {
285302 if ! sr .shouldSendProof () {
286- return nil , true
303+ return
287304 }
288305
289306 bitmap := sr .GenerateBitmap (bls .SrSignature )
290307 err := sr .checkSignaturesValidity (bitmap )
291308 if err != nil {
292309 log .Debug ("sendProof.checkSignaturesValidity" , "error" , err .Error ())
293- return nil , false
310+ return
294311 }
295312
296313 // Aggregate signatures, handle invalid signers and send final info if needed
297314 bitmap , sig , err := sr .aggregateSigsAndHandleInvalidSigners (bitmap )
298315 if err != nil {
299316 log .Debug ("sendProof.aggregateSigsAndHandleInvalidSigners" , "error" , err .Error ())
300- return nil , false
317+ return
301318 }
302319
303320 ok := sr .ScheduledProcessor ().IsProcessedOKWithTimeout ()
304321 // placeholder for subroundEndRound.doEndRoundJobByLeader script
305322 if ! ok {
306- return nil , false
323+ return
307324 }
308325
309326 roundHandler := sr .RoundHandler ()
310327 if roundHandler .RemainingTime (roundHandler .TimeStamp (), roundHandler .TimeDuration ()) < 0 {
311328 log .Debug ("sendProof: time is out -> cancel broadcasting final info and header" ,
312329 "round time stamp" , roundHandler .TimeStamp (),
313330 "current time" , time .Now ())
314- return nil , false
331+ return
315332 }
316333
317334 // broadcast header proof
318- proof , err := sr .createAndBroadcastProof (sig , bitmap )
319- return proof , err == nil
335+ err = sr .createAndBroadcastProof (sig , bitmap )
336+ if err != nil {
337+ log .Warn ("sendProof.createAndBroadcastProof" , "error" , err .Error ())
338+ }
320339}
321340
322341func (sr * subroundEndRound ) shouldSendProof () bool {
@@ -524,7 +543,7 @@ func (sr *subroundEndRound) computeAggSigOnValidNodes() ([]byte, []byte, error)
524543 return bitmap , sig , nil
525544}
526545
527- func (sr * subroundEndRound ) createAndBroadcastProof (signature []byte , bitmap []byte ) ( * block. HeaderProof , error ) {
546+ func (sr * subroundEndRound ) createAndBroadcastProof (signature []byte , bitmap []byte ) error {
528547 headerProof := & block.HeaderProof {
529548 PubKeysBitmap : bitmap ,
530549 AggregatedSignature : signature ,
@@ -533,18 +552,19 @@ func (sr *subroundEndRound) createAndBroadcastProof(signature []byte, bitmap []b
533552 HeaderNonce : sr .GetHeader ().GetNonce (),
534553 HeaderShardId : sr .GetHeader ().GetShardID (),
535554 HeaderRound : sr .GetHeader ().GetRound (),
555+ IsStartOfEpoch : sr .GetHeader ().IsStartOfEpochBlock (),
536556 }
537557
538558 err := sr .BroadcastMessenger ().BroadcastEquivalentProof (headerProof , []byte (sr .SelfPubKey ()))
539559 if err != nil {
540- return nil , err
560+ return err
541561 }
542562
543563 log .Debug ("step 3: block header proof has been sent" ,
544564 "PubKeysBitmap" , bitmap ,
545565 "AggregateSignature" , signature )
546566
547- return headerProof , nil
567+ return nil
548568}
549569
550570func (sr * subroundEndRound ) createAndBroadcastInvalidSigners (invalidSigners []byte ) {
0 commit comments