Skip to content

Commit 03335c4

Browse files
authored
Merge branch 'main' into marko/execution_refactor
2 parents e9ba0f9 + d4a2da9 commit 03335c4

File tree

24 files changed

+651
-491
lines changed

24 files changed

+651
-491
lines changed

apps/evm/cmd/rollback.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,9 @@ import (
55
"errors"
66
"fmt"
77

8-
ds "github.com/ipfs/go-datastore"
9-
kt "github.com/ipfs/go-datastore/keytransform"
108
"github.com/spf13/cobra"
119

1210
goheaderstore "github.com/celestiaorg/go-header/store"
13-
"github.com/evstack/ev-node/node"
1411
rollcmd "github.com/evstack/ev-node/pkg/cmd"
1512
"github.com/evstack/ev-node/pkg/store"
1613
"github.com/evstack/ev-node/types"
@@ -50,10 +47,7 @@ func NewRollbackCmd() *cobra.Command {
5047
}()
5148

5249
// prefixed evolve db
53-
evolveDB := kt.Wrap(rawEvolveDB, &kt.PrefixTransform{
54-
Prefix: ds.NewKey(node.EvPrefix),
55-
})
56-
50+
evolveDB := store.NewEvNodeKVStore(rawEvolveDB)
5751
evolveStore := store.New(evolveDB)
5852
if height == 0 {
5953
currentHeight, err := evolveStore.Height(goCtx)

apps/evm/cmd/run.go

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

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

173-
basedSeq, err := based.NewBasedSequencer(ctx, fiRetriever, datastore, genesis, logger)
170+
fiRetriever := block.NewForcedInclusionRetriever(daClient, logger, genesis.DAStartHeight, genesis.DAEpochForcedInclusion)
171+
basedSeq, err := based.NewBasedSequencer(fiRetriever, datastore, genesis, logger)
174172
if err != nil {
175173
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
176174
}
@@ -184,15 +182,12 @@ func createSequencer(
184182
}
185183

186184
sequencer, err := single.NewSequencer(
187-
ctx,
188185
logger,
189186
datastore,
190187
daClient,
191188
[]byte(genesis.ChainID),
192189
nodeConfig.Node.BlockTime.Duration,
193-
nodeConfig.Node.Aggregator,
194190
1000,
195-
fiRetriever,
196191
genesis,
197192
)
198193
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, 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/rollback.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,11 @@ import (
66
"fmt"
77

88
kvexecutor "github.com/evstack/ev-node/apps/testapp/kv"
9-
"github.com/evstack/ev-node/node"
109
rollcmd "github.com/evstack/ev-node/pkg/cmd"
1110
"github.com/evstack/ev-node/pkg/store"
1211
"github.com/evstack/ev-node/types"
1312

1413
goheaderstore "github.com/celestiaorg/go-header/store"
15-
ds "github.com/ipfs/go-datastore"
16-
kt "github.com/ipfs/go-datastore/keytransform"
1714
"github.com/spf13/cobra"
1815
)
1916

@@ -51,10 +48,7 @@ func NewRollbackCmd() *cobra.Command {
5148
}()
5249

5350
// prefixed evolve db
54-
evolveDB := kt.Wrap(rawEvolveDB, &kt.PrefixTransform{
55-
Prefix: ds.NewKey(node.EvPrefix),
56-
})
57-
51+
evolveDB := store.NewEvNodeKVStore(rawEvolveDB)
5852
evolveStore := store.New(evolveDB)
5953
if height == 0 {
6054
currentHeight, err := evolveStore.Height(goCtx)

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, 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/components.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ func NewSyncComponents(
161161
config,
162162
genesis,
163163
daSubmitter,
164+
nil, // No sequencer for sync nodes
164165
nil, // No signer for sync nodes
165166
logger,
166167
errorCh,
@@ -250,6 +251,7 @@ func NewAggregatorComponents(
250251
config,
251252
genesis,
252253
daSubmitter,
254+
sequencer,
253255
signer, // Signer for aggregator nodes to submit to DA
254256
logger,
255257
errorCh,

block/internal/da/forced_inclusion_retriever.go

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import (
99
"github.com/rs/zerolog"
1010

1111
datypes "github.com/evstack/ev-node/pkg/da/types"
12-
"github.com/evstack/ev-node/pkg/genesis"
1312
"github.com/evstack/ev-node/types"
1413
)
1514

@@ -18,10 +17,10 @@ var ErrForceInclusionNotConfigured = errors.New("forced inclusion namespace not
1817

1918
// ForcedInclusionRetriever handles retrieval of forced inclusion transactions from DA.
2019
type ForcedInclusionRetriever struct {
21-
client Client
22-
genesis genesis.Genesis
23-
logger zerolog.Logger
24-
daEpochSize uint64
20+
client Client
21+
logger zerolog.Logger
22+
daEpochSize uint64
23+
daStartHeight uint64
2524
}
2625

2726
// ForcedInclusionEvent contains forced inclusion transactions retrieved from DA.
@@ -35,25 +34,30 @@ type ForcedInclusionEvent struct {
3534
// NewForcedInclusionRetriever creates a new forced inclusion retriever.
3635
func NewForcedInclusionRetriever(
3736
client Client,
38-
genesis genesis.Genesis,
3937
logger zerolog.Logger,
38+
daStartHeight, daEpochSize uint64,
4039
) *ForcedInclusionRetriever {
4140
return &ForcedInclusionRetriever{
42-
client: client,
43-
genesis: genesis,
44-
logger: logger.With().Str("component", "forced_inclusion_retriever").Logger(),
45-
daEpochSize: genesis.DAEpochForcedInclusion,
41+
client: client,
42+
logger: logger.With().Str("component", "forced_inclusion_retriever").Logger(),
43+
daStartHeight: daStartHeight,
44+
daEpochSize: daEpochSize,
4645
}
4746
}
4847

4948
// RetrieveForcedIncludedTxs retrieves forced inclusion transactions at the given DA height.
5049
// It respects epoch boundaries and only fetches at epoch start.
5150
func (r *ForcedInclusionRetriever) RetrieveForcedIncludedTxs(ctx context.Context, daHeight uint64) (*ForcedInclusionEvent, error) {
51+
// when daStartHeight is not set or no namespace is configured, we retrieve nothing.
5252
if !r.client.HasForcedInclusionNamespace() {
5353
return nil, ErrForceInclusionNotConfigured
5454
}
5555

56-
epochStart, epochEnd, currentEpochNumber := types.CalculateEpochBoundaries(daHeight, r.genesis.DAStartHeight, r.daEpochSize)
56+
if daHeight < r.daStartHeight {
57+
return nil, fmt.Errorf("DA height %d is before the configured start height %d", daHeight, r.daStartHeight)
58+
}
59+
60+
epochStart, epochEnd, currentEpochNumber := types.CalculateEpochBoundaries(daHeight, r.daStartHeight, r.daEpochSize)
5761

5862
if daHeight != epochEnd {
5963
r.logger.Debug().

block/internal/da/forced_inclusion_retriever_test.go

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ func TestNewForcedInclusionRetriever(t *testing.T) {
2424
DAEpochForcedInclusion: 10,
2525
}
2626

27-
retriever := NewForcedInclusionRetriever(client, gen, zerolog.Nop())
27+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
2828
assert.Assert(t, retriever != nil)
2929
}
3030

@@ -37,7 +37,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_NoNamespace(t *testi
3737
DAEpochForcedInclusion: 10,
3838
}
3939

40-
retriever := NewForcedInclusionRetriever(client, gen, zerolog.Nop())
40+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
4141
ctx := context.Background()
4242

4343
_, err := retriever.RetrieveForcedIncludedTxs(ctx, 100)
@@ -56,7 +56,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_NotAtEpochStart(t *t
5656
DAEpochForcedInclusion: 10,
5757
}
5858

59-
retriever := NewForcedInclusionRetriever(client, gen, zerolog.Nop())
59+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
6060
ctx := context.Background()
6161

6262
// Height 105 is not an epoch start (100, 110, 120, etc. are epoch starts)
@@ -89,7 +89,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_EpochStartSuccess(t
8989
DAEpochForcedInclusion: 1, // Single height epoch
9090
}
9191

92-
retriever := NewForcedInclusionRetriever(client, gen, zerolog.Nop())
92+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
9393
ctx := context.Background()
9494

9595
// Height 100 is an epoch start
@@ -116,7 +116,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_EpochStartNotAvailab
116116
DAEpochForcedInclusion: 10,
117117
}
118118

119-
retriever := NewForcedInclusionRetriever(client, gen, zerolog.Nop())
119+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
120120
ctx := context.Background()
121121

122122
// Epoch boundaries: [100, 109] - retrieval happens at epoch end (109)
@@ -139,7 +139,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_NoBlobsAtHeight(t *t
139139
DAEpochForcedInclusion: 1, // Single height epoch
140140
}
141141

142-
retriever := NewForcedInclusionRetriever(client, gen, zerolog.Nop())
142+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
143143
ctx := context.Background()
144144

145145
event, err := retriever.RetrieveForcedIncludedTxs(ctx, 100)
@@ -177,7 +177,7 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_MultiHeightEpoch(t *
177177
DAEpochForcedInclusion: 3, // Epoch: 100-102
178178
}
179179

180-
retriever := NewForcedInclusionRetriever(client, gen, zerolog.Nop())
180+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
181181
ctx := context.Background()
182182

183183
// Epoch boundaries: [100, 102] - retrieval happens at epoch end (102)
@@ -201,7 +201,7 @@ func TestForcedInclusionRetriever_processForcedInclusionBlobs(t *testing.T) {
201201
DAEpochForcedInclusion: 10,
202202
}
203203

204-
retriever := NewForcedInclusionRetriever(client, gen, zerolog.Nop())
204+
retriever := NewForcedInclusionRetriever(client, zerolog.Nop(), gen.DAStartHeight, gen.DAEpochForcedInclusion)
205205

206206
tests := []struct {
207207
name string

block/internal/executing/executor.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,8 @@ func (e *Executor) initializeState() error {
197197
LastBlockHeight: e.genesis.InitialHeight - 1,
198198
LastBlockTime: e.genesis.StartTime,
199199
AppHash: stateRoot,
200-
DAHeight: e.genesis.DAStartHeight,
200+
// DA start height is usually 0 at InitChain unless it is a re-genesis or a based sequencer.
201+
DAHeight: e.genesis.DAStartHeight,
201202
}
202203
}
203204

block/internal/submitting/submitter.go

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import (
1515
"github.com/evstack/ev-node/block/internal/cache"
1616
"github.com/evstack/ev-node/block/internal/common"
1717
coreexecutor "github.com/evstack/ev-node/core/execution"
18+
coresequencer "github.com/evstack/ev-node/core/sequencer"
1819
"github.com/evstack/ev-node/pkg/config"
1920
"github.com/evstack/ev-node/pkg/genesis"
2021
"github.com/evstack/ev-node/pkg/signer"
@@ -31,10 +32,11 @@ type daSubmitterAPI interface {
3132
// Submitter handles DA submission and inclusion processing for both sync and aggregator nodes
3233
type Submitter struct {
3334
// Core components
34-
store store.Store
35-
exec coreexecutor.Executor
36-
config config.Config
37-
genesis genesis.Genesis
35+
store store.Store
36+
exec coreexecutor.Executor
37+
sequencer coresequencer.Sequencer
38+
config config.Config
39+
genesis genesis.Genesis
3840

3941
// Shared components
4042
cache cache.Manager
@@ -74,6 +76,7 @@ func NewSubmitter(
7476
config config.Config,
7577
genesis genesis.Genesis,
7678
daSubmitter daSubmitterAPI,
79+
sequencer coresequencer.Sequencer, // Can be nil for sync nodes
7780
signer signer.Signer, // Can be nil for sync nodes
7881
logger zerolog.Logger,
7982
errorCh chan<- error,
@@ -86,6 +89,7 @@ func NewSubmitter(
8689
config: config,
8790
genesis: genesis,
8891
daSubmitter: daSubmitter,
92+
sequencer: sequencer,
8993
signer: signer,
9094
daIncludedHeight: &atomic.Uint64{},
9195
errorCh: errorCh,
@@ -364,6 +368,12 @@ func (s *Submitter) setSequencerHeightToDAHeight(ctx context.Context, height uin
364368
if err := s.store.SetMetadata(ctx, store.GenesisDAHeightKey, genesisDAIncludedHeightBytes); err != nil {
365369
return err
366370
}
371+
372+
// the sequencer will process DA epochs from this height.
373+
if s.sequencer != nil {
374+
s.sequencer.SetDAHeight(genesisDAIncludedHeight)
375+
s.logger.Debug().Uint64("genesis_da_height", genesisDAIncludedHeight).Msg("initialized sequencer DA height from persisted genesis DA height")
376+
}
367377
}
368378

369379
return nil

0 commit comments

Comments
 (0)