Skip to content

Commit 459b570

Browse files
authored
Merge branch 'main' into bring-pkg-blob-from-blob-rpc
2 parents d523336 + 5ee785f commit 459b570

Some content is hidden

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

52 files changed

+5204
-747
lines changed

CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,22 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
99

1010
## [Unreleased]
1111

12+
### Added
13+
14+
- Implement forced inclusion and based sequencing ([#2797](https://github.com/evstack/ev-node/pull/2797))
15+
This changes requires to add a `da_epoch_forced_inclusion` field in `genesis.json` file.
16+
To enable this feature, set the force inclusion namespace in the `evnode.yaml`.
17+
1218
### Changed
1319

1420
- Rename `evm-single` to `evm` and `grpc-single` to `evgrpc` for clarity. [#2839](https://github.com/evstack/ev-node/pull/2839)
1521
- Split cache interface in `CacheManager` and `PendingManager` and create `da` client to easy DA handling. [#2878](https://github.com/evstack/ev-node/pull/2878)
1622
- Improve startup da retrieval height when cache cleared or empty. [#2880](https://github.com/evstack/ev-node/pull/2880)
1723

24+
### Removed
25+
26+
- **BREAKING:** Removed unused and confusing metrics from sequencers and block processing, including sequencer-specific metrics (gas price, blob size, transaction status, pending blocks), channel buffer metrics, overly granular error metrics, block production categorization metrics, and sync lag metrics. Essential metrics for DA submission health, block production, and performance monitoring are retained. [#2904](https://github.com/evstack/ev-node/pull/2904)
27+
1828
## v1.0.0-beta.10
1929

2030
### Added

apps/evm/cmd/run.go

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/rs/zerolog"
1313
"github.com/spf13/cobra"
1414

15+
"github.com/evstack/ev-node/block"
1516
"github.com/evstack/ev-node/core/da"
1617
"github.com/evstack/ev-node/core/execution"
1718
coresequencer "github.com/evstack/ev-node/core/sequencer"
@@ -25,6 +26,8 @@ import (
2526
"github.com/evstack/ev-node/pkg/p2p"
2627
"github.com/evstack/ev-node/pkg/p2p/key"
2728
"github.com/evstack/ev-node/pkg/store"
29+
"github.com/evstack/ev-node/sequencers/based"
30+
seqcommon "github.com/evstack/ev-node/sequencers/common"
2831
"github.com/evstack/ev-node/sequencers/single"
2932
)
3033

@@ -57,7 +60,7 @@ var RunCmd = &cobra.Command{
5760

5861
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
5962

60-
daJrpc, err := jsonrpc.NewClient(context.Background(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, rollcmd.DefaultMaxBlobSize)
63+
daJrpc, err := jsonrpc.NewClient(context.Background(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, seqcommon.AbsoluteMaxBlobSize)
6164
if err != nil {
6265
return err
6366
}
@@ -103,6 +106,8 @@ func init() {
103106
}
104107

105108
// createSequencer creates a sequencer based on the configuration.
109+
// If BasedSequencer is enabled, it creates a based sequencer that fetches transactions from DA.
110+
// Otherwise, it creates a single (traditional) sequencer.
106111
func createSequencer(
107112
ctx context.Context,
108113
logger zerolog.Logger,
@@ -111,6 +116,25 @@ func createSequencer(
111116
nodeConfig config.Config,
112117
genesis genesis.Genesis,
113118
) (coresequencer.Sequencer, error) {
119+
daClient := block.NewDAClient(da, nodeConfig, logger)
120+
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, logger)
121+
122+
if nodeConfig.Node.BasedSequencer {
123+
// Based sequencer mode - fetch transactions only from DA
124+
if !nodeConfig.Node.Aggregator {
125+
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
126+
}
127+
128+
basedSeq := based.NewBasedSequencer(fiRetriever, da, nodeConfig, genesis, logger)
129+
130+
logger.Info().
131+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
132+
Uint64("da_epoch", genesis.DAEpochForcedInclusion).
133+
Msg("based sequencer initialized")
134+
135+
return basedSeq, nil
136+
}
137+
114138
sequencer, err := single.NewSequencer(
115139
ctx,
116140
logger,
@@ -119,11 +143,18 @@ func createSequencer(
119143
[]byte(genesis.ChainID),
120144
nodeConfig.Node.BlockTime.Duration,
121145
nodeConfig.Node.Aggregator,
146+
1000,
147+
fiRetriever,
148+
genesis,
122149
)
123150
if err != nil {
124151
return nil, fmt.Errorf("failed to create single sequencer: %w", err)
125152
}
126153

154+
logger.Info().
155+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
156+
Msg("single sequencer initialized")
157+
127158
return sequencer, nil
128159
}
129160

apps/evm/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ require (
1515
github.com/ethereum/go-ethereum v1.16.7
1616
github.com/evstack/ev-node v1.0.0-beta.10
1717
github.com/evstack/ev-node/core v1.0.0-beta.5
18-
github.com/evstack/ev-node/da v1.0.0-beta.6
18+
github.com/evstack/ev-node/da v0.0.0-00010101000000-000000000000
1919
github.com/evstack/ev-node/execution/evm v1.0.0-beta.3
2020
github.com/ipfs/go-datastore v0.9.0
2121
github.com/rs/zerolog v1.34.0
@@ -34,7 +34,7 @@ require (
3434
github.com/celestiaorg/go-libp2p-messenger v0.2.2 // indirect
3535
github.com/celestiaorg/go-square/v3 v3.0.2 // indirect
3636
github.com/cespare/xxhash/v2 v2.3.0 // indirect
37-
github.com/consensys/gnark-crypto v0.18.1 // indirect
37+
github.com/consensys/gnark-crypto v0.18.0 // indirect
3838
github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect
3939
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect
4040
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect

apps/evm/go.sum

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,8 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP
5757
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
5858
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
5959
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
60-
github.com/consensys/gnark-crypto v0.18.1 h1:RyLV6UhPRoYYzaFnPQA4qK3DyuDgkTgskDdoGqFt3fI=
61-
github.com/consensys/gnark-crypto v0.18.1/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c=
60+
github.com/consensys/gnark-crypto v0.18.0 h1:vIye/FqI50VeAr0B3dx+YjeIvmc3LWz4yEfbWBpTUf0=
61+
github.com/consensys/gnark-crypto v0.18.0/go.mod h1:L3mXGFTe1ZN+RSJ+CLjUt9x7PNdx8ubaYfDROyp2Z8c=
6262
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
6363
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
6464
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=

apps/grpc/cmd/run.go

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/rs/zerolog"
1010
"github.com/spf13/cobra"
1111

12+
"github.com/evstack/ev-node/block"
1213
"github.com/evstack/ev-node/core/da"
1314
"github.com/evstack/ev-node/core/execution"
1415
coresequencer "github.com/evstack/ev-node/core/sequencer"
@@ -22,6 +23,8 @@ import (
2223
"github.com/evstack/ev-node/pkg/p2p"
2324
"github.com/evstack/ev-node/pkg/p2p/key"
2425
"github.com/evstack/ev-node/pkg/store"
26+
"github.com/evstack/ev-node/sequencers/based"
27+
seqcommon "github.com/evstack/ev-node/sequencers/common"
2528
"github.com/evstack/ev-node/sequencers/single"
2629
)
2730

@@ -58,7 +61,7 @@ The execution client must implement the Evolve execution gRPC interface.`,
5861
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
5962

6063
// Create DA client
61-
daJrpc, err := jsonrpc.NewClient(cmd.Context(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, rollcmd.DefaultMaxBlobSize)
64+
daJrpc, err := jsonrpc.NewClient(cmd.Context(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, seqcommon.AbsoluteMaxBlobSize)
6265
if err != nil {
6366
return err
6467
}
@@ -119,6 +122,25 @@ func createSequencer(
119122
nodeConfig config.Config,
120123
genesis genesis.Genesis,
121124
) (coresequencer.Sequencer, error) {
125+
daClient := block.NewDAClient(da, nodeConfig, logger)
126+
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, logger)
127+
128+
if nodeConfig.Node.BasedSequencer {
129+
// Based sequencer mode - fetch transactions only from DA
130+
if !nodeConfig.Node.Aggregator {
131+
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
132+
}
133+
134+
basedSeq := based.NewBasedSequencer(fiRetriever, da, nodeConfig, genesis, logger)
135+
136+
logger.Info().
137+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
138+
Uint64("da_epoch", genesis.DAEpochForcedInclusion).
139+
Msg("based sequencer initialized")
140+
141+
return basedSeq, nil
142+
}
143+
122144
sequencer, err := single.NewSequencer(
123145
ctx,
124146
logger,
@@ -127,11 +149,18 @@ func createSequencer(
127149
[]byte(genesis.ChainID),
128150
nodeConfig.Node.BlockTime.Duration,
129151
nodeConfig.Node.Aggregator,
152+
1000,
153+
fiRetriever,
154+
genesis,
130155
)
131156
if err != nil {
132157
return nil, fmt.Errorf("failed to create single sequencer: %w", err)
133158
}
134159

160+
logger.Info().
161+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
162+
Msg("single sequencer initialized")
163+
135164
return sequencer, nil
136165
}
137166

apps/testapp/cmd/run.go

Lines changed: 71 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,24 @@ import (
55
"fmt"
66
"path/filepath"
77

8+
"github.com/ipfs/go-datastore"
9+
"github.com/rs/zerolog"
810
"github.com/spf13/cobra"
911

1012
kvexecutor "github.com/evstack/ev-node/apps/testapp/kv"
13+
"github.com/evstack/ev-node/block"
1114
"github.com/evstack/ev-node/core/da"
15+
coresequencer "github.com/evstack/ev-node/core/sequencer"
1216
"github.com/evstack/ev-node/da/jsonrpc"
1317
"github.com/evstack/ev-node/node"
14-
rollcmd "github.com/evstack/ev-node/pkg/cmd"
15-
genesispkg "github.com/evstack/ev-node/pkg/genesis"
18+
"github.com/evstack/ev-node/pkg/cmd"
19+
"github.com/evstack/ev-node/pkg/config"
20+
"github.com/evstack/ev-node/pkg/genesis"
1621
"github.com/evstack/ev-node/pkg/p2p"
1722
"github.com/evstack/ev-node/pkg/p2p/key"
1823
"github.com/evstack/ev-node/pkg/store"
24+
"github.com/evstack/ev-node/sequencers/based"
25+
seqcommon "github.com/evstack/ev-node/sequencers/common"
1926
"github.com/evstack/ev-node/sequencers/single"
2027
)
2128

@@ -25,16 +32,16 @@ var RunCmd = &cobra.Command{
2532
Use: "start",
2633
Aliases: []string{"node", "run"},
2734
Short: "Run the testapp node",
28-
RunE: func(cmd *cobra.Command, args []string) error {
29-
nodeConfig, err := rollcmd.ParseConfig(cmd)
35+
RunE: func(command *cobra.Command, args []string) error {
36+
nodeConfig, err := cmd.ParseConfig(command)
3037
if err != nil {
3138
return err
3239
}
3340

34-
logger := rollcmd.SetupLogger(nodeConfig.Log)
41+
logger := cmd.SetupLogger(nodeConfig.Log)
3542

3643
// Get KV endpoint flag
37-
kvEndpoint, _ := cmd.Flags().GetString(flagKVEndpoint)
44+
kvEndpoint, _ := command.Flags().GetString(flagKVEndpoint)
3845
if kvEndpoint == "" {
3946
logger.Info().Msg("KV endpoint flag not set, using default from http_server")
4047
}
@@ -53,7 +60,7 @@ var RunCmd = &cobra.Command{
5360

5461
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
5562

56-
daJrpc, err := jsonrpc.NewClient(ctx, logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, rollcmd.DefaultMaxBlobSize)
63+
daJrpc, err := jsonrpc.NewClient(ctx, logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, seqcommon.AbsoluteMaxBlobSize)
5764
if err != nil {
5865
return err
5966
}
@@ -80,7 +87,7 @@ var RunCmd = &cobra.Command{
8087
}
8188

8289
genesisPath := filepath.Join(filepath.Dir(nodeConfig.ConfigPath()), "genesis.json")
83-
genesis, err := genesispkg.LoadGenesis(genesisPath)
90+
genesis, err := genesis.LoadGenesis(genesisPath)
8491
if err != nil {
8592
return fmt.Errorf("failed to load genesis: %w", err)
8693
}
@@ -89,15 +96,8 @@ var RunCmd = &cobra.Command{
8996
logger.Warn().Msg("da_start_height is not set in genesis.json, ask your chain developer")
9097
}
9198

92-
sequencer, err := single.NewSequencer(
93-
ctx,
94-
logger,
95-
datastore,
96-
&daJrpc.DA,
97-
[]byte(genesis.ChainID),
98-
nodeConfig.Node.BlockTime.Duration,
99-
nodeConfig.Node.Aggregator,
100-
)
99+
// Create sequencer based on configuration
100+
sequencer, err := createSequencer(ctx, logger, datastore, &daJrpc.DA, nodeConfig, genesis)
101101
if err != nil {
102102
return err
103103
}
@@ -107,6 +107,59 @@ var RunCmd = &cobra.Command{
107107
return err
108108
}
109109

110-
return rollcmd.StartNode(logger, cmd, executor, sequencer, &daJrpc.DA, p2pClient, datastore, nodeConfig, genesis, node.NodeOptions{})
110+
return cmd.StartNode(logger, command, executor, sequencer, &daJrpc.DA, p2pClient, datastore, nodeConfig, genesis, node.NodeOptions{})
111111
},
112112
}
113+
114+
// createSequencer creates a sequencer based on the configuration.
115+
// If BasedSequencer is enabled, it creates a based sequencer that fetches transactions from DA.
116+
// Otherwise, it creates a single (traditional) sequencer.
117+
func createSequencer(
118+
ctx context.Context,
119+
logger zerolog.Logger,
120+
datastore datastore.Batching,
121+
da da.DA,
122+
nodeConfig config.Config,
123+
genesis genesis.Genesis,
124+
) (coresequencer.Sequencer, error) {
125+
daClient := block.NewDAClient(da, nodeConfig, logger)
126+
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, logger)
127+
128+
if nodeConfig.Node.BasedSequencer {
129+
// Based sequencer mode - fetch transactions only from DA
130+
if !nodeConfig.Node.Aggregator {
131+
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
132+
}
133+
134+
basedSeq := based.NewBasedSequencer(fiRetriever, da, nodeConfig, genesis, logger)
135+
136+
logger.Info().
137+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
138+
Uint64("da_epoch", genesis.DAEpochForcedInclusion).
139+
Msg("based sequencer initialized")
140+
141+
return basedSeq, nil
142+
}
143+
144+
sequencer, err := single.NewSequencer(
145+
ctx,
146+
logger,
147+
datastore,
148+
da,
149+
[]byte(genesis.ChainID),
150+
nodeConfig.Node.BlockTime.Duration,
151+
nodeConfig.Node.Aggregator,
152+
1000,
153+
fiRetriever,
154+
genesis,
155+
)
156+
if err != nil {
157+
return nil, fmt.Errorf("failed to create single sequencer: %w", err)
158+
}
159+
160+
logger.Info().
161+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
162+
Msg("single sequencer initialized")
163+
164+
return sequencer, nil
165+
}

apps/testapp/go.mod

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ require (
1616
github.com/evstack/ev-node/core v1.0.0-beta.5
1717
github.com/evstack/ev-node/da v0.0.0-00010101000000-000000000000
1818
github.com/ipfs/go-datastore v0.9.0
19+
github.com/rs/zerolog v1.34.0
1920
github.com/spf13/cobra v1.10.1
2021
github.com/stretchr/testify v1.11.1
2122
)
@@ -79,7 +80,7 @@ require (
7980
github.com/libp2p/go-reuseport v0.4.0 // indirect
8081
github.com/libp2p/go-yamux/v5 v5.0.1 // indirect
8182
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd // indirect
82-
github.com/mattn/go-colorable v0.1.13 // indirect
83+
github.com/mattn/go-colorable v0.1.14 // indirect
8384
github.com/mattn/go-isatty v0.0.20 // indirect
8485
github.com/miekg/dns v1.1.68 // indirect
8586
github.com/mikioh/tcpinfo v0.0.0-20190314235526-30a79bb1804b // indirect
@@ -129,7 +130,6 @@ require (
129130
github.com/quic-go/qpack v0.5.1 // indirect
130131
github.com/quic-go/quic-go v0.55.0 // indirect
131132
github.com/quic-go/webtransport-go v0.9.0 // indirect
132-
github.com/rs/zerolog v1.34.0 // indirect
133133
github.com/sagikazarmark/locafero v0.11.0 // indirect
134134
github.com/sourcegraph/conc v0.3.1-0.20240121214520-5f936abd7ae8 // indirect
135135
github.com/spaolacci/murmur3 v1.1.0 // indirect

apps/testapp/go.sum

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -231,8 +231,9 @@ github.com/marcopolo/simnet v0.0.1 h1:rSMslhPz6q9IvJeFWDoMGxMIrlsbXau3NkuIXHGJxf
231231
github.com/marcopolo/simnet v0.0.1/go.mod h1:WDaQkgLAjqDUEBAOXz22+1j6wXKfGlC5sD5XWt3ddOs=
232232
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk=
233233
github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU=
234-
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
235234
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
235+
github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE=
236+
github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8=
236237
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
237238
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
238239
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=

block/components.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -245,6 +245,15 @@ func NewAggregatorComponents(
245245
return nil, fmt.Errorf("failed to create reaper: %w", err)
246246
}
247247

248+
if config.Node.BasedSequencer { // no submissions needed for bases sequencer
249+
return &Components{
250+
Executor: executor,
251+
Reaper: reaper,
252+
Cache: cacheManager,
253+
errorCh: errorCh,
254+
}, nil
255+
}
256+
248257
// Create DA client and submitter for aggregator nodes (with signer for submission)
249258
daClient := NewDAClient(da, config, logger)
250259
daSubmitter := submitting.NewDASubmitter(daClient, config, genesis, blockOpts, metrics, logger)

0 commit comments

Comments
 (0)