@@ -6,6 +6,7 @@ mod publisher;
66use crate :: configuration:: { ConfigError , NetworkConfig , SnapshotConfig , SnapshotFileMetadata } ;
77use crate :: downloader:: { DownloadError , SnapshotDownloader } ;
88use crate :: publisher:: SnapshotPublisher ;
9+ use acropolis_common:: genesis_values:: GenesisValues ;
910use acropolis_common:: snapshot:: streaming_snapshot:: StreamingSnapshotParser ;
1011use acropolis_common:: {
1112 messages:: { CardanoMessage , Message } ,
@@ -180,11 +181,15 @@ impl SnapshotBootstrapper {
180181 Self :: parse_snapshot ( & file_path, & mut publisher) . await ?;
181182 }
182183
183- let metadata = publisher
184- . metadata ( )
185- . ok_or_else ( || anyhow:: anyhow!( "No metadata received from snapshots" ) ) ?;
184+ let last_snapshot =
185+ snapshots. last ( ) . ok_or_else ( || anyhow:: anyhow!( "No snapshots to process" ) ) ?;
186+
187+ let block_info = build_block_info_from_metadata ( last_snapshot) . map_err ( |e| {
188+ BootstrapError :: Parse ( format ! (
189+ "Failed to build block info from snapshot metadata: {e}"
190+ ) )
191+ } ) ?;
186192
187- let block_info = build_block_info_from_metadata ( metadata) ;
188193 publisher. publish_completion ( block_info) . await ?;
189194
190195 Ok ( ( ) )
@@ -204,18 +209,32 @@ impl SnapshotBootstrapper {
204209 }
205210}
206211
207- fn build_block_info_from_metadata (
208- metadata : & acropolis_common:: snapshot:: streaming_snapshot:: SnapshotMetadata ,
209- ) -> BlockInfo {
210- BlockInfo {
212+ fn build_block_info_from_metadata ( metadata : & SnapshotFileMetadata ) -> Result < BlockInfo > {
213+ let ( slot, block_hash_str) = metadata
214+ . parse_point ( )
215+ . ok_or_else ( || anyhow:: anyhow!( "Invalid point format: {}" , metadata. point) ) ?;
216+
217+ let hash = BlockHash :: try_from ( hex:: decode ( block_hash_str) ?)
218+ . map_err ( |e| anyhow:: anyhow!( "Invalid block hash hex: {:?}" , e) ) ?;
219+
220+ let genesis = GenesisValues :: mainnet ( ) ;
221+ let epoch_slot = slot - genesis. epoch_to_first_slot ( slot) ;
222+ let timestamp = genesis. slot_to_timestamp ( slot) ;
223+
224+ info ! (
225+ "Block info built: slot={}, hash={}, epoch={}, slot_in_epoch={}, timestamp={}" ,
226+ slot, hash, metadata. epoch, epoch_slot, timestamp
227+ ) ;
228+
229+ Ok ( BlockInfo {
211230 status : BlockStatus :: Immutable ,
212- slot : 0 ,
231+ slot,
213232 number : 0 ,
214- hash : BlockHash :: default ( ) ,
233+ hash,
215234 epoch : metadata. epoch ,
216- epoch_slot : 0 ,
235+ epoch_slot,
217236 new_epoch : false ,
218- timestamp : 0 ,
237+ timestamp,
219238 era : Era :: Conway ,
220- }
239+ } )
221240}
0 commit comments