From aabded250fed95d33db997fd2901f94cc8861471 Mon Sep 17 00:00:00 2001 From: james-prysm <90280386+james-prysm@users.noreply.github.com> Date: Mon, 6 Oct 2025 10:47:27 -0500 Subject: [PATCH] fixing Origin block root is not set error log (#15808) * fixing error log * kasey's suggestion * kasey's feedback replacing comment --- beacon-chain/db/kv/state.go | 4 +- beacon-chain/db/kv/state_test.go | 48 +++++++++++++++++++ changelog/james-prysm_fix-origin-block-log.md | 3 ++ 3 files changed, 54 insertions(+), 1 deletion(-) create mode 100644 changelog/james-prysm_fix-origin-block-log.md diff --git a/beacon-chain/db/kv/state.go b/beacon-chain/db/kv/state.go index b6ef40dad2..16ed683747 100644 --- a/beacon-chain/db/kv/state.go +++ b/beacon-chain/db/kv/state.go @@ -954,7 +954,9 @@ func (s *Store) CleanUpDirtyStates(ctx context.Context, slotsPerArchivedPoint pr deletedRoots := make([][32]byte, 0) oRoot, err := s.OriginCheckpointBlockRoot(ctx) - if err != nil { + if err != nil && !errors.Is(err, ErrNotFoundOriginBlockRoot) { + // If the node did not use checkpoint sync, there will be no origin block root. + // Use zero hash which will never match any actual state root return err } diff --git a/beacon-chain/db/kv/state_test.go b/beacon-chain/db/kv/state_test.go index ebb29bf9c4..c5bb58de9c 100644 --- a/beacon-chain/db/kv/state_test.go +++ b/beacon-chain/db/kv/state_test.go @@ -10,6 +10,7 @@ import ( "github.com/OffchainLabs/prysm/v6/beacon-chain/state" "github.com/OffchainLabs/prysm/v6/config/features" + fieldparams "github.com/OffchainLabs/prysm/v6/config/fieldparams" "github.com/OffchainLabs/prysm/v6/config/params" "github.com/OffchainLabs/prysm/v6/consensus-types/blocks" "github.com/OffchainLabs/prysm/v6/consensus-types/interfaces" @@ -1283,3 +1284,50 @@ func BenchmarkState_CheckStateSaveTime_10(b *testing.B) { checkStateSaveTime(b, func BenchmarkState_CheckStateReadTime_1(b *testing.B) { checkStateReadTime(b, 1) } func BenchmarkState_CheckStateReadTime_10(b *testing.B) { checkStateReadTime(b, 10) } + +func TestStore_CleanUpDirtyStates_NoOriginRoot(t *testing.T) { + // This test verifies that CleanUpDirtyStates does not fail when the origin block root is not set, + // which can happen when starting from genesis or in certain fork scenarios like Fulu. + db := setupDB(t) + genesisState, err := util.NewBeaconState() + require.NoError(t, err) + genesisRoot := [fieldparams.RootLength]byte{'a'} + require.NoError(t, db.SaveGenesisBlockRoot(t.Context(), genesisRoot)) + require.NoError(t, db.SaveState(t.Context(), genesisState, genesisRoot)) + // Note: We intentionally do NOT call SaveOriginCheckpointBlockRoot here + // to simulate the scenario where origin block root is not set + slotsPerArchivedPoint := primitives.Slot(128) + bRoots := make([][fieldparams.RootLength]byte, 0) + prevRoot := genesisRoot + for i := primitives.Slot(1); i <= slotsPerArchivedPoint; i++ { // skip slot 0 + b := util.NewBeaconBlock() + b.Block.Slot = i + b.Block.ParentRoot = prevRoot[:] + r, err := b.Block.HashTreeRoot() + require.NoError(t, err) + wsb, err := blocks.NewSignedBeaconBlock(b) + require.NoError(t, err) + require.NoError(t, db.SaveBlock(t.Context(), wsb)) + bRoots = append(bRoots, r) + prevRoot = r + st, err := util.NewBeaconState() + require.NoError(t, err) + require.NoError(t, st.SetSlot(i)) + require.NoError(t, db.SaveState(t.Context(), st, r)) + } + require.NoError(t, db.SaveFinalizedCheckpoint(t.Context(), ðpb.Checkpoint{ + Root: bRoots[len(bRoots)-1][:], + Epoch: primitives.Epoch(slotsPerArchivedPoint / params.BeaconConfig().SlotsPerEpoch), + })) + // This should not fail even though origin block root is not set + err = db.CleanUpDirtyStates(t.Context(), slotsPerArchivedPoint) + require.NoError(t, err) + // Verify that cleanup still works correctly + for i, root := range bRoots { + if primitives.Slot(i) >= slotsPerArchivedPoint.SubSlot(slotsPerArchivedPoint.Div(3)) { + require.Equal(t, true, db.HasState(t.Context(), root)) + } else { + require.Equal(t, false, db.HasState(t.Context(), root)) + } + } +} diff --git a/changelog/james-prysm_fix-origin-block-log.md b/changelog/james-prysm_fix-origin-block-log.md new file mode 100644 index 0000000000..ec8f59d493 --- /dev/null +++ b/changelog/james-prysm_fix-origin-block-log.md @@ -0,0 +1,3 @@ +### Fixed + +- fixes level=error msg="Could not clean up dirty states" error="OriginBlockRoot: not found in db" prefix=state-gen error when starting in kurtosis \ No newline at end of file