Skip to content

Commit cf5aaf2

Browse files
committed
Update API of requester.BlocksProvider type to avoid concurrency issues
1 parent 74c050a commit cf5aaf2

File tree

5 files changed

+41
-26
lines changed

5 files changed

+41
-26
lines changed

api/debug.go

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -178,10 +178,9 @@ func (d *DebugAPI) TraceCall(
178178
blocksProvider := requester.NewBlocksProvider(
179179
d.blocks,
180180
d.config.FlowNetworkID,
181-
)
182-
blocksProvider.SetTracer(tracer)
181+
).WithTracer(tracer)
183182
if config.BlockOverrides != nil {
184-
blocksProvider.SetBlockOverrides(&ethTypes.BlockOverrides{
183+
blocksProvider = blocksProvider.WithBlockOverrides(&ethTypes.BlockOverrides{
185184
Number: config.BlockOverrides.Number,
186185
Time: config.BlockOverrides.Time,
187186
Coinbase: config.BlockOverrides.Coinbase,

bootstrap/bootstrap.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,11 +208,6 @@ func (b *Bootstrap) StartAPIServer(ctx context.Context) error {
208208
b.config,
209209
)
210210

211-
blocksProvider := requester.NewBlocksProvider(
212-
b.storages.Blocks,
213-
b.config.FlowNetworkID,
214-
)
215-
216211
accountKeys := make([]*requester.AccountKey, 0)
217212
if !b.config.IndexOnly {
218213
account, err := b.client.GetAccount(ctx, b.config.COAAddress)
@@ -245,7 +240,6 @@ func (b *Bootstrap) StartAPIServer(ctx context.Context) error {
245240

246241
evm, err := requester.NewEVM(
247242
b.storages.Registers,
248-
blocksProvider,
249243
b.client,
250244
b.config,
251245
b.logger,

services/replayer/blocks_provider.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,13 @@ func (bs *blockSnapshot) BlockContext() (evmTypes.BlockContext, error) {
4141
)
4242
}
4343

44+
// This BlocksProvider implementation is used in the EVM events ingestion pipeline.
45+
// The ingestion module notifies the BlocksProvider of incoming EVM blocks, by
46+
// calling the `OnBlockReceived` method. This method guarantees that blocks are
47+
// processed sequentially, and keeps track of the latest block, which is used
48+
// for generating the proper `BlockContext`. This is necessary for replaying
49+
// EVM blocks/transactions locally, and verifying that there are no state
50+
// mismatches.
4451
type BlocksProvider struct {
4552
blocks storage.BlockIndexer
4653
chainID flowGo.ChainID

services/requester/blocks_provider.go

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ func (bs *blockSnapshot) BlockContext() (evmTypes.BlockContext, error) {
6565
return blockContext, nil
6666
}
6767

68+
// This BlocksProvider implementation is only used for the `eth_call` &
69+
// `debug_traceCall` JSON-RPC endpoints. It accepts optional `Tracer` &
70+
// `BlockOverrides` objects, which are used when constructing the
71+
// `BlockContext` object.
6872
type BlocksProvider struct {
6973
blocks storage.BlockIndexer
7074
chainID flowGo.ChainID
@@ -84,12 +88,24 @@ func NewBlocksProvider(
8488
}
8589
}
8690

87-
func (bp *BlocksProvider) SetTracer(tracer *tracers.Tracer) {
88-
bp.tracer = tracer
91+
func (bp *BlocksProvider) WithTracer(tracer *tracers.Tracer) *BlocksProvider {
92+
return &BlocksProvider{
93+
blocks: bp.blocks,
94+
chainID: bp.chainID,
95+
tracer: tracer,
96+
blockOverrides: bp.blockOverrides,
97+
}
8998
}
9099

91-
func (bp *BlocksProvider) SetBlockOverrides(blockOverrides *ethTypes.BlockOverrides) {
92-
bp.blockOverrides = blockOverrides
100+
func (bp *BlocksProvider) WithBlockOverrides(
101+
blockOverrides *ethTypes.BlockOverrides,
102+
) *BlocksProvider {
103+
return &BlocksProvider{
104+
blocks: bp.blocks,
105+
chainID: bp.chainID,
106+
tracer: bp.tracer,
107+
blockOverrides: blockOverrides,
108+
}
93109
}
94110

95111
func (bp *BlocksProvider) GetSnapshotAt(height uint64) (

services/requester/requester.go

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -95,15 +95,14 @@ type Requester interface {
9595
var _ Requester = &EVM{}
9696

9797
type EVM struct {
98-
registerStore *pebble.RegisterStorage
99-
blocksProvider *BlocksProvider
100-
client *CrossSporkClient
101-
config config.Config
102-
txPool *TxPool
103-
logger zerolog.Logger
104-
blocks storage.BlockIndexer
105-
mux sync.Mutex
106-
keystore *KeyStore
98+
registerStore *pebble.RegisterStorage
99+
client *CrossSporkClient
100+
config config.Config
101+
txPool *TxPool
102+
logger zerolog.Logger
103+
blocks storage.BlockIndexer
104+
mux sync.Mutex
105+
keystore *KeyStore
107106

108107
head *types.Header
109108
evmSigner types.Signer
@@ -113,7 +112,6 @@ type EVM struct {
113112

114113
func NewEVM(
115114
registerStore *pebble.RegisterStorage,
116-
blocksProvider *BlocksProvider,
117115
client *CrossSporkClient,
118116
config config.Config,
119117
logger zerolog.Logger,
@@ -168,7 +166,6 @@ func NewEVM(
168166

169167
evm := &EVM{
170168
registerStore: registerStore,
171-
blocksProvider: blocksProvider,
172169
client: client,
173170
config: config,
174171
logger: logger,
@@ -443,15 +440,17 @@ func (e *EVM) getBlockView(
443440
height uint64,
444441
blockOverrides *ethTypes.BlockOverrides,
445442
) (*query.View, error) {
443+
blocksProvider := NewBlocksProvider(e.blocks, e.config.FlowNetworkID)
444+
446445
if blockOverrides != nil {
447-
e.blocksProvider.SetBlockOverrides(blockOverrides)
446+
blocksProvider = blocksProvider.WithBlockOverrides(blockOverrides)
448447
}
449448

450449
viewProvider := query.NewViewProvider(
451450
e.config.FlowNetworkID,
452451
evm.StorageAccountAddress(e.config.FlowNetworkID),
453452
e.registerStore,
454-
e.blocksProvider,
453+
blocksProvider,
455454
blockGasLimit,
456455
)
457456

0 commit comments

Comments
 (0)