Skip to content

Commit c727394

Browse files
committed
simplify
1 parent 229da68 commit c727394

File tree

6 files changed

+120
-89
lines changed

6 files changed

+120
-89
lines changed

apps/evm/cmd/run.go

Lines changed: 1 addition & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -167,19 +167,7 @@ func createSequencer(
167167
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
168168
}
169169

170-
// Create async epoch fetcher for background prefetching
171-
asyncFetcher := block.NewAsyncEpochFetcher(
172-
daClient,
173-
logger,
174-
genesis.DAStartHeight,
175-
genesis.DAEpochForcedInclusion,
176-
2, // prefetch 2 epochs ahead for based sequencer
177-
1*time.Second, // check frequently
178-
)
179-
asyncFetcher.Start()
180-
181-
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion, asyncFetcher)
182-
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
170+
basedSeq, err := based.NewBasedSequencer(daClient, datastore, genesis, logger)
183171
if err != nil {
184172
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
185173
}

apps/grpc/cmd/run.go

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"path/filepath"
7-
"time"
87

98
"github.com/ipfs/go-datastore"
109
"github.com/rs/zerolog"
@@ -128,19 +127,7 @@ func createSequencer(
128127
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
129128
}
130129

131-
// Create async epoch fetcher for background prefetching
132-
asyncFetcher := block.NewAsyncEpochFetcher(
133-
daClient,
134-
logger,
135-
genesis.DAStartHeight,
136-
genesis.DAEpochForcedInclusion,
137-
2, // prefetch 2 epochs ahead for based sequencer
138-
1*time.Second, // check frequently
139-
)
140-
asyncFetcher.Start()
141-
142-
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion, asyncFetcher)
143-
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
130+
basedSeq, err := based.NewBasedSequencer(daClient, datastore, genesis, logger)
144131
if err != nil {
145132
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
146133
}

apps/testapp/cmd/run.go

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import (
44
"context"
55
"fmt"
66
"path/filepath"
7-
"time"
87

98
"github.com/ipfs/go-datastore"
109
"github.com/rs/zerolog"
@@ -129,19 +128,7 @@ func createSequencer(
129128
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
130129
}
131130

132-
// Create async epoch fetcher for background prefetching
133-
asyncFetcher := block.NewAsyncEpochFetcher(
134-
daClient,
135-
logger,
136-
genesis.DAStartHeight,
137-
genesis.DAEpochForcedInclusion,
138-
2, // prefetch 2 epochs ahead for based sequencer
139-
1*time.Second, // check frequently
140-
)
141-
asyncFetcher.Start()
142-
143-
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion, asyncFetcher)
144-
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
131+
basedSeq, err := based.NewBasedSequencer(daClient, datastore, genesis, logger)
145132
if err != nil {
146133
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
147134
}

pkg/sequencers/based/sequencer.go

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ var _ coresequencer.Sequencer = (*BasedSequencer)(nil)
2525
type BasedSequencer struct {
2626
logger zerolog.Logger
2727

28+
asyncFetcher *block.AsyncEpochFetcher
2829
fiRetriever block.ForcedInclusionRetriever
2930
daHeight atomic.Uint64
3031
checkpointStore *seqcommon.CheckpointStore
@@ -38,15 +39,14 @@ type BasedSequencer struct {
3839

3940
// NewBasedSequencer creates a new based sequencer instance
4041
func NewBasedSequencer(
41-
fiRetriever block.ForcedInclusionRetriever,
42+
daClient block.FullDAClient,
4243
db ds.Batching,
4344
genesis genesis.Genesis,
4445
logger zerolog.Logger,
4546
) (*BasedSequencer, error) {
4647
bs := &BasedSequencer{
4748
logger: logger.With().Str("component", "based_sequencer").Logger(),
4849
checkpointStore: seqcommon.NewCheckpointStore(db, ds.NewKey("/based/checkpoint")),
49-
fiRetriever: fiRetriever,
5050
}
5151
// based sequencers need community consensus about the da start height given no submission are done
5252
bs.SetDAHeight(genesis.DAStartHeight)
@@ -78,6 +78,19 @@ func NewBasedSequencer(
7878
}
7979
}
8080

81+
// Create async epoch fetcher for background prefetching (created once)
82+
bs.asyncFetcher = block.NewAsyncEpochFetcher(
83+
daClient,
84+
logger,
85+
genesis.DAStartHeight,
86+
genesis.DAEpochForcedInclusion,
87+
2, // prefetch 2 epochs ahead for based sequencer
88+
1*time.Second, // check frequently
89+
)
90+
bs.asyncFetcher.Start()
91+
92+
bs.fiRetriever = block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion, bs.asyncFetcher)
93+
8194
return bs, nil
8295
}
8396

pkg/sequencers/based/sequencer_test.go

