Skip to content

Commit 37daddb

Browse files
authored
rpc: add_check on persistentReceipt (#19414)
close #19215 In the following API add check on persistent receipt: - erigon_getLogs() - erigon_getLatestLogs() - eth_getTransactionReceipt() - eth_getBlockReceipts() - overlay_getLogs()
1 parent d8bbe0c commit 37daddb

File tree

4 files changed

+25
-9
lines changed

4 files changed

+25
-9
lines changed

rpc/jsonrpc/erigon_receipts.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (api *ErigonImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria)
136136
return nil, &rpc.CustomError{Message: fmt.Sprintf("end (%d) > MaxUint32)", end), Code: rpc.ErrCodeInvalidParams}
137137
}
138138

139-
err := api.BaseAPI.checkPruneHistory(ctx, tx, begin)
139+
err := api.BaseAPI.checkReceiptsAvailable(ctx, tx, begin)
140140
if err != nil {
141141
return nil, err
142142
}
@@ -228,7 +228,7 @@ func (api *ErigonImpl) GetLatestLogs(ctx context.Context, crit filters.FilterCri
228228
return nil, &rpc.CustomError{Message: fmt.Sprintf("%s: %d", errExceedBlockRange, api.rangeLimit), Code: rpc.ErrCodeInvalidParams}
229229
}
230230

231-
err = api.BaseAPI.checkPruneHistory(ctx, tx, begin)
231+
err = api.BaseAPI.checkReceiptsAvailable(ctx, tx, begin)
232232
if err != nil {
233233
return nil, err
234234
}

rpc/jsonrpc/eth_api.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import (
2020
"bytes"
2121
"context"
2222
"errors"
23+
"fmt"
2324
"sync"
2425
"sync/atomic"
2526
"time"
@@ -34,6 +35,7 @@ import (
3435
"github.com/erigontech/erigon/db/datadir"
3536
"github.com/erigontech/erigon/db/kv"
3637
"github.com/erigontech/erigon/db/kv/kvcache"
38+
"github.com/erigontech/erigon/db/kv/kvcfg"
3739
"github.com/erigontech/erigon/db/kv/prune"
3840
"github.com/erigontech/erigon/db/kv/rawdbv3"
3941
"github.com/erigontech/erigon/db/rawdb"
@@ -368,13 +370,26 @@ func (api *BaseAPI) checkPruneHistory(ctx context.Context, tx kv.Tx, block uint6
368370
}
369371
prunedTo := p.History.PruneTo(latest)
370372
if block < prunedTo {
371-
return state.PrunedError
373+
return fmt.Errorf("%w: requested block %d, history is available from block %d", state.PrunedError, block, prunedTo)
372374
}
373375
}
374376

375377
return nil
376378
}
377379

380+
// checkReceiptsAvailable checks if receipts are available for the given block.
381+
// In case --persist.receipts which makes all historical receipts available even when state history is pruned.
382+
func (api *BaseAPI) checkReceiptsAvailable(ctx context.Context, tx kv.Tx, block uint64) error {
383+
persistReceipts, err := kvcfg.PersistReceipts.Enabled(tx)
384+
if err != nil {
385+
return err
386+
}
387+
if persistReceipts {
388+
return nil
389+
}
390+
return api.checkPruneHistory(ctx, tx, block)
391+
}
392+
378393
func (api *BaseAPI) pruneMode(tx kv.Tx) (*prune.Mode, error) {
379394
p := api._pruneMode.Load()
380395
if p != nil {

rpc/jsonrpc/eth_receipts.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,10 @@ func (api *APIImpl) GetLogs(ctx context.Context, crit filters.FilterCriteria) (t
194194
return nil, fmt.Errorf("node is still initializing")
195195
}
196196

197+
if err = api.BaseAPI.checkReceiptsAvailable(ctx, tx, begin); err != nil {
198+
return nil, err
199+
}
200+
197201
erigonLogs, err := api.getLogsV3(ctx, tx, begin, end, crit, api.BaseAPI.rangeLimit)
198202
if err != nil {
199203
return nil, err
@@ -248,9 +252,6 @@ func applyFiltersV3(txNumsReader rawdbv3.TxNumsReader, tx kv.TemporalTx, begin,
248252
if err != nil {
249253
return out, err
250254
}
251-
if err := assertReceiptsAvailable(context.Background(), txNumsReader, begin, fromTxNum, tx); err != nil {
252-
return out, err
253-
}
254255
}
255256

256257
toTxNum, err = txNumsReader.Max(context.Background(), tx, end)
@@ -503,7 +504,7 @@ func (api *APIImpl) GetTransactionReceipt(ctx context.Context, txnHash common.Ha
503504
return nil, nil
504505
}
505506

506-
err = api.BaseAPI.checkPruneHistory(ctx, tx, blockNum)
507+
err = api.BaseAPI.checkReceiptsAvailable(ctx, tx, blockNum)
507508
if err != nil {
508509
return nil, err
509510
}
@@ -614,7 +615,7 @@ func (api *APIImpl) GetBlockReceipts(ctx context.Context, numberOrHash rpc.Block
614615
return nil, err
615616
}
616617

617-
err = api.BaseAPI.checkPruneHistory(ctx, tx, blockNum)
618+
err = api.BaseAPI.checkReceiptsAvailable(ctx, tx, blockNum)
618619
if err != nil {
619620
return nil, err
620621
}

rpc/jsonrpc/overlay_api.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,7 @@ func (api *OverlayAPIImpl) GetLogs(ctx context.Context, crit filters.FilterCrite
291291
return nil, err
292292
}
293293

294-
err = api.BaseAPI.checkPruneHistory(ctx, tx, begin)
294+
err = api.BaseAPI.checkReceiptsAvailable(ctx, tx, begin)
295295
if err != nil {
296296
return nil, err
297297
}

0 commit comments

Comments
 (0)