Skip to content

Commit

Permalink
Eth: BlockRef (ethereum-optimism#12251)
Browse files Browse the repository at this point in the history
  • Loading branch information
axelKingsley authored Oct 2, 2024
1 parent a12738b commit 40a70bd
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 25 deletions.
4 changes: 4 additions & 0 deletions op-service/eth/id.go
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,10 @@ func (id L1BlockRef) ParentID() BlockID {
}
}

// BlockRef is a Block Ref indepdendent of L1 or L2
// Because L1BlockRefs are strict subsets of L2BlockRefs, BlockRef is a direct alias of L1BlockRef
type BlockRef = L1BlockRef

func (id L2BlockRef) ID() BlockID {
return BlockID{
Hash: id.Hash,
Expand Down
2 changes: 1 addition & 1 deletion op-supervisor/supervisor/backend/db/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,7 @@ func (db *ChainsDB) AddLog(

func (db *ChainsDB) SealBlock(
chain types.ChainID,
block eth.L2BlockRef) error {
block eth.BlockRef) error {
logDB, ok := db.logDBs[chain]
if !ok {
return fmt.Errorf("%w: %v", ErrUnknownChain, chain)
Expand Down
24 changes: 12 additions & 12 deletions op-supervisor/supervisor/backend/safety/safety.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ import (

type SafetyIndex interface {
// Updaters for the latest local safety status of each chain
UpdateLocalUnsafe(chainID types.ChainID, ref eth.L2BlockRef) error
UpdateLocalSafe(chainID types.ChainID, at eth.L1BlockRef, ref eth.L2BlockRef) error
UpdateFinalizeL1(ref eth.L1BlockRef) error
UpdateLocalUnsafe(chainID types.ChainID, ref eth.BlockRef) error
UpdateLocalSafe(chainID types.ChainID, at eth.BlockRef, ref eth.BlockRef) error
UpdateFinalizeL1(ref eth.BlockRef) error

// Getters for the latest safety status of each chain
UnsafeL2(chainID types.ChainID) (heads.HeadPointer, error)
Expand All @@ -42,10 +42,10 @@ type safetyIndex struct {
finalized map[types.ChainID]eth.BlockID

// remember what each non-finalized L2 block is derived from
derivedFrom map[types.ChainID]map[common.Hash]eth.L1BlockRef
derivedFrom map[types.ChainID]map[common.Hash]eth.BlockRef

// the last received L1 finality signal.
finalizedL1 eth.L1BlockRef
finalizedL1 eth.BlockRef
}

func NewSafetyIndex(log log.Logger, chains ChainsDBClient) *safetyIndex {
Expand All @@ -55,12 +55,12 @@ func NewSafetyIndex(log log.Logger, chains ChainsDBClient) *safetyIndex {
unsafe: make(map[types.ChainID]*View),
safe: make(map[types.ChainID]*View),
finalized: make(map[types.ChainID]eth.BlockID),
derivedFrom: make(map[types.ChainID]map[common.Hash]eth.L1BlockRef),
derivedFrom: make(map[types.ChainID]map[common.Hash]eth.BlockRef),
}
}

// UpdateLocalUnsafe updates the local-unsafe view for the given chain, and advances the cross-unsafe status.
func (r *safetyIndex) UpdateLocalUnsafe(chainID types.ChainID, ref eth.L2BlockRef) error {
func (r *safetyIndex) UpdateLocalUnsafe(chainID types.ChainID, ref eth.BlockRef) error {
view, ok := r.safe[chainID]
if !ok {
iter, err := r.chains.IteratorStartingAt(chainID, ref.Number, 0)
Expand All @@ -76,11 +76,11 @@ func (r *safetyIndex) UpdateLocalUnsafe(chainID types.ChainID, ref eth.L2BlockRe
LastSealedTimestamp: ref.Time,
LogsSince: 0,
},
localDerivedFrom: eth.L1BlockRef{},
localDerivedFrom: eth.BlockRef{},
validWithinView: r.ValidWithinUnsafeView,
}
r.unsafe[chainID] = view
} else if err := view.UpdateLocal(eth.L1BlockRef{}, ref); err != nil {
} else if err := view.UpdateLocal(eth.BlockRef{}, ref); err != nil {
return fmt.Errorf("failed to update local-unsafe: %w", err)
}
local, _ := r.unsafe[chainID].Local()
Expand All @@ -102,7 +102,7 @@ func (r *safetyIndex) advanceCrossUnsafe() {

// UpdateLocalSafe updates the local-safe view for the given chain, and advances the cross-safe status.
func (r *safetyIndex) UpdateLocalSafe(
chainID types.ChainID, at eth.L1BlockRef, ref eth.L2BlockRef) error {
chainID types.ChainID, at eth.BlockRef, ref eth.BlockRef) error {
view, ok := r.safe[chainID]
if !ok {
iter, err := r.chains.IteratorStartingAt(chainID, ref.Number, 0)
Expand All @@ -129,7 +129,7 @@ func (r *safetyIndex) UpdateLocalSafe(
// register what this L2 block is derived from
m, ok := r.derivedFrom[chainID]
if !ok {
m = make(map[common.Hash]eth.L1BlockRef)
m = make(map[common.Hash]eth.BlockRef)
r.derivedFrom[chainID] = m
}
m[ref.Hash] = at
Expand All @@ -152,7 +152,7 @@ func (r *safetyIndex) advanceCrossSafe() {
}

// UpdateFinalizeL1 updates the finalized L1 block, and advances the finalized safety status.
func (r *safetyIndex) UpdateFinalizeL1(ref eth.L1BlockRef) error {
func (r *safetyIndex) UpdateFinalizeL1(ref eth.BlockRef) error {
if ref.Number <= r.finalizedL1.Number {
return fmt.Errorf("ignoring old L1 finality signal of %s, already have %s", ref, r.finalizedL1)
}
Expand Down
4 changes: 2 additions & 2 deletions op-supervisor/supervisor/backend/safety/views.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ type View struct {
iter logs.Iterator

localView heads.HeadPointer
localDerivedFrom eth.L1BlockRef
localDerivedFrom eth.BlockRef

validWithinView func(l1View uint64, execMsg *types.ExecutingMessage) error
}
Expand All @@ -31,7 +31,7 @@ func (vi *View) Local() (heads.HeadPointer, error) {
return vi.localView, nil
}

func (vi *View) UpdateLocal(at eth.L1BlockRef, ref eth.L2BlockRef) error {
func (vi *View) UpdateLocal(at eth.BlockRef, ref eth.BlockRef) error {
vi.localView = heads.HeadPointer{
LastSealedBlockHash: ref.Hash,
LastSealedBlockNum: ref.Number,
Expand Down
10 changes: 5 additions & 5 deletions op-supervisor/supervisor/backend/source/chain_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,17 +21,17 @@ type Source interface {
}

type LogProcessor interface {
ProcessLogs(ctx context.Context, block eth.L2BlockRef, receipts gethtypes.Receipts) error
ProcessLogs(ctx context.Context, block eth.BlockRef, receipts gethtypes.Receipts) error
}

type DatabaseRewinder interface {
Rewind(chain types.ChainID, headBlockNum uint64) error
LatestBlockNum(chain types.ChainID) (num uint64, ok bool)
}

type BlockProcessorFn func(ctx context.Context, block eth.L1BlockRef) error
type BlockProcessorFn func(ctx context.Context, block eth.BlockRef) error

func (fn BlockProcessorFn) ProcessBlock(ctx context.Context, block eth.L1BlockRef) error {
func (fn BlockProcessorFn) ProcessBlock(ctx context.Context, block eth.BlockRef) error {
return fn(ctx, block)
}

Expand Down Expand Up @@ -131,7 +131,7 @@ func (s *ChainProcessor) worker() {
func (s *ChainProcessor) update(nextNum uint64) error {
ctx, cancel := context.WithTimeout(s.ctx, time.Second*10)
nextL1, err := s.client.L1BlockRefByNumber(ctx, nextNum)
next := eth.L2BlockRef{
next := eth.BlockRef{
Hash: nextL1.Hash,
ParentHash: nextL1.ParentHash,
Number: nextL1.Number,
Expand Down Expand Up @@ -166,7 +166,7 @@ func (s *ChainProcessor) update(nextNum uint64) error {
return nil
}

func (s *ChainProcessor) OnNewHead(ctx context.Context, head eth.L1BlockRef) error {
func (s *ChainProcessor) OnNewHead(ctx context.Context, head eth.BlockRef) error {
// update the latest target
s.lastHead.Store(head.Number)
// signal that we have something to process
Expand Down
6 changes: 3 additions & 3 deletions op-supervisor/supervisor/backend/source/log_processor.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,12 @@ import (
)

type LogStorage interface {
SealBlock(chain types.ChainID, block eth.L2BlockRef) error
SealBlock(chain types.ChainID, block eth.BlockRef) error
AddLog(chain types.ChainID, logHash common.Hash, parentBlock eth.BlockID, logIdx uint32, execMsg *types.ExecutingMessage) error
}

type ChainsDBClientForLogProcessor interface {
SealBlock(chain types.ChainID, block eth.L2BlockRef) error
SealBlock(chain types.ChainID, block eth.BlockRef) error
AddLog(chain types.ChainID, logHash common.Hash, parentBlock eth.BlockID, logIdx uint32, execMsg *types.ExecutingMessage) error
}

Expand All @@ -44,7 +44,7 @@ func newLogProcessor(chain types.ChainID, logStore LogStorage) *logProcessor {

// ProcessLogs processes logs from a block and stores them in the log storage
// for any logs that are related to executing messages, they are decoded and stored
func (p *logProcessor) ProcessLogs(_ context.Context, block eth.L2BlockRef, rcpts ethTypes.Receipts) error {
func (p *logProcessor) ProcessLogs(_ context.Context, block eth.BlockRef, rcpts ethTypes.Receipts) error {
for _, rcpt := range rcpts {
for _, l := range rcpt.Logs {
// log hash represents the hash of *this* log as a potentially initiating message
Expand Down
4 changes: 2 additions & 2 deletions op-supervisor/supervisor/backend/source/log_processor_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ var logProcessorChainID = types.ChainIDFromUInt64(4)

func TestLogProcessor(t *testing.T) {
ctx := context.Background()
block1 := eth.L2BlockRef{
block1 := eth.BlockRef{
ParentHash: common.Hash{0x42},
Number: 100,
Hash: common.Hash{0x11},
Expand Down Expand Up @@ -205,7 +205,7 @@ type stubLogStorage struct {
seals []storedSeal
}

func (s *stubLogStorage) SealBlock(chainID types.ChainID, block eth.L2BlockRef) error {
func (s *stubLogStorage) SealBlock(chainID types.ChainID, block eth.BlockRef) error {
if logProcessorChainID != chainID {
return fmt.Errorf("chain id mismatch, expected %v but got %v", logProcessorChainID, chainID)
}
Expand Down

0 comments on commit 40a70bd

Please sign in to comment.