@@ -53,25 +53,26 @@ pub enum StateLoadStrategy<P: Preset> {
53
53
}
54
54
55
55
#[ expect( clippy:: struct_field_names) ]
56
+ #[ derive( Clone ) ]
56
57
pub struct Storage < P > {
57
58
config : Arc < Config > ,
58
- pub ( crate ) database : Database ,
59
+ pub ( crate ) database : Arc < Database > ,
59
60
pub ( crate ) archival_epoch_interval : NonZeroU64 ,
60
61
prune_storage : bool ,
61
62
phantom : PhantomData < P > ,
62
63
}
63
64
64
65
impl < P : Preset > Storage < P > {
65
66
#[ must_use]
66
- pub const fn new (
67
+ pub fn new (
67
68
config : Arc < Config > ,
68
69
database : Database ,
69
70
archival_epoch_interval : NonZeroU64 ,
70
71
prune_storage : bool ,
71
72
) -> Self {
72
73
Self {
73
74
config,
74
- database,
75
+ database : Arc :: new ( database ) ,
75
76
archival_epoch_interval,
76
77
prune_storage,
77
78
phantom : PhantomData ,
@@ -222,7 +223,7 @@ impl<P: Preset> Storage<P> {
222
223
& self ,
223
224
unfinalized : impl Iterator < Item = & ' cl ChainLink < P > > ,
224
225
finalized : impl DoubleEndedIterator < Item = & ' cl ChainLink < P > > ,
225
- store : & Store < P > ,
226
+ store : & Store < P , Self > ,
226
227
) -> Result < AppendedBlockSlots > {
227
228
let mut slots = AppendedBlockSlots :: default ( ) ;
228
229
let mut store_head_slot = 0 ;
@@ -353,6 +354,25 @@ impl<P: Preset> Storage<P> {
353
354
Ok ( persisted_blob_ids)
354
355
}
355
356
357
+ pub ( crate ) fn append_states (
358
+ & self ,
359
+ states_with_block_roots : impl Iterator < Item = ( Arc < BeaconState < P > > , H256 ) > ,
360
+ ) -> Result < Vec < Slot > > {
361
+ let mut slots = vec ! [ ] ;
362
+ let mut batch = vec ! [ ] ;
363
+
364
+ for ( state, block_root) in states_with_block_roots {
365
+ if !self . contains_key ( StateByBlockRoot ( block_root) ) ? {
366
+ slots. push ( state. slot ( ) ) ;
367
+ batch. push ( serialize ( StateByBlockRoot ( block_root) , state) ?) ;
368
+ }
369
+ }
370
+
371
+ self . database . put_batch ( batch) ?;
372
+
373
+ Ok ( slots)
374
+ }
375
+
356
376
pub ( crate ) fn blob_sidecar_by_id (
357
377
& self ,
358
378
blob_id : BlobIdentifier ,
@@ -405,7 +425,7 @@ impl<P: Preset> Storage<P> {
405
425
Ok ( None )
406
426
}
407
427
408
- pub ( crate ) fn genesis_block_root ( & self , store : & Store < P > ) -> Result < H256 > {
428
+ pub ( crate ) fn genesis_block_root ( & self , store : & Store < P , Self > ) -> Result < H256 > {
409
429
self . block_root_by_slot_with_store ( store, GENESIS_SLOT ) ?
410
430
. ok_or ( Error :: GenesisBlockRootNotFound )
411
431
. map_err ( Into :: into)
@@ -448,7 +468,7 @@ impl<P: Preset> Storage<P> {
448
468
// Like `block_root_by_slot`, but looks for the root in `store` first.
449
469
pub ( crate ) fn block_root_by_slot_with_store (
450
470
& self ,
451
- store : & Store < P > ,
471
+ store : & Store < P , Self > ,
452
472
slot : Slot ,
453
473
) -> Result < Option < H256 > > {
454
474
if let Some ( chain_link) = store. chain_link_before_or_at ( slot) {
@@ -551,7 +571,7 @@ impl<P: Preset> Storage<P> {
551
571
552
572
pub ( crate ) fn dependent_root (
553
573
& self ,
554
- store : & Store < P > ,
574
+ store : & Store < P , Self > ,
555
575
state : & BeaconState < P > ,
556
576
epoch : Epoch ,
557
577
) -> Result < H256 > {
@@ -711,10 +731,8 @@ impl<P: Preset> Storage<P> {
711
731
712
732
itertools:: process_results ( results, |pairs| {
713
733
pairs
714
- . take_while ( |( key_bytes, _) | {
715
- FinalizedBlockByRoot :: has_prefix ( key_bytes)
716
- && !UnfinalizedBlockByRoot :: has_prefix ( key_bytes)
717
- } )
734
+ . take_while ( |( key_bytes, _) | FinalizedBlockByRoot :: has_prefix ( key_bytes) )
735
+ . filter ( |( key_bytes, _) | !UnfinalizedBlockByRoot :: has_prefix ( key_bytes) )
718
736
. count ( )
719
737
} )
720
738
}
@@ -744,6 +762,12 @@ impl<P: Preset> Storage<P> {
744
762
}
745
763
}
746
764
765
+ impl < P : Preset > fork_choice_store:: Storage < P > for Storage < P > {
766
+ fn stored_state_by_block_root ( & self , block_root : H256 ) -> Result < Option < Arc < BeaconState < P > > > > {
767
+ self . state_by_block_root ( block_root)
768
+ }
769
+ }
770
+
747
771
#[ derive( Default , Debug ) ]
748
772
pub struct AppendedBlockSlots {
749
773
pub finalized : Vec < Slot > ,
0 commit comments