Skip to content

Commit c62ee99

Browse files
cherry-pick return meaningful error instead of malformed data if block is pruned (#2473)
## Describe your changes and provide context ## Testing performed to validate your change --------- Co-authored-by: Tony Chen <[email protected]>
1 parent cd71dd9 commit c62ee99

File tree

14 files changed

+218
-91
lines changed

14 files changed

+218
-91
lines changed

app/app.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1833,9 +1833,12 @@ func (app *App) RegisterTendermintService(clientCtx client.Context) {
18331833
}
18341834
return app.legacyEncodingConfig.TxConfig
18351835
}
1836+
earliestVersionFetcher := func() int64 {
1837+
return app.CommitMultiStore().GetEarliestVersion()
1838+
}
18361839

18371840
if app.evmRPCConfig.HTTPEnabled {
1838-
evmHTTPServer, err := evmrpc.NewEVMHTTPServer(app.Logger(), app.evmRPCConfig, clientCtx.Client, &app.EvmKeeper, app.BaseApp, app.TracerAnteHandler, app.RPCContextProvider, txConfigProvider, DefaultNodeHome, nil)
1841+
evmHTTPServer, err := evmrpc.NewEVMHTTPServer(app.Logger(), app.evmRPCConfig, clientCtx.Client, &app.EvmKeeper, app.BaseApp, app.TracerAnteHandler, app.RPCContextProvider, txConfigProvider, earliestVersionFetcher, DefaultNodeHome, nil)
18391842
if err != nil {
18401843
panic(err)
18411844
}
@@ -1848,7 +1851,7 @@ func (app *App) RegisterTendermintService(clientCtx client.Context) {
18481851
}
18491852

18501853
if app.evmRPCConfig.WSEnabled {
1851-
evmWSServer, err := evmrpc.NewEVMWebSocketServer(app.Logger(), app.evmRPCConfig, clientCtx.Client, &app.EvmKeeper, app.BaseApp, app.TracerAnteHandler, app.RPCContextProvider, txConfigProvider, DefaultNodeHome)
1854+
evmWSServer, err := evmrpc.NewEVMWebSocketServer(app.Logger(), app.evmRPCConfig, clientCtx.Client, &app.EvmKeeper, app.BaseApp, app.TracerAnteHandler, app.RPCContextProvider, txConfigProvider, earliestVersionFetcher, DefaultNodeHome)
18521855
if err != nil {
18531856
panic(err)
18541857
}

evmrpc/block.go

Lines changed: 81 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type BlockAPI struct {
3939
keeper *keeper.Keeper
4040
ctxProvider func(int64) sdk.Context
4141
txConfigProvider func(int64) client.TxConfig
42+
earliestVersion func() int64
4243
connectionType ConnectionType
4344
namespace string
4445
includeShellReceipts bool
@@ -52,12 +53,22 @@ type SeiBlockAPI struct {
5253
isPanicTx func(ctx context.Context, hash common.Hash) (bool, error)
5354
}
5455

55-
func NewBlockAPI(tmClient rpcclient.Client, k *keeper.Keeper, ctxProvider func(int64) sdk.Context, txConfigProvider func(int64) client.TxConfig, connectionType ConnectionType, globalBlockCache BlockCache, cacheCreationMutex *sync.Mutex) *BlockAPI {
56+
func NewBlockAPI(
57+
tmClient rpcclient.Client,
58+
k *keeper.Keeper,
59+
ctxProvider func(int64) sdk.Context,
60+
txConfigProvider func(int64) client.TxConfig,
61+
earliestVersion func() int64,
62+
connectionType ConnectionType,
63+
globalBlockCache BlockCache,
64+
cacheCreationMutex *sync.Mutex,
65+
) *BlockAPI {
5666
return &BlockAPI{
5767
tmClient: tmClient,
5868
keeper: k,
5969
ctxProvider: ctxProvider,
6070
txConfigProvider: txConfigProvider,
71+
earliestVersion: earliestVersion,
6172
connectionType: connectionType,
6273
includeShellReceipts: false,
6374
includeBankTransfers: false,
@@ -72,6 +83,7 @@ func NewSeiBlockAPI(
7283
k *keeper.Keeper,
7384
ctxProvider func(int64) sdk.Context,
7485
txConfigProvider func(int64) client.TxConfig,
86+
earliestVersion func() int64,
7587
connectionType ConnectionType,
7688
isPanicTx func(ctx context.Context, hash common.Hash) (bool, error),
7789
globalBlockCache BlockCache,
@@ -82,6 +94,7 @@ func NewSeiBlockAPI(
8294
keeper: k,
8395
ctxProvider: ctxProvider,
8496
txConfigProvider: txConfigProvider,
97+
earliestVersion: earliestVersion,
8598
connectionType: connectionType,
8699
includeShellReceipts: true,
87100
includeBankTransfers: false,
@@ -100,12 +113,13 @@ func NewSei2BlockAPI(
100113
k *keeper.Keeper,
101114
ctxProvider func(int64) sdk.Context,
102115
txConfigProvider func(int64) client.TxConfig,
116+
earliestVersion func() int64,
103117
connectionType ConnectionType,
104118
isPanicTx func(ctx context.Context, hash common.Hash) (bool, error),
105119
globalBlockCache BlockCache,
106120
cacheCreationMutex *sync.Mutex,
107121
) *SeiBlockAPI {
108-
blockAPI := NewSeiBlockAPI(tmClient, k, ctxProvider, txConfigProvider, connectionType, isPanicTx, globalBlockCache, cacheCreationMutex)
122+
blockAPI := NewSeiBlockAPI(tmClient, k, ctxProvider, txConfigProvider, earliestVersion, connectionType, isPanicTx, globalBlockCache, cacheCreationMutex)
109123
blockAPI.namespace = Sei2Namespace
110124
blockAPI.includeBankTransfers = true
111125
return blockAPI
@@ -161,7 +175,24 @@ func (a *BlockAPI) getBlockByHash(ctx context.Context, blockHash common.Hash, fu
161175
if err != nil {
162176
return nil, err
163177
}
164-
return EncodeTmBlock(a.ctxProvider, a.txConfigProvider, block, blockRes, a.keeper, fullTx, a.includeBankTransfers, includeSyntheticTxs, isPanicTx, a.globalBlockCache, a.cacheCreationMutex)
178+
encodedBlock, err := EncodeTmBlock(
179+
a.ctxProvider,
180+
a.txConfigProvider,
181+
a.earliestVersion,
182+
block,
183+
blockRes,
184+
a.keeper,
185+
fullTx,
186+
a.includeBankTransfers,
187+
includeSyntheticTxs,
188+
isPanicTx,
189+
a.globalBlockCache,
190+
a.cacheCreationMutex,
191+
)
192+
if err != nil {
193+
return nil, err
194+
}
195+
return encodedBlock, nil
165196
}
166197

167198
func (a *BlockAPI) GetBlockByNumber(ctx context.Context, number rpc.BlockNumber, fullTx bool) (result map[string]interface{}, returnErr error) {
@@ -216,7 +247,24 @@ func (a *BlockAPI) getBlockByNumber(
216247
if err != nil {
217248
return nil, err
218249
}
219-
return EncodeTmBlock(a.ctxProvider, a.txConfigProvider, block, blockRes, a.keeper, fullTx, a.includeBankTransfers, includeSyntheticTxs, isPanicTx, a.globalBlockCache, a.cacheCreationMutex)
250+
encodedBlock, err := EncodeTmBlock(
251+
a.ctxProvider,
252+
a.txConfigProvider,
253+
a.earliestVersion,
254+
block,
255+
blockRes,
256+
a.keeper,
257+
fullTx,
258+
a.includeBankTransfers,
259+
includeSyntheticTxs,
260+
isPanicTx,
261+
a.globalBlockCache,
262+
a.cacheCreationMutex,
263+
)
264+
if err != nil {
265+
return nil, err
266+
}
267+
return encodedBlock, nil
220268
}
221269

222270
func (a *BlockAPI) GetBlockReceipts(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (result []map[string]interface{}, returnErr error) {
@@ -235,9 +283,19 @@ func (a *BlockAPI) GetBlockReceipts(ctx context.Context, blockNrOrHash rpc.Block
235283

236284
// Get all tx hashes for the block
237285
height := block.Block.Height
238-
239-
txHashes := getTxHashesFromBlock(a.ctxProvider, a.txConfigProvider, a.keeper, block, shouldIncludeSynthetic(a.namespace), a.cacheCreationMutex, a.globalBlockCache)
240-
286+
txHashes, err := getTxHashesFromBlock(
287+
a.ctxProvider,
288+
a.txConfigProvider,
289+
a.earliestVersion,
290+
a.keeper,
291+
block,
292+
shouldIncludeSynthetic(a.namespace),
293+
a.cacheCreationMutex,
294+
a.globalBlockCache,
295+
)
296+
if err != nil {
297+
return nil, err
298+
}
241299
// Get tx receipts for all hashes in parallel
242300
wg := sync.WaitGroup{}
243301
mtx := sync.Mutex{}
@@ -256,7 +314,17 @@ func (a *BlockAPI) GetBlockReceipts(ctx context.Context, blockNrOrHash rpc.Block
256314
mtx.Unlock()
257315
}
258316
} else {
259-
encodedReceipt, err := encodeReceipt(a.ctxProvider, a.txConfigProvider, receipt, a.keeper, block, a.includeShellReceipts, a.globalBlockCache, a.cacheCreationMutex)
317+
encodedReceipt, err := encodeReceipt(
318+
a.ctxProvider,
319+
a.txConfigProvider,
320+
a.earliestVersion,
321+
receipt,
322+
a.keeper,
323+
block,
324+
a.includeShellReceipts,
325+
a.globalBlockCache,
326+
a.cacheCreationMutex,
327+
)
260328
if err != nil {
261329
mtx.Lock()
262330
returnErr = err
@@ -285,6 +353,7 @@ func (a *BlockAPI) GetBlockReceipts(ctx context.Context, blockNrOrHash rpc.Block
285353
func EncodeTmBlock(
286354
ctxProvider func(int64) sdk.Context,
287355
txConfigProvider func(int64) client.TxConfig,
356+
earliestVersion func() int64,
288357
block *coretypes.ResultBlock,
289358
blockRes *coretypes.ResultBlockResults,
290359
k *keeper.Keeper,
@@ -315,7 +384,10 @@ func EncodeTmBlock(
315384
transactions := []interface{}{}
316385
latestCtx := ctxProvider(LatestCtxHeight)
317386

318-
msgs := filterTransactions(k, ctxProvider, txConfigProvider, block, includeSyntheticTxs, includeBankTransfers, cacheCreationMutex, globalBlockCache)
387+
msgs, err := filterTransactions(k, ctxProvider, txConfigProvider, earliestVersion, block, includeSyntheticTxs, includeBankTransfers, cacheCreationMutex, globalBlockCache)
388+
if err != nil {
389+
return nil, err
390+
}
319391

320392
blockBloom := make([]byte, ethtypes.BloomByteLength)
321393
for _, msg := range msgs {

evmrpc/block_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ func TestEncodeTmBlock_EmptyTransactions(t *testing.T) {
5050
}
5151

5252
// Call EncodeTmBlock with empty transactions
53-
result, err := evmrpc.EncodeTmBlock(func(i int64) sdk.Context { return ctx }, func(i int64) client.TxConfig { return TxConfig }, block, blockRes, k, true, false, false, nil, evmrpc.NewBlockCache(3000), &sync.Mutex{})
53+
result, err := evmrpc.EncodeTmBlock(func(i int64) sdk.Context { return ctx }, func(i int64) client.TxConfig { return TxConfig }, noopEarliestVersionFetcher, block, blockRes, k, true, false, false, nil, evmrpc.NewBlockCache(3000), &sync.Mutex{})
5454
require.Nil(t, err)
5555

5656
// Assert txHash is equal to ethtypes.EmptyTxsHash
@@ -96,7 +96,7 @@ func TestEncodeBankMsg(t *testing.T) {
9696
},
9797
},
9898
}
99-
res, err := evmrpc.EncodeTmBlock(func(i int64) sdk.Context { return ctx }, func(i int64) client.TxConfig { return TxConfig }, &resBlock, &resBlockRes, k, true, false, false, nil, evmrpc.NewBlockCache(3000), &sync.Mutex{})
99+
res, err := evmrpc.EncodeTmBlock(func(i int64) sdk.Context { return ctx }, func(i int64) client.TxConfig { return TxConfig }, noopEarliestVersionFetcher, &resBlock, &resBlockRes, k, true, false, false, nil, evmrpc.NewBlockCache(3000), &sync.Mutex{})
100100
require.Nil(t, err)
101101
txs := res["transactions"].([]interface{})
102102
require.Equal(t, 0, len(txs))
@@ -144,7 +144,7 @@ func TestEncodeWasmExecuteMsg(t *testing.T) {
144144
},
145145
},
146146
}
147-
res, err := evmrpc.EncodeTmBlock(func(i int64) sdk.Context { return ctx }, func(i int64) client.TxConfig { return TxConfig }, &resBlock, &resBlockRes, k, true, false, true, nil, evmrpc.NewBlockCache(3000), &sync.Mutex{})
147+
res, err := evmrpc.EncodeTmBlock(func(i int64) sdk.Context { return ctx }, func(i int64) client.TxConfig { return TxConfig }, noopEarliestVersionFetcher, &resBlock, &resBlockRes, k, true, false, true, nil, evmrpc.NewBlockCache(3000), &sync.Mutex{})
148148
require.Nil(t, err)
149149
txs := res["transactions"].([]interface{})
150150
require.Equal(t, 1, len(txs))
@@ -205,7 +205,7 @@ func TestEncodeBankTransferMsg(t *testing.T) {
205205
},
206206
},
207207
}
208-
res, err := evmrpc.EncodeTmBlock(func(i int64) sdk.Context { return ctx }, func(i int64) client.TxConfig { return TxConfig }, &resBlock, &resBlockRes, k, true, true, false, nil, evmrpc.NewBlockCache(3000), &sync.Mutex{})
208+
res, err := evmrpc.EncodeTmBlock(func(i int64) sdk.Context { return ctx }, func(i int64) client.TxConfig { return TxConfig }, noopEarliestVersionFetcher, &resBlock, &resBlockRes, k, true, true, false, nil, evmrpc.NewBlockCache(3000), &sync.Mutex{})
209209
require.Nil(t, err)
210210
txs := res["transactions"].([]interface{})
211211
require.Equal(t, 1, len(txs))

evmrpc/filter.go

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,7 @@ func NewFilterAPI(
270270
k *keeper.Keeper,
271271
ctxProvider func(int64) sdk.Context,
272272
txConfigProvider func(int64) client.TxConfig,
273+
earliestVersion func() int64,
273274
filterConfig *FilterConfig,
274275
connectionType ConnectionType,
275276
namespace string,
@@ -291,6 +292,7 @@ func NewFilterAPI(
291292
k: k,
292293
ctxProvider: ctxProvider,
293294
txConfigProvider: txConfigProvider,
295+
earliestVersion: earliestVersion,
294296
filterConfig: filterConfig,
295297
includeSyntheticReceipts: shouldIncludeSynthetic(namespace),
296298
dbReadSemaphore: dbReadSemaphore,
@@ -653,6 +655,7 @@ type LogFetcher struct {
653655
k *keeper.Keeper
654656
txConfigProvider func(int64) client.TxConfig
655657
ctxProvider func(int64) sdk.Context
658+
earliestVersion func() int64
656659
filterConfig *FilterConfig
657660
includeSyntheticReceipts bool
658661
dbReadSemaphore chan struct{}
@@ -661,7 +664,7 @@ type LogFetcher struct {
661664
globalLogSlicePool *LogSlicePool
662665
}
663666

664-
func (f *LogFetcher) GetLogsByFilters(ctx context.Context, crit filters.FilterCriteria, lastToHeight int64) (res []*ethtypes.Log, end int64, err error) {
667+
func (f *LogFetcher) GetLogsByFilters(ctx context.Context, crit filters.FilterCriteria, lastToHeight int64) (res []*ethtypes.Log, end int64, rerr error) {
665668
latest := f.ctxProvider(LatestCtxHeight).BlockHeight()
666669
begin, end := latest, latest
667670
if crit.FromBlock != nil {
@@ -723,6 +726,12 @@ func (f *LogFetcher) GetLogsByFilters(ctx context.Context, crit filters.FilterCr
723726
resultsMutex.Unlock()
724727
}
725728

729+
defer func() {
730+
if r := recover(); r != nil {
731+
rerr = fmt.Errorf("encountered error when fetching logs: %v", r)
732+
}
733+
}()
734+
726735
// Batch process with fail-fast
727736
blockBatch := make([]*coretypes.ResultBlock, 0, WorkerBatchSize)
728737
for block := range blocks {
@@ -843,8 +852,20 @@ func (f *LogFetcher) collectLogs(block *coretypes.ResultBlock, crit filters.Filt
843852
ctx := f.ctxProvider(block.Block.Height)
844853
totalLogs := uint(0)
845854
evmTxIndex := 0
846-
847-
for _, hash := range getTxHashesFromBlock(f.ctxProvider, f.txConfigProvider, f.k, block, f.includeSyntheticReceipts, f.cacheCreationMutex, f.globalBlockCache) {
855+
txHashes, err := getTxHashesFromBlock(
856+
f.ctxProvider,
857+
f.txConfigProvider,
858+
f.earliestVersion,
859+
f.k,
860+
block,
861+
f.includeSyntheticReceipts,
862+
f.cacheCreationMutex,
863+
f.globalBlockCache,
864+
)
865+
if err != nil {
866+
panic(err)
867+
}
868+
for _, hash := range txHashes {
848869
receipt, found := getOrSetCachedReceipt(f.cacheCreationMutex, f.globalBlockCache, ctx, f.k, block, hash.hash)
849870
if !found {
850871
ctx.Logger().Error(fmt.Sprintf("collectLogs: unable to find receipt for hash %s", hash.hash.Hex()))

evmrpc/send.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type SendConfig struct {
4242
func NewSendAPI(
4343
tmClient rpcclient.Client,
4444
txConfigProvider func(int64) client.TxConfig,
45+
earliestVersion func() int64,
4546
sendConfig *SendConfig,
4647
k *keeper.Keeper,
4748
ctxProvider func(int64) sdk.Context,
@@ -60,7 +61,7 @@ func NewSendAPI(
6061
keeper: k,
6162
ctxProvider: ctxProvider,
6263
homeDir: homeDir,
63-
backend: NewBackend(ctxProvider, k, txConfigProvider, tmClient, simulateConfig, app, antehandler, globalBlockCache, cacheCreationMutex),
64+
backend: NewBackend(ctxProvider, k, txConfigProvider, earliestVersion, tmClient, simulateConfig, app, antehandler, globalBlockCache, cacheCreationMutex),
6465
connectionType: connectionType,
6566
}
6667
}

0 commit comments

Comments
 (0)