1+ use crate :: digesters:: { Digester , DigesterError , DigesterResult } ;
12use crate :: entities:: ImmutableFileNumber ;
23
34use sha2:: { Digest , Sha256 } ;
@@ -6,11 +7,10 @@ use std::ffi::OsStr;
67use std:: fs:: File ;
78use std:: io;
89use std:: path:: { Path , PathBuf } ;
9- use thiserror:: Error ;
1010
1111use walkdir:: WalkDir ;
1212
13- /// ImmutableDigester
13+ /// A digester working directly on a Cardano DB immutables files
1414pub struct ImmutableDigester {
1515 /// A cardano node DB directory
1616 db_directory : PathBuf ,
@@ -19,27 +19,6 @@ pub struct ImmutableDigester {
1919 logger : Logger ,
2020}
2121
22- #[ derive( Error , Debug ) ]
23- pub enum ImmutableDigesterError {
24- #[ error( "Immutable files listing failed: `{0}`" ) ]
25- ListImmutablesError ( String ) ,
26-
27- #[ error( "At least two immutables chunk should exists" ) ]
28- NotEnoughImmutable ( ) ,
29-
30- #[ error( "Digest computation failed:" ) ]
31- DigestComputationError ( #[ from] io:: Error ) ,
32- }
33-
34- #[ derive( Debug ) ]
35- pub struct ImmutableDigesterResult {
36- /// The computed digest
37- pub digest : String ,
38-
39- /// The number of the last immutable file used to compute the digest
40- pub last_immutable_file_number : ImmutableFileNumber ,
41- }
42-
4322impl ImmutableDigester {
4423 /// ImmutableDigester factory
4524 pub fn new ( db_directory : PathBuf , logger : Logger ) -> Self {
@@ -49,28 +28,6 @@ impl ImmutableDigester {
4928 }
5029 }
5130
52- pub fn compute_digest ( & self ) -> Result < ImmutableDigesterResult , ImmutableDigesterError > {
53- let immutables = ImmutableFile :: list_in_dir ( & * self . db_directory )
54- . map_err ( ImmutableDigesterError :: ListImmutablesError ) ?;
55- let last_immutable = immutables
56- . last ( )
57- . ok_or ( ImmutableDigesterError :: NotEnoughImmutable ( ) ) ?;
58-
59- info ! ( self . logger, "#immutables: {}" , immutables. len( ) ) ;
60-
61- let hash = self
62- . compute_hash ( & immutables)
63- . map_err ( ImmutableDigesterError :: DigestComputationError ) ?;
64- let digest = hex:: encode ( hash) ;
65-
66- debug ! ( self . logger, "#computed digest: {:?}" , digest) ;
67-
68- Ok ( ImmutableDigesterResult {
69- digest,
70- last_immutable_file_number : last_immutable. number ,
71- } )
72- }
73-
7431 fn compute_hash ( & self , entries : & [ ImmutableFile ] ) -> Result < [ u8 ; 32 ] , io:: Error > {
7532 let mut hasher = Sha256 :: new ( ) ;
7633 let mut progress = Progress {
@@ -92,6 +49,30 @@ impl ImmutableDigester {
9249 }
9350}
9451
52+ impl Digester for ImmutableDigester {
53+ fn compute_digest ( & self ) -> Result < DigesterResult , DigesterError > {
54+ let immutables = ImmutableFile :: list_in_dir ( & * self . db_directory )
55+ . map_err ( DigesterError :: ListImmutablesError ) ?;
56+ let last_immutable = immutables
57+ . last ( )
58+ . ok_or ( DigesterError :: NotEnoughImmutable ( ) ) ?;
59+
60+ info ! ( self . logger, "#immutables: {}" , immutables. len( ) ) ;
61+
62+ let hash = self
63+ . compute_hash ( & immutables)
64+ . map_err ( DigesterError :: DigestComputationError ) ?;
65+ let digest = hex:: encode ( hash) ;
66+
67+ debug ! ( self . logger, "#computed digest: {:?}" , digest) ;
68+
69+ Ok ( DigesterResult {
70+ digest,
71+ last_immutable_file_number : last_immutable. number ,
72+ } )
73+ }
74+ }
75+
9576struct Progress {
9677 index : usize ,
9778 total : usize ,
0 commit comments