Skip to content

Commit 7c1903d

Browse files
committed
Merge branch 'master' into fix-skipped-state-gc
2 parents f084047 + 8919ab3 commit 7c1903d

File tree

3 files changed

+60
-38
lines changed

3 files changed

+60
-38
lines changed

arbitrum/apibackend.go

Lines changed: 53 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -86,21 +86,28 @@ type SyncProgressBackend interface {
8686
FinalizedBlockNumber(ctx context.Context) (uint64, error)
8787
}
8888

89-
func createRegisterAPIBackend(backend *Backend, sync SyncProgressBackend, filterConfig filters.Config, fallbackClientUrl string, fallbackClientTimeout time.Duration) (*filters.FilterSystem, error) {
89+
func createRegisterAPIBackend(backend *Backend, filterConfig filters.Config, fallbackClientUrl string, fallbackClientTimeout time.Duration) (*filters.FilterSystem, error) {
9090
fallbackClient, err := CreateFallbackClient(fallbackClientUrl, fallbackClientTimeout)
9191
if err != nil {
9292
return nil, err
9393
}
9494
backend.apiBackend = &APIBackend{
9595
b: backend,
9696
fallbackClient: fallbackClient,
97-
sync: sync,
9897
}
9998
filterSystem := filters.NewFilterSystem(backend.apiBackend, filterConfig)
10099
backend.stack.RegisterAPIs(backend.apiBackend.GetAPIs(filterSystem))
101100
return filterSystem, nil
102101
}
103102

103+
func (a *APIBackend) SetSyncBackend(sync SyncProgressBackend) error {
104+
if a.sync != nil {
105+
return errors.New("sync progress monitor already set")
106+
}
107+
a.sync = sync
108+
return nil
109+
}
110+
104111
func (a *APIBackend) GetAPIs(filterSystem *filters.FilterSystem) []rpc.API {
105112
apis := ethapi.GetAPIs(a)
106113

@@ -137,7 +144,7 @@ func (a *APIBackend) GetAPIs(filterSystem *filters.FilterSystem) []rpc.API {
137144
return apis
138145
}
139146

140-
func (a *APIBackend) blockChain() *core.BlockChain {
147+
func (a *APIBackend) BlockChain() *core.BlockChain {
141148
return a.b.arb.BlockChain()
142149
}
143150

@@ -146,19 +153,24 @@ func (a *APIBackend) GetArbitrumNode() interface{} {
146153
}
147154

148155
func (a *APIBackend) GetBody(ctx context.Context, hash common.Hash, number rpc.BlockNumber) (*types.Body, error) {
149-
if body := a.blockChain().GetBody(hash); body != nil {
156+
if body := a.BlockChain().GetBody(hash); body != nil {
150157
return body, nil
151158
}
152159
return nil, errors.New("block body not found")
153160
}
154161

155162
// General Ethereum API
156163
func (a *APIBackend) SyncProgressMap() map[string]interface{} {
164+
if a.sync == nil {
165+
res := make(map[string]interface{})
166+
res["error"] = "sync object not set in apibackend"
167+
return res
168+
}
157169
return a.sync.SyncProgressMap()
158170
}
159171

160172
func (a *APIBackend) SyncProgress() ethereum.SyncProgress {
161-
progress := a.sync.SyncProgressMap()
173+
progress := a.SyncProgressMap()
162174

163175
if len(progress) == 0 {
164176
return ethereum.SyncProgress{}
@@ -184,7 +196,7 @@ func (a *APIBackend) FeeHistory(
184196
}
185197

186198
nitroGenesis := rpc.BlockNumber(a.ChainConfig().ArbitrumChainParams.GenesisBlockNum)
187-
newestBlock, latestBlock := a.blockChain().ClipToPostNitroGenesis(newestBlock)
199+
newestBlock, latestBlock := a.BlockChain().ClipToPostNitroGenesis(newestBlock)
188200

189201
maxFeeHistory := a.b.config.FeeHistoryMaxBlockCount
190202
if blocks > maxFeeHistory {
@@ -260,7 +272,7 @@ func (a *APIBackend) FeeHistory(
260272
currentTimestampGasUsed = 0
261273
}
262274

263-
receipts := a.blockChain().GetReceiptsByHash(header.ReceiptHash)
275+
receipts := a.BlockChain().GetReceiptsByHash(header.ReceiptHash)
264276
for _, receipt := range receipts {
265277
if receipt.GasUsed > receipt.GasUsedForL1 {
266278
currentTimestampGasUsed += receipt.GasUsed - receipt.GasUsedForL1
@@ -329,17 +341,23 @@ func (a *APIBackend) HeaderByNumber(ctx context.Context, number rpc.BlockNumber)
329341
}
330342

331343
func (a *APIBackend) HeaderByHash(ctx context.Context, hash common.Hash) (*types.Header, error) {
332-
return a.blockChain().GetHeaderByHash(hash), nil
344+
return a.BlockChain().GetHeaderByHash(hash), nil
333345
}
334346

335347
func (a *APIBackend) blockNumberToUint(ctx context.Context, number rpc.BlockNumber) (uint64, error) {
336348
if number == rpc.LatestBlockNumber || number == rpc.PendingBlockNumber {
337-
return a.blockChain().CurrentBlock().Number.Uint64(), nil
349+
return a.BlockChain().CurrentBlock().Number.Uint64(), nil
338350
}
339351
if number == rpc.SafeBlockNumber {
352+
if a.sync == nil {
353+
return 0, errors.New("block number not supported: object not set")
354+
}
340355
return a.sync.SafeBlockNumber(ctx)
341356
}
342357
if number == rpc.FinalizedBlockNumber {
358+
if a.sync == nil {
359+
return 0, errors.New("block number not supported: object not set")
360+
}
343361
return a.sync.FinalizedBlockNumber(ctx)
344362
}
345363
if number < 0 {
@@ -350,13 +368,13 @@ func (a *APIBackend) blockNumberToUint(ctx context.Context, number rpc.BlockNumb
350368

351369
func (a *APIBackend) headerByNumberImpl(ctx context.Context, number rpc.BlockNumber) (*types.Header, error) {
352370
if number == rpc.LatestBlockNumber || number == rpc.PendingBlockNumber {
353-
return a.blockChain().CurrentBlock(), nil
371+
return a.BlockChain().CurrentBlock(), nil
354372
}
355373
numUint, err := a.blockNumberToUint(ctx, number)
356374
if err != nil {
357375
return nil, err
358376
}
359-
return a.blockChain().GetHeaderByNumber(numUint), nil
377+
return a.BlockChain().GetHeaderByNumber(numUint), nil
360378
}
361379

362380
func (a *APIBackend) headerByNumberOrHashImpl(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Header, error) {
@@ -366,7 +384,7 @@ func (a *APIBackend) headerByNumberOrHashImpl(ctx context.Context, blockNrOrHash
366384
}
367385
hash, ishash := blockNrOrHash.Hash()
368386
if ishash {
369-
return a.blockChain().GetHeaderByHash(hash), nil
387+
return a.BlockChain().GetHeaderByHash(hash), nil
370388
}
371389
return nil, errors.New("invalid arguments; neither block nor hash specified")
372390
}
@@ -376,17 +394,17 @@ func (a *APIBackend) HeaderByNumberOrHash(ctx context.Context, blockNrOrHash rpc
376394
}
377395

378396
func (a *APIBackend) CurrentHeader() *types.Header {
379-
return a.blockChain().CurrentHeader()
397+
return a.BlockChain().CurrentHeader()
380398
}
381399

382400
func (a *APIBackend) CurrentBlock() *types.Header {
383-
return a.blockChain().CurrentBlock()
401+
return a.BlockChain().CurrentBlock()
384402
}
385403

386404
func (a *APIBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber) (*types.Block, error) {
387405
if number == rpc.LatestBlockNumber || number == rpc.PendingBlockNumber {
388-
currentHeader := a.blockChain().CurrentBlock()
389-
currentBlock := a.blockChain().GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64())
406+
currentHeader := a.BlockChain().CurrentBlock()
407+
currentBlock := a.BlockChain().GetBlock(currentHeader.Hash(), currentHeader.Number.Uint64())
390408
if currentBlock == nil {
391409
return nil, errors.New("can't find block for current header")
392410
}
@@ -396,11 +414,11 @@ func (a *APIBackend) BlockByNumber(ctx context.Context, number rpc.BlockNumber)
396414
if err != nil {
397415
return nil, err
398416
}
399-
return a.blockChain().GetBlockByNumber(numUint), nil
417+
return a.BlockChain().GetBlockByNumber(numUint), nil
400418
}
401419

402420
func (a *APIBackend) BlockByHash(ctx context.Context, hash common.Hash) (*types.Block, error) {
403-
return a.blockChain().GetBlockByHash(hash), nil
421+
return a.BlockChain().GetBlockByHash(hash), nil
404422
}
405423

406424
func (a *APIBackend) BlockByNumberOrHash(ctx context.Context, blockNrOrHash rpc.BlockNumberOrHash) (*types.Block, error) {
@@ -422,10 +440,10 @@ func (a *APIBackend) stateAndHeaderFromHeader(ctx context.Context, header *types
422440
if header == nil {
423441
return nil, nil, errors.New("header not found")
424442
}
425-
if !a.blockChain().Config().IsArbitrumNitro(header.Number) {
443+
if !a.BlockChain().Config().IsArbitrumNitro(header.Number) {
426444
return nil, header, types.ErrUseFallback
427445
}
428-
bc := a.blockChain()
446+
bc := a.BlockChain()
429447
stateFor := func(header *types.Header) (*state.StateDB, error) {
430448
return bc.StateAt(header.Root)
431449
}
@@ -454,51 +472,51 @@ func (a *APIBackend) StateAndHeaderByNumberOrHash(ctx context.Context, blockNrOr
454472
}
455473

456474
func (a *APIBackend) StateAtBlock(ctx context.Context, block *types.Block, reexec uint64, base *state.StateDB, checkLive bool, preferDisk bool) (statedb *state.StateDB, release tracers.StateReleaseFunc, err error) {
457-
if !a.blockChain().Config().IsArbitrumNitro(block.Number()) {
475+
if !a.BlockChain().Config().IsArbitrumNitro(block.Number()) {
458476
return nil, nil, types.ErrUseFallback
459477
}
460478
// DEV: This assumes that `StateAtBlock` only accesses the blockchain and chainDb fields
461479
return eth.NewArbEthereum(a.b.arb.BlockChain(), a.ChainDb()).StateAtBlock(ctx, block, reexec, base, checkLive, preferDisk)
462480
}
463481

464482
func (a *APIBackend) StateAtTransaction(ctx context.Context, block *types.Block, txIndex int, reexec uint64) (*core.Message, vm.BlockContext, *state.StateDB, tracers.StateReleaseFunc, error) {
465-
if !a.blockChain().Config().IsArbitrumNitro(block.Number()) {
483+
if !a.BlockChain().Config().IsArbitrumNitro(block.Number()) {
466484
return nil, vm.BlockContext{}, nil, nil, types.ErrUseFallback
467485
}
468486
// DEV: This assumes that `StateAtTransaction` only accesses the blockchain and chainDb fields
469487
return eth.NewArbEthereum(a.b.arb.BlockChain(), a.ChainDb()).StateAtTransaction(ctx, block, txIndex, reexec)
470488
}
471489

472490
func (a *APIBackend) GetReceipts(ctx context.Context, hash common.Hash) (types.Receipts, error) {
473-
return a.blockChain().GetReceiptsByHash(hash), nil
491+
return a.BlockChain().GetReceiptsByHash(hash), nil
474492
}
475493

476494
func (a *APIBackend) GetTd(ctx context.Context, hash common.Hash) *big.Int {
477-
if header := a.blockChain().GetHeaderByHash(hash); header != nil {
478-
return a.blockChain().GetTd(hash, header.Number.Uint64())
495+
if header := a.BlockChain().GetHeaderByHash(hash); header != nil {
496+
return a.BlockChain().GetTd(hash, header.Number.Uint64())
479497
}
480498
return nil
481499
}
482500

483501
func (a *APIBackend) GetEVM(ctx context.Context, msg *core.Message, state *state.StateDB, header *types.Header, vmConfig *vm.Config, blockCtx *vm.BlockContext) (*vm.EVM, func() error) {
484502
vmError := func() error { return nil }
485503
if vmConfig == nil {
486-
vmConfig = a.blockChain().GetVMConfig()
504+
vmConfig = a.BlockChain().GetVMConfig()
487505
}
488506
txContext := core.NewEVMTxContext(msg)
489-
return vm.NewEVM(*blockCtx, txContext, state, a.blockChain().Config(), *vmConfig), vmError
507+
return vm.NewEVM(*blockCtx, txContext, state, a.BlockChain().Config(), *vmConfig), vmError
490508
}
491509

492510
func (a *APIBackend) SubscribeChainEvent(ch chan<- core.ChainEvent) event.Subscription {
493-
return a.blockChain().SubscribeChainEvent(ch)
511+
return a.BlockChain().SubscribeChainEvent(ch)
494512
}
495513

496514
func (a *APIBackend) SubscribeChainHeadEvent(ch chan<- core.ChainHeadEvent) event.Subscription {
497-
return a.blockChain().SubscribeChainHeadEvent(ch)
515+
return a.BlockChain().SubscribeChainHeadEvent(ch)
498516
}
499517

500518
func (a *APIBackend) SubscribeChainSideEvent(ch chan<- core.ChainSideEvent) event.Subscription {
501-
return a.blockChain().SubscribeChainSideEvent(ch)
519+
return a.BlockChain().SubscribeChainSideEvent(ch)
502520
}
503521

504522
// Transaction pool API
@@ -526,7 +544,7 @@ func (a *APIBackend) GetPoolTransaction(txHash common.Hash) *types.Transaction {
526544
}
527545

528546
func (a *APIBackend) GetPoolNonce(ctx context.Context, addr common.Address) (uint64, error) {
529-
stateDB, err := a.blockChain().State()
547+
stateDB, err := a.BlockChain().State()
530548
if err != nil {
531549
return 0, err
532550
}
@@ -566,7 +584,7 @@ func (a *APIBackend) ServiceFilter(ctx context.Context, session *bloombits.Match
566584
}
567585

568586
func (a *APIBackend) SubscribeLogsEvent(ch chan<- []*types.Log) event.Subscription {
569-
return a.blockChain().SubscribeLogsEvent(ch)
587+
return a.BlockChain().SubscribeLogsEvent(ch)
570588
}
571589

572590
func (a *APIBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Subscription {
@@ -575,15 +593,15 @@ func (a *APIBackend) SubscribePendingLogsEvent(ch chan<- []*types.Log) event.Sub
575593
}
576594

577595
func (a *APIBackend) SubscribeRemovedLogsEvent(ch chan<- core.RemovedLogsEvent) event.Subscription {
578-
return a.blockChain().SubscribeRemovedLogsEvent(ch)
596+
return a.BlockChain().SubscribeRemovedLogsEvent(ch)
579597
}
580598

581599
func (a *APIBackend) ChainConfig() *params.ChainConfig {
582-
return a.blockChain().Config()
600+
return a.BlockChain().Config()
583601
}
584602

585603
func (a *APIBackend) Engine() consensus.Engine {
586-
return a.blockChain().Engine()
604+
return a.BlockChain().Engine()
587605
}
588606

589607
func (b *APIBackend) PendingBlockAndReceipts() (*types.Block, types.Receipts) {

arbitrum/backend.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ type Backend struct {
3434
chanNewBlock chan struct{} //create new L2 block unless empty
3535
}
3636

37-
func NewBackend(stack *node.Node, config *Config, chainDb ethdb.Database, publisher ArbInterface, sync SyncProgressBackend, filterConfig filters.Config) (*Backend, *filters.FilterSystem, error) {
37+
func NewBackend(stack *node.Node, config *Config, chainDb ethdb.Database, publisher ArbInterface, filterConfig filters.Config) (*Backend, *filters.FilterSystem, error) {
3838
backend := &Backend{
3939
arb: publisher,
4040
stack: stack,
@@ -52,7 +52,7 @@ func NewBackend(stack *node.Node, config *Config, chainDb ethdb.Database, publis
5252
}
5353

5454
backend.bloomIndexer.Start(backend.arb.BlockChain())
55-
filterSystem, err := createRegisterAPIBackend(backend, sync, filterConfig, config.ClassicRedirect, config.ClassicRedirectTimeout)
55+
filterSystem, err := createRegisterAPIBackend(backend, filterConfig, config.ClassicRedirect, config.ClassicRedirectTimeout)
5656
if err != nil {
5757
return nil, nil, err
5858
}

core/blockchain_arbitrum.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package core
1919

2020
import (
21+
"errors"
2122
"time"
2223

2324
"github.com/ethereum/go-ethereum/core/state"
@@ -39,7 +40,10 @@ func (bc *BlockChain) WriteBlockAndSetHeadWithTime(block *types.Block, receipts
3940
func (bc *BlockChain) ReorgToOldBlock(newHead *types.Block) error {
4041
bc.wg.Add(1)
4142
defer bc.wg.Done()
42-
bc.chainmu.MustLock()
43+
locked := bc.chainmu.TryLock()
44+
if !locked {
45+
return errors.New("couldn't catch lock to reorg")
46+
}
4347
defer bc.chainmu.Unlock()
4448
oldHead := bc.CurrentBlock()
4549
if oldHead.Hash() == newHead.Hash() {

0 commit comments

Comments
 (0)