From 0761ec597b4d609c3ae718eb8387cba4e25703b6 Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Wed, 24 Jun 2026 15:34:53 +0300 Subject: [PATCH 1/2] when transitioning to Andromeda, request missing proofs --- process/block/baseProcess.go | 9 ++- process/block/baseProcess_test.go | 106 +++++++++++++++++++++++++----- 2 files changed, 96 insertions(+), 19 deletions(-) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index 49dde1f2e2..72f298c616 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -1216,10 +1216,15 @@ func (bp *baseProcessor) requestMissingFinalityAttestingHeaders( } for index := range headers { - bp.hdrsForCurrBlock.hdrHashAndInfo[string(headersHashes[index])] = &hdrInfo{ - hdr: headers[index], + hdrHash := headersHashes[index] + hdr := headers[index] + + bp.hdrsForCurrBlock.hdrHashAndInfo[string(hdrHash)] = &hdrInfo{ + hdr: hdr, usedInBlock: false, } + + bp.requestProofIfNeeded(hdrHash, hdr) } } diff --git a/process/block/baseProcess_test.go b/process/block/baseProcess_test.go index ebe8b2473e..72f72062e7 100644 --- a/process/block/baseProcess_test.go +++ b/process/block/baseProcess_test.go @@ -2515,23 +2515,34 @@ func TestBaseProcessor_CheckScheduledData(t *testing.T) { createProcessorAndHeader := func(t *testing.T) (interface { CheckScheduledData(data.HeaderHandler) error - }, *block.HeaderV2) { t.Helper(); coreComponents, dataComponents, bootstrapComponents, statusComponents := createComponentHolderMocks(); coreComponents.EnableEpochsHandlerField = enableEpochsHandlerMock.NewEnableEpochsHandlerStub(common.ScheduledMiniBlocksFlag); arguments := CreateMockArguments(coreComponents, dataComponents, bootstrapComponents, statusComponents); arguments.ArgBaseProcessor.AccountsDB[state.UserAccountsState] = &stateMock.AccountsStub{ - RootHashCalled: func() ([]byte, error) { - return []byte("scheduled-root"), nil - }, - }; arguments.ArgBaseProcessor.ScheduledTxsExecutionHandler = &testscommon.ScheduledTxsExecutionStub{ - GetScheduledGasAndFeesCalled: func() scheduled.GasAndFees { - return scheduledGasAndFees - }, - }; processor, err := blproc.NewShardProcessor(arguments); require.NoError(t, err); header := &block.HeaderV2{ - Header: &block.Header{}, - ScheduledRootHash: []byte("scheduled-root"), - ScheduledAccumulatedFees: big.NewInt(11), - ScheduledDeveloperFees: big.NewInt(12), - ScheduledGasProvided: 13, - ScheduledGasPenalized: 14, - ScheduledGasRefunded: 15, - }; return processor, header } + }, *block.HeaderV2) { + t.Helper() + coreComponents, dataComponents, bootstrapComponents, statusComponents := createComponentHolderMocks() + coreComponents.EnableEpochsHandlerField = enableEpochsHandlerMock.NewEnableEpochsHandlerStub(common.ScheduledMiniBlocksFlag) + arguments := CreateMockArguments(coreComponents, dataComponents, bootstrapComponents, statusComponents) + arguments.ArgBaseProcessor.AccountsDB[state.UserAccountsState] = &stateMock.AccountsStub{ + RootHashCalled: func() ([]byte, error) { + return []byte("scheduled-root"), nil + }, + } + arguments.ArgBaseProcessor.ScheduledTxsExecutionHandler = &testscommon.ScheduledTxsExecutionStub{ + GetScheduledGasAndFeesCalled: func() scheduled.GasAndFees { + return scheduledGasAndFees + }, + } + processor, err := blproc.NewShardProcessor(arguments) + require.NoError(t, err) + header := &block.HeaderV2{ + Header: &block.Header{}, + ScheduledRootHash: []byte("scheduled-root"), + ScheduledAccumulatedFees: big.NewInt(11), + ScheduledDeveloperFees: big.NewInt(12), + ScheduledGasProvided: 13, + ScheduledGasPenalized: 14, + ScheduledGasRefunded: 15, + } + return processor, header + } t.Run("should work when scheduled data matches", func(t *testing.T) { t.Parallel() @@ -3818,3 +3829,64 @@ func TestBaseProcessor_DisplayHeader(t *testing.T) { require.Equal(t, 23, len(lines)) }) } + +func TestMetaProcessor_requestMissingFinalityAttestingShardHeaders_AttestationHeaderPresentProofMissingShouldRequestProof(t *testing.T) { + t.Parallel() + + noOfShards := uint32(2) + td := createTestData() + proofRequests := make(chan requestedProof, 1) + + arguments := createMetaProcessorArguments(t, noOfShards) + coreComponents, ok := arguments.CoreComponents.(*mock.CoreComponentsMock) + require.True(t, ok) + coreComponents.EnableEpochsHandlerField = &enableEpochsHandlerMock.EnableEpochsHandlerStub{ + IsFlagEnabledInEpochCalled: func(flag core.EnableEpochFlag, epoch uint32) bool { + return flag == common.AndromedaFlag + }, + } + + poolsHolder, ok := arguments.DataComponents.Datapool().(*dataRetrieverMock.PoolsHolderMock) + require.True(t, ok) + poolsHolder.SetHeadersPool(createPoolsHolderForHeaderRequests()) + + requestHandler, ok := arguments.ArgBaseProcessor.RequestHandler.(*testscommon.RequestHandlerStub) + require.True(t, ok) + requestHandler.RequestEquivalentProofByHashCalled = func(headerShard uint32, headerHash []byte) { + proofRequests <- requestedProof{shardID: headerShard, hash: append([]byte(nil), headerHash...)} + } + + mp, err := blproc.NewMetaProcessor(*arguments) + require.NoError(t, err) + + referenced := td[0].referencedHeaderData + attestation := td[0].attestationHeaderData + + mp.SetShardBlockFinality(1) + mp.SetHighestHdrNonceForCurrentBlock(referenced.header.GetShardID(), referenced.header.GetNonce()) + mp.SetLastNotarizedHeaderForShard(referenced.header.GetShardID(), &blproc.LastNotarizedHeaderInfo{ + Header: referenced.header, + Hash: referenced.headerHash, + NotarizedBasedOnProof: false, + HasProof: false, + }) + + mp.GetDataPool().Headers().AddHeader(attestation.headerHash, attestation.header) + + missingFinalityHeaders := mp.RequestMissingFinalityAttestingShardHeaders() + + require.Equal(t, uint32(0), missingFinalityHeaders) + + select { + case requested := <-proofRequests: + require.Equal(t, attestation.header.GetShardID(), requested.shardID) + require.Equal(t, attestation.headerHash, requested.hash) + case <-time.After(100 * time.Millisecond): + require.Fail(t, "missing equivalent proof request for attestation header") + } +} + +type requestedProof struct { + shardID uint32 + hash []byte +} From 235f4057643abd918302d624358543cae254376f Mon Sep 17 00:00:00 2001 From: BeniaminDrasovean Date: Thu, 25 Jun 2026 17:05:54 +0300 Subject: [PATCH 2/2] fix after review --- process/block/baseProcess.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/process/block/baseProcess.go b/process/block/baseProcess.go index 72f298c616..13c0a20c60 100644 --- a/process/block/baseProcess.go +++ b/process/block/baseProcess.go @@ -1216,15 +1216,12 @@ func (bp *baseProcessor) requestMissingFinalityAttestingHeaders( } for index := range headers { - hdrHash := headersHashes[index] - hdr := headers[index] - - bp.hdrsForCurrBlock.hdrHashAndInfo[string(hdrHash)] = &hdrInfo{ - hdr: hdr, + bp.hdrsForCurrBlock.hdrHashAndInfo[string(headersHashes[index])] = &hdrInfo{ + hdr: headers[index], usedInBlock: false, } - bp.requestProofIfNeeded(hdrHash, hdr) + bp.requestProofIfNeeded(headersHashes[index], headers[index]) } }