Skip to content

Commit 314e7cc

Browse files
committed
Optimize RPCBlockTrackingSubscriber to avoid fetch EVM tx events for empty EVM blocks
1 parent 0d9cfb9 commit 314e7cc

File tree

1 file changed

+66
-34
lines changed

1 file changed

+66
-34
lines changed

services/ingestion/block_tracking_subscriber.go

Lines changed: 66 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import (
1010
errs "github.com/onflow/flow-evm-gateway/models/errors"
1111
"github.com/onflow/flow-evm-gateway/services/requester"
1212
"github.com/onflow/flow-go-sdk"
13+
"github.com/onflow/flow-go/fvm/evm/events"
1314
flowGo "github.com/onflow/flow-go/model/flow"
15+
"github.com/onflow/go-ethereum/core/types"
1416
"github.com/rs/zerolog"
1517
)
1618

@@ -151,40 +153,10 @@ func (r *RPCBlockTrackingSubscriber) subscribe(ctx context.Context, height uint6
151153
return
152154
}
153155

154-
var blockEvents flow.BlockEvents
155-
for _, eventType := range blocksFilter(r.chain).EventTypes {
156-
evts, err := r.client.GetEventsForHeightRange(
157-
ctx,
158-
eventType,
159-
blockHeader.Height,
160-
blockHeader.Height,
161-
)
162-
if err != nil {
163-
eventsChan <- models.NewBlockEventsError(
164-
fmt.Errorf(
165-
"failed to fetch EVM events for height: %d, with: %w",
166-
blockHeader.Height,
167-
err,
168-
),
169-
)
170-
return
171-
}
172-
173-
if len(evts) != 1 {
174-
eventsChan <- models.NewBlockEventsError(
175-
fmt.Errorf(
176-
"received unexpected number of EVM events for height: %d, got: %d, expected: 1",
177-
blockHeader.Height,
178-
len(evts),
179-
),
180-
)
181-
return
182-
}
183-
blockEvent := evts[0]
184-
blockEvents.BlockID = blockEvent.BlockID
185-
blockEvents.BlockTimestamp = blockEvent.BlockTimestamp
186-
blockEvents.Height = blockEvent.Height
187-
blockEvents.Events = append(blockEvents.Events, blockEvent.Events...)
156+
blockEvents, err := r.evmEventsForHeight(ctx, blockHeader.Height)
157+
if err != nil {
158+
eventsChan <- models.NewBlockEventsError(err)
159+
return
188160
}
189161

190162
evmEvents := models.NewSingleBlockEvents(blockEvents)
@@ -243,3 +215,63 @@ func (r *RPCBlockTrackingSubscriber) subscribe(ctx context.Context, height uint6
243215

244216
return eventsChan
245217
}
218+
219+
func (r *RPCBlockTrackingSubscriber) evmEventsForHeight(
220+
ctx context.Context,
221+
height uint64,
222+
) (flow.BlockEvents, error) {
223+
eventTypes := blocksFilter(r.chain).EventTypes
224+
evmBlockEvent := eventTypes[0]
225+
226+
evts, err := r.client.GetEventsForHeightRange(
227+
ctx,
228+
evmBlockEvent,
229+
height,
230+
height,
231+
)
232+
if err != nil {
233+
return flow.BlockEvents{}, err
234+
}
235+
236+
if len(evts) != 1 && len(evts[0].Events) != 1 {
237+
return flow.BlockEvents{}, fmt.Errorf(
238+
"received unexpected number of EVM events for height: %d, got: %d, expected: 1",
239+
height,
240+
len(evts),
241+
)
242+
}
243+
244+
blockEvents := evts[0]
245+
payload, err := events.DecodeBlockEventPayload(blockEvents.Events[0].Value)
246+
if err != nil {
247+
return flow.BlockEvents{}, err
248+
}
249+
250+
if payload.TransactionHashRoot == types.EmptyTxsHash {
251+
return blockEvents, nil
252+
}
253+
254+
evmTxEvent := eventTypes[1]
255+
evts, err = r.client.GetEventsForHeightRange(
256+
ctx,
257+
evmTxEvent,
258+
height,
259+
height,
260+
)
261+
if err != nil {
262+
return flow.BlockEvents{}, err
263+
}
264+
265+
if len(evts) != 1 && len(evts[0].Events) != 1 {
266+
return flow.BlockEvents{}, fmt.Errorf(
267+
"received unexpected number of EVM events for height: %d, got: %d, expected: 1",
268+
height,
269+
len(evts),
270+
)
271+
}
272+
txEvents := evts[0]
273+
274+
blockEvents.Events = append(blockEvents.Events, txEvents.Events...)
275+
276+
return blockEvents, nil
277+
}

0 commit comments

Comments
 (0)