drive/verify/single_document/verify_proof_keep_serialized/
mod.rs

1mod v0;
2
3use crate::error::drive::DriveError;
4use crate::verify::RootHash;
5
6use crate::error::Error;
7use crate::query::SingleDocumentDriveQuery;
8
9use dpp::version::PlatformVersion;
10
11impl SingleDocumentDriveQuery {
12    /// Verifies the proof of a document while keeping it serialized.
13    ///
14    /// `is_subset` indicates if the function should verify a subset of a larger proof.
15    ///
16    /// # Parameters
17    ///
18    /// - `is_subset`: A boolean indicating whether to verify a subset of a larger proof.
19    /// - `proof`: A byte slice representing the proof to be verified.
20    /// - `platform_version`: The platform version against which to verify the proof.
21    ///
22    /// # Returns
23    ///
24    /// Returns a `Result` with a tuple of `RootHash` and `Option<Vec<u8>>`. The `Option<Vec<u8>>`
25    /// represents the serialized document if it exists.
26    ///
27    /// # Errors
28    ///
29    /// Returns an `Error` if:
30    ///
31    /// - An unknown or unsupported platform version is provided.
32    /// - Any other error as documented in the specific versioned function.
33    pub fn verify_proof_keep_serialized(
34        &self,
35        is_subset: bool,
36        proof: &[u8],
37        platform_version: &PlatformVersion,
38    ) -> Result<(RootHash, Option<Vec<u8>>), Error> {
39        match platform_version
40            .drive
41            .methods
42            .verify
43            .single_document
44            .verify_proof_keep_serialized
45        {
46            0 => self.verify_proof_keep_serialized_v0(is_subset, proof, platform_version),
47            version => Err(Error::Drive(DriveError::UnknownVersionMismatch {
48                method: "SingleDocumentDriveQuery::verify_proof_keep_serialized".to_string(),
49                known_versions: vec![0],
50                received: version,
51            })),
52        }
53    }
54}
55
56#[cfg(test)]
57mod tests {
58    use super::*;
59    use crate::error::drive::DriveError;
60    use crate::query::SingleDocumentDriveQueryContestedStatus;
61
62    #[test]
63    fn test_single_document_verify_proof_keep_serialized_unknown_version() {
64        let mut platform_version = PlatformVersion::latest().clone();
65        platform_version
66            .drive
67            .methods
68            .verify
69            .single_document
70            .verify_proof_keep_serialized = 255;
71
72        let query = SingleDocumentDriveQuery {
73            contract_id: [0u8; 32],
74            document_type_name: "test".to_string(),
75            document_type_keeps_history: false,
76            document_id: [0u8; 32],
77            block_time_ms: None,
78            contested_status: SingleDocumentDriveQueryContestedStatus::NotContested,
79        };
80
81        let result = query.verify_proof_keep_serialized(false, &[], &platform_version);
82
83        assert!(
84            matches!(result, Err(Error::Drive(DriveError::UnknownVersionMismatch { method, known_versions, received }))
85                if method == "SingleDocumentDriveQuery::verify_proof_keep_serialized" && known_versions == vec![0] && received == 255
86            )
87        );
88    }
89}