1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
use alloc::vec::Vec;
use anyhow::{format_err, Result};
use crate::node_type::{LeafNode, Node, NodeKey};
use crate::{KeyHash, OwnedValue, Version};
/// Defines the interface between a
/// [`JellyfishMerkleTree`](crate::JellyfishMerkleTree)
/// and underlying storage holding nodes.
pub trait TreeReader {
/// Gets node given a node key. Returns error if the node does not exist.
fn get_node(&self, node_key: &NodeKey) -> Result<Node> {
self.get_node_option(node_key)?
.ok_or_else(|| format_err!("Missing node at {:?}.", node_key))
}
/// Gets node given a node key. Returns `None` if the node does not exist.
fn get_node_option(&self, node_key: &NodeKey) -> Result<Option<Node>>;
/// Gets a value by identifier, returning the newest value whose version is *less than or
/// equal to* the specified version. Returns an error if the value does not exist.
fn get_value(&self, max_version: Version, key_hash: KeyHash) -> Result<OwnedValue> {
self.get_value_option(max_version, key_hash)?
.ok_or_else(|| {
format_err!(
"Missing value with max_version {max_version:} and key hash {key_hash:?}."
)
})
}
/// Gets a value by identifier, returning the newest value whose version is *less than or
/// equal to* the specified version. Returns None if the value does not exist.
fn get_value_option(
&self,
max_version: Version,
key_hash: KeyHash,
) -> Result<Option<OwnedValue>>;
/// Gets the rightmost leaf. Note that this assumes we are in the process of restoring the tree
/// and all nodes are at the same version.
fn get_rightmost_leaf(&self) -> Result<Option<(NodeKey, LeafNode)>>;
}
/// Defines the ability for a tree to look up the preimage of its key hashes.
pub trait HasPreimage {
/// Gets the preimage of a key hash, if it is present in the tree.
fn preimage(&self, key_hash: KeyHash) -> Result<Option<Vec<u8>>>;
}