Skip to content

Commit dcc8d1a

Browse files
authored
[r33] rpc: add check on latest executed block (#19133)
Back-porting of #19018
1 parent b500191 commit dcc8d1a

15 files changed

+160
-2
lines changed

.github/workflows/scripts/run_rpc_tests_ethereum.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,10 @@ DISABLED_TEST_LIST=(
3838
txpool_status/test_1.json
3939
web3_clientVersion/test_1.json
4040
# tests not updated after cherry-picking
41+
eth_getBalance/test_05.json
4142
eth_getStorageAt/test_09.json
43+
ots_hasCode/test_06.json
44+
ots_hasCode/test_09.json
4245
# disabled because eth_createAccessList/test_19.json currently fails on mainnet; root cause under investigation
4346
eth_createAccessList/test_19.json
4447
)

.github/workflows/scripts/run_rpc_tests_remote_ethereum.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,10 @@ DISABLED_TEST_LIST=(
1414
eth_getProof
1515
eth_simulateV1
1616
# tests not updated after cherry-picking
17+
eth_getBalance/test_05.json
1718
eth_getStorageAt/test_09.json
19+
ots_hasCode/test_06.json
20+
ots_hasCode/test_09.json
1821
# Disabled because of an incorrect response.
1922
eth_createAccessList/test_19.json
2023
)

rpc/jsonrpc/erigon_block.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -212,7 +212,7 @@ func (api *ErigonImpl) GetBalanceChangesInBlock(ctx context.Context, blockNrOrHa
212212
defer tx.Rollback()
213213

214214
balancesMapping := make(map[common.Address]*hexutil.Big)
215-
latestState, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, blockNrOrHash, 0, api.filters, api.stateCache, api._txNumReader)
215+
reader, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, blockNrOrHash, 0, api.filters, api.stateCache, api._txNumReader)
216216
if err != nil {
217217
return nil, err
218218
}
@@ -222,6 +222,11 @@ func (api *ErigonImpl) GetBalanceChangesInBlock(ctx context.Context, blockNrOrHa
222222
return nil, err
223223
}
224224

