Skip to content

Commit be30808

Browse files
committed
updates
1 parent 8d1c9f4 commit be30808

File tree

12 files changed

+105
-52
lines changed

12 files changed

+105
-52
lines changed

apps/evm/cmd/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,7 @@ func createSequencer(
161161
genesis genesis.Genesis,
162162
daClient block.FullDAClient,
163163
) (coresequencer.Sequencer, error) {
164-
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, logger)
164+
fiRetriever := block.NewForcedInclusionRetriever(daClient, genesis, datastore, logger)
165165

166166
if nodeConfig.Node.BasedSequencer {
167167
// Based sequencer mode - fetch transactions only from DA

apps/grpc/cmd/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ func createSequencer(
120120
}
121121

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

125125
if nodeConfig.Node.BasedSequencer {
126126
// Based sequencer mode - fetch transactions only from DA

apps/testapp/cmd/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ func createSequencer(
121121
}
122122

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

126126
if nodeConfig.Node.BasedSequencer {
127127
// Based sequencer mode - fetch transactions only from DA

block/internal/da/forced_inclusion_retriever.go

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package da
22

33
import (
44
"context"
5+
"encoding/binary"
56
"errors"
67
"fmt"
78
"time"
@@ -10,6 +11,7 @@ import (
1011

1112
datypes "github.com/evstack/ev-node/pkg/da/types"
1213
"github.com/evstack/ev-node/pkg/genesis"
14+
"github.com/evstack/ev-node/pkg/store"
1315
"github.com/evstack/ev-node/types"
1416
)
1517

@@ -20,6 +22,7 @@ var ErrForceInclusionNotConfigured = errors.New("forced inclusion namespace not
2022
type ForcedInclusionRetriever struct {
2123
client Client
2224
logger zerolog.Logger
25+
store store.Store
2326
daEpochSize uint64
2427
daStartHeight uint64
2528
}
@@ -36,24 +39,30 @@ type ForcedInclusionEvent struct {
3639
func NewForcedInclusionRetriever(
3740
client Client,
3841
genesis genesis.Genesis,
42+
store store.Store,
3943
logger zerolog.Logger,
4044
) *ForcedInclusionRetriever {
41-
return &ForcedInclusionRetriever{
42-
client: client,
43-
daStartHeight: genesis.DAStartHeight, // TODO: this should be genesis da start height (for full nodes) or store metadata da start height (for sequencers)
44-
logger: logger.With().Str("component", "forced_inclusion_retriever").Logger(),
45-
daEpochSize: genesis.DAEpochForcedInclusion,
45+
r := &ForcedInclusionRetriever{
46+
client: client,
47+
store: store,
48+
logger: logger.With().Str("component", "forced_inclusion_retriever").Logger(),
49+
daEpochSize: genesis.DAEpochForcedInclusion,
4650
}
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
4755
}
4856

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

56-
epochStart, epochEnd, currentEpochNumber := types.CalculateEpochBoundaries(daHeight, r.daStartHeight /* this should be fetch from store once */, r.daEpochSize)
65+
epochStart, epochEnd, currentEpochNumber := types.CalculateEpochBoundaries(daHeight, r.daStartHeight, r.daEpochSize)
5766

5867
if daHeight != epochEnd {
5968
r.logger.Debug().
@@ -171,3 +180,13 @@ func (r *ForcedInclusionRetriever) processForcedInclusionBlobs(
171180

172181
return nil
173182
}
183+
184+
// getInitialDAStartHeight retrieves the DA height of the first included chain height from store.
185+
func (r *ForcedInclusionRetriever) getInitialDAStartHeight(ctx context.Context) uint64 {
186+
daIncludedHeightBytes, err := r.store.GetMetadata(ctx, store.GenesisDAHeightKey)
187+
if err != nil || len(daIncludedHeightBytes) != 8 {
188+
return 0
189+
}
190+
191+
return binary.LittleEndian.Uint64(daIncludedHeightBytes)
192+
}

block/internal/da/forced_inclusion_retriever_test.go

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

8+
"github.com/ipfs/go-datastore"
9+
dssync "github.com/ipfs/go-datastore/sync"
810
"github.com/rs/zerolog"
911
"github.com/stretchr/testify/mock"
1012
"gotest.tools/v3/assert"
1113

1214
datypes "github.com/evstack/ev-node/pkg/da/types"
1315
"github.com/evstack/ev-node/pkg/genesis"
16+
"github.com/evstack/ev-node/pkg/store"
1417
"github.com/evstack/ev-node/test/mocks"
1518
)
1619

@@ -24,7 +27,10 @@ func TestNewForcedInclusionRetriever(t *testing.T) {
2427
DAEpochForcedInclusion: 10,
2528
}
2629

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

@@ -37,7 +43,10 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_NoNamespace(t *testi
3743
DAEpochForcedInclusion: 10,
3844
}
3945

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

4352
_, err := retriever.RetrieveForcedIncludedTxs(ctx, 100)
@@ -56,7 +65,10 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_NotAtEpochStart(t *t
5665
DAEpochForcedInclusion: 10,
5766
}
5867

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

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

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

95110
// Height 100 is an epoch start
@@ -116,7 +131,10 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_EpochStartNotAvailab
116131
DAEpochForcedInclusion: 10,
117132
}
118133

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

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

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

145166
event, err := retriever.RetrieveForcedIncludedTxs(ctx, 100)
@@ -177,7 +198,10 @@ func TestForcedInclusionRetriever_RetrieveForcedIncludedTxs_MultiHeightEpoch(t *
177198
DAEpochForcedInclusion: 3, // Epoch: 100-102
178199
}
179200

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

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

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

206233
tests := []struct {
207234
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.logger)
190+
s.fiRetriever = da.NewForcedInclusionRetriever(s.daClient, s.genesis, s.store, s.logger)
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, zerolog.Nop())
373+
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
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, zerolog.Nop())
446+
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
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, zerolog.Nop())
549+
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
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, zerolog.Nop())
656+
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
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, zerolog.Nop())
722+
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
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, zerolog.Nop())
787+
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
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, zerolog.Nop())
910+
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
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, zerolog.Nop())
999+
fiRetriever := da.NewForcedInclusionRetriever(client, gen, st, zerolog.Nop())
10001000