Lines changed: 85 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,87 @@ func (m *MockForcedInclusionRetriever) RetrieveForcedIncludedTxs(ctx context.Con
3131
return args.Get(0).(*block.ForcedInclusionEvent), args.Error(1)
3232
}
3333

34+
// MockDAClient is a mock implementation of block.FullDAClient for testing
35+
type MockDAClient struct {
36+
mock.Mock
37+
retriever *MockForcedInclusionRetriever
38+
}
39+
40+
// Client interface methods
41+
func (m *MockDAClient) Submit(ctx context.Context, data [][]byte, gasPrice float64, namespace []byte, options []byte) datypes.ResultSubmit {
42+
args := m.Called(ctx, data, gasPrice, namespace, options)
43+
return args.Get(0).(datypes.ResultSubmit)
44+
}
45+
46+
func (m *MockDAClient) Retrieve(ctx context.Context, height uint64, namespace []byte) datypes.ResultRetrieve {
47+
args := m.Called(ctx, height, namespace)
48+
return args.Get(0).(datypes.ResultRetrieve)
49+
}
50+
51+
func (m *MockDAClient) Get(ctx context.Context, ids []datypes.ID, namespace []byte) ([]datypes.Blob, error) {
52+
args := m.Called(ctx, ids, namespace)
53+
if args.Get(0) == nil {
54+
return nil, args.Error(1)
55+
}
56+
return args.Get(0).([]datypes.Blob), args.Error(1)
57+
}
58+
59+
func (m *MockDAClient) GetHeaderNamespace() []byte {
60+
args := m.Called()
61+
if args.Get(0) == nil {
62+
return nil
63+
}
64+
return args.Get(0).([]byte)
65+
}
66+
67+
func (m *MockDAClient) GetDataNamespace() []byte {
68+
args := m.Called()
69+
if args.Get(0) == nil {
70+
return nil
71+
}
72+
return args.Get(0).([]byte)
73+
}
74+
75+
func (m *MockDAClient) GetForcedInclusionNamespace() []byte {
76+
args := m.Called()
77+
if args.Get(0) == nil {
78+
return nil
79+
}
80+
return args.Get(0).([]byte)
81+
}
82+
83+
func (m *MockDAClient) HasForcedInclusionNamespace() bool {
84+
args := m.Called()
85+
return args.Get(0).(bool)
86+
}
87+
88+
// Verifier interface methods
89+
func (m *MockDAClient) GetProofs(ctx context.Context, ids []datypes.ID, namespace []byte) ([]datypes.Proof, error) {
90+
args := m.Called(ctx, ids, namespace)
91+
return args.Get(0).([]datypes.Proof), args.Error(1)
92+
}
93+
94+
func (m *MockDAClient) Validate(ctx context.Context, ids []datypes.ID, proofs []datypes.Proof, namespace []byte) ([]bool, error) {
95+
args := m.Called(ctx, ids, proofs, namespace)
96+
return args.Get(0).([]bool), args.Error(1)
97+
}
98+
3499
// createTestSequencer is a helper function to create a sequencer for testing
35100
func createTestSequencer(t *testing.T, mockRetriever *MockForcedInclusionRetriever, gen genesis.Genesis) *BasedSequencer {
36101
t.Helper()
37102

38103
// Create in-memory datastore
39104
db := syncds.MutexWrap(ds.NewMapDatastore())
40105

41-
seq, err := NewBasedSequencer(mockRetriever, db, gen, zerolog.Nop())
106+
// Create mock DA client that wraps the retriever
107+
mockDAClient := &MockDAClient{retriever: mockRetriever}
108+
109+
seq, err := NewBasedSequencer(mockDAClient, db, gen, zerolog.Nop())
42110
require.NoError(t, err)
111+
112+
// Replace the fiRetriever with our mock so tests work as before
113+
seq.fiRetriever = mockRetriever
114+
43115
return seq
44116
}
45117

