github.com/ethereum-optimism/optimism@v1.7.2/op-node/rollup/driver/metered_l1fetcher.go (about)

     1  package driver
     2  
     3  import (
     4  	"context"
     5  	"time"
     6  
     7  	"github.com/ethereum-optimism/optimism/op-node/rollup/derive"
     8  	"github.com/ethereum-optimism/optimism/op-service/eth"
     9  	"github.com/ethereum/go-ethereum/common"
    10  	"github.com/ethereum/go-ethereum/core/types"
    11  )
    12  
    13  type L1FetcherMetrics interface {
    14  	RecordL1RequestTime(method string, duration time.Duration)
    15  }
    16  
    17  type MeteredL1Fetcher struct {
    18  	inner   derive.L1Fetcher
    19  	metrics L1FetcherMetrics
    20  	now     func() time.Time
    21  }
    22  
    23  func NewMeteredL1Fetcher(inner derive.L1Fetcher, metrics L1FetcherMetrics) *MeteredL1Fetcher {
    24  	return &MeteredL1Fetcher{
    25  		inner:   inner,
    26  		metrics: metrics,
    27  		now:     time.Now,
    28  	}
    29  }
    30  func (m *MeteredL1Fetcher) L1BlockRefByLabel(ctx context.Context, label eth.BlockLabel) (eth.L1BlockRef, error) {
    31  	defer m.recordTime("L1BlockRefByLabel")()
    32  	return m.inner.L1BlockRefByLabel(ctx, label)
    33  }
    34  
    35  func (m *MeteredL1Fetcher) L1BlockRefByNumber(ctx context.Context, num uint64) (eth.L1BlockRef, error) {
    36  	defer m.recordTime("L1BlockRefByNumber")()
    37  	return m.inner.L1BlockRefByNumber(ctx, num)
    38  }
    39  
    40  func (m *MeteredL1Fetcher) L1BlockRefByHash(ctx context.Context, hash common.Hash) (eth.L1BlockRef, error) {
    41  	defer m.recordTime("L1BlockRefByHash")()
    42  	return m.inner.L1BlockRefByHash(ctx, hash)
    43  }
    44  
    45  func (m *MeteredL1Fetcher) InfoByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, error) {
    46  	defer m.recordTime("InfoByHash")()
    47  	return m.inner.InfoByHash(ctx, hash)
    48  }
    49  
    50  func (m *MeteredL1Fetcher) InfoAndTxsByHash(ctx context.Context, hash common.Hash) (eth.BlockInfo, types.Transactions, error) {
    51  	defer m.recordTime("InfoAndTxsByHash")()
    52  	return m.inner.InfoAndTxsByHash(ctx, hash)
    53  }
    54  
    55  func (m *MeteredL1Fetcher) FetchReceipts(ctx context.Context, blockHash common.Hash) (eth.BlockInfo, types.Receipts, error) {
    56  	defer m.recordTime("FetchReceipts")()
    57  	return m.inner.FetchReceipts(ctx, blockHash)
    58  }
    59  
    60  var _ derive.L1Fetcher = (*MeteredL1Fetcher)(nil)
    61  
    62  func (m *MeteredL1Fetcher) recordTime(method string) func() {
    63  	start := m.now()
    64  	return func() {
    65  		end := m.now()
    66  		m.metrics.RecordL1RequestTime(method, end.Sub(start))
    67  	}
    68  }