Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 13 additions & 7 deletions tools/preconf-rpc/blocktracker/blocktracker.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (

"github.com/ethereum/go-ethereum/common"
"github.com/ethereum/go-ethereum/core/types"
lru "github.com/hashicorp/golang-lru/v2"
)

type EthClient interface {
Expand All @@ -18,20 +19,25 @@ type EthClient interface {

type blockTracker struct {
latestBlockNo atomic.Uint64
blocks map[uint64]*types.Block
blocks *lru.Cache[uint64, *types.Block]
client EthClient
log *slog.Logger
checkTrigger chan struct{}
}

func NewBlockTracker(client EthClient, log *slog.Logger) *blockTracker {
func NewBlockTracker(client EthClient, log *slog.Logger) (*blockTracker, error) {
cache, err := lru.New[uint64, *types.Block](1000)
if err != nil {
log.Error("Failed to create LRU cache", "error", err)
return nil, err
}
return &blockTracker{
latestBlockNo: atomic.Uint64{},
blocks: make(map[uint64]*types.Block),
blocks: cache,
client: client,
log: log,
checkTrigger: make(chan struct{}, 1),
}
}, nil
}

func (b *blockTracker) Start(ctx context.Context) <-chan struct{} {
Expand All @@ -55,7 +61,7 @@ func (b *blockTracker) Start(ctx context.Context) <-chan struct{} {
b.log.Error("Failed to get block by number", "error", err)
continue
}
b.blocks[blockNo] = block
_ = b.blocks.Add(blockNo, block)
b.latestBlockNo.Store(block.NumberU64())
b.log.Info("New block detected", "number", block.NumberU64(), "hash", block.Hash().Hex())
b.triggerCheck()
Expand Down Expand Up @@ -95,14 +101,14 @@ WaitForBlock:
}
}

block, ok := b.blocks[blockNumber]
block, ok := b.blocks.Get(blockNumber)
if !ok {
block, err := b.client.BlockByNumber(ctx, big.NewInt(int64(blockNumber)))
if err != nil {
b.log.Error("Failed to get block by number", "error", err, "blockNumber", blockNumber)
return false, err
}
b.blocks[blockNumber] = block
_ = b.blocks.Add(blockNumber, block)
}

for _, tx := range block.Transactions() {
Expand Down
5 changes: 4 additions & 1 deletion tools/preconf-rpc/blocktracker/blocktracker_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,10 @@ func TestBlockTracker(t *testing.T) {
},
}

tracker := blocktracker.NewBlockTracker(client, slog.Default())
tracker, err := blocktracker.NewBlockTracker(client, slog.Default())
if err != nil {
t.Fatalf("Failed to create block tracker: %v", err)
}
done := tracker.Start(ctx)

blkNo := tracker.LatestBlockNumber()
Expand Down
6 changes: 5 additions & 1 deletion tools/preconf-rpc/service/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -184,10 +184,14 @@ func New(config *Config) (*Service, error) {
return nil, fmt.Errorf("failed to create store: %w", err)
}

blockTracker := blocktracker.NewBlockTracker(
blockTracker, err := blocktracker.NewBlockTracker(
l1RPCClient,
config.Logger.With("module", "blocktracker"),
)
if err != nil {
return nil, fmt.Errorf("failed to create block tracker: %w", err)
}

blockTrackerDone := blockTracker.Start(ctx)
healthChecker.Register(health.CloseChannelHealthCheck("BlockTracker", blockTrackerDone))

Expand Down
Loading