@@ -757,4 +757,132 @@ mod tests {
757757 )
758758 }
759759 }
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+ }
760888}
0 commit comments