@@ -9,6 +9,7 @@ use async_lock::RwLock;
9
9
use committable:: { Commitment , Committable } ;
10
10
use either:: Either ;
11
11
use hotshot_task:: dependency:: { Dependency , EventDependency } ;
12
+ use hotshot_types:: traits:: storage:: Storage ;
12
13
use hotshot_types:: {
13
14
consensus:: OuterConsensus ,
14
15
data:: { Leaf2 , QuorumProposalWrapper , ViewChangeEvidence2 } ,
@@ -180,10 +181,11 @@ pub(crate) async fn fetch_proposal<TYPES: NodeType, V: Versions>(
180
181
}
181
182
182
183
/// Handles calling add_epoch_root and sync_l1 on Membership if necessary.
183
- async fn decide_epoch_root < TYPES : NodeType > (
184
+ async fn decide_epoch_root < TYPES : NodeType , I : NodeImplementation < TYPES > > (
184
185
decided_leaf : & Leaf2 < TYPES > ,
185
186
epoch_height : u64 ,
186
187
membership : & Arc < RwLock < TYPES :: Membership > > ,
188
+ storage : & Arc < RwLock < I :: Storage > > ,
187
189
) {
188
190
let decided_block_number = decided_leaf. block_header ( ) . block_number ( ) ;
189
191
@@ -192,6 +194,19 @@ async fn decide_epoch_root<TYPES: NodeType>(
192
194
let next_epoch_number =
193
195
TYPES :: Epoch :: new ( epoch_from_block_number ( decided_block_number, epoch_height) + 2 ) ;
194
196
197
+ if let Err ( e) = storage
198
+ . write ( )
199
+ . await
200
+ . add_epoch_root ( next_epoch_number, decided_leaf. block_header ( ) . clone ( ) )
201
+ . await
202
+ {
203
+ tracing:: error!(
204
+ "Failed to store epoch root for epoch {:?}: {}" ,
205
+ next_epoch_number,
206
+ e
207
+ ) ;
208
+ }
209
+
195
210
let write_callback = {
196
211
tracing:: debug!( "Calling add_epoch_root for epoch {:?}" , next_epoch_number) ;
197
212
let membership_reader = membership. read ( ) . await ;
@@ -251,13 +266,14 @@ impl<TYPES: NodeType + Default> Default for LeafChainTraversalOutcome<TYPES> {
251
266
/// # Panics
252
267
/// If the leaf chain contains no decided leaf while reaching a decided view, which should be
253
268
/// impossible.
254
- pub async fn decide_from_proposal_2 < TYPES : NodeType > (
269
+ pub async fn decide_from_proposal_2 < TYPES : NodeType , I : NodeImplementation < TYPES > > (
255
270
proposal : & QuorumProposalWrapper < TYPES > ,
256
271
consensus : OuterConsensus < TYPES > ,
257
272
existing_upgrade_cert : Arc < RwLock < Option < UpgradeCertificate < TYPES > > > > ,
258
273
public_key : & TYPES :: SignatureKey ,
259
274
with_epochs : bool ,
260
275
membership : & Arc < RwLock < TYPES :: Membership > > ,
276
+ storage : & Arc < RwLock < I :: Storage > > ,
261
277
) -> LeafChainTraversalOutcome < TYPES > {
262
278
let mut res = LeafChainTraversalOutcome :: default ( ) ;
263
279
let consensus_reader = consensus. read ( ) . await ;
@@ -332,7 +348,13 @@ pub async fn decide_from_proposal_2<TYPES: NodeType>(
332
348
drop ( consensus_reader) ;
333
349
334
350
for decided_leaf_info in & res. leaf_views {
335
- decide_epoch_root ( & decided_leaf_info. leaf , epoch_height, membership) . await ;
351
+ decide_epoch_root :: < TYPES , I > (
352
+ & decided_leaf_info. leaf ,
353
+ epoch_height,
354
+ membership,
355
+ storage,
356
+ )
357
+ . await ;
336
358
}
337
359
}
338
360
@@ -370,13 +392,14 @@ pub async fn decide_from_proposal_2<TYPES: NodeType>(
370
392
/// # Panics
371
393
/// If the leaf chain contains no decided leaf while reaching a decided view, which should be
372
394
/// impossible.
373
- pub async fn decide_from_proposal < TYPES : NodeType , V : Versions > (
395
+ pub async fn decide_from_proposal < TYPES : NodeType , I : NodeImplementation < TYPES > , V : Versions > (
374
396
proposal : & QuorumProposalWrapper < TYPES > ,
375
397
consensus : OuterConsensus < TYPES > ,
376
398
existing_upgrade_cert : Arc < RwLock < Option < UpgradeCertificate < TYPES > > > > ,
377
399
public_key : & TYPES :: SignatureKey ,
378
400
with_epochs : bool ,
379
401
membership : & Arc < RwLock < TYPES :: Membership > > ,
402
+ storage : & Arc < RwLock < I :: Storage > > ,
380
403
) -> LeafChainTraversalOutcome < TYPES > {
381
404
let consensus_reader = consensus. read ( ) . await ;
382
405
let existing_upgrade_cert_reader = existing_upgrade_cert. read ( ) . await ;
@@ -488,7 +511,13 @@ pub async fn decide_from_proposal<TYPES: NodeType, V: Versions>(
488
511
489
512
if with_epochs && res. new_decided_view_number . is_some ( ) {
490
513
for decided_leaf_info in & res. leaf_views {
491
- decide_epoch_root ( & decided_leaf_info. leaf , epoch_height, membership) . await ;
514
+ decide_epoch_root :: < TYPES , I > (
515
+ & decided_leaf_info. leaf ,
516
+ epoch_height,
517
+ membership,
518
+ storage,
519
+ )
520
+ . await ;
492
521
}
493
522
}
494
523
0 commit comments