@@ -757,4 +757,132 @@ mod tests {
757
757
)
758
758
}
759
759
}
760
+
761
+ mod verify_cardano_database {
762
+
763
+ use std:: { collections:: BTreeMap , ops:: RangeInclusive , path:: PathBuf } ;
764
+
765
+ use mithril_cardano_node_internal_database:: {
766
+ digesters:: { CardanoImmutableDigester , ImmutableDigester } ,
767
+ test:: DummyCardanoDbBuilder ,
768
+ } ;
769
+ use mithril_common:: {
770
+ entities:: { CardanoDbBeacon , Epoch , ImmutableFileNumber , ProtocolMessage } ,
771
+ messages:: CertificateMessage ,
772
+ test:: double:: Dummy ,
773
+ } ;
774
+
775
+ use crate :: cardano_database_client:: ImmutableFileRange ;
776
+ use crate :: { cardano_database_client:: VerifiedDigests , test_utils:: TestLogger } ;
777
+
778
+ use super :: * ;
779
+
780
+ async fn prepare_db_and_verified_digests (
781
+ dir_name : & str ,
782
+ beacon : & CardanoDbBeacon ,
783
+ immutable_file_range : & RangeInclusive < ImmutableFileNumber > ,
784
+ ) -> ( PathBuf , CertificateMessage , VerifiedDigests ) {
785
+ let cardano_db = DummyCardanoDbBuilder :: new ( dir_name)
786
+ . with_immutables ( & immutable_file_range. clone ( ) . collect :: < Vec < _ > > ( ) )
787
+ . append_immutable_trio ( )
788
+ . build ( ) ;
789
+ let database_dir = cardano_db. get_dir ( ) ;
790
+ let immutable_digester =
791
+ CardanoImmutableDigester :: new ( "whatever" . to_string ( ) , None , TestLogger :: stdout ( ) ) ;
792
+ let computed_digests = immutable_digester
793
+ . compute_digests_for_range ( database_dir, immutable_file_range)
794
+ . await
795
+ . unwrap ( ) ;
796
+
797
+ let digests = computed_digests
798
+ . entries
799
+ . iter ( )
800
+ . map ( |( immutable_file, digest) | ( immutable_file. filename . clone ( ) , digest. clone ( ) ) )
801
+ . collect :: < BTreeMap < _ , _ > > ( ) ;
802
+
803
+ let merkle_tree = immutable_digester
804
+ . compute_merkle_tree ( database_dir, beacon)
805
+ . await
806
+ . unwrap ( ) ;
807
+
808
+ let verified_digests = VerifiedDigests {
809
+ digests,
810
+ merkle_tree,
811
+ } ;
812
+
813
+ let certificate = {
814
+ let protocol_message_merkle_root =
815
+ verified_digests. merkle_tree . compute_root ( ) . unwrap ( ) . to_hex ( ) ;
816
+ let mut protocol_message = ProtocolMessage :: new ( ) ;
817
+ protocol_message. set_message_part (
818
+ ProtocolMessagePartKey :: CardanoDatabaseMerkleRoot ,
819
+ protocol_message_merkle_root,
820
+ ) ;
821
+
822
+ CertificateMessage {
823
+ protocol_message : protocol_message. clone ( ) ,
824
+ signed_message : protocol_message. compute_hash ( ) ,
825
+ ..CertificateMessage :: dummy ( )
826
+ }
827
+ } ;
828
+
829
+ ( database_dir. to_owned ( ) , certificate, verified_digests)
830
+ }
831
+
832
+ fn to_vec_immutable_file_name ( list : & [ & str ] ) -> Vec < ImmutableFileName > {
833
+ list. iter ( ) . map ( |s| ImmutableFileName :: from ( * s) ) . collect ( )
834
+ }
835
+
836
+ #[ tokio:: test]
837
+ async fn verify_cardano_database_succeeds ( ) {
838
+ let beacon = CardanoDbBeacon {
839
+ epoch : Epoch ( 123 ) ,
840
+ immutable_file_number : 10 ,
841
+ } ;
842
+ let immutable_file_range = 1 ..=15 ;
843
+ let immutable_file_range_to_prove = ImmutableFileRange :: Range ( 2 , 4 ) ;
844
+ let ( database_dir, certificate, verified_digests) = prepare_db_and_verified_digests (
845
+ "compute_cardano_database_message_succeeds" ,
846
+ & beacon,
847
+ & immutable_file_range,
848
+ )
849
+ . await ;
850
+
851
+ //TODO: verify_cardano_database will not build a message anymore
852
+ // let message = MessageBuilder::new()
853
+ // .compute_cardano_database_message(
854
+ // &certificate,
855
+ // &CardanoDatabaseSnapshotMessage::dummy(),
856
+ // &immutable_file_range_to_prove,
857
+ // false,
858
+ // &database_dir,
859
+ // &verified_digests,
860
+ // )
861
+ // .await
862
+ // .unwrap();
863
+
864
+ // assert!(certificate.match_message(&message));
865
+ let expected_merkle_root =
866
+ verified_digests. merkle_tree . compute_root ( ) . unwrap ( ) . to_owned ( ) ;
867
+
868
+ let client = CardanoDatabaseClientDependencyInjector :: new ( ) ;
869
+
870
+ let merkle_proof = client
871
+ . verify_cardano_database (
872
+ & certificate,
873
+ & CardanoDatabaseSnapshotMessage :: dummy ( ) ,
874
+ & immutable_file_range_to_prove,
875
+ false ,
876
+ & database_dir,
877
+ & verified_digests,
878
+ )
879
+ . await
880
+ . unwrap ( ) ;
881
+
882
+ merkle_proof. verify ( ) . unwrap ( ) ;
883
+ let merkle_proof_root = merkle_proof. root ( ) . to_owned ( ) ;
884
+ assert_eq ! ( expected_merkle_root, merkle_proof_root) ;
885
+ assert ! ( !InternalArtifactProver :: digest_target_dir( ) . exists( ) ) ;
886
+ }
887
+ }
760
888
}
0 commit comments