Skip to content

Commit a18e75f

Browse files
committed
feat: forced inclusion
1 parent 178b4fe commit a18e75f

Some content is hidden

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

47 files changed

+4351
-574
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ 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)

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

@@ -55,7 +58,7 @@ var RunCmd = &cobra.Command{
5558

5659
logger.Info().Str("headerNamespace", headerNamespace.HexString()).Str("dataNamespace", dataNamespace.HexString()).Msg("namespaces")
5760

58-
daJrpc, err := jsonrpc.NewClient(context.Background(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, rollcmd.DefaultMaxBlobSize)
61+
daJrpc, err := jsonrpc.NewClient(context.Background(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, seqcommon.AbsoluteMaxBlobSize)
5962
if err != nil {
6063
return err
6164
}
@@ -101,6 +104,8 @@ func init() {
101104
}
102105

103106
// createSequencer creates a sequencer based on the configuration.
107+
// If BasedSequencer is enabled, it creates a based sequencer that fetches transactions from DA.
108+
// Otherwise, it creates a single (traditional) sequencer.
104109
func createSequencer(
105110
ctx context.Context,
106111
logger zerolog.Logger,
@@ -109,6 +114,25 @@ func createSequencer(
109114
nodeConfig config.Config,
110115
genesis genesis.Genesis,
111116
) (coresequencer.Sequencer, error) {
117+
daClient := block.NewDAClient(da, nodeConfig, logger)
118+
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, logger)
119+
120+
if nodeConfig.Node.BasedSequencer {
121+
// Based sequencer mode - fetch transactions only from DA
122+
if !nodeConfig.Node.Aggregator {
123+
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
124+
}
125+
126+
basedSeq := based.NewBasedSequencer(fiRetriever, da, nodeConfig, genesis, logger)
127+
128+
logger.Info().
129+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
130+
Uint64("da_epoch", genesis.DAEpochForcedInclusion).
131+
Msg("based sequencer initialized")
132+
133+
return basedSeq, nil
134+
}
135+
112136
singleMetrics, err := single.NopMetrics()
113137
if err != nil {
114138
return nil, fmt.Errorf("failed to create single sequencer metrics: %w", err)
@@ -123,11 +147,18 @@ func createSequencer(
123147
nodeConfig.Node.BlockTime.Duration,
124148
singleMetrics,
125149
nodeConfig.Node.Aggregator,
150+
1000,
151+
fiRetriever,
152+
genesis,
126153
)
127154
if err != nil {
128155
return nil, fmt.Errorf("failed to create single sequencer: %w", err)
129156
}
130157

158+
logger.Info().
159+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
160+
Msg("single sequencer initialized")
161+
131162
return sequencer, nil
132163
}
133164

apps/evm/go.mod

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,10 @@ replace (
1212

1313
require (
1414
github.com/celestiaorg/go-header v0.7.3
15-
github.com/ethereum/go-ethereum v1.16.5
15+
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
@@ -26,14 +26,15 @@ require (
2626
connectrpc.com/connect v1.19.1 // indirect
2727
connectrpc.com/grpcreflect v1.3.0 // indirect
2828
github.com/Microsoft/go-winio v0.6.2 // indirect
29+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 // indirect
2930
github.com/StackExchange/wmi v1.2.1 // indirect
3031
github.com/benbjohnson/clock v1.3.5 // indirect
3132
github.com/beorn7/perks v1.0.1 // indirect
3233
github.com/bits-and-blooms/bitset v1.20.0 // indirect
3334
github.com/celestiaorg/go-libp2p-messenger v0.2.2 // indirect
3435
github.com/celestiaorg/go-square/v3 v3.0.2 // indirect
3536
github.com/cespare/xxhash/v2 v2.3.0 // indirect
36-
github.com/consensys/gnark-crypto v0.18.1 // indirect
37+
github.com/consensys/gnark-crypto v0.18.0 // indirect
3738
github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect
3839
github.com/crate-crypto/go-ipa v0.0.0-20240724233137-53bbb0ceb27a // indirect
3940
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
@@ -44,7 +45,7 @@ require (
4445
github.com/dgraph-io/ristretto/v2 v2.1.0 // indirect
4546
github.com/dustin/go-humanize v1.0.1 // indirect
4647
github.com/emicklei/dot v1.6.2 // indirect
47-
github.com/ethereum/c-kzg-4844/v2 v2.1.3 // indirect
48+
github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect
4849
github.com/ethereum/go-verkle v0.2.2 // indirect
4950
github.com/ferranbt/fastssz v0.1.4 // indirect
5051
github.com/filecoin-project/go-clock v0.1.0 // indirect

apps/evm/go.sum

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ github.com/DataDog/zstd v1.5.5 h1:oWf5W7GtOLgp6bciQYDmhHHjdhYkALu6S/5Ni9ZgSvQ=
1616
github.com/DataDog/zstd v1.5.5/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw=
1717
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
1818
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
19+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6 h1:1zYrtlhrZ6/b6SAjLSfKzWtdgqK0U+HtH/VcBWh1BaU=
20+
github.com/ProjectZKM/Ziren/crates/go-runtime/zkvm_runtime v0.0.0-20251001021608-1fe7b43fc4d6/go.mod h1:ioLG6R+5bUSO1oeGSDxOV3FADARuMoytZCSX6MEMQkI=
1921
github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA=
2022
github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8=
2123
github.com/VictoriaMetrics/fastcache v1.13.0 h1:AW4mheMR5Vd9FkAPUv+NH6Nhw+fmbTMGMsNAoA/+4G0=
@@ -55,8 +57,8 @@ github.com/cockroachdb/redact v1.1.5 h1:u1PMllDkdFfPWaNGMyLD1+so+aq3uUItthCFqzwP
5557
github.com/cockroachdb/redact v1.1.5/go.mod h1:BVNblN9mBWFyMyqK1k3AAiSxhvhfK2oOZZ2lK+dpvRg=
5658
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06 h1:zuQyyAKVxetITBuuhv3BI9cMrmStnpT18zmgmTxunpo=
5759
github.com/cockroachdb/tokenbucket v0.0.0-20230807174530-cc333fc44b06/go.mod h1:7nc4anLGjupUW/PeY5qiNYsdNXj7zopG+eqsS7To5IQ=
58-
github.com/consensys/gnark-crypto v0.18.1 h1:RyLV6UhPRoYYzaFnPQA4qK3DyuDgkTgskDdoGqFt3fI=
59-
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=
6062
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
6163
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
6264
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
@@ -95,12 +97,12 @@ github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymF
9597
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
9698
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
9799
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
98-
github.com/ethereum/c-kzg-4844/v2 v2.1.3 h1:DQ21UU0VSsuGy8+pcMJHDS0CV1bKmJmxsJYK8l3MiLU=
99-
github.com/ethereum/c-kzg-4844/v2 v2.1.3/go.mod h1:fyNcYI/yAuLWJxf4uzVtS8VDKeoAaRM8G/+ADz/pRdA=
100+
github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s=
101+
github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs=
100102
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab h1:rvv6MJhy07IMfEKuARQ9TKojGqLVNxQajaXEp/BoqSk=
101103
github.com/ethereum/go-bigmodexpfix v0.0.0-20250911101455-f9e208c548ab/go.mod h1:IuLm4IsPipXKF7CW5Lzf68PIbZ5yl7FFd74l/E0o9A8=
102-
github.com/ethereum/go-ethereum v1.16.5 h1:GZI995PZkzP7ySCxEFaOPzS8+bd8NldE//1qvQDQpe0=
103-
github.com/ethereum/go-ethereum v1.16.5/go.mod h1:kId9vOtlYg3PZk9VwKbGlQmSACB5ESPTBGT+M9zjmok=
104+
github.com/ethereum/go-ethereum v1.16.7 h1:qeM4TvbrWK0UC0tgkZ7NiRsmBGwsjqc64BHo20U59UQ=
105+
github.com/ethereum/go-ethereum v1.16.7/go.mod h1:Fs6QebQbavneQTYcA39PEKv2+zIjX7rPUZ14DER46wk=
104106
github.com/ethereum/go-verkle v0.2.2 h1:I2W0WjnrFUIzzVPwm8ykY+7pL2d4VhlsePn4j7cnFk8=
105107
github.com/ethereum/go-verkle v0.2.2/go.mod h1:M3b90YRnzqKyyzBEWJGqj8Qff4IDeXnzFw0P9bFw3uk=
106108
github.com/evstack/ev-node/execution/evm v1.0.0-beta.3 h1:xo0mZz3CJtntP1RPLFDBubBKpNkqStImt9H9N0xysj8=

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

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

5962
// Create DA client
60-
daJrpc, err := jsonrpc.NewClient(cmd.Context(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, rollcmd.DefaultMaxBlobSize)
63+
daJrpc, err := jsonrpc.NewClient(cmd.Context(), logger, nodeConfig.DA.Address, nodeConfig.DA.AuthToken, seqcommon.AbsoluteMaxBlobSize)
6164
if err != nil {
6265
return err
6366
}
@@ -118,6 +121,25 @@ func createSequencer(
118121
nodeConfig config.Config,
119122
genesis genesis.Genesis,
120123
) (coresequencer.Sequencer, error) {
124+
daClient := block.NewDAClient(da, nodeConfig, logger)
125+
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, logger)
126+
127+
if nodeConfig.Node.BasedSequencer {
128+
// Based sequencer mode - fetch transactions only from DA
129+
if !nodeConfig.Node.Aggregator {
130+
return nil, fmt.Errorf("based sequencer mode requires aggregator mode to be enabled")
131+
}
132+
133+
basedSeq := based.NewBasedSequencer(fiRetriever, da, nodeConfig, genesis, logger)
134+
135+
logger.Info().
136+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
137+
Uint64("da_epoch", genesis.DAEpochForcedInclusion).
138+
Msg("based sequencer initialized")
139+
140+
return basedSeq, nil
141+
}
142+
121143
singleMetrics, err := single.NopMetrics()
122144
if err != nil {
123145
return nil, fmt.Errorf("failed to create single sequencer metrics: %w", err)
@@ -132,11 +154,18 @@ func createSequencer(
132154
nodeConfig.Node.BlockTime.Duration,
133155
singleMetrics,
134156
nodeConfig.Node.Aggregator,
157+
1000,
158+
fiRetriever,
159+
genesis,
135160
)
136161
if err != nil {
137162
return nil, fmt.Errorf("failed to create single sequencer: %w", err)
138163
}
139164

165+
logger.Info().
166+
Str("forced_inclusion_namespace", nodeConfig.DA.GetForcedInclusionNamespace()).
167+
Msg("single sequencer initialized")
168+
140169
return sequencer, nil
141170
}
142171

0 commit comments

Comments
 (0)