Skip to content

Commit d7089a9

Browse files
authored
Merge pull request #6665 from multiversx/fixes-header-sig-verification
Fixes header sig verification
2 parents d0ec90f + 893302e commit d7089a9

File tree

27 files changed

+359
-277
lines changed

27 files changed

+359
-277
lines changed

cmd/node/factory/interface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55

66
"github.com/multiversx/mx-chain-core-go/core"
77
"github.com/multiversx/mx-chain-core-go/data"
8+
89
"github.com/multiversx/mx-chain-go/p2p"
910
)
1011

@@ -15,7 +16,6 @@ type HeaderSigVerifierHandler interface {
1516
VerifyRandSeedAndLeaderSignature(header data.HeaderHandler) error
1617
VerifySignature(header data.HeaderHandler) error
1718
VerifySignatureForHash(header data.HeaderHandler, hash []byte, pubkeysBitmap []byte, signature []byte) error
18-
VerifyPreviousBlockProof(header data.HeaderHandler) error
1919
VerifyHeaderProof(headerProof data.HeaderProofHandler) error
2020
IsInterfaceNil() bool
2121
}

consensus/broadcast/delayedBroadcast.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -699,9 +699,8 @@ func (dbb *delayedBlockBroadcaster) interceptedHeader(_ string, headerHash []byt
699699

700700
// TODO: should be handled from interceptor
701701
proof := headerHandler.GetPreviousProof()
702-
703702
var aggSig, bitmap []byte
704-
if proof != nil {
703+
if !check.IfNilReflect(proof) {
705704
aggSig, bitmap = proof.GetAggregatedSignature(), proof.GetPubKeysBitmap()
706705
}
707706

consensus/interface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,13 +127,13 @@ type HeaderSigVerifier interface {
127127
VerifyLeaderSignature(header data.HeaderHandler) error
128128
VerifySignature(header data.HeaderHandler) error
129129
VerifySignatureForHash(header data.HeaderHandler, hash []byte, pubkeysBitmap []byte, signature []byte) error
130-
VerifyPreviousBlockProof(header data.HeaderHandler) error
131130
VerifyHeaderProof(headerProof data.HeaderProofHandler) error
132131
IsInterfaceNil() bool
133132
}
134133

135134
// FallbackHeaderValidator defines the behaviour of a component able to signal when a fallback header validation could be applied
136135
type FallbackHeaderValidator interface {
136+
ShouldApplyFallbackValidationForHeaderWith(shardID uint32, startOfEpochBlock bool, round uint64, prevHeaderHash []byte) bool
137137
ShouldApplyFallbackValidation(headerHandler data.HeaderHandler) bool
138138
IsInterfaceNil() bool
139139
}

consensus/spos/bls/v1/subroundBlock.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,9 +415,14 @@ func (sr *subroundBlock) receivedBlockBodyAndHeader(ctx context.Context, cnsDta
415415
return false
416416
}
417417

418+
header := sr.BlockProcessor().DecodeBlockHeader(cnsDta.Header)
419+
if headerHasProof(header) {
420+
return false
421+
}
422+
418423
sr.SetData(cnsDta.BlockHeaderHash)
419424
sr.SetBody(sr.BlockProcessor().DecodeBlockBody(cnsDta.Body))
420-
sr.SetHeader(sr.BlockProcessor().DecodeBlockHeader(cnsDta.Header))
425+
sr.SetHeader(header)
421426

422427
isInvalidData := check.IfNil(sr.GetBody()) || sr.isInvalidHeaderOrData()
423428
if isInvalidData {
@@ -514,8 +519,13 @@ func (sr *subroundBlock) receivedBlockHeader(ctx context.Context, cnsDta *consen
514519
return false
515520
}
516521

522+
header := sr.BlockProcessor().DecodeBlockHeader(cnsDta.Header)
523+
if headerHasProof(header) {
524+
return false
525+
}
526+
517527
sr.SetData(cnsDta.BlockHeaderHash)
518-
sr.SetHeader(sr.BlockProcessor().DecodeBlockHeader(cnsDta.Header))
528+
sr.SetHeader(header)
519529

520530
if sr.isInvalidHeaderOrData() {
521531
return false
@@ -535,6 +545,13 @@ func (sr *subroundBlock) receivedBlockHeader(ctx context.Context, cnsDta *consen
535545
return blockProcessedWithSuccess
536546
}
537547

548+
func headerHasProof(headerHandler data.HeaderHandler) bool {
549+
if check.IfNil(headerHandler) {
550+
return false
551+
}
552+
return !check.IfNilReflect(headerHandler.GetPreviousProof())
553+
}
554+
538555
func (sr *subroundBlock) processReceivedBlock(ctx context.Context, cnsDta *consensus.Message) bool {
539556
if check.IfNil(sr.GetBody()) {
540557
return false

consensus/spos/bls/v2/subroundBlock.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/multiversx/mx-chain-core-go/core"
1010
"github.com/multiversx/mx-chain-core-go/core/check"
1111
"github.com/multiversx/mx-chain-core-go/data"
12+
1213
"github.com/multiversx/mx-chain-go/common"
1314
"github.com/multiversx/mx-chain-go/consensus"
1415
"github.com/multiversx/mx-chain-go/consensus/spos"
@@ -110,7 +111,6 @@ func (sr *subroundBlock) doBlockJob(ctx context.Context) bool {
110111
return false
111112
}
112113

113-
// todo: check again the block proof verification & leader signature verification
114114
// block proof verification should be done over the header that contains the leader signature
115115
leaderSignature, err := sr.signBlockHeader(header)
116116
if err != nil {
@@ -177,7 +177,7 @@ func printLogMessage(ctx context.Context, baseMessage string, err error) {
177177
log.Debug(baseMessage, "error", err.Error())
178178
}
179179

180-
func (sr *subroundBlock) sendBlock(header data.HeaderHandler, body data.BodyHandler, leader string) bool {
180+
func (sr *subroundBlock) sendBlock(header data.HeaderHandler, body data.BodyHandler, _ string) bool {
181181
marshalledBody, err := sr.Marshalizer().Marshal(body)
182182
if err != nil {
183183
log.Debug("sendBlock.Marshal: body", "error", err.Error())

consensus/spos/errors.go

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -253,9 +253,6 @@ var ErrEquivalentMessageAlreadyReceived = errors.New("equivalent message already
253253
// ErrNilEnableEpochsHandler signals that a nil enable epochs handler has been provided
254254
var ErrNilEnableEpochsHandler = errors.New("nil enable epochs handler")
255255

256-
// ErrMissingProposerSignature signals that proposer signature is missing
257-
var ErrMissingProposerSignature = errors.New("missing proposer signature")
258-
259256
// ErrNilThrottler signals that a nil throttler has been provided
260257
var ErrNilThrottler = errors.New("nil throttler")
261258

@@ -267,3 +264,9 @@ var ErrNilEquivalentProofPool = errors.New("nil equivalent proof pool")
267264

268265
// ErrNilHeaderProof signals that a nil header proof has been provided
269266
var ErrNilHeaderProof = errors.New("nil header proof")
267+
268+
// ErrHeaderProofNotExpected signals that a header proof was not expected
269+
var ErrHeaderProofNotExpected = errors.New("header proof not expected")
270+
271+
// ErrConsensusMessageNotExpected signals that a consensus message was not expected
272+
var ErrConsensusMessageNotExpected = errors.New("consensus message not expected")

consensus/spos/interface.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ type HeaderSigVerifier interface {
138138
VerifyLeaderSignature(header data.HeaderHandler) error
139139
VerifySignature(header data.HeaderHandler) error
140140
VerifySignatureForHash(header data.HeaderHandler, hash []byte, pubkeysBitmap []byte, signature []byte) error
141-
VerifyPreviousBlockProof(header data.HeaderHandler) error
141+
VerifyHeaderWithProof(header data.HeaderHandler) error
142142
VerifyHeaderProof(headerProof data.HeaderProofHandler) error
143143
IsInterfaceNil() bool
144144
}

consensus/spos/worker.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -525,10 +525,9 @@ func (wrk *Worker) doJobOnMessageWithHeader(cnsMsg *consensus.Message) error {
525525
err)
526526
}
527527

528-
err = wrk.headerSigVerifier.VerifyPreviousBlockProof(header)
528+
err = wrk.checkHeaderPreviousProof(header)
529529
if err != nil {
530-
return fmt.Errorf("%w : verify previous block proof for received header from consensus topic failed",
531-
err)
530+
return err
532531
}
533532

534533
wrk.processReceivedHeaderMetric(cnsMsg)
@@ -544,6 +543,18 @@ func (wrk *Worker) doJobOnMessageWithHeader(cnsMsg *consensus.Message) error {
544543
return nil
545544
}
546545

546+
func (wrk *Worker) checkHeaderPreviousProof(header data.HeaderHandler) error {
547+
if wrk.enableEpochsHandler.IsFlagEnabledInEpoch(common.EquivalentMessagesFlag, header.GetEpoch()) {
548+
return fmt.Errorf("%w : received header on consensus topic after equivalent messages activation", ErrConsensusMessageNotExpected)
549+
}
550+
551+
if !check.IfNilReflect(header.GetPreviousProof()) {
552+
return fmt.Errorf("%w : received header from consensus topic has previous proof", ErrHeaderProofNotExpected)
553+
}
554+
555+
return nil
556+
}
557+
547558
func (wrk *Worker) verifyHeaderHash(hash []byte, marshalledHeader []byte) bool {
548559
computedHash := wrk.hasher.Compute(string(marshalledHeader))
549560
return bytes.Equal(hash, computedHash)

dataRetriever/dataPool/proofsCache/proofsPool.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import (
44
"fmt"
55
"sync"
66

7+
"github.com/multiversx/mx-chain-core-go/core/check"
78
"github.com/multiversx/mx-chain-core-go/data"
89
logger "github.com/multiversx/mx-chain-logger-go"
910
)
@@ -26,7 +27,7 @@ func NewProofsPool() *proofsPool {
2627
func (pp *proofsPool) AddProof(
2728
headerProof data.HeaderProofHandler,
2829
) error {
29-
if headerProof == nil {
30+
if check.IfNilReflect(headerProof) {
3031
return ErrNilProof
3132
}
3233

epochStart/bootstrap/disabled/disabledHeaderSigVerifier.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package disabled
22

33
import (
44
"github.com/multiversx/mx-chain-core-go/data"
5+
56
"github.com/multiversx/mx-chain-go/process"
67
)
78

@@ -40,8 +41,8 @@ func (h *headerSigVerifier) VerifySignatureForHash(_ data.HeaderHandler, _ []byt
4041
return nil
4142
}
4243

43-
// VerifyPreviousBlockProof returns nil as it is disabled
44-
func (h *headerSigVerifier) VerifyPreviousBlockProof(_ data.HeaderHandler) error {
44+
// VerifyHeaderWithProof returns nil as it is disabled
45+
func (h *headerSigVerifier) VerifyHeaderWithProof(_ data.HeaderHandler) error {
4546
return nil
4647
}
4748

0 commit comments

Comments
 (0)