From 47fba2b0035db56c7316925e0043be68dc43145c Mon Sep 17 00:00:00 2001 From: yperbasis Date: Tue, 11 Aug 2026 15:38:31 +0200 Subject: [PATCH] rpc: keep modified-account tags on committed view --- rpc/jsonrpc/debug_api.go | 4 ++-- rpc/jsonrpc/debug_api_test.go | 8 +++++--- rpc/jsonrpc/overlay_race_test.go | 23 +++++++++++++++++++++++ 3 files changed, 30 insertions(+), 5 deletions(-) diff --git a/rpc/jsonrpc/debug_api.go b/rpc/jsonrpc/debug_api.go index c9df7e41e8c..783c53e2cd1 100644 --- a/rpc/jsonrpc/debug_api.go +++ b/rpc/jsonrpc/debug_api.go @@ -319,7 +319,7 @@ func (api *DebugAPIImpl) GetModifiedAccountsByNumber(ctx context.Context, startN return nil, err } - startNum, _, _, err := rpchelper.GetBlockNumber(ctx, rpc.BlockNumberOrHashWithNumber(startNumber), tx, api._blockReader, api.filters) + startNum, _, _, err := rpchelper.GetBlockNumber(ctx, rpc.BlockNumberOrHashWithNumber(startNumber), tx, api._blockReader, nil) if err != nil { return nil, err } @@ -344,7 +344,7 @@ func (api *DebugAPIImpl) GetModifiedAccountsByNumber(ctx context.Context, startN } // Two params: Geth compares state at startNum vs endNum → blocks (startNum, endNum]. - endNum, _, _, err := rpchelper.GetBlockNumber(ctx, rpc.BlockNumberOrHashWithNumber(*endNumber), tx, api._blockReader, api.filters) + endNum, _, _, err := rpchelper.GetBlockNumber(ctx, rpc.BlockNumberOrHashWithNumber(*endNumber), tx, api._blockReader, nil) if err != nil { return nil, err } diff --git a/rpc/jsonrpc/debug_api_test.go b/rpc/jsonrpc/debug_api_test.go index 45b1ccbe5ba..278bea25780 100644 --- a/rpc/jsonrpc/debug_api_test.go +++ b/rpc/jsonrpc/debug_api_test.go @@ -971,8 +971,9 @@ func TestGetModifiedAccountsByNumber(t *testing.T) { result, err = api.GetModifiedAccountsByNumber(m.Ctx, rpc.FinalizedBlockNumber, nil) require.NoError(t, err) require.NotEmpty(t, result) + }) - // Non-nil filters with a LastPendingBlock exceeding latest executed block should return an error + t.Run("pending tag uses committed view", func(t *testing.T) { ff := rpchelper.New(t.Context(), rpchelper.FiltersConfig{}, nil, nil, nil, func() {}, log.New(), nil) pendingBlock := types.NewBlockWithHeader(&types.Header{Number: *uint256.NewInt(100)}) payload, err := rlp.EncodeToBytes(pendingBlock) @@ -982,8 +983,9 @@ func TestGetModifiedAccountsByNumber(t *testing.T) { baseWithFilters := NewBaseApi(ff, m.StateCache, m.BlockReader, m.Engine, nil, &rpccfg.BaseApiConfig{Dirs: m.Dirs}) apiWithFilters := NewPrivateDebugAPI(baseWithFilters, m.DB, nil, &rpccfg.DebugApiConfig{}) - _, err = apiWithFilters.GetModifiedAccountsByNumber(m.Ctx, rpc.PendingBlockNumber, nil) - require.Error(t, err) + result, err := apiWithFilters.GetModifiedAccountsByNumber(m.Ctx, rpc.PendingBlockNumber, nil) + require.NoError(t, err) + require.NotEmpty(t, result) }) } diff --git a/rpc/jsonrpc/overlay_race_test.go b/rpc/jsonrpc/overlay_race_test.go index f57ccd8a2e8..1ec6fd9de58 100644 --- a/rpc/jsonrpc/overlay_race_test.go +++ b/rpc/jsonrpc/overlay_race_test.go @@ -41,6 +41,7 @@ import ( "github.com/erigontech/erigon/node/gointerfaces/txpoolproto" "github.com/erigontech/erigon/node/shards" "github.com/erigontech/erigon/rpc" + "github.com/erigontech/erigon/rpc/rpccfg" "github.com/erigontech/erigon/rpc/rpchelper" ) @@ -98,6 +99,7 @@ func newOverlayAheadTestAPI(t *testing.T) (base *BaseAPI, m *execmoduletester.Ex // enough for the reader paths under test to resolve this header as current. require.NoError(t, rawdb.WriteHeader(overlay, overlayHeader)) require.NoError(t, rawdb.WriteHeadHeaderHash(overlay, hash)) + rawdb.WriteForkchoiceHead(overlay, hash) require.NoError(t, rawdb.WriteCanonicalHash(overlay, hash, overlayNumber)) require.NoError(t, rawdb.WriteBody(overlay, hash, overlayNumber, &types.Body{})) @@ -159,6 +161,27 @@ func TestGetBlockByTimestamp_SeesOverlayHead(t *testing.T) { "must resolve to the overlay head block, not the stale MDBX-committed head") } +func TestGetModifiedAccountsByNumber_UsesCommittedStartTag(t *testing.T) { + t.Parallel() + base, m, _ := newOverlayAheadTestAPI(t) + api := NewPrivateDebugAPI(base, m.DB, nil, &rpccfg.DebugApiConfig{}) + + result, err := api.GetModifiedAccountsByNumber(m.Ctx, rpc.LatestBlockNumber, nil) + require.NoError(t, err) + require.NotEmpty(t, result) +} + +func TestGetModifiedAccountsByNumber_UsesCommittedEndTag(t *testing.T) { + t.Parallel() + base, m, _ := newOverlayAheadTestAPI(t) + api := NewPrivateDebugAPI(base, m.DB, nil, &rpccfg.DebugApiConfig{}) + latest := rpc.LatestBlockNumber + + result, err := api.GetModifiedAccountsByNumber(m.Ctx, rpc.EarliestBlockNumber, &latest) + require.NoError(t, err) + require.NotEmpty(t, result) +} + // TestGetTransactionByHash_PendingTx_UsesOverlayHead pins that the pending-tx // fallback in GetTransactionByHash reads the current header through the block // overlay: the returned tx's gas price (derived from that header's base fee)