Skip to content
Merged
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
25 changes: 25 additions & 0 deletions grovedb-version/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,31 @@ macro_rules! check_grovedb_v0_or_v1 {
}};
}

#[macro_export]
macro_rules! check_grovedb_v0_v1_or_v2 {
($method:expr, $version:expr) => {{
const EXPECTED_VERSION_V0: u16 = 0;
const EXPECTED_VERSION_V1: u16 = 1;
const EXPECTED_VERSION_V2: u16 = 2;
if $version != EXPECTED_VERSION_V0
&& $version != EXPECTED_VERSION_V1
&& $version != EXPECTED_VERSION_V2
{
return Err($crate::error::GroveVersionError::UnknownVersionMismatch {
method: $method.to_string(),
known_versions: vec![
EXPECTED_VERSION_V0,
EXPECTED_VERSION_V1,
EXPECTED_VERSION_V2,
],
received: $version,
}
.into());
}
$version
}};
}

#[macro_export]
macro_rules! check_merk_v0_with_cost {
($method:expr, $version:expr) => {{
Expand Down
7 changes: 7 additions & 0 deletions grovedb-version/src/version/merk_versions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ pub struct MerkBatchVersions {
pub struct MerkAverageCaseCostsVersions {
pub add_average_case_merk_propagate: FeatureVersion,
pub sum_tree_estimated_size: FeatureVersion,
/// `EstimatedLayerSizes::value_with_feature_and_flags_size`. Version
/// 0 keeps the pre-existing **unweighted** Mix average
/// `Σ size_i / Σ weight_i` (used by grove v1/v2, consensus-locked).
/// Version 1 switches to a proper weighted average
/// `Σ (size_i · weight_i) / Σ weight_i`. Output for non-Mix
/// variants is identical across versions.
pub value_with_feature_and_flags_size: FeatureVersion,
}

/// Merk-level proof method versions.
Expand Down
1 change: 1 addition & 0 deletions grovedb-version/src/version/v1.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,7 @@ pub const GROVE_V1: GroveVersion = GroveVersion {
average_case_costs: MerkAverageCaseCostsVersions {
add_average_case_merk_propagate: 0,
sum_tree_estimated_size: 0,
value_with_feature_and_flags_size: 0,
},
// `prove_count_offset_on_range` is implementation-version 0
// here too — but in grove v1 the V0 proof envelope rejects
Expand Down
3 changes: 3 additions & 0 deletions grovedb-version/src/version/v2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -216,6 +216,9 @@ pub const GROVE_V2: GroveVersion = GroveVersion {
average_case_costs: MerkAverageCaseCostsVersions {
add_average_case_merk_propagate: 1, // changed
sum_tree_estimated_size: 1, // changed
// grove v2 is consensus-locked to the legacy unweighted
// Mix average; v3 bumps this to 1 with the fixed formula.
value_with_feature_and_flags_size: 0,
},
// See the comment in v1.rs — `prove_count_offset_on_range` is
// not reachable from v2's prove path (V0 envelope rejects
Expand Down
20 changes: 18 additions & 2 deletions grovedb-version/src/version/v3.rs
Original file line number Diff line number Diff line change
Expand Up @@ -214,8 +214,24 @@ pub const GROVE_V3: GroveVersion = GroveVersion {
merk_versions: MerkVersions {
batch: MerkBatchVersions { commit: 1 }, // return accumulated batch costs
average_case_costs: MerkAverageCaseCostsVersions {
add_average_case_merk_propagate: 1,
sum_tree_estimated_size: 1,
// Bumped from 1 → 2: v2 fixes the Mix-arm divisor on both
// `replaced_bytes` and `storage_loaded_bytes`. v1 computed
// `Σ(weight_i · cost_i) / (nodes_updated · total_weight)`
// (off by a factor of `nodes_updated²` vs the equivalent
// homogeneous-layer cost); v2 computes
// `nodes_updated · Σ(weight_i · cost_i) / total_weight`.
add_average_case_merk_propagate: 2,
// Bumped from 1 → 2: v2 folds the four `Provable*` tree-type
// weight fields on `EstimatedSumTrees::SomeSumTrees` into the
// weighted-average formula. v0/v1 outputs are preserved for
// already-shipped grove versions (v1 → v0 formula, v2 → v1
// formula).
sum_tree_estimated_size: 2,
// Bumped from 0 → 1: v1 fixes the Mix-arm "average" to a
// proper weighted average. v0 returned
// `Σ size_i / Σ weight_i` (low-biased and ignored weights);
// v1 returns `Σ (size_i · weight_i) / Σ weight_i`.
value_with_feature_and_flags_size: 1,
},
proof: MerkProofVersions {
// Initial implementation; introduced alongside the V1
Expand Down
4 changes: 4 additions & 0 deletions grovedb/src/batch/estimated_costs/average_case_costs.rs
Original file line number Diff line number Diff line change
Expand Up @@ -962,6 +962,10 @@ mod tests {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand Down
36 changes: 36 additions & 0 deletions grovedb/src/tests/misc_coverage_tests.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1414,6 +1414,10 @@ fn batch_average_case_sum_tree_insert() {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand Down Expand Up @@ -2008,6 +2012,10 @@ fn batch_average_case_replace_sum_item_cost() {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand Down Expand Up @@ -2060,6 +2068,10 @@ fn batch_average_case_replace_sum_tree_cost() {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand All @@ -2078,6 +2090,10 @@ fn batch_average_case_replace_sum_tree_cost() {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand Down Expand Up @@ -2124,6 +2140,10 @@ fn batch_average_case_insert_into_sum_tree() {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand Down Expand Up @@ -2416,6 +2436,10 @@ fn batch_average_case_delete_sum_tree_cost() {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand All @@ -2434,6 +2458,10 @@ fn batch_average_case_delete_sum_tree_cost() {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand Down Expand Up @@ -2862,6 +2890,10 @@ fn batch_average_case_insert_count_tree_cost() {
count_trees_weight: 1,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand Down Expand Up @@ -3412,6 +3444,10 @@ fn batch_average_case_insert_big_sum_tree() {
count_trees_weight: 0,
count_sum_trees_weight: 0,
non_sum_trees_weight: 1,
provable_sum_trees_weight: 0,
provable_count_trees_weight: 0,
provable_count_sum_trees_weight: 0,
provable_count_provable_sum_trees_weight: 0,
},
None,
),
Expand Down
Loading
Loading