Skip to main content

drive/verify/shielded/verify_shielded_encrypted_notes/
mod.rs

1mod v0;
2
3use crate::drive::Drive;
4use crate::error::drive::DriveError;
5use crate::error::Error;
6use crate::verify::RootHash;
7use dpp::version::PlatformVersion;
8
9impl Drive {
10    /// Verifies a proof for shielded encrypted notes.
11    ///
12    /// Returns `(root_hash, notes, total_count)`. `total_count` is the
13    /// on-chain total number of notes in the shielded `CommitmentTree`,
14    /// extracted from the SAME proof (the parent CommitmentTree element is
15    /// always present in a note-fetch proof) — wallets get the sync
16    /// progress-bar denominator for free on every chunk fetch.
17    #[allow(clippy::type_complexity)]
18    pub fn verify_shielded_encrypted_notes(
19        proof: &[u8],
20        start_index: u64,
21        count: u32,
22        max_elements: u32,
23        verify_subset_of_proof: bool,
24        platform_version: &PlatformVersion,
25    ) -> Result<(RootHash, Vec<(Vec<u8>, Vec<u8>, Vec<u8>)>, u64), Error> {
26        match platform_version
27            .drive
28            .methods
29            .verify
30            .shielded
31            .verify_shielded_encrypted_notes
32        {
33            0 => Self::verify_shielded_encrypted_notes_v0(
34                proof,
35                start_index,
36                count,
37                max_elements,
38                verify_subset_of_proof,
39                platform_version,
40            ),
41            version => Err(Error::Drive(DriveError::UnknownVersionMismatch {
42                method: "verify_shielded_encrypted_notes".to_string(),
43                known_versions: vec![0],
44                received: version,
45            })),
46        }
47    }
48}
49
50#[cfg(test)]
51mod tests {
52    use super::*;
53    use dpp::version::PlatformVersion;
54
55    #[test]
56    fn test_verify_shielded_encrypted_notes_unknown_version_mismatch() {
57        let mut platform_version = PlatformVersion::latest().clone();
58        platform_version
59            .drive
60            .methods
61            .verify
62            .shielded
63            .verify_shielded_encrypted_notes = 255;
64
65        let result = Drive::verify_shielded_encrypted_notes(&[], 0, 0, 0, false, &platform_version);
66
67        assert!(
68            matches!(
69                result,
70                Err(Error::Drive(DriveError::UnknownVersionMismatch { .. }))
71            ),
72            "expected UnknownVersionMismatch, got {:?}",
73            result,
74        );
75    }
76}