drive/verify/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::DriveDocumentQuery;
8
9use dpp::version::PlatformVersion;
10
11impl DriveDocumentQuery<'_> {
12    /// Verifies the given proof and returns the root hash of the GroveDB tree and a vector
13    /// of serialized documents if the verification is successful.
14    ///
15    /// # Arguments
16    /// * `proof` - A byte slice representing the proof to be verified.
17    /// * `platform_version` - The platform version against which to verify the proof.
18    ///
19    /// # Returns
20    /// * On success, returns a tuple containing the root hash of the GroveDB tree and a vector of serialized documents.
21    /// * On failure, returns an Error.
22    ///
23    /// # Errors
24    /// This function will return an Error if:
25    /// 1. The start at document is not present in proof and it is expected to be.
26    /// 2. The path query fails to verify against the given proof.
27    /// 3. Converting the element into bytes fails.
28    pub fn verify_proof_keep_serialized(
29        &self,
30        proof: &[u8],
31        platform_version: &PlatformVersion,
32    ) -> Result<(RootHash, Vec<Vec<u8>>), Error> {
33        match platform_version
34            .drive
35            .methods
36            .verify
37            .document
38            .verify_proof_keep_serialized
39        {
40            0 => self.verify_proof_keep_serialized_v0(proof, platform_version),
41            version => Err(Error::Drive(DriveError::UnknownVersionMismatch {
42                method: "verify_proof_keep_serialized".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 crate::error::drive::DriveError;
54    use dpp::data_contract::accessors::v0::DataContractV0Getters;
55    use dpp::data_contracts::SystemDataContract;
56    use dpp::system_data_contracts::load_system_data_contract;
57
58    #[test]
59    fn test_document_verify_proof_keep_serialized_unknown_version() {
60        let platform_version = PlatformVersion::latest();
61        let contract = load_system_data_contract(SystemDataContract::DPNS, platform_version)
62            .expect("expected to load DPNS contract");
63        let document_type = contract
64            .document_type_for_name("domain")
65            .expect("expected domain document type");
66
67        let mut platform_version = platform_version.clone();
68        platform_version
69            .drive
70            .methods
71            .verify
72            .document
73            .verify_proof_keep_serialized = 255;
74
75        let query = DriveDocumentQuery {
76            contract: &contract,
77            document_type,
78            internal_clauses: Default::default(),
79            offset: None,
80            limit: None,
81            order_by: Default::default(),
82            start_at: None,
83            start_at_included: false,
84            block_time_ms: None,
85        };
86
87        let result = query.verify_proof_keep_serialized(&[], &platform_version);
88
89        assert!(
90            matches!(result, Err(Error::Drive(DriveError::UnknownVersionMismatch { method, known_versions, received }))
91                if method == "verify_proof_keep_serialized" && known_versions == vec![0] && received == 255
92            )
93        );
94    }
95}