oasis_runtime_sdk/storage/
hashed.rs

1use std::marker::PhantomData;
2
3use oasis_core_runtime::storage::mkvs;
4
5use super::Store;
6
7/// A key-value store that hashes all keys and stores them as `H(k) || k`.
8pub struct HashedStore<S: Store, D: digest::Digest> {
9    parent: S,
10    _digest: PhantomData<D>,
11}
12
13impl<S: Store, D: digest::Digest> HashedStore<S, D> {
14    /// Create a new hashed store.
15    pub fn new(parent: S) -> Self {
16        Self {
17            parent,
18            _digest: PhantomData,
19        }
20    }
21}
22
23impl<S: Store, D: digest::Digest> Store for HashedStore<S, D> {
24    fn get(&self, key: &[u8]) -> Option<Vec<u8>> {
25        self.parent.get(&[&D::digest(key), key].concat())
26    }
27
28    fn insert(&mut self, key: &[u8], value: &[u8]) {
29        self.parent.insert(&[&D::digest(key), key].concat(), value);
30    }
31
32    fn remove(&mut self, key: &[u8]) {
33        self.parent.remove(&[&D::digest(key), key].concat());
34    }
35
36    fn iter(&self) -> Box<dyn mkvs::Iterator + '_> {
37        self.parent.iter()
38    }
39
40    fn prefetch_prefixes(&mut self, prefixes: Vec<mkvs::Prefix>, limit: u16) {
41        self.parent.prefetch_prefixes(prefixes, limit);
42    }
43}