@@ -721,14 +721,7 @@ func (wrk *Worker) ResetConsensusMessages() {
721721}
722722
723723func (wrk * Worker ) checkValidityAndProcessEquivalentMessages (cnsMsg * consensus.Message , p2pMessage p2p.MessageP2P ) error {
724- wrk .mutEquivalentMessages .Lock ()
725- defer wrk .mutEquivalentMessages .Unlock ()
726-
727724 msgType := consensus .MessageType (cnsMsg .MsgType )
728- err := wrk .processEquivalentMessageUnprotected (msgType , cnsMsg .BlockHeaderHash )
729- if err != nil {
730- return err
731- }
732725
733726 log .Trace ("received message from consensus topic" ,
734727 "msg type" , wrk .consensusService .GetStringValue (msgType ),
@@ -738,28 +731,41 @@ func (wrk *Worker) checkValidityAndProcessEquivalentMessages(cnsMsg *consensus.M
738731 "size" , len (p2pMessage .Data ()),
739732 )
740733
734+ if ! wrk .enableEpochsHandler .IsEquivalentMessagesFlagEnabled () {
735+ return wrk .consensusMessageValidator .checkConsensusMessageValidity (cnsMsg , p2pMessage .Peer ())
736+ }
737+
738+ // if the message is not with final info, no need to check its equivalent messages
739+ if ! wrk .consensusService .IsMessageWithFinalInfo (msgType ) {
740+ return wrk .consensusMessageValidator .checkConsensusMessageValidity (cnsMsg , p2pMessage .Peer ())
741+ }
742+
743+ wrk .mutEquivalentMessages .Lock ()
744+ defer wrk .mutEquivalentMessages .Unlock ()
745+
746+ err := wrk .processEquivalentMessageUnprotected (cnsMsg )
747+ if err != nil {
748+ return err
749+ }
750+
741751 err = wrk .consensusMessageValidator .checkConsensusMessageValidity (cnsMsg , p2pMessage .Peer ())
742752 if err != nil {
743- wrk .processInvalidEquivalentMessageUnprotected (msgType , cnsMsg .BlockHeaderHash )
753+ wrk .processInvalidEquivalentMessageUnprotected (cnsMsg .BlockHeaderHash )
744754 return err
745755 }
746756
747757 return nil
748758}
749759
750- func (wrk * Worker ) processEquivalentMessageUnprotected (msgType consensus.MessageType , blockHeaderHash []byte ) error {
751- if wrk .enableEpochsHandler .IsEquivalentMessagesFlagEnabled () {
752- return nil
753- }
754-
755- // early exit if the message is not with final info
756- if ! wrk .consensusService .IsMessageWithFinalInfo (msgType ) {
757- return nil
760+ func (wrk * Worker ) processEquivalentMessageUnprotected (cnsMsg * consensus.Message ) error {
761+ err := wrk .verifyEquivalentMessageSignature (cnsMsg )
762+ if err != nil {
763+ return err
758764 }
759765
760- hdrHash := string (blockHeaderHash )
766+ hdrHash := string (cnsMsg . BlockHeaderHash )
761767
762- // if an equivalent message was seen before, return error to stop further broadcasts
768+ // if a valid equivalent message was seen before, return error to stop further broadcasts
763769 numMessages := wrk .equivalentMessages [hdrHash ]
764770 wrk .equivalentMessages [hdrHash ] = numMessages + 1
765771 if numMessages > 0 {
@@ -769,17 +775,34 @@ func (wrk *Worker) processEquivalentMessageUnprotected(msgType consensus.Message
769775 return nil
770776}
771777
772- func (wrk * Worker ) processInvalidEquivalentMessageUnprotected ( msgType consensus.MessageType , blockHeaderHash [] byte ) {
773- if wrk .enableEpochsHandler . IsEquivalentMessagesFlagEnabled ( ) {
774- return
778+ func (wrk * Worker ) verifyEquivalentMessageSignature ( cnsMsg * consensus.Message ) error {
779+ if check . IfNil ( wrk .consensusState . Header ) {
780+ return ErrNilHeader
775781 }
776782
777- if ! wrk .consensusService .IsMessageWithFinalInfo (msgType ) {
778- return
783+ header := wrk .consensusState .Header .ShallowClone ()
784+
785+ err := header .SetSignature (cnsMsg .Signature )
786+ if err != nil {
787+ return err
779788 }
780789
781- hdrHash := string (blockHeaderHash )
790+ err = header .SetPubKeysBitmap (cnsMsg .PubKeysBitmap )
791+ if err != nil {
792+ return err
793+ }
782794
795+ err = wrk .headerSigVerifier .VerifySignature (header )
796+ if err != nil {
797+ log .Debug ("verifyEquivalentMessageSignature" , "error" , err .Error ())
798+ return err
799+ }
800+
801+ return nil
802+ }
803+
804+ func (wrk * Worker ) processInvalidEquivalentMessageUnprotected (blockHeaderHash []byte ) {
805+ hdrHash := string (blockHeaderHash )
783806 delete (wrk .equivalentMessages , hdrHash )
784807}
785808
0 commit comments