Skip to content

Commit 1f8f963

Browse files
committed
refactor fi retriever instantiation to get correct start height
1 parent a976da9 commit 1f8f963

File tree

12 files changed

+91
-151
lines changed

12 files changed

+91
-151
lines changed

apps/evm/cmd/run.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ var RunCmd = &cobra.Command{
8888
}
8989

9090
// Create sequencer based on configuration
91-
sequencer, err := createSequencer(context.Background(), logger, datastore, nodeConfig, genesis, daClient)
91+
sequencer, err := createSequencer(logger, datastore, nodeConfig, genesis, daClient)
9292
if err != nil {
9393
return err
9494
}
@@ -154,22 +154,20 @@ func init() {
154154
// If BasedSequencer is enabled, it creates a based sequencer that fetches transactions from DA.
155155
// Otherwise, it creates a single (traditional) sequencer.
156156
func createSequencer(
157-
ctx context.Context,
158157
logger zerolog.Logger,
159158
datastore datastore.Batching,
160159
nodeConfig config.Config,
161160
genesis genesis.Genesis,
162161
daClient block.FullDAClient,
163162
) (coresequencer.Sequencer, error) {
164-
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, datastore, logger)
165-
166163
if nodeConfig.Node.BasedSequencer {
167164
// Based sequencer mode - fetch transactions only from DA
168165
if !nodeConfig.Node.Aggregator {
169166
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
170167
}
171168

172-
basedSeq, err := based.NewBasedSequencer(ctx, fiRetriever, datastore, genesis, logger)
169+
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion)
170+
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
173171
if err != nil {
174172
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
175173
}
@@ -183,15 +181,12 @@ func createSequencer(
183181
}
184182

185183
sequencer, err := single.NewSequencer(
186-
ctx,
187184
logger,
188185
datastore,
189186
daClient,
190187
[]byte(genesis.ChainID),
191188
nodeConfig.Node.BlockTime.Duration,
192-
nodeConfig.Node.Aggregator,
193189
1000,
194-
fiRetriever,
195190
genesis,
196191
)
197192
if err != nil {

apps/grpc/cmd/run.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -120,15 +120,15 @@ func createSequencer(
120120
}
121121

122122
daClient := block.NewDAClient(blobClient, nodeConfig, logger)
123-
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, datastore, logger)
124123

125124
if nodeConfig.Node.BasedSequencer {
126125
// Based sequencer mode - fetch transactions only from DA
127126
if !nodeConfig.Node.Aggregator {
128127
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
129128
}
130129

131-
basedSeq, err := based.NewBasedSequencer(ctx, fiRetriever, datastore, genesis, logger)
130+
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion)
131+
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
132132
if err != nil {
133133
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
134134
}
@@ -142,15 +142,12 @@ func createSequencer(
142142
}
143143

144144
sequencer, err := single.NewSequencer(
145-
ctx,
146145
logger,
147146
datastore,
148147
daClient,
149148
[]byte(genesis.ChainID),
150149
nodeConfig.Node.BlockTime.Duration,
151-
nodeConfig.Node.Aggregator,
152150
1000,
153-
fiRetriever,
154151
genesis,
155152
)
156153
if err != nil {

apps/testapp/cmd/run.go

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -121,15 +121,15 @@ func createSequencer(
121121
}
122122

123123
daClient := block.NewDAClient(blobClient, nodeConfig, logger)
124-
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, datastore, logger)
125124

126125
if nodeConfig.Node.BasedSequencer {
127126
// Based sequencer mode - fetch transactions only from DA
128127
if !nodeConfig.Node.Aggregator {
129128
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
130129
}
131130

132-
basedSeq, err := based.NewBasedSequencer(ctx, fiRetriever, datastore, genesis, logger)
131+
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion)
132+
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
133133
if err != nil {
134134
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
135135
}
@@ -143,15 +143,12 @@ func createSequencer(
143143
}
144144

145145
sequencer, err := single.NewSequencer(
146-
ctx,
147146
logger,
148147
datastore,
149148
daClient,
150149
[]byte(genesis.ChainID),
151150
nodeConfig.Node.BlockTime.Duration,
152-
nodeConfig.Node.Aggregator,
153151
1000,
154-
fiRetriever,
155152
genesis,
156153
)
157154
if err != nil {

block/internal/da/forced_inclusion_retriever.go

Lines changed: 8 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,13 @@ package da
22

33
import (
44
"context"
5-
"encoding/binary"
65
"errors"
76
"fmt"
87
"time"
98

109
"github.com/rs/zerolog"
1110

1211
datypes "github.com/evstack/ev-node/pkg/da/types"
13-
"github.com/evstack/ev-node/pkg/genesis"
14-
"github.com/evstack/ev-node/pkg/store"
1512
"github.com/evstack/ev-node/types"
1613
)
1714

@@ -22,7 +19,6 @@ var ErrForceInclusionNotConfigured = errors.New("forced inclusion namespace not
2219
type ForcedInclusionRetriever struct {
2320
client Client
2421
logger zerolog.Logger
25-
store store.Store
2622
daEpochSize uint64
2723
daStartHeight uint64
2824
}
@@ -38,32 +34,27 @@ type ForcedInclusionEvent struct {
3834
// NewForcedInclusionRetriever creates a new forced inclusion retriever.
3935
func NewForcedInclusionRetriever(
4036
client Client,
41-
genesis genesis.Genesis,
42-
store store.Store,
4337
logger zerolog.Logger,
38+
daStartHeight, daEpochSize uint64,
4439
) *ForcedInclusionRetriever {
45-
r := &ForcedInclusionRetriever{
46-
client: client,
47-
store: store,
48-
logger: logger.With().Str("component", "forced_inclusion_retriever").Logger(),
49-
daEpochSize: genesis.DAEpochForcedInclusion,
40+
return &ForcedInclusionRetriever{
41+
client: client,
42+
logger: logger.With().Str("component", "forced_inclusion_retriever").Logger(),
43+
daStartHeight: daStartHeight,
44+
daEpochSize: daEpochSize,
5045
}
51-
52-
// check for inclusion da height on store (sequencer) or genesis da height (full nodes)
53-
r.daStartHeight = max(r.getInitialDAStartHeight(context.Background()), genesis.DAStartHeight)
54-
return r
5546
}
5647

5748
// RetrieveForcedIncludedTxs retrieves forced inclusion transactions at the given DA height.
5849
// It respects epoch boundaries and only fetches at epoch start.
5950
func (r *ForcedInclusionRetriever) RetrieveForcedIncludedTxs(ctx context.Context, daHeight uint64) (*ForcedInclusionEvent, error) {
6051
// when daStartHeight is not set or no namespace is configured, we retrieve nothing.
61-
if !r.client.HasForcedInclusionNamespace() || r.daStartHeight == 0 {
52+
if !r.client.HasForcedInclusionNamespace() {
6253
return nil, ErrForceInclusionNotConfigured
6354
}
6455

6556
if daHeight < r.daStartHeight {
66-
return nil, ErrForceInclusionNotConfigured
57+
return nil, fmt.Errorf("DA height %d is before the configured start height %d", daHeight, r.daStartHeight)
6758
}
6859

6960
epochStart, epochEnd, currentEpochNumber := types.CalculateEpochBoundaries(daHeight, r.daStartHeight, r.daEpochSize)
@@ -184,13 +175,3 @@ func (r *ForcedInclusionRetriever) processForcedInclusionBlobs(
184175

185176
return nil
186177
}
187-
188-
// getInitialDAStartHeight retrieves the DA height of the first included chain height from store.
189-
func (r *ForcedInclusionRetriever) getInitialDAStartHeight(ctx context.Context) uint64 {
190-
daIncludedHeightBytes, err := r.store.GetMetadata(ctx, store.GenesisDAHeightKey)
191-
if err != nil || len(daIncludedHeightBytes) != 8 {
192-
return 0
193-
}
194-
195-
return binary.LittleEndian.Uint64(daIncludedHeightBytes)
196-
}

block/internal/da/forced_inclusion_retriever_test.go

Lines changed: 8 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,12 @@ import (
55
"testing"
66
"time"
77

8-
"github.com/ipfs/go-datastore"
9-
dssync "github.com/ipfs/go-datastore/sync"
108
"github.com/rs/zerolog"
119
"github.com/stretchr/testify/mock"
1210
"gotest.tools/v3/assert"
1311

1412
datypes "github.com/evstack/ev-node/pkg/da/types"
1513
"github.com/evstack/ev-node/pkg/genesis"
16-
"github.com/evstack/ev-node/pkg/store"
1714
"github.com/evstack/ev-node/test/mocks"
1815
)
1916

@@ -27,10 +24,7 @@ func TestNewForcedInclusionRetriever(t *testing.T) {
2724
DAEpochForcedInclusion: 10,
2825
}
2926

30-
ds := dssync.MutexWrap(datastore.NewMapDatastore())
31-
st := store.New(ds)
32-
33-
retriever := NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
27+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
3428
assert.Assert(t, retriever != nil)
3529
}
3630

@@ -43,10 +37,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_NoNamespace(t *testi
4337
DAEpochForcedInclusion: 10,
4438
}
4539

46-
ds := dssync.MutexWrap(datastore.NewMapDatastore())
47-
st := store.New(ds)
48-
49-
retriever := NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
40+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
5041
ctx := context.Background()
5142

5243
_, err := retriever.RetrieveForcedIncludedTxs(ctx, 100)
@@ -65,10 +56,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_NotAtEpochStart(t *t
6556
DAEpochForcedInclusion: 10,
6657
}
6758

68-
ds := dssync.MutexWrap(datastore.NewMapDatastore())
69-
st := store.New(ds)
70-
71-
retriever := NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
59+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
7260
ctx := context.Background()
7361

7462
// Height 105 is not an epoch start (100, 110, 120, etc. are epoch starts)
@@ -101,10 +89,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_EpochStartSuccess(t
10189
DAEpochForcedInclusion: 1, // Single height epoch
10290
}
10391

104-
ds := dssync.MutexWrap(datastore.NewMapDatastore())
105-
st := store.New(ds)
106-
107-
retriever := NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
92+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
10893
ctx := context.Background()
10994

11095
// Height 100 is an epoch start
@@ -131,10 +116,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_EpochStartNotAvailab
131116
DAEpochForcedInclusion: 10,
132117
}
133118

134-
ds := dssync.MutexWrap(datastore.NewMapDatastore())
135-
st := store.New(ds)
136-
137-
retriever := NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
119+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
138120
ctx := context.Background()
139121

140122
// Epoch boundaries: [100, 109] - retrieval happens at epoch end (109)
@@ -157,10 +139,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_NoBlobsAtHeight(t *t
157139
DAEpochForcedInclusion: 1, // Single height epoch
158140
}
159141

160-
ds := dssync.MutexWrap(datastore.NewMapDatastore())
161-
st := store.New(ds)
162-
163-
retriever := NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
142+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
164143
ctx := context.Background()
165144

166145
event, err := retriever.RetrieveForcedIncludedTxs(ctx, 100)
@@ -198,10 +177,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_MultiHeightEpoch(t *
198177
DAEpochForcedInclusion: 3, // Epoch: 100-102
199178
}
200179

201-
ds := dssync.MutexWrap(datastore.NewMapDatastore())
202-
st := store.New(ds)
203-
204-
retriever := NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
180+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
205181
ctx := context.Background()
206182

207183
// Epoch boundaries: [100, 102] - retrieval happens at epoch end (102)
@@ -225,10 +201,7 @@ func TestForcedInclusionRetriever_processForcedInclusionBlobs(t *testing.T) {
225201
DAEpochForcedInclusion: 10,
226202
}
227203

228-
ds := dssync.MutexWrap(datastore.NewMapDatastore())
229-
st := store.New(ds)
230-
231-
retriever := NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
204+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
232205

233206
tests := []struct {
234207
name string

block/internal/syncing/syncer.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ func (s *Syncer) Start(ctx context.Context) error {
187187

188188
// Initialize handlers
189189
s.daRetriever = NewDARetriever(s.daClient, s.cache, s.genesis, s.logger)
190-
s.fiRetriever = da.NewForcedInclusionRetriever(s.daClient, s.genesis, s.store, s.logger)
190+
s.fiRetriever = da.NewForcedInclusionRetriever(s.daClient, s.logger, s.genesis.DAStartHeight, s.genesis.DAEpochForcedInclusion)
191191
s.p2pHandler = NewP2PHandler(s.headerStore.Store(), s.dataStore.Store(), s.cache, s.genesis, s.logger)
192192
if currentHeight, err := s.store.Height(s.ctx); err != nil {
193193
s.logger.Error().Err(err).Msg("failed to set initial processed height for p2p handler")

block/internal/syncing/syncer_forced_inclusion_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ func TestVerifyForcedInclusionTxs_AllTransactionsIncluded(t *testing.T) {
370370
client.On("GetForcedInclusionNamespace").Return([]byte(cfg.DA.ForcedInclusionNamespace)).Maybe()
371371
client.On("HasForcedInclusionNamespace").Return(true).Maybe()
372372
daRetriever := NewDARetriever(client, cm, gen, zerolog.Nop())
373-
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
373+
fiRetriever := da.NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
374374

375375
s := NewSyncer(
376376
st,
@@ -443,7 +443,7 @@ func TestVerifyForcedInclusionTxs_MissingTransactions(t *testing.T) {
443443
client.On("GetForcedInclusionNamespace").Return([]byte(cfg.DA.ForcedInclusionNamespace)).Maybe()
444444
client.On("HasForcedInclusionNamespace").Return(true).Maybe()
445445
daRetriever := NewDARetriever(client, cm, gen, zerolog.Nop())
446-
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
446+
fiRetriever := da.NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
447447

448448
s := NewSyncer(
449449
st,
@@ -546,7 +546,7 @@ func TestVerifyForcedInclusionTxs_PartiallyIncluded(t *testing.T) {
546546
client.On("GetForcedInclusionNamespace").Return([]byte(cfg.DA.ForcedInclusionNamespace)).Maybe()
547547
client.On("HasForcedInclusionNamespace").Return(true).Maybe()
548548
daRetriever := NewDARetriever(client, cm, gen, zerolog.Nop())
549-
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
549+
fiRetriever := da.NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
550550

551551
s := NewSyncer(
552552
st,
@@ -653,7 +653,7 @@ func TestVerifyForcedInclusionTxs_NoForcedTransactions(t *testing.T) {
653653
client.On("GetForcedInclusionNamespace").Return([]byte(cfg.DA.ForcedInclusionNamespace)).Maybe()
654654
client.On("HasForcedInclusionNamespace").Return(true).Maybe()
655655
daRetriever := NewDARetriever(client, cm, gen, zerolog.Nop())
656-
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
656+
fiRetriever := da.NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
657657

658658
s := NewSyncer(
659659
st,
@@ -719,7 +719,7 @@ func TestVerifyForcedInclusionTxs_NamespaceNotConfigured(t *testing.T) {
719719
client.On("GetForcedInclusionNamespace").Return([]byte(nil)).Maybe()
720720
client.On("HasForcedInclusionNamespace").Return(false).Maybe()
721721
daRetriever := NewDARetriever(client, cm, gen, zerolog.Nop())
722-
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
722+
fiRetriever := da.NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
723723

724724
s := NewSyncer(
725725
st,
@@ -784,7 +784,7 @@ func TestVerifyForcedInclusionTxs_DeferralWithinEpoch(t *testing.T) {
784784
client.On("GetForcedInclusionNamespace").Return([]byte(cfg.DA.ForcedInclusionNamespace)).Maybe()
785785
client.On("HasForcedInclusionNamespace").Return(true).Maybe()
786786
daRetriever := NewDARetriever(client, cm, gen, zerolog.Nop())
787-
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
787+
fiRetriever := da.NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
788788

789789
s := NewSyncer(
790790
st,
@@ -907,7 +907,7 @@ func TestVerifyForcedInclusionTxs_MaliciousAfterEpochEnd(t *testing.T) {
907907
client.On("GetForcedInclusionNamespace").Return([]byte(cfg.DA.ForcedInclusionNamespace)).Maybe()
908908
client.On("HasForcedInclusionNamespace").Return(true).Maybe()
909909
daRetriever := NewDARetriever(client, cm, gen, zerolog.Nop())
910-
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
910+
fiRetriever := da.NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
911911

912912
s := NewSyncer(
913913
st,
@@ -996,7 +996,7 @@ func TestVerifyForcedInclusionTxs_SmoothingExceedsEpoch(t *testing.T) {
996996
client.On("HasForcedInclusionNamespace").Return(true).Maybe()
997997

998998
daRetriever := NewDARetriever(client, cm, gen, zerolog.Nop())
999-
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
999+
fiRetriever := da.NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
10001000

10011001
s := NewSyncer(
10021002
st,

0 commit comments

Comments
 (0)