Skip to content

Commit 8cd8f49

Browse files
committed
Construct replayer tracer with proper chain config based on EVM height
1 parent 6ae6588 commit 8cd8f49

6 files changed

Lines changed: 52 additions & 75 deletions

File tree

bootstrap/bootstrap.go

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -162,17 +162,13 @@ func (b *Bootstrap) StartEventIngestion(ctx context.Context) error {
162162
nextCadenceHeight,
163163
)
164164

165-
callTracerCollector, err := replayer.NewCallTracerCollector(
166-
b.config.EVMNetworkID,
165+
callTracerCollector := replayer.NewCallTracerCollector(
166+
b.config,
167167
b.logger,
168168
)
169-
if err != nil {
170-
return err
171-
}
172169
blocksProvider := replayer.NewBlocksProvider(
173170
b.storages.Blocks,
174171
chainID,
175-
callTracerCollector.TxTracer(),
176172
)
177173
replayerConfig := replayer.Config{
178174
ChainID: chainID,

services/ingestion/engine.go

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -236,13 +236,19 @@ func (e *Engine) indexEvents(events *models.CadenceEvents, batch *pebbleDB.Batch
236236
return err
237237
}
238238

239+
traceCollector := e.replayerConfig.CallTracerCollector
240+
txTracer, err := traceCollector.TxTracer(events.Block().Height)
241+
if err != nil {
242+
return err
243+
}
244+
239245
replayer := sync.NewReplayer(
240246
e.replayerConfig.ChainID,
241247
e.replayerConfig.RootAddr,
242248
e.registerStore,
243249
e.blocksProvider,
244250
e.log,
245-
e.replayerConfig.CallTracerCollector.TxTracer(),
251+
txTracer,
246252
e.replayerConfig.ValidateResults,
247253
)
248254

@@ -293,7 +299,6 @@ func (e *Engine) indexEvents(events *models.CadenceEvents, batch *pebbleDB.Batch
293299
return fmt.Errorf("failed to index receipts for block %d event: %w", events.Block().Height, err)
294300
}
295301

296-
traceCollector := e.replayerConfig.CallTracerCollector
297302
for _, tx := range events.Transactions() {
298303
txHash := tx.Hash()
299304
traceResult, err := traceCollector.Collect(txHash)

services/ingestion/engine_test.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ func TestSerialBlockIngestion(t *testing.T) {
6666

6767
engine := NewEventIngestionEngine(
6868
subscriber,
69-
replayer.NewBlocksProvider(blocks, flowGo.Emulator, nil),
69+
replayer.NewBlocksProvider(blocks, flowGo.Emulator),
7070
store,
7171
registerStore,
7272
blocks,
@@ -145,7 +145,7 @@ func TestSerialBlockIngestion(t *testing.T) {
145145

146146
engine := NewEventIngestionEngine(
147147
subscriber,
148-
replayer.NewBlocksProvider(blocks, flowGo.Emulator, nil),
148+
replayer.NewBlocksProvider(blocks, flowGo.Emulator),
149149
store,
150150
registerStore,
151151
blocks,
@@ -266,7 +266,7 @@ func TestBlockAndTransactionIngestion(t *testing.T) {
266266

267267
engine := NewEventIngestionEngine(
268268
subscriber,
269-
replayer.NewBlocksProvider(blocks, flowGo.Emulator, nil),
269+
replayer.NewBlocksProvider(blocks, flowGo.Emulator),
270270
store,
271271
registerStore,
272272
blocks,
@@ -374,7 +374,7 @@ func TestBlockAndTransactionIngestion(t *testing.T) {
374374

375375
engine := NewEventIngestionEngine(
376376
subscriber,
377-
replayer.NewBlocksProvider(blocks, flowGo.Emulator, nil),
377+
replayer.NewBlocksProvider(blocks, flowGo.Emulator),
378378
store,
379379
registerStore,
380380
blocks,
@@ -468,7 +468,7 @@ func TestBlockAndTransactionIngestion(t *testing.T) {
468468

469469
engine := NewEventIngestionEngine(
470470
subscriber,
471-
replayer.NewBlocksProvider(blocks, flowGo.Emulator, nil),
471+
replayer.NewBlocksProvider(blocks, flowGo.Emulator),
472472
store,
473473
registerStore,
474474
blocks,

services/replayer/blocks_provider.go

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
evmTypes "github.com/onflow/flow-go/fvm/evm/types"
1111
flowGo "github.com/onflow/flow-go/model/flow"
1212
gethCommon "github.com/onflow/go-ethereum/common"
13-
"github.com/onflow/go-ethereum/eth/tracers"
1413
)
1514

1615
type blockSnapshot struct {
@@ -38,7 +37,7 @@ func (bs *blockSnapshot) BlockContext() (evmTypes.BlockContext, error) {
3837
return blockHash
3938
},
4039
bs.block.PrevRandao,
41-
bs.tracer,
40+
nil, // Set by the sync.ReplayBlockExecution method
4241
)
4342
if err != nil {
4443
return evmTypes.BlockContext{}, err
@@ -59,7 +58,6 @@ func (bs *blockSnapshot) BlockContext() (evmTypes.BlockContext, error) {
5958
type BlocksProvider struct {
6059
blocks storage.BlockIndexer
6160
chainID flowGo.ChainID
62-
tracer *tracers.Tracer
6361
latestBlock *models.Block
6462
}
6563

@@ -68,12 +66,10 @@ var _ evmTypes.BlockSnapshotProvider = (*BlocksProvider)(nil)
6866
func NewBlocksProvider(
6967
blocks storage.BlockIndexer,
7068
chainID flowGo.ChainID,
71-
tracer *tracers.Tracer,
7269
) *BlocksProvider {
7370
return &BlocksProvider{
7471
blocks: blocks,
7572
chainID: chainID,
76-
tracer: tracer,
7773
}
7874
}
7975

services/replayer/blocks_provider_test.go

Lines changed: 11 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,15 @@ import (
55

66
pebble2 "github.com/cockroachdb/pebble"
77

8-
"github.com/goccy/go-json"
98
"github.com/onflow/flow-evm-gateway/config"
109
"github.com/onflow/flow-evm-gateway/models"
1110
"github.com/onflow/flow-evm-gateway/storage"
1211
"github.com/onflow/flow-evm-gateway/storage/mocks"
1312
"github.com/onflow/flow-evm-gateway/storage/pebble"
1413
"github.com/onflow/flow-go-sdk"
15-
"github.com/onflow/flow-go/fvm/evm/emulator"
1614
evmTypes "github.com/onflow/flow-go/fvm/evm/types"
1715
flowGo "github.com/onflow/flow-go/model/flow"
1816
"github.com/onflow/go-ethereum/common"
19-
"github.com/onflow/go-ethereum/eth/tracers"
2017
"github.com/rs/zerolog"
2118
"github.com/stretchr/testify/assert"
2219
"github.com/stretchr/testify/require"
@@ -31,7 +28,7 @@ func TestOnBlockReceived(t *testing.T) {
3128
t.Run("without latest block", func(t *testing.T) {
3229
_, blocks := setupBlocksDB(t)
3330

34-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, nil)
31+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
3532

3633
block := mocks.NewBlock(1)
3734
err := blocksProvider.OnBlockReceived(block)
@@ -40,7 +37,7 @@ func TestOnBlockReceived(t *testing.T) {
4037

4138
t.Run("with new block non-sequential to latest block", func(t *testing.T) {
4239
_, blocks := setupBlocksDB(t)
43-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, nil)
40+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
4441

4542
block1 := mocks.NewBlock(1)
4643
err := blocksProvider.OnBlockReceived(block1)
@@ -58,7 +55,7 @@ func TestOnBlockReceived(t *testing.T) {
5855

5956
t.Run("with new block non-sequential to latest block", func(t *testing.T) {
6057
_, blocks := setupBlocksDB(t)
61-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, nil)
58+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
6259

6360
block1 := mocks.NewBlock(10)
6461
err := blocksProvider.OnBlockReceived(block1)
@@ -74,8 +71,7 @@ func TestBlockContext(t *testing.T) {
7471

7572
t.Run("for latest block", func(t *testing.T) {
7673
_, blocks := setupBlocksDB(t)
77-
tracer := newCallTracer(t)
78-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, tracer)
74+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
7975

8076
block := mocks.NewBlock(1)
8177
err := blocksProvider.OnBlockReceived(block)
@@ -96,7 +92,6 @@ func TestBlockContext(t *testing.T) {
9692
blockHash := blockContext.GetHashFunc(block.Height)
9793
assert.Equal(t, common.Hash{}, blockHash)
9894
assert.Equal(t, block.PrevRandao, blockContext.Random)
99-
assert.Equal(t, tracer, blockContext.Tracer)
10095
})
10196
}
10297

@@ -123,8 +118,7 @@ func TestGetHashFunc(t *testing.T) {
123118
}
124119

125120
t.Run("with requested height >= latest block height", func(t *testing.T) {
126-
tracer := newCallTracer(t)
127-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, tracer)
121+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
128122

129123
latestBlock := blockMapping[200]
130124
err := blocksProvider.OnBlockReceived(latestBlock)
@@ -146,8 +140,7 @@ func TestGetHashFunc(t *testing.T) {
146140
})
147141

148142
t.Run("with requested height within 256 block height range", func(t *testing.T) {
149-
tracer := newCallTracer(t)
150-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, tracer)
143+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
151144

152145
latestBlock := blockMapping[257]
153146
err := blocksProvider.OnBlockReceived(latestBlock)
@@ -168,8 +161,7 @@ func TestGetHashFunc(t *testing.T) {
168161
})
169162

170163
t.Run("with requested height outside the 256 block height range", func(t *testing.T) {
171-
tracer := newCallTracer(t)
172-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, tracer)
164+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
173165

174166
latestBlock := blockMapping[260]
175167
err := blocksProvider.OnBlockReceived(latestBlock)
@@ -187,8 +179,7 @@ func TestGetHashFunc(t *testing.T) {
187179
})
188180

189181
t.Run("with requested height missing from Blocks DB", func(t *testing.T) {
190-
tracer := newCallTracer(t)
191-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, tracer)
182+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
192183

193184
latestBlock := blockMapping[260]
194185
err := blocksProvider.OnBlockReceived(latestBlock)
@@ -210,8 +201,7 @@ func TestGetSnapshotAt(t *testing.T) {
210201

211202
t.Run("for latest block", func(t *testing.T) {
212203
_, blocks := setupBlocksDB(t)
213-
tracer := newCallTracer(t)
214-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, tracer)
204+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
215205

216206
block := mocks.NewBlock(1)
217207
err := blocksProvider.OnBlockReceived(block)
@@ -225,13 +215,11 @@ func TestGetSnapshotAt(t *testing.T) {
225215
assert.Equal(t, block.Height, blockContext.BlockNumber)
226216
assert.Equal(t, block.Timestamp, blockContext.BlockTimestamp)
227217
assert.Equal(t, block.PrevRandao, blockContext.Random)
228-
assert.Equal(t, tracer, blockContext.Tracer)
229218
})
230219

231220
t.Run("for historic block", func(t *testing.T) {
232221
db, blocks := setupBlocksDB(t)
233-
tracer := newCallTracer(t)
234-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, tracer)
222+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
235223

236224
block1 := mocks.NewBlock(1)
237225
batch := db.NewBatch()
@@ -253,13 +241,11 @@ func TestGetSnapshotAt(t *testing.T) {
253241
assert.Equal(t, block1.Height, blockContext.BlockNumber)
254242
assert.Equal(t, block1.Timestamp, blockContext.BlockTimestamp)
255243
assert.Equal(t, block1.PrevRandao, blockContext.Random)
256-
assert.Equal(t, tracer, blockContext.Tracer)
257244
})
258245

259246
t.Run("for missing historic block", func(t *testing.T) {
260247
_, blocks := setupBlocksDB(t)
261-
tracer := newCallTracer(t)
262-
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator, tracer)
248+
blocksProvider := NewBlocksProvider(blocks, flowGo.Emulator)
263249

264250
// `block1` is not stored on Blocks DB
265251
block1 := mocks.NewBlock(1)
@@ -296,15 +282,3 @@ func setupBlocksDB(t *testing.T) (*pebble.Storage, storage.BlockIndexer) {
296282

297283
return db, blocks
298284
}
299-
300-
func newCallTracer(t *testing.T) *tracers.Tracer {
301-
tracer, err := tracers.DefaultDirectory.New(
302-
"callTracer",
303-
&tracers.Context{},
304-
json.RawMessage(`{ "onlyTopCall": true }`),
305-
emulator.DefaultChainConfig,
306-
)
307-
require.NoError(t, err)
308-
309-
return tracer
310-
}

services/replayer/call_tracer_collector.go

Lines changed: 26 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"fmt"
66
"math/big"
77

8+
"github.com/onflow/flow-evm-gateway/config"
89
"github.com/onflow/flow-go/fvm/evm/emulator"
910
"github.com/onflow/go-ethereum/common"
1011
"github.com/onflow/go-ethereum/core/tracing"
@@ -18,8 +19,11 @@ const (
1819
TracerName = "callTracer"
1920
)
2021

21-
func DefaultCallTracer(evmChainID *big.Int) (*tracers.Tracer, error) {
22-
evmChainConfig := emulator.MakeChainConfig(evmChainID)
22+
func DefaultCallTracer(evmHeight uint64, cfg config.Config) (*tracers.Tracer, error) {
23+
evmChainConfig := emulator.MakeChainConfig(cfg.EVMNetworkID)
24+
if !config.IsPrague(evmHeight, cfg.FlowNetworkID) {
25+
evmChainConfig.PragueTime = nil
26+
}
2327

2428
tracer, err := tracers.DefaultDirectory.New(
2529
TracerName,
@@ -35,44 +39,46 @@ func DefaultCallTracer(evmChainID *big.Int) (*tracers.Tracer, error) {
3539
}
3640

3741
type EVMTracer interface {
38-
TxTracer() *tracers.Tracer
42+
TxTracer(evmHeight uint64) (*tracers.Tracer, error)
3943
ResetTracer() error
4044
Collect(txID common.Hash) (json.RawMessage, error)
4145
}
4246

4347
type CallTracerCollector struct {
4448
tracer *tracers.Tracer
4549
resultsByTxID map[common.Hash]json.RawMessage
50+
config config.Config
4651
logger zerolog.Logger
47-
evmChainID *big.Int
52+
lastEvmHeight uint64
4853
}
4954

5055
var _ EVMTracer = (*CallTracerCollector)(nil)
5156

52-
func NewCallTracerCollector(evmChainID *big.Int, logger zerolog.Logger) (
53-
*CallTracerCollector,
57+
func NewCallTracerCollector(config config.Config, logger zerolog.Logger) *CallTracerCollector {
58+
return &CallTracerCollector{
59+
resultsByTxID: make(map[common.Hash]json.RawMessage),
60+
config: config,
61+
logger: logger.With().Str("component", "evm-tracer").Logger(),
62+
}
63+
}
64+
65+
func (t *CallTracerCollector) TxTracer(evmHeight uint64) (
66+
*tracers.Tracer,
5467
error,
5568
) {
56-
tracer, err := DefaultCallTracer(evmChainID)
69+
var err error
70+
t.tracer, err = DefaultCallTracer(evmHeight, t.config)
5771
if err != nil {
5872
return nil, err
5973
}
74+
t.lastEvmHeight = evmHeight
6075

61-
return &CallTracerCollector{
62-
tracer: tracer,
63-
resultsByTxID: make(map[common.Hash]json.RawMessage),
64-
logger: logger.With().Str("component", "evm-tracer").Logger(),
65-
evmChainID: evmChainID,
66-
}, nil
67-
}
68-
69-
func (t *CallTracerCollector) TxTracer() *tracers.Tracer {
70-
return NewSafeTxTracer(t)
76+
return NewSafeTxTracer(t), nil
7177
}
7278

7379
func (t *CallTracerCollector) ResetTracer() error {
7480
var err error
75-
t.tracer, err = DefaultCallTracer(t.evmChainID)
81+
t.tracer, err = DefaultCallTracer(t.lastEvmHeight, t.config)
7682
return err
7783
}
7884

@@ -207,8 +213,8 @@ var _ EVMTracer = (*nopTracer)(nil)
207213

208214
type nopTracer struct{}
209215

210-
func (n nopTracer) TxTracer() *tracers.Tracer {
211-
return nil
216+
func (n nopTracer) TxTracer(_ uint64) (*tracers.Tracer, error) {
217+
return nil, nil
212218
}
213219

214220
func (n nopTracer) Collect(_ common.Hash) (json.RawMessage, error) {

0 commit comments

Comments
 (0)