diff --git a/rpc/jsonrpc/debug_api.go b/rpc/jsonrpc/debug_api.go index e4527edb291..c9df7e41e8c 100644 --- a/rpc/jsonrpc/debug_api.go +++ b/rpc/jsonrpc/debug_api.go @@ -319,8 +319,10 @@ func (api *DebugAPIImpl) GetModifiedAccountsByNumber(ctx context.Context, startN return nil, err } - // forces negative numbers to fail (too large) but allows zero - startNum := uint64(startNumber.Int64()) + startNum, _, _, err := rpchelper.GetBlockNumber(ctx, rpc.BlockNumberOrHashWithNumber(startNumber), tx, api._blockReader, api.filters) + if err != nil { + return nil, err + } if startNum > latestBlock { return nil, fmt.Errorf("start block (%d) is later than the latest block (%d)", startNum, latestBlock) } @@ -342,7 +344,10 @@ func (api *DebugAPIImpl) GetModifiedAccountsByNumber(ctx context.Context, startN } // Two params: Geth compares state at startNum vs endNum → blocks (startNum, endNum]. - endNum := uint64(endNumber.Int64()) // forces negative numbers to fail (too large) + endNum, _, _, err := rpchelper.GetBlockNumber(ctx, rpc.BlockNumberOrHashWithNumber(*endNumber), tx, api._blockReader, api.filters) + if err != nil { + return nil, err + } if endNum > latestBlock { return nil, fmt.Errorf("end block (%d) is later than the latest block (%d)", endNum, latestBlock) } diff --git a/rpc/jsonrpc/debug_api_test.go b/rpc/jsonrpc/debug_api_test.go index 35ec24c5be4..45b1ccbe5ba 100644 --- a/rpc/jsonrpc/debug_api_test.go +++ b/rpc/jsonrpc/debug_api_test.go @@ -50,6 +50,7 @@ import ( chainspec "github.com/erigontech/erigon/execution/chain/spec" "github.com/erigontech/erigon/execution/execmodule" "github.com/erigontech/erigon/execution/execmodule/execmoduletester" + "github.com/erigontech/erigon/execution/rlp" "github.com/erigontech/erigon/execution/stagedsync/stages" "github.com/erigontech/erigon/execution/state" "github.com/erigontech/erigon/execution/tests/blockgen" @@ -58,6 +59,7 @@ import ( "github.com/erigontech/erigon/execution/types/accounts" "github.com/erigontech/erigon/node/direct" "github.com/erigontech/erigon/node/gointerfaces/remoteproto" + "github.com/erigontech/erigon/node/gointerfaces/txpoolproto" "github.com/erigontech/erigon/node/privateapi" "github.com/erigontech/erigon/rpc" "github.com/erigontech/erigon/rpc/ethapi" @@ -938,6 +940,51 @@ func TestGetModifiedAccountsByNumber(t *testing.T) { _, err = api.GetModifiedAccountsByNumber(m.Ctx, rpc.BlockNumber(11), &n2) require.Error(t, err) }) + t.Run("block tags", func(t *testing.T) { + latest := rpc.LatestBlockNumber + earliest := rpc.EarliestBlockNumber + + result, err := api.GetModifiedAccountsByNumber(m.Ctx, latest, nil) + require.NoError(t, err) + require.NotEmpty(t, result) + + result, err = api.GetModifiedAccountsByNumber(m.Ctx, earliest, &latest) + require.NoError(t, err) + require.NotEmpty(t, result) + + n := rpc.BlockNumber(11) + result, err = api.GetModifiedAccountsByNumber(m.Ctx, n, &latest) + require.NoError(t, err) + require.NotEmpty(t, result) + + result, err = api.GetModifiedAccountsByNumber(m.Ctx, rpc.PendingBlockNumber, nil) + require.NoError(t, err) + require.NotEmpty(t, result) + + _, err = api.GetModifiedAccountsByNumber(m.Ctx, latest, &earliest) + require.Error(t, err) + + result, err = api.GetModifiedAccountsByNumber(m.Ctx, rpc.SafeBlockNumber, nil) + require.NoError(t, err) + require.NotEmpty(t, result) + + 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 + 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) + require.NoError(t, err) + ff.HandlePendingBlock(&txpoolproto.OnPendingBlockReply{RplBlock: payload}) + + 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) + }) } func TestMapTxNum2BlockNum(t *testing.T) {