casper_storage/data_access_layer/
query.rs

1//! Support for global state queries.
2use casper_types::{global_state::TrieMerkleProof, Digest, Key, StoredValue};
3
4use crate::tracking_copy::{TrackingCopyError, TrackingCopyQueryResult};
5
6/// Request for a global state query.
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct QueryRequest {
9    state_hash: Digest,
10    key: Key,
11    path: Vec<String>,
12}
13
14impl QueryRequest {
15    /// Creates new request object.
16    pub fn new(state_hash: Digest, key: Key, path: Vec<String>) -> Self {
17        QueryRequest {
18            state_hash,
19            key,
20            path,
21        }
22    }
23
24    /// Returns state root hash.
25    pub fn state_hash(&self) -> Digest {
26        self.state_hash
27    }
28
29    /// Returns a key.
30    pub fn key(&self) -> Key {
31        self.key
32    }
33
34    /// Returns a query path.
35    pub fn path(&self) -> &[String] {
36        &self.path
37    }
38}
39
40impl From<TrackingCopyQueryResult> for QueryResult {
41    fn from(tracking_copy_query_result: TrackingCopyQueryResult) -> Self {
42        match tracking_copy_query_result {
43            TrackingCopyQueryResult::ValueNotFound(message) => QueryResult::ValueNotFound(message),
44            TrackingCopyQueryResult::CircularReference(message) => {
45                QueryResult::Failure(TrackingCopyError::CircularReference(message))
46            }
47            TrackingCopyQueryResult::Success { value, proofs } => {
48                let value = Box::new(value);
49                QueryResult::Success { value, proofs }
50            }
51            TrackingCopyQueryResult::DepthLimit { depth } => {
52                QueryResult::Failure(TrackingCopyError::QueryDepthLimit { depth })
53            }
54            TrackingCopyQueryResult::RootNotFound => QueryResult::RootNotFound,
55        }
56    }
57}
58
59/// Result of a global state query request.
60#[derive(Debug)]
61pub enum QueryResult {
62    /// Invalid state root hash.
63    RootNotFound,
64    /// Value not found.
65    ValueNotFound(String),
66    /// Successful query.
67    Success {
68        /// Stored value under a path.
69        value: Box<StoredValue>,
70        /// Merkle proof of the query.
71        proofs: Vec<TrieMerkleProof<Key, StoredValue>>,
72    },
73    /// Tracking Copy Error
74    Failure(TrackingCopyError),
75}