@@ -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
storage_mode : StorageMode ,
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
storage_mode : StorageMode ,
71
72
) -> Self {
72
73
Self {
73
74
config,
74
- database,
75
+ database : Arc :: new ( database ) ,
75
76
archival_epoch_interval,
76
77
storage_mode,
77
78
phantom : PhantomData ,
@@ -232,7 +233,7 @@ impl<P: Preset> Storage<P> {
232
233
& self ,
233
234
unfinalized : impl Iterator < Item = & ' cl ChainLink < P > > ,
234
235
finalized : impl DoubleEndedIterator < Item = & ' cl ChainLink < P > > ,
235
- store : & Store < P > ,
236
+ store : & Store < P , Self > ,
236
237
) -> Result < AppendedBlockSlots > {
237
238
let mut slots = AppendedBlockSlots :: default ( ) ;
238
239
let mut store_head_slot = 0 ;
@@ -363,6 +364,25 @@ impl<P: Preset> Storage<P> {
363
364
Ok ( persisted_blob_ids)
364
365
}
365
366
367
+ pub ( crate ) fn append_states (
368
+ & self ,
369
+ states_with_block_roots : impl Iterator < Item = ( Arc < BeaconState < P > > , H256 ) > ,
370
+ ) -> Result < Vec < Slot > > {
371
+ let mut slots = vec ! [ ] ;
372
+ let mut batch = vec ! [ ] ;
373
+
374
+ for ( state, block_root) in states_with_block_roots {
375
+ if !self . contains_key ( StateByBlockRoot ( block_root) ) ? {
376
+ slots. push ( state. slot ( ) ) ;
377
+ batch. push ( serialize ( StateByBlockRoot ( block_root) , state) ?) ;
378
+ }
379
+ }
380
+
381
+ self . database . put_batch ( batch) ?;
382
+
383
+ Ok ( slots)
384
+ }
385
+
366
386
pub ( crate ) fn blob_sidecar_by_id (
367
387
& self ,
368
388
blob_id : BlobIdentifier ,
@@ -480,7 +500,7 @@ impl<P: Preset> Storage<P> {
480
500
Ok ( None )
481
501
}
482
502
483
- pub ( crate ) fn genesis_block_root ( & self , store : & Store < P > ) -> Result < H256 > {
503
+ pub ( crate ) fn genesis_block_root ( & self , store : & Store < P , Self > ) -> Result < H256 > {
484
504
self . block_root_by_slot_with_store ( store, GENESIS_SLOT ) ?
485
505
. ok_or ( Error :: GenesisBlockRootNotFound )
486
506
. map_err ( Into :: into)
@@ -523,7 +543,7 @@ impl<P: Preset> Storage<P> {
523
543
// Like `block_root_by_slot`, but looks for the root in `store` first.
524
544
pub ( crate ) fn block_root_by_slot_with_store (
525
545
& self ,
526
- store : & Store < P > ,
546
+ store : & Store < P , Self > ,
527
547
slot : Slot ,
528
548
) -> Result < Option < H256 > > {
529
549
if let Some ( chain_link) = store. chain_link_before_or_at ( slot) {
@@ -641,7 +661,7 @@ impl<P: Preset> Storage<P> {
641
661
642
662
pub ( crate ) fn dependent_root (
643
663
& self ,
644
- store : & Store < P > ,
664
+ store : & Store < P , Self > ,
645
665
state : & BeaconState < P > ,
646
666
epoch : Epoch ,
647
667
) -> Result < H256 > {
@@ -880,6 +900,12 @@ impl<P: Preset> Storage<P> {
880
900
}
881
901
}
882
902
903
+ impl < P : Preset > fork_choice_store:: Storage < P > for Storage < P > {
904
+ fn stored_state_by_block_root ( & self , block_root : H256 ) -> Result < Option < Arc < BeaconState < P > > > > {
905
+ self . state_by_block_root ( block_root)
906
+ }
907
+ }
908
+
883
909
#[ derive( Default , Debug ) ]
884
910
pub struct AppendedBlockSlots {
885
911
pub finalized : Vec < Slot > ,
0 commit comments