Skip to content

Commit 993c2b1

Browse files
committed
Merge branch 'main' into alex/2609_hints
* main: fix: make evm_execution more robust (#2942) fix(sequencers/single): deterministic queue (#2938) fix(block): fix init logic sequencer for da epoch fetching (#2926)
2 parents e593848 + d386df5 commit 993c2b1

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+1917
-983
lines changed

.mockery.yaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,11 @@ packages:
6868
dir: ./test/mocks
6969
pkgname: mocks
7070
filename: da.go
71-
github.com/evstack/ev-node/pkg/da/types:
72-
interfaces:
7371
Verifier:
7472
config:
7573
dir: ./test/mocks
7674
pkgname: mocks
77-
filename: da_verifier.go
75+
filename: da.go
7876
github.com/evstack/ev-node/pkg/da/jsonrpc:
7977
interfaces:
8078
BlobModule:

apps/evm/cmd/rollback.go

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

88
"github.com/evstack/ev-node/types"
9-
ds "github.com/ipfs/go-datastore"
10-
kt "github.com/ipfs/go-datastore/keytransform"
119
"github.com/spf13/cobra"
1210

1311
goheaderstore "github.com/celestiaorg/go-header/store"
14-
"github.com/evstack/ev-node/node"
1512
rollcmd "github.com/evstack/ev-node/pkg/cmd"
1613
"github.com/evstack/ev-node/pkg/store"
1714
)
@@ -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: 14 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,23 @@ var RunCmd = &cobra.Command{
4343
Aliases: []string{"node", "run"},
4444
Short: "Run the evolve node with EVM execution client",
4545
RunE: func(cmd *cobra.Command, args []string) error {
46-
executor, err := createExecutionClient(cmd)
46+
nodeConfig, err := rollcmd.ParseConfig(cmd)
4747
if err != nil {
4848
return err
4949
}
5050

51-
nodeConfig, err := rollcmd.ParseConfig(cmd)
51+
logger := rollcmd.SetupLogger(nodeConfig.Log)
52+
53+
// Create datastore first - needed by execution client for ExecMeta tracking
54+
datastore, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, evmDbName)
5255
if err != nil {
5356
return err
5457
}
5558

56-
logger := rollcmd.SetupLogger(nodeConfig.Log)
59+
executor, err := createExecutionClient(cmd, datastore)
60+
if err != nil {
61+
return err
62+
}
5763

5864
blobClient, err := blobrpc.NewClient(context.Background(), nodeConfig.DA.Address, nodeConfig.DA.AuthToken, "")
5965
if err != nil {
@@ -72,11 +78,6 @@ var RunCmd = &cobra.Command{
7278

7379
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
7480

75-
datastore, err := store.NewDefaultKVStore(nodeConfig.RootDir, nodeConfig.DBPath, evmDbName)
76-
if err != nil {
77-
return err
78-
}
79-
8081
genesisPath := filepath.Join(filepath.Dir(nodeConfig.ConfigPath()), "genesis.json")
8182
genesis, err := genesispkg.LoadGenesis(genesisPath)
8283
if err != nil {
@@ -88,7 +89,7 @@ var RunCmd = &cobra.Command{
8889
}
8990

9091
// Create sequencer based on configuration
91-
sequencer, err := createSequencer(context.Background(), logger, datastore, nodeConfig, genesis, daClient)
92+
sequencer, err := createSequencer(logger, datastore, nodeConfig, genesis, daClient)
9293
if err != nil {
9394
return err
9495
}
@@ -154,22 +155,20 @@ func init() {
154155
// If BasedSequencer is enabled, it creates a based sequencer that fetches transactions from DA.
155156
// Otherwise, it creates a single (traditional) sequencer.
156157
func createSequencer(
157-
ctx context.Context,
158158
logger zerolog.Logger,
159159
datastore datastore.Batching,
160160
nodeConfig config.Config,
161161
genesis genesis.Genesis,
162162
daClient block.FullDAClient,
163163
) (coresequencer.Sequencer, error) {
164-
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, logger)
165-
166164
if nodeConfig.Node.BasedSequencer {
167165
// Based sequencer mode - fetch transactions only from DA
168166
if !nodeConfig.Node.Aggregator {
169167
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
170168
}
171169

172-
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)
173172
if err != nil {
174173
return nil, fmt.Errorf("failed to create based sequencer: %w", err)
175174
}
@@ -183,15 +182,12 @@ func createSequencer(
183182
}
184183

185184
sequencer, err := single.NewSequencer(
186-
ctx,
187185
logger,
188186
datastore,
189187
daClient,
190188
[]byte(genesis.ChainID),
191189
nodeConfig.Node.BlockTime.Duration,
192-
nodeConfig.Node.Aggregator,
193190
1000,
194-
fiRetriever,
195191
genesis,
196192
)
197193
if err != nil {
@@ -205,7 +201,7 @@ func createSequencer(
205201
return sequencer, nil
206202
}
207203

208-
func createExecutionClient(cmd *cobra.Command) (execution.Executor, error) {
204+
func createExecutionClient(cmd *cobra.Command, db datastore.Batching) (execution.Executor, error) {
209205
// Read execution client parameters from flags
210206
ethURL, err := cmd.Flags().GetString(evm.FlagEvmEthURL)
211207
if err != nil {
@@ -250,7 +246,7 @@ func createExecutionClient(cmd *cobra.Command) (execution.Executor, error) {
250246
genesisHash := common.HexToHash(genesisHashStr)
251247
feeRecipient := common.HexToAddress(feeRecipientStr)
252248

253-
return evm.NewEngineExecutionClient(ethURL, engineURL, jwtSecret, genesisHash, feeRecipient)
249+
return evm.NewEngineExecutionClient(ethURL, engineURL, jwtSecret, genesisHash, feeRecipient, db)
254250
}
255251

256252
// addFlags adds flags related to the EVM execution client

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: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,12 @@ import (
55
"errors"
66
"fmt"
77

8-
goheaderstore "github.com/celestiaorg/go-header/store"
98
kvexecutor "github.com/evstack/ev-node/apps/testapp/kv"
10-
"github.com/evstack/ev-node/node"
119
rollcmd "github.com/evstack/ev-node/pkg/cmd"
1210
"github.com/evstack/ev-node/pkg/store"
1311
"github.com/evstack/ev-node/types"
14-
ds "github.com/ipfs/go-datastore"
15-
kt "github.com/ipfs/go-datastore/keytransform"
12+
13+
goheaderstore "github.com/celestiaorg/go-header/store"
1614
"github.com/spf13/cobra"
1715
)
1816

@@ -50,10 +48,7 @@ func NewRollbackCmd() *cobra.Command {
5048
}()
5149

5250
// prefixed evolve db
53-
evolveDB := kt.Wrap(rawEvolveDB, &kt.PrefixTransform{
54-
Prefix: ds.NewKey(node.EvPrefix),
55-
})
56-
51+
evolveDB := store.NewEvNodeKVStore(rawEvolveDB)
5752
evolveStore := store.New(evolveDB)
5853
if height == 0 {
5954
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
@@ -160,6 +160,7 @@ func NewSyncComponents(
160160
config,
161161
genesis,
162162
daSubmitter,
163+
nil, // No sequencer for sync nodes
163164
nil, // No signer for sync nodes
164165
logger,
165166
errorCh,
@@ -249,6 +250,7 @@ func NewAggregatorComponents(
249250
config,
250251
genesis,
251252
daSubmitter,
253+
sequencer,
252254
signer, // Signer for aggregator nodes to submit to DA
253255
logger,
254256
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

0 commit comments

Comments
 (0)