Skip to main content

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        self.ensure_no_sub_queries("verify_proof_keep_serialized")?;
34        match platform_version
35            .drive
36            .methods
37            .verify
38            .document
39            .verify_proof_keep_serialized
40        {
41            0 => self.verify_proof_keep_serialized_v0(proof, platform_version),
42            version => Err(Error::Drive(DriveError::UnknownVersionMismatch {
43                method: "verify_proof_keep_serialized".to_string(),
44                known_versions: vec![0],
45                received: version,
46            })),
47        }
48    }
49}
50
51#[cfg(test)]
52mod tests {
53    use super::*;
54    use crate::error::drive::DriveError;
55    use dpp::data_contract::accessors::v0::DataContractV0Getters;
56    use dpp::data_contracts::SystemDataContract;
57    use dpp::system_data_contracts::load_system_data_contract;
58
59    #[test]
60    fn test_document_verify_proof_keep_serialized_unknown_version() {
61        let platform_version = PlatformVersion::latest();
62        let contract = load_system_data_contract(SystemDataContract::DPNS, platform_version)
63            .expect("expected to load DPNS contract");
64        let document_type = contract
65            .document_type_for_name("domain")
66            .expect("expected domain document type");
67
68        let mut platform_version = platform_version.clone();
69        platform_version
70            .drive
71            .methods
72            .verify
73            .document
74            .verify_proof_keep_serialized = 255;
75
76        let query = DriveDocumentQuery {
77            contract: &contract,
78            document_type,
79            internal_clauses: Default::default(),
80            offset: None,
81            limit: None,
82            order_by: Default::default(),
83            start_at: None,
84            start_at_included: false,
85            block_time_ms: None,
86            resolved_time_ranges: vec![],
87            sub_queries: vec![],
88        };
89
90        let result = query.verify_proof_keep_serialized(&[], &platform_version);
91
92        assert!(
93            matches!(result, Err(Error::Drive(DriveError::UnknownVersionMismatch { method, known_versions, received }))
94                if method == "verify_proof_keep_serialized" && known_versions == vec![0] && received == 255
95            )
96        );
97    }
98}