10011001
s := NewSyncer(
10021002
st,

block/public.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"github.com/evstack/ev-node/pkg/config"
99
blobrpc "github.com/evstack/ev-node/pkg/da/jsonrpc"
1010
"github.com/evstack/ev-node/pkg/genesis"
11+
"github.com/evstack/ev-node/pkg/store"
12+
"github.com/ipfs/go-datastore"
1113
"github.com/rs/zerolog"
1214
)
1315

@@ -75,7 +77,9 @@ type ForcedInclusionRetriever interface {
7577
func NewForcedInclusionRetriever(
7678
client DAClient,
7779
genesis genesis.Genesis,
80+
ds datastore.Batching,
7881
logger zerolog.Logger,
7982
) ForcedInclusionRetriever {
80-
return da.NewForcedInclusionRetriever(client, genesis, logger)
83+
mainKV := store.NewEvNodeKVStore(ds)
84+
return da.NewForcedInclusionRetriever(client, genesis, store.New(mainKV), logger)
8185
}

node/full.go

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ import (
1111
"time"
1212

1313
ds "github.com/ipfs/go-datastore"
14-
ktds "github.com/ipfs/go-datastore/keytransform"
1514
"github.com/prometheus/client_golang/prometheus"
1615
"github.com/prometheus/client_golang/prometheus/promhttp"
1716
"github.com/rs/zerolog"
@@ -30,9 +29,6 @@ import (
3029
evsync "github.com/evstack/ev-node/pkg/sync"
3130
)
3231

33-
// prefixes used in KV store to separate rollkit data from execution environment data (if the same data base is reused)
34-
var EvPrefix = "0"
35-
3632
const (
3733
// genesisChunkSize is the maximum size, in bytes, of each
3834
// chunk in the genesis structure for the chunked API
@@ -83,8 +79,8 @@ func newFullNode(
8379

8480
blockMetrics, _ := metricsProvider(genesis.ChainID)
8581

86-
mainKV := newPrefixKV(database, EvPrefix)
87-
rktStore := store.New(mainKV)
82+
mainKV := store.NewEvNodeKVStore(database)
83+
evstore := store.New(mainKV)
8884

8985
headerSyncService, err := initHeaderSyncService(mainKV, nodeConfig, genesis, p2pClient, logger)
9086
if err != nil {
@@ -101,7 +97,7 @@ func newFullNode(
10197
blockComponents, err = block.NewAggregatorComponents(
10298
nodeConfig,
10399
genesis,
104-
rktStore,
100+
evstore,
105101
exec,
106102
sequencer,
107103
daClient,
@@ -116,7 +112,7 @@ func newFullNode(
116112
blockComponents, err = block.NewSyncComponents(
117113
nodeConfig,
118114
genesis,
119-
rktStore,
115+
evstore,
120116
exec,
121117
daClient,
122118
headerSyncService,
@@ -136,7 +132,7 @@ func newFullNode(
136132
p2pClient: p2pClient,
137133
blockComponents: blockComponents,
138134
daClient: daClient,
139-
Store: rktStore,
135+
Store: evstore,
140136
hSyncService: headerSyncService,
141137
dSyncService: dataSyncService,
142138
}
@@ -471,7 +467,3 @@ func (n *FullNode) GetGenesisChunks() ([]string, error) {
471467
func (n *FullNode) IsRunning() bool {
472468
return n.blockComponents != nil
473469
}
474-
475-
func newPrefixKV(kvStore ds.Batching, prefix string) ds.Batching {
476-
return ktds.Wrap(kvStore, ktds.PrefixTransform{Prefix: ds.NewKey(prefix)})
477-
}

0 commit comments

Comments
 (0)