From 7472f6ac2eff6ef482ed6d5ed137d0eb8120893c Mon Sep 17 00:00:00 2001 From: Adrian Dobrita Date: Mon, 23 Feb 2026 12:54:40 +0200 Subject: [PATCH] re-activate eq proofs check against block tracker. --- .../disabled/disabledValidityAttester.go | 4 +- factory/mock/blockTrackerStub.go | 10 ++--- integrationTests/mock/blockTrackerStub.go | 10 ++--- node/mock/blockTrackerStub.go | 10 ++--- .../interceptedBlockHeader.go | 2 +- .../interceptedEquivalentProof.go | 8 ++-- .../interceptedEquivalentProof_test.go | 38 +++++++++++++++++++ .../interceptedMetaBlockHeader.go | 2 +- process/interface.go | 4 +- process/mock/blockTrackerMock.go | 10 ++--- process/mock/finalityAttesterStub.go | 10 ++--- process/track/baseBlockTrack.go | 8 ++-- 12 files changed, 77 insertions(+), 39 deletions(-) diff --git a/epochStart/bootstrap/disabled/disabledValidityAttester.go b/epochStart/bootstrap/disabled/disabledValidityAttester.go index e811055c3d5..2f916eaefb1 100644 --- a/epochStart/bootstrap/disabled/disabledValidityAttester.go +++ b/epochStart/bootstrap/disabled/disabledValidityAttester.go @@ -26,8 +26,8 @@ func (v *validityAttester) CheckBlockAgainstRoundHandler(_ data.HeaderHandler) e return nil } -// CheckBlockAgainstWhitelist - -func (v *validityAttester) CheckBlockAgainstWhitelist(_ process.InterceptedData) bool { +// CheckAgainstWhitelist - +func (v *validityAttester) CheckAgainstWhitelist(_ process.InterceptedData) bool { return false } diff --git a/factory/mock/blockTrackerStub.go b/factory/mock/blockTrackerStub.go index 9bd8e2d21f7..7c519a10863 100644 --- a/factory/mock/blockTrackerStub.go +++ b/factory/mock/blockTrackerStub.go @@ -15,7 +15,7 @@ type BlockTrackerStub struct { CheckProofAgainstRoundHandlerCalled func(proof data.HeaderProofHandler) error CheckBlockAgainstFinalCalled func(headerHandler data.HeaderHandler) error CheckProofAgainstFinalCalled func(proof data.HeaderProofHandler) error - CheckBlockAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool + CheckAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool CleanupHeadersBehindNonceCalled func(shardID uint32, selfNotarizedNonce uint64, crossNotarizedNonce uint64) ComputeLongestChainCalled func(shardID uint32, header data.HeaderHandler) ([]data.HeaderHandler, [][]byte) ComputeLongestMetaChainFromLastNotarizedCalled func() ([]data.HeaderHandler, [][]byte, error) @@ -99,10 +99,10 @@ func (bts *BlockTrackerStub) CheckProofAgainstRoundHandler(proof data.HeaderProo return nil } -// CheckBlockAgainstWhitelist - -func (bts *BlockTrackerStub) CheckBlockAgainstWhitelist(interceptedData process.InterceptedData) bool { - if bts.CheckBlockAgainstWhitelistCalled != nil { - return bts.CheckBlockAgainstWhitelistCalled(interceptedData) +// CheckAgainstWhitelist - +func (bts *BlockTrackerStub) CheckAgainstWhitelist(interceptedData process.InterceptedData) bool { + if bts.CheckAgainstWhitelistCalled != nil { + return bts.CheckAgainstWhitelistCalled(interceptedData) } return false diff --git a/integrationTests/mock/blockTrackerStub.go b/integrationTests/mock/blockTrackerStub.go index de0dfc2cbbc..36418df7ed6 100644 --- a/integrationTests/mock/blockTrackerStub.go +++ b/integrationTests/mock/blockTrackerStub.go @@ -16,7 +16,7 @@ type BlockTrackerStub struct { CheckProofAgainstFinalCalled func(proof data.HeaderProofHandler) error CheckBlockAgainstRoundHandlerCalled func(headerHandler data.HeaderHandler) error CheckProofAgainstRoundHandlerCalled func(proof data.HeaderProofHandler) error - CheckBlockAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool + CheckAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool CleanupHeadersBehindNonceCalled func(shardID uint32, selfNotarizedNonce uint64, crossNotarizedNonce uint64) ComputeLongestChainCalled func(shardID uint32, header data.HeaderHandler) ([]data.HeaderHandler, [][]byte) ComputeLongestMetaChainFromLastNotarizedCalled func() ([]data.HeaderHandler, [][]byte, error) @@ -100,10 +100,10 @@ func (bts *BlockTrackerStub) CheckProofAgainstRoundHandler(proof data.HeaderProo return nil } -// CheckBlockAgainstWhitelist - -func (bts *BlockTrackerStub) CheckBlockAgainstWhitelist(interceptedData process.InterceptedData) bool { - if bts.CheckBlockAgainstWhitelistCalled != nil { - return bts.CheckBlockAgainstWhitelistCalled(interceptedData) +// CheckAgainstWhitelist - +func (bts *BlockTrackerStub) CheckAgainstWhitelist(interceptedData process.InterceptedData) bool { + if bts.CheckAgainstWhitelistCalled != nil { + return bts.CheckAgainstWhitelistCalled(interceptedData) } return false diff --git a/node/mock/blockTrackerStub.go b/node/mock/blockTrackerStub.go index 3b84fc4a14d..5f2bbc1cd31 100644 --- a/node/mock/blockTrackerStub.go +++ b/node/mock/blockTrackerStub.go @@ -13,7 +13,7 @@ type BlockTrackerStub struct { AddSelfNotarizedHeaderCalled func(shardID uint32, selfNotarizedHeader data.HeaderHandler, selfNotarizedHeaderHash []byte) CheckBlockAgainstRoundHandlerCalled func(headerHandler data.HeaderHandler) error CheckBlockAgainstFinalCalled func(headerHandler data.HeaderHandler) error - CheckBlockAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool + CheckAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool CleanupHeadersBehindNonceCalled func(shardID uint32, selfNotarizedNonce uint64, crossNotarizedNonce uint64) ComputeLongestChainCalled func(shardID uint32, header data.HeaderHandler) ([]data.HeaderHandler, [][]byte) ComputeLongestMetaChainFromLastNotarizedCalled func() ([]data.HeaderHandler, [][]byte, error) @@ -97,10 +97,10 @@ func (bts *BlockTrackerStub) CheckBlockAgainstFinal(headerHandler data.HeaderHan return nil } -// CheckBlockAgainstWhitelist - -func (bts *BlockTrackerStub) CheckBlockAgainstWhitelist(interceptedData process.InterceptedData) bool { - if bts.CheckBlockAgainstWhitelistCalled != nil { - return bts.CheckBlockAgainstWhitelistCalled(interceptedData) +// CheckAgainstWhitelist - +func (bts *BlockTrackerStub) CheckAgainstWhitelist(interceptedData process.InterceptedData) bool { + if bts.CheckAgainstWhitelistCalled != nil { + return bts.CheckAgainstWhitelistCalled(interceptedData) } return false diff --git a/process/block/interceptedBlocks/interceptedBlockHeader.go b/process/block/interceptedBlocks/interceptedBlockHeader.go index cdd2bd5bd43..255e32ef5df 100644 --- a/process/block/interceptedBlocks/interceptedBlockHeader.go +++ b/process/block/interceptedBlocks/interceptedBlockHeader.go @@ -147,7 +147,7 @@ func (inHdr *InterceptedHeader) integrity() error { return err } - if !inHdr.validityAttester.CheckBlockAgainstWhitelist(inHdr) { + if !inHdr.validityAttester.CheckAgainstWhitelist(inHdr) { err = inHdr.validityAttester.CheckBlockAgainstFinal(inHdr.HeaderHandler()) if err != nil { return err diff --git a/process/block/interceptedBlocks/interceptedEquivalentProof.go b/process/block/interceptedBlocks/interceptedEquivalentProof.go index 766a8a876b8..e4dccfd7fe3 100644 --- a/process/block/interceptedBlocks/interceptedEquivalentProof.go +++ b/process/block/interceptedBlocks/interceptedEquivalentProof.go @@ -150,9 +150,11 @@ func (iep *interceptedEquivalentProof) CheckValidity() error { return err } - err = iep.validityAttester.CheckProofAgainstFinal(iep.proof) - if err != nil { - return err + if !iep.validityAttester.CheckAgainstWhitelist(iep) { + err = iep.validityAttester.CheckProofAgainstFinal(iep.proof) + if err != nil { + return err + } } err = iep.validityAttester.CheckProofAgainstRoundHandler(iep.proof) diff --git a/process/block/interceptedBlocks/interceptedEquivalentProof_test.go b/process/block/interceptedBlocks/interceptedEquivalentProof_test.go index fdf0e8fdfa4..12aebf66f97 100644 --- a/process/block/interceptedBlocks/interceptedEquivalentProof_test.go +++ b/process/block/interceptedBlocks/interceptedEquivalentProof_test.go @@ -251,6 +251,44 @@ func TestInterceptedEquivalentProof_CheckValidity(t *testing.T) { err = iep.CheckValidity() require.Equal(t, expectedErr, err) }) + t.Run("whitelisted proof should bypass CheckProofAgainstFinal", func(t *testing.T) { + t.Parallel() + + args := createMockArgInterceptedEquivalentProof() + args.ValidityAttester = &processMock.ValidityAttesterStub{ + CheckAgainstWhitelistCalled: func(interceptedData process.InterceptedData) bool { + return true + }, + CheckProofAgainstFinalCalled: func(proof data.HeaderProofHandler) error { + return expectedErr + }, + } + + iep, err := NewInterceptedEquivalentProof(args) + require.NoError(t, err) + + err = iep.CheckValidity() + require.NoError(t, err) + }) + t.Run("whitelisted proof should still enforce round handler check", func(t *testing.T) { + t.Parallel() + + args := createMockArgInterceptedEquivalentProof() + args.ValidityAttester = &processMock.ValidityAttesterStub{ + CheckAgainstWhitelistCalled: func(interceptedData process.InterceptedData) bool { + return true + }, + CheckProofAgainstRoundHandlerCalled: func(proof data.HeaderProofHandler) error { + return expectedErr + }, + } + + iep, err := NewInterceptedEquivalentProof(args) + require.NoError(t, err) + + err = iep.CheckValidity() + require.Equal(t, expectedErr, err) + }) t.Run("already exiting proof should error", func(t *testing.T) { t.Parallel() diff --git a/process/block/interceptedBlocks/interceptedMetaBlockHeader.go b/process/block/interceptedBlocks/interceptedMetaBlockHeader.go index 64214579181..3f71cd0ffab 100644 --- a/process/block/interceptedBlocks/interceptedMetaBlockHeader.go +++ b/process/block/interceptedBlocks/interceptedMetaBlockHeader.go @@ -82,7 +82,7 @@ func (imh *InterceptedMetaHeader) CheckValidity() error { return err } - if !imh.validityAttester.CheckBlockAgainstWhitelist(imh) { + if !imh.validityAttester.CheckAgainstWhitelist(imh) { err = imh.validityAttester.CheckBlockAgainstFinal(imh.HeaderHandler()) if err != nil { return err diff --git a/process/interface.go b/process/interface.go index a81a8c23190..6762ed03e6b 100644 --- a/process/interface.go +++ b/process/interface.go @@ -1017,7 +1017,7 @@ type BlockTracker interface { AddTrackedHeader(header data.HeaderHandler, hash []byte) CheckBlockAgainstFinal(headerHandler data.HeaderHandler) error CheckBlockAgainstRoundHandler(headerHandler data.HeaderHandler) error - CheckBlockAgainstWhitelist(interceptedData InterceptedData) bool + CheckAgainstWhitelist(interceptedData InterceptedData) bool CheckProofAgainstFinal(proof data.HeaderProofHandler) error CheckProofAgainstRoundHandler(proof data.HeaderProofHandler) error CleanupHeadersBehindNonce(shardID uint32, selfNotarizedNonce uint64, crossNotarizedNonce uint64) @@ -1163,7 +1163,7 @@ type EpochStartSystemSCProcessor interface { type ValidityAttester interface { CheckBlockAgainstFinal(headerHandler data.HeaderHandler) error CheckBlockAgainstRoundHandler(headerHandler data.HeaderHandler) error - CheckBlockAgainstWhitelist(interceptedData InterceptedData) bool + CheckAgainstWhitelist(interceptedData InterceptedData) bool CheckProofAgainstFinal(proof data.HeaderProofHandler) error CheckProofAgainstRoundHandler(proof data.HeaderProofHandler) error IsInterfaceNil() bool diff --git a/process/mock/blockTrackerMock.go b/process/mock/blockTrackerMock.go index 9a512ba5171..d7730ff84ee 100644 --- a/process/mock/blockTrackerMock.go +++ b/process/mock/blockTrackerMock.go @@ -29,7 +29,7 @@ type BlockTrackerMock struct { CheckProofAgainstFinalCalled func(proof data.HeaderProofHandler) error CheckBlockAgainstRoundHandlerCalled func(headerHandler data.HeaderHandler) error CheckProofAgainstRoundHandlerCalled func(proof data.HeaderProofHandler) error - CheckBlockAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool + CheckAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool CleanupHeadersBehindNonceCalled func(shardID uint32, selfNotarizedNonce uint64, crossNotarizedNonce uint64) ComputeLongestChainCalled func(shardID uint32, header data.HeaderHandler) ([]data.HeaderHandler, [][]byte) ComputeLongestMetaChainFromLastNotarizedCalled func() ([]data.HeaderHandler, [][]byte, error) @@ -204,10 +204,10 @@ func (btm *BlockTrackerMock) CheckProofAgainstRoundHandler(proof data.HeaderProo return nil } -// CheckBlockAgainstWhitelist - -func (btm *BlockTrackerMock) CheckBlockAgainstWhitelist(interceptedData process.InterceptedData) bool { - if btm.CheckBlockAgainstWhitelistCalled != nil { - return btm.CheckBlockAgainstWhitelistCalled(interceptedData) +// CheckAgainstWhitelist - +func (btm *BlockTrackerMock) CheckAgainstWhitelist(interceptedData process.InterceptedData) bool { + if btm.CheckAgainstWhitelistCalled != nil { + return btm.CheckAgainstWhitelistCalled(interceptedData) } return false diff --git a/process/mock/finalityAttesterStub.go b/process/mock/finalityAttesterStub.go index a2e425a20cd..dae632d68b5 100644 --- a/process/mock/finalityAttesterStub.go +++ b/process/mock/finalityAttesterStub.go @@ -10,7 +10,7 @@ import ( type ValidityAttesterStub struct { CheckBlockAgainstRoundHandlerCalled func(headerHandler data.HeaderHandler) error CheckBlockAgainstFinalCalled func(headerHandler data.HeaderHandler) error - CheckBlockAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool + CheckAgainstWhitelistCalled func(interceptedData process.InterceptedData) bool CheckProofAgainstFinalCalled func(proof data.HeaderProofHandler) error CheckProofAgainstRoundHandlerCalled func(proof data.HeaderProofHandler) error } @@ -33,10 +33,10 @@ func (vas *ValidityAttesterStub) CheckBlockAgainstFinal(headerHandler data.Heade return nil } -// CheckBlockAgainstWhitelist - -func (vas *ValidityAttesterStub) CheckBlockAgainstWhitelist(interceptedData process.InterceptedData) bool { - if vas.CheckBlockAgainstWhitelistCalled != nil { - return vas.CheckBlockAgainstWhitelistCalled(interceptedData) +// CheckAgainstWhitelist - +func (vas *ValidityAttesterStub) CheckAgainstWhitelist(interceptedData process.InterceptedData) bool { + if vas.CheckAgainstWhitelistCalled != nil { + return vas.CheckAgainstWhitelistCalled(interceptedData) } return false diff --git a/process/track/baseBlockTrack.go b/process/track/baseBlockTrack.go index 9887a8637eb..424671e981f 100644 --- a/process/track/baseBlockTrack.go +++ b/process/track/baseBlockTrack.go @@ -512,9 +512,7 @@ func (bbt *baseBlockTrack) CheckProofAgainstFinal(proof data.HeaderProofHandler) return process.ErrNilHeaderProof } - // TODO: need to fix the condition for proofs - // return bbt.checkAgainstFinal(proof.GetHeaderShardId(), proof.GetHeaderRound(), proof.GetHeaderNonce()) - return nil + return bbt.checkAgainstFinal(proof.GetHeaderShardId(), proof.GetHeaderRound(), proof.GetHeaderNonce()) } func (bbt *baseBlockTrack) checkAgainstFinal(shardID uint32, round uint64, nonce uint64) error { @@ -566,8 +564,8 @@ func (bbt *baseBlockTrack) getFinalHeader(shardID uint32) (data.HeaderHandler, [ return bbt.selfNotarizer.GetFirstNotarizedHeader(shardID) } -// CheckBlockAgainstWhitelist returns if the provided intercepted data (blocks) is whitelisted or not -func (bbt *baseBlockTrack) CheckBlockAgainstWhitelist(interceptedData process.InterceptedData) bool { +// CheckAgainstWhitelist returns if the provided intercepted data is whitelisted or not +func (bbt *baseBlockTrack) CheckAgainstWhitelist(interceptedData process.InterceptedData) bool { return bbt.whitelistHandler.IsWhiteListed(interceptedData) }