@@ -6,11 +6,7 @@ use crate::{
66 chain:: { ChainStore , index:: ResolveNullTipset } ,
77 chain_sync:: { load_full_tipset, tipset_syncer:: validate_tipset} ,
88 cli_shared:: { chain_path, read_config} ,
9- db:: {
10- MemoryDB , SettingsStoreExt ,
11- car:: { AnyCar , ManyCar } ,
12- db_engine:: db_root,
13- } ,
9+ db:: { SettingsStoreExt , db_engine:: db_root} ,
1410 genesis:: read_genesis_header,
1511 interpreter:: VMTrace ,
1612 networks:: { ChainConfig , NetworkChain } ,
@@ -73,7 +69,7 @@ impl ComputeCommand {
7369 let ( _, config) = read_config ( None , Some ( chain. clone ( ) ) ) ?;
7470 db_root ( & chain_path ( & config) ) ?
7571 } ;
76- let db = generate_test_snapshot:: load_db ( & db_root_path) ?;
72+ let db = generate_test_snapshot:: load_db ( & db_root_path, Some ( & chain ) ) . await ?;
7773 let chain_config = Arc :: new ( ChainConfig :: from_chain ( & chain) ) ;
7874 let genesis_header =
7975 read_genesis_header ( None , chain_config. genesis_bytes ( & db) . await ?. as_deref ( ) , & db)
@@ -85,18 +81,30 @@ impl ComputeCommand {
8581 chain_config,
8682 genesis_header,
8783 ) ?) ;
88- let ts = {
84+ let ( ts , ts_next ) = {
8985 // We don't want to track all entries that are visited by `tipset_by_height`
9086 db. pause_tracking ( ) ;
9187 let ts = chain_store. chain_index ( ) . tipset_by_height (
9288 epoch,
9389 chain_store. heaviest_tipset ( ) ,
9490 ResolveNullTipset :: TakeOlder ,
9591 ) ?;
92+ let ts_next = chain_store. chain_index ( ) . tipset_by_height (
93+ epoch + 1 ,
94+ chain_store. heaviest_tipset ( ) ,
95+ ResolveNullTipset :: TakeNewer ,
96+ ) ?;
9697 db. resume_tracking ( ) ;
97- SettingsStoreExt :: write_obj ( & db. tracker , crate :: db:: setting_keys:: HEAD_KEY , ts. key ( ) ) ?;
98- // Only track the desired tipset
99- Tipset :: load_required ( & db, ts. key ( ) ) ?
98+ SettingsStoreExt :: write_obj (
99+ & db. tracker ,
100+ crate :: db:: setting_keys:: HEAD_KEY ,
101+ ts_next. key ( ) ,
102+ ) ?;
103+ // Only track the desired tipsets
104+ (
105+ Tipset :: load_required ( & db, ts. key ( ) ) ?,
106+ Tipset :: load_required ( & db, ts_next. key ( ) ) ?,
107+ )
100108 } ;
101109 let epoch = ts. epoch ( ) ;
102110 let state_manager = Arc :: new ( StateManager :: new ( chain_store) ?) ;
@@ -114,6 +122,16 @@ impl ComputeCommand {
114122 "epoch: {epoch}, state_root: {state_root}, receipt_root: {receipt_root}, db_snapshot_size: {}" ,
115123 human_bytes:: human_bytes( db_snapshot. len( ) as f64 )
116124 ) ;
125+ let expected_state_root = * ts_next. parent_state ( ) ;
126+ let expected_receipt_root = * ts_next. parent_message_receipts ( ) ;
127+ anyhow:: ensure!(
128+ state_root == expected_state_root,
129+ "state root mismatch, state_root: {state_root}, expected_state_root: {expected_state_root}"
130+ ) ;
131+ anyhow:: ensure!(
132+ receipt_root == expected_receipt_root,
133+ "receipt root mismatch, receipt_root: {receipt_root}, expected_receipt_root: {expected_receipt_root}"
134+ ) ;
117135 if let Some ( export_db_to) = export_db_to {
118136 std:: fs:: write ( export_db_to, db_snapshot) ?;
119137 }
@@ -138,39 +156,12 @@ pub struct ReplayComputeCommand {
138156impl ReplayComputeCommand {
139157 pub async fn run ( self ) -> anyhow:: Result < ( ) > {
140158 let Self { snapshot, chain, n } = self ;
141- let snap_car = AnyCar :: try_from ( & snapshot) ?;
142- let ts = snap_car. heaviest_tipset ( ) ?;
143- let epoch = ts. epoch ( ) ;
144- let db = Arc :: new ( ManyCar :: new ( MemoryDB :: default ( ) ) . with_read_only ( snap_car) ?) ;
145- let chain_config = Arc :: new ( ChainConfig :: from_chain ( & chain) ) ;
146- let genesis_header =
147- read_genesis_header ( None , chain_config. genesis_bytes ( & db) . await ?. as_deref ( ) , & db)
159+ let ( sm, ts, ts_next) =
160+ crate :: state_manager:: utils:: state_compute:: prepare_state_compute ( & chain, & snapshot)
148161 . await ?;
149- let chain_store = Arc :: new ( ChainStore :: new (
150- db. clone ( ) ,
151- db. clone ( ) ,
152- db. clone ( ) ,
153- chain_config,
154- genesis_header,
155- ) ?) ;
156- let state_manager = Arc :: new ( StateManager :: new ( chain_store) ?) ;
157162 for _ in 0 ..n. get ( ) {
158- let start = Instant :: now ( ) ;
159- let StateOutput {
160- state_root,
161- receipt_root,
162- ..
163- } = state_manager
164- . compute_tipset_state (
165- ts. clone ( ) ,
166- crate :: state_manager:: NO_CALLBACK ,
167- VMTrace :: NotTraced ,
168- )
163+ crate :: state_manager:: utils:: state_compute:: state_compute ( & sm, ts. clone ( ) , & ts_next)
169164 . await ?;
170- println ! (
171- "epoch: {epoch}, state_root: {state_root}, receipt_root: {receipt_root}, took {}." ,
172- humantime:: format_duration( start. elapsed( ) )
173- ) ;
174165 }
175166 Ok ( ( ) )
176167 }
@@ -208,7 +199,7 @@ impl ValidateCommand {
208199 let ( _, config) = read_config ( None , Some ( chain. clone ( ) ) ) ?;
209200 db_root ( & chain_path ( & config) ) ?
210201 } ;
211- let db = generate_test_snapshot:: load_db ( & db_root_path) ?;
202+ let db = generate_test_snapshot:: load_db ( & db_root_path, Some ( & chain ) ) . await ?;
212203 let chain_config = Arc :: new ( ChainConfig :: from_chain ( & chain) ) ;
213204 let genesis_header =
214205 read_genesis_header ( None , chain_config. genesis_bytes ( & db) . await ?. as_deref ( ) , & db)
@@ -267,27 +258,14 @@ pub struct ReplayValidateCommand {
267258impl ReplayValidateCommand {
268259 pub async fn run ( self ) -> anyhow:: Result < ( ) > {
269260 let Self { snapshot, chain, n } = self ;
270- let snap_car = AnyCar :: try_from ( & snapshot) ?;
271- let ts = snap_car. heaviest_tipset ( ) ?;
272- let epoch = ts. epoch ( ) ;
273- let db = Arc :: new ( ManyCar :: new ( MemoryDB :: default ( ) ) . with_read_only ( snap_car) ?) ;
274- let chain_config = Arc :: new ( ChainConfig :: from_chain ( & chain) ) ;
275- let genesis_header =
276- read_genesis_header ( None , chain_config. genesis_bytes ( & db) . await ?. as_deref ( ) , & db)
261+ let ( sm, fts) =
262+ crate :: state_manager:: utils:: state_compute:: prepare_state_validate ( & chain, & snapshot)
277263 . await ?;
278- let chain_store = Arc :: new ( ChainStore :: new (
279- db. clone ( ) ,
280- db. clone ( ) ,
281- db. clone ( ) ,
282- chain_config,
283- genesis_header,
284- ) ?) ;
285- let state_manager = Arc :: new ( StateManager :: new ( chain_store) ?) ;
286- let fts = load_full_tipset ( state_manager. chain_store ( ) , ts. key ( ) ) ?;
264+ let epoch = fts. epoch ( ) ;
287265 for _ in 0 ..n. get ( ) {
288266 let fts = fts. clone ( ) ;
289267 let start = Instant :: now ( ) ;
290- validate_tipset ( & state_manager , fts, None ) . await ?;
268+ validate_tipset ( & sm , fts, None ) . await ?;
291269 println ! (
292270 "epoch: {epoch}, took {}." ,
293271 humantime:: format_duration( start. elapsed( ) )
@@ -298,5 +276,7 @@ impl ReplayValidateCommand {
298276}
299277
300278fn disable_tipset_cache ( ) {
301- unsafe { std:: env:: set_var ( "FOREST_TIPSET_CACHE_DISABLED" , "1" ) } ;
279+ unsafe {
280+ std:: env:: set_var ( "FOREST_TIPSET_CACHE_DISABLED" , "1" ) ;
281+ }
302282}
0 commit comments