225+
err = rpchelper.CheckBlockExecuted(tx, blockNumber)
226+
if err != nil {
227+
return nil, err
228+
}
229+
225230
minTxNum, err := api._txNumReader.Min(tx, blockNumber)
226231
if err != nil {
227232
return nil, err
@@ -250,7 +255,7 @@ func (api *ErigonImpl) GetBalanceChangesInBlock(ctx context.Context, blockNrOrHa
250255
oldBalance := oldAcc.Balance
251256

252257
address := common.BytesToAddress(addressBytes)
253-
newAcc, err := latestState.ReadAccountData(address)
258+
newAcc, err := reader.ReadAccountData(address)
254259
if err != nil {
255260
return nil, err
256261
}

rpc/jsonrpc/eth_accounts.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,16 @@ func (api *APIImpl) GetBalance(ctx context.Context, address common.Address, bloc
3838
return nil, fmt.Errorf("getBalance cannot open tx: %w", err1)
3939
}
4040
defer tx.Rollback()
41+
42+
blockNumber, _, _, err := rpchelper.GetBlockNumber(ctx, blockNrOrHash, tx, api._blockReader, api.filters)
43+
if err != nil {
44+
return nil, err
45+
}
46+
err = rpchelper.CheckBlockExecuted(tx, blockNumber)
47+
if err != nil {
48+
return nil, err
49+
}
50+
4151
reader, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, blockNrOrHash, 0, api.filters, api.stateCache, api._txNumReader)
4252
if err != nil {
4353
return nil, err
@@ -74,6 +84,16 @@ func (api *APIImpl) GetTransactionCount(ctx context.Context, address common.Addr
7484
return nil, fmt.Errorf("getTransactionCount cannot open tx: %w", err1)
7585
}
7686
defer tx.Rollback()
87+
88+
blockNumber, _, _, err := rpchelper.GetBlockNumber(ctx, blockNrOrHash, tx, api._blockReader, api.filters)
89+
if err != nil {
90+
return nil, err
91+
}
92+
err = rpchelper.CheckBlockExecuted(tx, blockNumber)
93+
if err != nil {
94+
return nil, err
95+
}
96+
7797
reader, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, blockNrOrHash, 0, api.filters, api.stateCache, api._txNumReader)
7898
if err != nil {
7999
return nil, err
@@ -93,6 +113,16 @@ func (api *APIImpl) GetCode(ctx context.Context, address common.Address, blockNr
93113
return nil, fmt.Errorf("getCode cannot open tx: %w", err1)
94114
}
95115
defer tx.Rollback()
116+
117+
blockNumber, _, _, err := rpchelper.GetBlockNumber(ctx, blockNrOrHash, tx, api._blockReader, api.filters)
118+
if err != nil {
119+
return nil, err
120+
}
121+
err = rpchelper.CheckBlockExecuted(tx, blockNumber)
122+
if err != nil {
123+
return nil, err
124+
}
125+
96126
reader, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, blockNrOrHash, 0, api.filters, api.stateCache, api._txNumReader)
97127
if err != nil {
98128
return nil, err
@@ -127,6 +157,15 @@ func (api *APIImpl) GetStorageAt(ctx context.Context, address common.Address, in
127157
}
128158
defer tx.Rollback()
129159

160+
blockNumber, _, _, err := rpchelper.GetBlockNumber(ctx, blockNrOrHash, tx, api._blockReader, api.filters)
161+
if err != nil {
162+
return hexutil.Encode(common.LeftPadBytes(empty, 32)), err
163+
}
164+
err = rpchelper.CheckBlockExecuted(tx, blockNumber)
165+
if err != nil {
166+
return hexutil.Encode(common.LeftPadBytes(empty, 32)), err
167+
}
168+
130169
reader, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, blockNrOrHash, 0, api.filters, api.stateCache, api._txNumReader)
131170
if err != nil {
132171
return hexutil.Encode(common.LeftPadBytes(empty, 32)), err
@@ -152,6 +191,15 @@ func (api *APIImpl) Exist(ctx context.Context, address common.Address, blockNrOr
152191
}
153192
defer tx.Rollback()
154193

194+
blockNumber, _, _, err := rpchelper.GetBlockNumber(ctx, blockNrOrHash, tx, api._blockReader, api.filters)
195+
if err != nil {
196+
return false, err
197+
}
198+
err = rpchelper.CheckBlockExecuted(tx, blockNumber)
199+
if err != nil {
200+
return false, err
201+
}
202+
155203
reader, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, blockNrOrHash, 0, api.filters, api.stateCache, api._txNumReader)
156204
if err != nil {
157205
return false, err

rpc/jsonrpc/eth_call.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,11 @@ func (api *APIImpl) Call(ctx context.Context, args ethapi2.CallArgs, requestedBl
9292
return nil, fmt.Errorf("header not found")
9393
}
9494

95+
err = rpchelper.CheckBlockExecuted(tx, header.Number.Uint64())
96+
if err != nil {
97+
return nil, err
98+
}
99+
95100
stateReader, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, blockNrOrHash, 0, api.filters, api.stateCache, api._txNumReader)
96101
if err != nil {
97102
return nil, err
@@ -184,6 +189,11 @@ func (api *APIImpl) EstimateGas(ctx context.Context, argsOrNil *ethapi2.CallArgs
184189

185190
blockNum := *(header.Number)
186191

192+
err = rpchelper.CheckBlockExecuted(dbtx, header.Number.Uint64())
193+
if err != nil {
194+
return 0, err
195+
}
196+
187197
stateReader, err := rpchelper.CreateStateReaderFromBlockNumber(ctx, dbtx, blockNum.Uint64(), isLatest, 0, api.stateCache, api._txNumReader)
188198
if err != nil {
189199
return 0, err
@@ -816,6 +826,10 @@ func (api *APIImpl) CreateAccessList(ctx context.Context, args ethapi2.CallArgs,
816826
}
817827
stateReader = rpchelper.CreateLatestCachedStateReader(cacheView, tx)
818828
} else {
829+
err = rpchelper.CheckBlockExecuted(tx, header.Number.Uint64())
830+
if err != nil {
831+
return nil, err
832+
}
819833
stateReader, err = rpchelper.CreateHistoryStateReader(tx, blockNumber+1, 0, api._txNumReader)
820834
if err != nil {
821835
return nil, err

rpc/jsonrpc/eth_callMany.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,11 @@ func (api *APIImpl) CallMany(ctx context.Context, bundles []Bundle, simulateCont
9191
return nil, err
9292
}
9393

94+
err = rpchelper.CheckBlockExecuted(tx, blockNum)
95+
if err != nil {
96+
return nil, err
97+
}
98+
9499
block, err := api.blockWithSenders(ctx, tx, hash, blockNum)
95100
if err != nil {
96101
return nil, err

rpc/jsonrpc/otterscan_has_code.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ func (api *OtterscanAPIImpl) HasCode(ctx context.Context, address common.Address
3737
return false, err
3838
}
3939

40+
err = rpchelper.CheckBlockExecuted(tx, blockNumber)
41+
if err != nil {
42+
return false, err
43+
}
44+
4045
reader, err := rpchelper.CreateHistoryStateReader(tx, blockNumber, 0, api._txNumReader)
4146
if err != nil {
4247
return false, err

rpc/jsonrpc/otterscan_search_trace.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,11 @@ func (api *OtterscanAPIImpl) traceBlock(dbtx kv.TemporalTx, ctx context.Context,
7373
return false, nil, nil
7474
}
7575

76+
err = rpchelper.CheckBlockExecuted(dbtx, blockNum)
77+
if err != nil {
78+
return false, nil, err
79+
}
80+
7681
reader, err := rpchelper.CreateHistoryStateReader(dbtx, blockNum, 0, api._txNumReader)
7782
if err != nil {
7883
return false, nil, err

rpc/jsonrpc/overlay_api.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,11 @@ func (api *OverlayAPIImpl) CallConstructor(ctx context.Context, address common.A
147147

148148
replayTransactions = block.Transactions()[:transactionIndex]
149149

150+
err = rpchelper.CheckBlockExecuted(tx, blockNum)
151+
if err != nil {
152+
return nil, err
153+
}
154+
150155
stateReader, err := rpchelper.CreateStateReader(ctx, tx, api._blockReader, rpc.BlockNumberOrHashWithNumber(rpc.BlockNumber(blockNum-1)), 0, api.filters, api.stateCache, api._txNumReader)
151156
if err != nil {
152157
return nil, err

rpc/jsonrpc/receipts/bor_receipts_generator.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/erigontech/erigon/execution/vm"
1919
"github.com/erigontech/erigon/execution/vm/evmtypes"
2020
bortypes "github.com/erigontech/erigon/polygon/bor/types"
21+
"github.com/erigontech/erigon/rpc/rpchelper"
2122
"github.com/erigontech/erigon/rpc/transactions"
2223
)
2324

@@ -48,6 +49,11 @@ func (g *BorGenerator) GenerateBorReceipt(ctx context.Context, tx kv.TemporalTx,
4849
return receipt, nil
4950
}
5051

52+
err := rpchelper.CheckBlockExecuted(tx, block.NumberU64())
53+
if err != nil {
54+
return nil, err
55+
}
56+
5157
txNumsReader := g.blockReader.TxnumReader(ctx)
5258
ibs, blockContext, _, _, _, err := transactions.ComputeBlockContext(ctx, g.engine, block.HeaderNoCopy(), chainConfig, g.blockReader, txNumsReader, tx, len(block.Transactions())) // we want to get the state at the end of the block
5359
if err != nil {

0 commit comments

Comments
 (0)