@@ -53,115 +53,95 @@ var _ Node = &FullNode{}
53
53
// It connects all the components and orchestrates their work.
54
54
type FullNode struct {
55
55
service.BaseService
56
- eventBus * cmtypes.EventBus
57
- proxyApp proxy.AppConns
58
56
59
57
genesis * cmtypes.GenesisDoc
60
58
// cache of chunked genesis data.
61
59
genChunks []string
62
60
63
- conf config.NodeConfig
64
- P2P * p2p.Client
61
+ nodeConfig config.NodeConfig
65
62
63
+ proxyApp proxy.AppConns
64
+ eventBus * cmtypes.EventBus
65
+ dalc da.DataAvailabilityLayerClient
66
+ p2pClient * p2p.Client
67
+ hExService * block.HeaderExchangeService
68
+ bExService * block.BlockExchangeService
66
69
// TODO(tzdybal): consider extracting "mempool reactor"
67
- Mempool mempool.Mempool
68
- mempoolIDs * mempoolIDs
69
-
70
+ Mempool mempool.Mempool
71
+ mempoolIDs * mempoolIDs
70
72
Store store.Store
71
73
blockManager * block.Manager
72
- dalc da.DataAvailabilityLayerClient
73
74
74
75
// Preserves cometBFT compatibility
75
76
TxIndexer txindex.TxIndexer
76
77
BlockIndexer indexer.BlockIndexer
77
78
IndexerService * txindex.IndexerService
78
79
79
- hExService * block.HeaderExchangeService
80
- bExService * block.BlockExchangeService
81
-
82
80
// keep context here only because of API compatibility
83
81
// - it's used in `OnStart` (defined in service.Service interface)
84
- ctx context.Context
85
-
82
+ ctx context.Context
86
83
cancel context.CancelFunc
87
84
}
88
85
89
86
// newFullNode creates a new Rollkit full node.
90
87
func newFullNode (
91
88
ctx context.Context ,
92
- conf config.NodeConfig ,
89
+ nodeConfig config.NodeConfig ,
93
90
p2pKey crypto.PrivKey ,
94
91
signingKey crypto.PrivKey ,
95
92
clientCreator proxy.ClientCreator ,
96
93
genesis * cmtypes.GenesisDoc ,
97
94
logger log.Logger ,
98
95
) (* FullNode , error ) {
99
- proxyApp := proxy .NewAppConns (clientCreator , proxy .NopMetrics ())
100
- proxyApp .SetLogger (logger .With ("module" , "proxy" ))
101
- if err := proxyApp .Start (); err != nil {
102
- return nil , fmt .Errorf ("error starting proxy app connections: %v" , err )
96
+ proxyApp , err := initProxyApp (clientCreator , logger )
97
+ if err != nil {
98
+ return nil , err
103
99
}
104
100
105
- eventBus := cmtypes .NewEventBus ()
106
- eventBus .SetLogger (logger .With ("module" , "events" ))
107
- if err := eventBus .Start (); err != nil {
101
+ eventBus , err := initEventBus (logger )
102
+ if err != nil {
108
103
return nil , err
109
104
}
110
105
111
- var err error
112
- var baseKV ds.TxnDatastore
113
- if conf .RootDir == "" && conf .DBPath == "" { // this is used for testing
114
- logger .Info ("WARNING: working in in-memory mode" )
115
- baseKV , err = store .NewDefaultInMemoryKVStore ()
116
- } else {
117
- baseKV , err = store .NewDefaultKVStore (conf .RootDir , conf .DBPath , "rollkit" )
118
- }
106
+ baseKV , err := initBaseKV (nodeConfig , logger )
119
107
if err != nil {
120
108
return nil , err
121
109
}
122
110
123
- mainKV := newPrefixKV (baseKV , mainPrefix )
124
111
dalcKV := newPrefixKV (baseKV , dalcPrefix )
125
- indexerKV := newPrefixKV (baseKV , indexerPrefix )
126
-
127
- client , err := p2p .NewClient (conf .P2P , p2pKey , genesis .ChainID , baseKV , logger .With ("module" , "p2p" ))
112
+ dalc , err := initDALC (nodeConfig , dalcKV , logger )
128
113
if err != nil {
129
114
return nil , err
130
115
}
131
- s := store .New (ctx , mainKV )
132
116
133
- dalc := registry .GetClient (conf .DALayer )
134
- if dalc == nil {
135
- return nil , fmt .Errorf ("couldn't get data availability client named '%s'" , conf .DALayer )
136
- }
137
- err = dalc .Init (conf .NamespaceID , []byte (conf .DAConfig ), dalcKV , logger .With ("module" , "da_client" ))
117
+ p2pClient , err := p2p .NewClient (nodeConfig .P2P , p2pKey , genesis .ChainID , baseKV , logger .With ("module" , "p2p" ))
138
118
if err != nil {
139
- return nil , fmt . Errorf ( "data availability layer client initialization error: %w" , err )
119
+ return nil , err
140
120
}
141
121
142
- indexerService , txIndexer , blockIndexer , err := createAndStartIndexerService (ctx , conf , indexerKV , eventBus , logger )
122
+ mainKV := newPrefixKV (baseKV , mainPrefix )
123
+ headerExchangeService , err := initHeaderExchangeService (ctx , mainKV , nodeConfig , genesis , p2pClient , logger )
143
124
if err != nil {
144
125
return nil , err
145
126
}
146
127
147
- mp := mempoolv1 .NewTxMempool (logger , llcfg .DefaultMempoolConfig (), proxyApp .Mempool (), 0 )
148
- mpIDs := newMempoolIDs ()
149
- mp .EnableTxsAvailable ()
150
-
151
- headerExchangeService , err := block .NewHeaderExchangeService (ctx , mainKV , conf , genesis , client , logger .With ("module" , "HeaderExchangeService" ))
128
+ blockExchangeService , err := initBlockExchangeService (ctx , mainKV , nodeConfig , genesis , p2pClient , logger )
152
129
if err != nil {
153
- return nil , fmt . Errorf ( "HeaderExchangeService initialization error: %w" , err )
130
+ return nil , err
154
131
}
155
132
156
- blockExchangeService , err := block .NewBlockExchangeService (ctx , mainKV , conf , genesis , client , logger .With ("module" , "BlockExchangeService" ))
133
+ mempool := initMempool (logger , proxyApp )
134
+
135
+ store := store .New (ctx , mainKV )
136
+ blockManager , err := initBlockManager (signingKey , nodeConfig , genesis , store , mempool , proxyApp , dalc , eventBus , logger , blockExchangeService )
157
137
if err != nil {
158
- return nil , fmt . Errorf ( "BlockExchangeService initialization error: %w" , err )
138
+ return nil , err
159
139
}
160
140
161
- doneBuildingChannel := make ( chan struct {} )
162
- blockManager , err := block . NewManager ( signingKey , conf . BlockManagerConfig , genesis , s , mp , proxyApp . Consensus (), dalc , eventBus , logger . With ( "module" , "BlockManager" ), doneBuildingChannel , blockExchangeService . BlockStore () )
141
+ indexerKV := newPrefixKV ( baseKV , indexerPrefix )
142
+ indexerService , txIndexer , blockIndexer , err := createAndStartIndexerService ( ctx , nodeConfig , indexerKV , eventBus , logger )
163
143
if err != nil {
164
- return nil , fmt . Errorf ( "BlockManager initialization error: %w" , err )
144
+ return nil , err
165
145
}
166
146
167
147
ctx , cancel := context .WithCancel (ctx )
@@ -170,13 +150,13 @@ func newFullNode(
170
150
proxyApp : proxyApp ,
171
151
eventBus : eventBus ,
172
152
genesis : genesis ,
173
- conf : conf ,
174
- P2P : client ,
153
+ nodeConfig : nodeConfig ,
154
+ p2pClient : p2pClient ,
175
155
blockManager : blockManager ,
176
156
dalc : dalc ,
177
- Mempool : mp ,
178
- mempoolIDs : mpIDs ,
179
- Store : s ,
157
+ Mempool : mempool ,
158
+ mempoolIDs : newMempoolIDs () ,
159
+ Store : store ,
180
160
TxIndexer : txIndexer ,
181
161
IndexerService : indexerService ,
182
162
BlockIndexer : blockIndexer ,
@@ -187,12 +167,80 @@ func newFullNode(
187
167
}
188
168
189
169
node .BaseService = * service .NewBaseService (logger , "Node" , node )
190
-
191
- node .P2P .SetTxValidator (node .newTxValidator ())
170
+ node .p2pClient .SetTxValidator (node .newTxValidator ())
192
171
193
172
return node , nil
194
173
}
195
174
175
+ func initProxyApp (clientCreator proxy.ClientCreator , logger log.Logger ) (proxy.AppConns , error ) {
176
+ proxyApp := proxy .NewAppConns (clientCreator , proxy .NopMetrics ())
177
+ proxyApp .SetLogger (logger .With ("module" , "proxy" ))
178
+ if err := proxyApp .Start (); err != nil {
179
+ return nil , fmt .Errorf ("error starting proxy app connections: %v" , err )
180
+ }
181
+ return proxyApp , nil
182
+ }
183
+
184
+ func initEventBus (logger log.Logger ) (* cmtypes.EventBus , error ) {
185
+ eventBus := cmtypes .NewEventBus ()
186
+ eventBus .SetLogger (logger .With ("module" , "events" ))
187
+ if err := eventBus .Start (); err != nil {
188
+ return nil , err
189
+ }
190
+ return eventBus , nil
191
+ }
192
+
193
+ // initBaseKV initializes the base key-value store.
194
+ func initBaseKV (nodeConfig config.NodeConfig , logger log.Logger ) (ds.TxnDatastore , error ) {
195
+ if nodeConfig .RootDir == "" && nodeConfig .DBPath == "" { // this is used for testing
196
+ logger .Info ("WARNING: working in in-memory mode" )
197
+ return store .NewDefaultInMemoryKVStore ()
198
+ }
199
+ return store .NewDefaultKVStore (nodeConfig .RootDir , nodeConfig .DBPath , "rollkit" )
200
+ }
201
+
202
+ func initDALC (nodeConfig config.NodeConfig , dalcKV ds.TxnDatastore , logger log.Logger ) (da.DataAvailabilityLayerClient , error ) {
203
+ dalc := registry .GetClient (nodeConfig .DALayer )
204
+ if dalc == nil {
205
+ return nil , fmt .Errorf ("couldn't get data availability client named '%s'" , nodeConfig .DALayer )
206
+ }
207
+ err := dalc .Init (nodeConfig .NamespaceID , []byte (nodeConfig .DAConfig ), dalcKV , logger .With ("module" , "da_client" ))
208
+ if err != nil {
209
+ return nil , fmt .Errorf ("data availability layer client initialization error: %w" , err )
210
+ }
211
+ return dalc , nil
212
+ }
213
+
214
+ func initMempool (logger log.Logger , proxyApp proxy.AppConns ) * mempoolv1.TxMempool {
215
+ mempool := mempoolv1 .NewTxMempool (logger , llcfg .DefaultMempoolConfig (), proxyApp .Mempool (), 0 )
216
+ mempool .EnableTxsAvailable ()
217
+ return mempool
218
+ }
219
+
220
+ func initHeaderExchangeService (ctx context.Context , mainKV ds.TxnDatastore , nodeConfig config.NodeConfig , genesis * cmtypes.GenesisDoc , p2pClient * p2p.Client , logger log.Logger ) (* block.HeaderExchangeService , error ) {
221
+ headerExchangeService , err := block .NewHeaderExchangeService (ctx , mainKV , nodeConfig , genesis , p2pClient , logger .With ("module" , "HeaderExchangeService" ))
222
+ if err != nil {
223
+ return nil , fmt .Errorf ("HeaderExchangeService initialization error: %w" , err )
224
+ }
225
+ return headerExchangeService , nil
226
+ }
227
+
228
+ func initBlockExchangeService (ctx context.Context , mainKV ds.TxnDatastore , nodeConfig config.NodeConfig , genesis * cmtypes.GenesisDoc , p2pClient * p2p.Client , logger log.Logger ) (* block.BlockExchangeService , error ) {
229
+ blockExchangeService , err := block .NewBlockExchangeService (ctx , mainKV , nodeConfig , genesis , p2pClient , logger .With ("module" , "BlockExchangeService" ))
230
+ if err != nil {
231
+ return nil , fmt .Errorf ("HeaderExchangeService initialization error: %w" , err )
232
+ }
233
+ return blockExchangeService , nil
234
+ }
235
+
236
+ func initBlockManager (signingKey crypto.PrivKey , nodeConfig config.NodeConfig , genesis * cmtypes.GenesisDoc , store store.Store , mempool mempool.Mempool , proxyApp proxy.AppConns , dalc da.DataAvailabilityLayerClient , eventBus * cmtypes.EventBus , logger log.Logger , blockExchangeService * block.BlockExchangeService ) (* block.Manager , error ) {
237
+ blockManager , err := block .NewManager (signingKey , nodeConfig .BlockManagerConfig , genesis , store , mempool , proxyApp .Consensus (), dalc , eventBus , logger .With ("module" , "BlockManager" ), blockExchangeService .BlockStore ())
238
+ if err != nil {
239
+ return nil , fmt .Errorf ("BlockManager initialization error: %w" , err )
240
+ }
241
+ return blockManager , nil
242
+ }
243
+
196
244
// initGenesisChunks creates a chunked format of the genesis document to make it easier to
197
245
// iterate through larger genesis structures.
198
246
func (n * FullNode ) initGenesisChunks () error {
@@ -258,7 +306,7 @@ func (n *FullNode) blockPublishLoop(ctx context.Context) {
258
306
func (n * FullNode ) OnStart () error {
259
307
260
308
n .Logger .Info ("starting P2P client" )
261
- err := n .P2P .Start (n .ctx )
309
+ err := n .p2pClient .Start (n .ctx )
262
310
if err != nil {
263
311
return fmt .Errorf ("error while starting P2P client: %w" , err )
264
312
}
@@ -275,9 +323,9 @@ func (n *FullNode) OnStart() error {
275
323
return fmt .Errorf ("error while starting data availability layer client: %w" , err )
276
324
}
277
325
278
- if n .conf .Aggregator {
279
- n .Logger .Info ("working in aggregator mode" , "block time" , n .conf .BlockTime )
280
- go n .blockManager .AggregationLoop (n .ctx , n .conf .LazyAggregator )
326
+ if n .nodeConfig .Aggregator {
327
+ n .Logger .Info ("working in aggregator mode" , "block time" , n .nodeConfig .BlockTime )
328
+ go n .blockManager .AggregationLoop (n .ctx , n .nodeConfig .LazyAggregator )
281
329
go n .blockManager .BlockSubmissionLoop (n .ctx )
282
330
go n .headerPublishLoop (n .ctx )
283
331
go n .blockPublishLoop (n .ctx )
@@ -307,7 +355,7 @@ func (n *FullNode) OnStop() {
307
355
n .Logger .Info ("halting full node..." )
308
356
n .cancel ()
309
357
err := n .dalc .Stop ()
310
- err = multierr .Append (err , n .P2P .Close ())
358
+ err = multierr .Append (err , n .p2pClient .Close ())
311
359
err = multierr .Append (err , n .hExService .Stop ())
312
360
err = multierr .Append (err , n .bExService .Stop ())
313
361
n .Logger .Error ("errors while stopping node:" , "errors" , err )
0 commit comments