@@ -454,10 +526,16 @@ func TestBasedSequencer_CheckpointPersistence(t *testing.T) {
454526
// Create persistent datastore
455527
db := syncds.MutexWrap(ds.NewMapDatastore())
456528

529+
// Create mock DA client
530+
mockDAClient := &MockDAClient{retriever: mockRetriever}
531+
457532
// Create first sequencer
458-
seq1, err := NewBasedSequencer(mockRetriever, db, gen, zerolog.Nop())
533+
seq1, err := NewBasedSequencer(mockDAClient, db, gen, zerolog.Nop())
459534
require.NoError(t, err)
460535

536+
// Replace the fiRetriever with our mock so tests work as before
537+
seq1.fiRetriever = mockRetriever
538+
461539
req := coresequencer.GetNextBatchRequest{
462540
MaxBytes: 1000000,
463541
LastBatchData: nil,
@@ -470,9 +548,13 @@ func TestBasedSequencer_CheckpointPersistence(t *testing.T) {
470548
assert.Equal(t, 2, len(resp.Batch.Transactions))
471549

472550
// Create a new sequencer with the same datastore (simulating restart)
473-
seq2, err := NewBasedSequencer(mockRetriever, db, gen, zerolog.Nop())
551+
mockDAClient2 := &MockDAClient{retriever: mockRetriever}
552+
seq2, err := NewBasedSequencer(mockDAClient2, db, gen, zerolog.Nop())
474553
require.NoError(t, err)
475554

555+
// Replace the fiRetriever with our mock so tests work as before
556+
seq2.fiRetriever = mockRetriever
557+
476558
// Checkpoint should be loaded from DB
477559
assert.Equal(t, uint64(101), seq2.checkpoint.DAHeight)
478560
assert.Equal(t, uint64(0), seq2.checkpoint.TxIndex)

pkg/sequencers/single/sequencer.go

Lines changed: 17 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -91,19 +91,6 @@ func NewSequencer(
9191
DAHeight: s.GetDAHeight(),
9292
TxIndex: 0,
9393
}
94-
95-
// Create async epoch fetcher for background prefetching
96-
s.asyncFetcher = block.NewAsyncEpochFetcher(
97-
daClient,
98-
logger,
99-
s.GetDAHeight(),
100-
genesis.DAEpochForcedInclusion,
101-
1, // prefetch 1 epoch ahead
102-
3*time.Second, // check every 3 seconds
103-
)
104-
s.asyncFetcher.Start()
105-
106-
s.fiRetriever = block.NewForcedInclusionRetriever(daClient, logger, s.GetDAHeight(), genesis.DAEpochForcedInclusion, s.asyncFetcher)
10794
} else {
10895
return nil, fmt.Errorf("failed to load checkpoint from DB: %w", err)
10996
}
@@ -117,22 +104,26 @@ func NewSequencer(
117104
Uint64("da_height", checkpoint.DAHeight).
118105
Msg("resuming from checkpoint within DA epoch")
119106
}
107+
}
120108

121-
initialDAHeight := s.getInitialDAStartHeight(context.Background())
109+
// Determine initial DA height for forced inclusion
110+
initialDAHeight := s.getInitialDAStartHeight(context.Background())
111+
if initialDAHeight == 0 {
112+
initialDAHeight = s.GetDAHeight()
113+
}
122114

123-
// Create async epoch fetcher for background prefetching
124-
s.asyncFetcher = block.NewAsyncEpochFetcher(
125-
daClient,
126-
logger,
127-
initialDAHeight,
128-
genesis.DAEpochForcedInclusion,
129-
1, // prefetch 1 epoch ahead
130-
3*time.Second, // check every 3 seconds
131-
)
132-
s.asyncFetcher.Start()
115+
// Create async epoch fetcher for background prefetching (created once)
116+
s.asyncFetcher = block.NewAsyncEpochFetcher(
117+
daClient,
118+
logger,
119+
initialDAHeight,
120+
genesis.DAEpochForcedInclusion,
121+
1, // prefetch 1 epoch ahead
122+
3*time.Second, // check every 3 seconds
123+
)
124+
s.asyncFetcher.Start()
133125

134-
s.fiRetriever = block.NewForcedInclusionRetriever(daClient, logger, initialDAHeight, genesis.DAEpochForcedInclusion, s.asyncFetcher)
135-
}
126+
s.fiRetriever = block.NewForcedInclusionRetriever(daClient, logger, initialDAHeight, genesis.DAEpochForcedInclusion, s.asyncFetcher)
136127

137128
return s, nil
138129
}
@@ -199,23 +190,6 @@ func (c *Sequencer) GetNextBatch(ctx context.Context, req coresequencer.GetNextB
199190
DAHeight: daHeight,
200191
TxIndex: 0,
201192
}
202-
203-
initialDAHeight := c.getInitialDAStartHeight(ctx)
204-
205-
// Create async epoch fetcher if not already created
206-
if c.asyncFetcher == nil {
207-
c.asyncFetcher = block.NewAsyncEpochFetcher(
208-
c.daClient,
209-
c.logger,
210-
initialDAHeight,
211-
c.genesis.DAEpochForcedInclusion,
212-
1, // prefetch 1 epoch ahead
213-
3*time.Second, // check every 3 seconds
214-
)
215-
c.asyncFetcher.Start()
216-
}
217-
218-
c.fiRetriever = block.NewForcedInclusionRetriever(c.daClient, c.logger, initialDAHeight, c.genesis.DAEpochForcedInclusion, c.asyncFetcher)
219193
}
220194

221195
// If we have no cached transactions or we've consumed all from the current cache,

0 commit comments

Comments
 (0)