Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 18 additions & 5 deletions grovedb/src/batch/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1020,7 +1020,8 @@ where
| Element::SumTree(..)
| Element::BigSumTree(..)
| Element::CountTree(..)
| Element::CountSumTree(..) => Err(Error::InvalidBatchOperation(
| Element::CountSumTree(..)
| Element::ProvableCountTree(..) => Err(Error::InvalidBatchOperation(
"references can not point to trees being updated",
))
.wrap_with_cost(cost),
Expand Down Expand Up @@ -1142,7 +1143,8 @@ where
| Element::SumTree(..)
| Element::BigSumTree(..)
| Element::CountTree(..)
| Element::CountSumTree(..) => Err(Error::InvalidBatchOperation(
| Element::CountSumTree(..)
| Element::ProvableCountTree(..) => Err(Error::InvalidBatchOperation(
"references can not point to trees being updated",
))
.wrap_with_cost(cost),
Expand Down Expand Up @@ -1173,7 +1175,8 @@ where
| Element::SumTree(..)
| Element::BigSumTree(..)
| Element::CountTree(..)
| Element::CountSumTree(..) => Err(Error::InvalidBatchOperation(
| Element::CountSumTree(..)
| Element::ProvableCountTree(..) => Err(Error::InvalidBatchOperation(
"references can not point to trees being updated",
))
.wrap_with_cost(cost),
Expand Down Expand Up @@ -1349,7 +1352,8 @@ where
| Element::SumTree(..)
| Element::BigSumTree(..)
| Element::CountTree(..)
| Element::CountSumTree(..) => {
| Element::CountSumTree(..)
| Element::ProvableCountTree(..) => {
let merk_feature_type = cost_return_on_error!(
&mut cost,
element
Expand Down Expand Up @@ -1571,6 +1575,13 @@ where
flags,
)
}
AggregateData::ProvableCount(count_value) => {
Element::new_provable_count_tree_with_flags_and_count_value(
root_key,
count_value,
flags,
)
}
};
let merk_feature_type =
cost_return_on_error_no_add!(cost, element.get_feature_type(in_tree_type));
Expand Down Expand Up @@ -1660,14 +1671,16 @@ where
| Element::SumTree(..)
| Element::BigSumTree(..)
| Element::CountTree(..)
| Element::CountSumTree(..) => {
| Element::CountSumTree(..)
| Element::ProvableCountTree(..) => {
let tree_type = new_element.tree_type().unwrap();
let tree_cost_size = match tree_type {
TreeType::NormalTree => TREE_COST_SIZE,
TreeType::SumTree => SUM_TREE_COST_SIZE,
TreeType::BigSumTree => BIG_SUM_TREE_COST_SIZE,
TreeType::CountTree => COUNT_TREE_COST_SIZE,
TreeType::CountSumTree => COUNT_SUM_TREE_COST_SIZE,
TreeType::ProvableCountTree => COUNT_TREE_COST_SIZE,
};
let tree_value_cost = tree_cost_size
+ flags_len
Expand Down
37 changes: 37 additions & 0 deletions grovedb/src/element/constructor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -245,4 +245,41 @@ impl Element {
) -> Self {
Element::CountSumTree(maybe_root_key, count_value, sum_value, flags)
}

#[cfg(feature = "minimal")]
/// Set element to default empty provable count tree without flags
pub fn empty_provable_count_tree() -> Self {
Element::new_provable_count_tree(Default::default())
}

#[cfg(feature = "minimal")]
/// Set element to default empty provable count tree with flags
pub fn empty_provable_count_tree_with_flags(flags: Option<ElementFlags>) -> Self {
Element::new_provable_count_tree_with_flags(Default::default(), flags)
}

#[cfg(feature = "minimal")]
/// Set element to a provable count tree without flags
pub fn new_provable_count_tree(maybe_root_key: Option<Vec<u8>>) -> Self {
Element::ProvableCountTree(maybe_root_key, 0, None)
}

#[cfg(feature = "minimal")]
/// Set element to a provable count tree with flags
pub fn new_provable_count_tree_with_flags(
maybe_root_key: Option<Vec<u8>>,
flags: Option<ElementFlags>,
) -> Self {
Element::ProvableCountTree(maybe_root_key, 0, flags)
}

#[cfg(feature = "minimal")]
/// Set element to a provable count tree with flags and count value
pub fn new_provable_count_tree_with_flags_and_count_value(
maybe_root_key: Option<Vec<u8>>,
count_value: CountValue,
flags: Option<ElementFlags>,
) -> Self {
Element::ProvableCountTree(maybe_root_key, count_value, flags)
}
}
18 changes: 12 additions & 6 deletions grovedb/src/element/delete.rs
Original file line number Diff line number Diff line change
Expand Up @@ -35,11 +35,13 @@ impl Element {
(TreeType::SumTree, true)
| (TreeType::BigSumTree, true)
| (TreeType::CountTree, true)
| (TreeType::CountSumTree, true) => Op::DeleteLayeredMaybeSpecialized,
| (TreeType::CountSumTree, true)
| (TreeType::ProvableCountTree, true) => Op::DeleteLayeredMaybeSpecialized,
(TreeType::SumTree, false)
| (TreeType::BigSumTree, false)
| (TreeType::CountTree, false)
| (TreeType::CountSumTree, false) => Op::DeleteMaybeSpecialized,
| (TreeType::CountSumTree, false)
| (TreeType::ProvableCountTree, false) => Op::DeleteMaybeSpecialized,
};
let batch = [(key, op)];
// todo not sure we get it again, we need to see if this is necessary
Expand Down Expand Up @@ -94,11 +96,13 @@ impl Element {
(TreeType::SumTree, true)
| (TreeType::BigSumTree, true)
| (TreeType::CountTree, true)
| (TreeType::CountSumTree, true) => Op::DeleteLayeredMaybeSpecialized,
| (TreeType::CountSumTree, true)
| (TreeType::ProvableCountTree, true) => Op::DeleteLayeredMaybeSpecialized,
(TreeType::SumTree, false)
| (TreeType::BigSumTree, false)
| (TreeType::CountTree, false)
| (TreeType::CountSumTree, false) => Op::DeleteMaybeSpecialized,
| (TreeType::CountSumTree, false)
| (TreeType::ProvableCountTree, false) => Op::DeleteMaybeSpecialized,
};
let batch = [(key, op)];
// todo not sure we get it again, we need to see if this is necessary
Expand Down Expand Up @@ -147,11 +151,13 @@ impl Element {
(TreeType::SumTree, true)
| (TreeType::BigSumTree, true)
| (TreeType::CountTree, true)
| (TreeType::CountSumTree, true) => Op::DeleteLayeredMaybeSpecialized,
| (TreeType::CountSumTree, true)
| (TreeType::ProvableCountTree, true) => Op::DeleteLayeredMaybeSpecialized,
(TreeType::SumTree, false)
| (TreeType::BigSumTree, false)
| (TreeType::CountTree, false)
| (TreeType::CountSumTree, false) => Op::DeleteMaybeSpecialized,
| (TreeType::CountSumTree, false)
| (TreeType::ProvableCountTree, false) => Op::DeleteMaybeSpecialized,
};
let entry = (key, op);
batch_operations.push(entry);
Expand Down
6 changes: 4 additions & 2 deletions grovedb/src/element/get.rs
Original file line number Diff line number Diff line change
Expand Up @@ -212,7 +212,8 @@ impl Element {
| Some(Element::SumTree(_, _, flags))
| Some(Element::BigSumTree(_, _, flags))
| Some(Element::CountTree(_, _, flags))
| Some(Element::CountSumTree(.., flags)) => {
| Some(Element::CountSumTree(.., flags))
| Some(Element::ProvableCountTree(_, _, flags)) => {
let tree_cost_size = element.as_ref().unwrap().tree_type().unwrap().cost_size();
let flags_len = flags.as_ref().map_or(0, |flags| {
let flags_len = flags.len() as u32;
Expand Down Expand Up @@ -294,7 +295,8 @@ impl Element {
| Element::SumTree(_, _, flags)
| Element::BigSumTree(_, _, flags)
| Element::CountTree(_, _, flags)
| Element::CountSumTree(.., flags) => {
| Element::CountSumTree(.., flags)
| Element::ProvableCountTree(_, _, flags) => {
let tree_cost_size = element.tree_type().unwrap().cost_size();
let flags_len = flags.as_ref().map_or(0, |flags| {
let flags_len = flags.len() as u32;
Expand Down
45 changes: 40 additions & 5 deletions grovedb/src/element/helpers.rs
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,8 @@ impl Element {
/// everything else
pub fn count_value_or_default(&self) -> u64 {
match self {
Element::CountTree(_, count_value, _) => *count_value,
Element::CountTree(_, count_value, _)
| Element::ProvableCountTree(_, count_value, _) => *count_value,
_ => 1,
}
}
Expand All @@ -67,6 +68,7 @@ impl Element {
Element::SumItem(sum_value, _) | Element::SumTree(_, sum_value, _) => (1, *sum_value),
Element::CountTree(_, count_value, _) => (*count_value, 0),
Element::CountSumTree(_, count_value, sum_value, _) => (*count_value, *sum_value),
Element::ProvableCountTree(_, count_value, _) => (*count_value, 0),
_ => (1, 0),
}
}
Expand Down Expand Up @@ -163,6 +165,9 @@ impl Element {
Element::BigSumTree(root_key, ..) => Some((root_key, TreeType::BigSumTree)),
Element::CountTree(root_key, ..) => Some((root_key, TreeType::CountTree)),
Element::CountSumTree(root_key, ..) => Some((root_key, TreeType::CountSumTree)),
Element::ProvableCountTree(root_key, ..) => {
Some((root_key, TreeType::ProvableCountTree))
}
_ => None,
}
}
Expand All @@ -177,6 +182,9 @@ impl Element {
Element::BigSumTree(root_key, ..) => Some((root_key, TreeType::BigSumTree)),
Element::CountTree(root_key, ..) => Some((root_key, TreeType::CountTree)),
Element::CountSumTree(root_key, ..) => Some((root_key, TreeType::CountSumTree)),
Element::ProvableCountTree(root_key, ..) => {
Some((root_key, TreeType::ProvableCountTree))
}
_ => None,
}
}
Expand All @@ -190,6 +198,7 @@ impl Element {
Element::BigSumTree(_, _, flags) => Some((flags, TreeType::BigSumTree)),
Element::CountTree(_, _, flags) => Some((flags, TreeType::CountTree)),
Element::CountSumTree(.., flags) => Some((flags, TreeType::CountSumTree)),
Element::ProvableCountTree(_, _, flags) => Some((flags, TreeType::ProvableCountTree)),
_ => None,
}
}
Expand All @@ -203,6 +212,7 @@ impl Element {
Element::BigSumTree(..) => Some(TreeType::BigSumTree),
Element::CountTree(..) => Some(TreeType::CountTree),
Element::CountSumTree(..) => Some(TreeType::CountSumTree),
Element::ProvableCountTree(..) => Some(TreeType::ProvableCountTree),
_ => None,
}
}
Expand All @@ -217,6 +227,9 @@ impl Element {
Element::BigSumTree(_, value, _) => Some(BigSummedMerkNode(*value)),
Element::CountTree(_, value, _) => Some(CountedMerkNode(*value)),
Element::CountSumTree(_, count, sum, _) => Some(CountedSummedMerkNode(*count, *sum)),
Element::ProvableCountTree(_, value, _) => {
Some(TreeFeatureType::ProvableCountedMerkNode(*value))
}
_ => None,
}
}
Expand All @@ -230,6 +243,7 @@ impl Element {
Element::BigSumTree(..) => MaybeTree::Tree(TreeType::BigSumTree),
Element::CountTree(..) => MaybeTree::Tree(TreeType::CountTree),
Element::CountSumTree(..) => MaybeTree::Tree(TreeType::CountSumTree),
Element::ProvableCountTree(..) => MaybeTree::Tree(TreeType::ProvableCountTree),
_ => MaybeTree::NotTree,
}
}
Expand All @@ -256,6 +270,7 @@ impl Element {
| Element::BigSumTree(..)
| Element::CountTree(..)
| Element::CountSumTree(..)
| Element::ProvableCountTree(..)
)
}

Expand Down Expand Up @@ -295,6 +310,9 @@ impl Element {
let v = self.count_sum_value_or_default();
Ok(CountedSummedMerkNode(v.0, v.1))
}
TreeType::ProvableCountTree => Ok(TreeFeatureType::ProvableCountedMerkNode(
self.count_value_or_default(),
)),
}
}

Expand All @@ -309,7 +327,8 @@ impl Element {
| Element::BigSumTree(.., flags)
| Element::CountTree(.., flags)
| Element::SumItem(_, flags)
| Element::CountSumTree(.., flags) => flags,
| Element::CountSumTree(.., flags)
| Element::ProvableCountTree(.., flags) => flags,
}
}

Expand All @@ -324,7 +343,8 @@ impl Element {
| Element::BigSumTree(.., flags)
| Element::CountTree(.., flags)
| Element::SumItem(_, flags)
| Element::CountSumTree(.., flags) => flags,
| Element::CountSumTree(.., flags)
| Element::ProvableCountTree(.., flags) => flags,
}
}

Expand All @@ -339,7 +359,8 @@ impl Element {
| Element::BigSumTree(.., flags)
| Element::CountTree(.., flags)
| Element::SumItem(_, flags)
| Element::CountSumTree(.., flags) => flags,
| Element::CountSumTree(.., flags)
| Element::ProvableCountTree(.., flags) => flags,
}
}

Expand All @@ -354,7 +375,8 @@ impl Element {
| Element::BigSumTree(.., flags)
| Element::CountTree(.., flags)
| Element::SumItem(_, flags)
| Element::CountSumTree(.., flags) => *flags = new_flags,
| Element::CountSumTree(.., flags)
| Element::ProvableCountTree(.., flags) => *flags = new_flags,
}
}

Expand Down Expand Up @@ -476,6 +498,17 @@ impl Element {
key_len, value_len, node_type,
)
}
Element::ProvableCountTree(_, _count_value, flags) => {
let flags_len = flags.map_or(0, |flags| {
let flags_len = flags.len() as u32;
flags_len + flags_len.required_space() as u32
});
let value_len = COUNT_TREE_COST_SIZE + flags_len;
let key_len = key.len() as u32;
KV::layered_value_byte_cost_size_for_key_and_value_lengths(
key_len, value_len, node_type,
)
}
Element::SumItem(.., flags) => {
let flags_len = flags.map_or(0, |flags| {
let flags_len = flags.len() as u32;
Expand Down Expand Up @@ -504,6 +537,7 @@ impl Element {
Element::SumItem(..) => Ok(SUM_ITEM_COST_SIZE),
Element::CountTree(..) => Ok(COUNT_TREE_COST_SIZE),
Element::CountSumTree(..) => Ok(COUNT_SUM_TREE_COST_SIZE),
Element::ProvableCountTree(..) => Ok(COUNT_TREE_COST_SIZE),
_ => Err(Error::CorruptedCodeExecution(
"trying to get tree cost from non tree element",
)),
Expand All @@ -526,6 +560,7 @@ impl Element {
Element::BigSumTree(..) => Some(LayeredValueDefinedCost(cost)),
Element::CountTree(..) => Some(LayeredValueDefinedCost(cost)),
Element::CountSumTree(..) => Some(LayeredValueDefinedCost(cost)),
Element::ProvableCountTree(..) => Some(LayeredValueDefinedCost(cost)),
Element::SumItem(..) => Some(SpecializedValueDefinedCost(cost)),
_ => None,
}
Expand Down
15 changes: 15 additions & 0 deletions grovedb/src/element/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ impl CostSize for TreeType {
TreeType::BigSumTree => BIG_SUM_TREE_COST_SIZE,
TreeType::CountTree => COUNT_TREE_COST_SIZE,
TreeType::CountSumTree => COUNT_SUM_TREE_COST_SIZE,
TreeType::ProvableCountTree => COUNT_TREE_COST_SIZE,
}
}
}
Expand Down Expand Up @@ -138,6 +139,8 @@ pub enum Element {
CountTree(Option<Vec<u8>>, CountValue, Option<ElementFlags>),
/// Combines Element::SumTree and Element::CountTree
CountSumTree(Option<Vec<u8>>, CountValue, SumValue, Option<ElementFlags>),
/// Same as Element::CountTree but includes counts in cryptographic state
ProvableCountTree(Option<Vec<u8>>, CountValue, Option<ElementFlags>),
}

impl fmt::Display for Element {
Expand Down Expand Up @@ -229,6 +232,17 @@ impl fmt::Display for Element {
.map_or(String::new(), |f| format!(", flags: {:?}", f))
)
}
Element::ProvableCountTree(root_key, count_value, flags) => {
write!(
f,
"ProvableCountTree({}, {}{})",
root_key.as_ref().map_or("None".to_string(), hex::encode),
count_value,
flags
.as_ref()
.map_or(String::new(), |f| format!(", flags: {:?}", f))
)
}
}
}
}
Expand All @@ -244,6 +258,7 @@ impl Element {
Element::BigSumTree(..) => "big sum tree",
Element::CountTree(..) => "count tree",
Element::CountSumTree(..) => "count sum tree",
Element::ProvableCountTree(..) => "provable count tree",
}
}

Expand Down
Loading
Loading