From 3aefaa3db20150613efc249591f7c6b0ab2828d4 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 10 Jan 2025 19:01:07 +0000 Subject: [PATCH 1/3] fix: get_next_power_exponent off by 1 --- .../src/merkle_tree/variable_merkle_tree.nr | 21 ++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr b/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr index 044f131beff8..aa0973c11f46 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr @@ -20,7 +20,8 @@ pub struct VariableMerkleTree { /// The smallest exponent `n` where `2^n >= input` unconstrained fn get_next_power_exponent(input: u32, start: u8) -> u8 { let mut next_power_exponent = 0; - if input <= 2 << start { + // We check if input is less than or equal to 2^start. + if input <= (1 << start) { next_power_exponent = start; } else { next_power_exponent = get_next_power_exponent(input, start + 1); @@ -49,7 +50,7 @@ fn get_prev_power_2(value: u32) -> u32 { get_next_power_exponent(value, 0) }; - let next_power_2 = 2 << next_power_exponent; + let next_power_2 = 1 << next_power_exponent; let prev_power_2 = next_power_2 / 2; assert(prev_power_2 < value); assert(value <= next_power_2); @@ -122,7 +123,8 @@ impl VariableMerkleTree { pub mod tests { use crate::{ - hash::accumulate_sha256, merkle_tree::variable_merkle_tree::VariableMerkleTree, + hash::accumulate_sha256, + merkle_tree::variable_merkle_tree::{get_next_power_exponent, VariableMerkleTree}, tests::fixtures::merkle_tree::generate_full_sha_tree, }; @@ -140,6 +142,19 @@ pub mod tests { items } + #[test] + unconstrained fn test_get_next_power_exponent() { + assert_eq(get_next_power_exponent(0, 0), 0); + assert_eq(get_next_power_exponent(1, 0), 0); + assert_eq(get_next_power_exponent(2, 0), 1); + assert_eq(get_next_power_exponent(3, 0), 2); + assert_eq(get_next_power_exponent(4, 0), 2); + assert_eq(get_next_power_exponent(5, 0), 3); + assert_eq(get_next_power_exponent(8, 0), 3); + assert_eq(get_next_power_exponent(9, 0), 4); + assert_eq(get_next_power_exponent(16, 0), 4); + } + #[test] fn test_0_elems() { let items = [0; 100]; From fb5b31bc49bcf71de399de545a562897ff318288 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 10 Jan 2025 21:14:50 +0000 Subject: [PATCH 2/3] optimization --- .../crates/types/src/merkle_tree/variable_merkle_tree.nr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr b/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr index aa0973c11f46..5e04ee351447 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr @@ -50,8 +50,8 @@ fn get_prev_power_2(value: u32) -> u32 { get_next_power_exponent(value, 0) }; - let next_power_2 = 1 << next_power_exponent; - let prev_power_2 = next_power_2 / 2; + let prev_power_2 = 1 << (next_power_exponent - 1); + let next_power_2 = prev_power_2 * 2; assert(prev_power_2 < value); assert(value <= next_power_2); From d4b3da4e8afcd141b8dd0ab7703d1d3dba303119 Mon Sep 17 00:00:00 2001 From: benesjan Date: Fri, 10 Jan 2025 23:04:20 +0000 Subject: [PATCH 3/3] Revert "optimization" This reverts commit 06e9cc2f308b15eb8183e25a059deb669493d948. --- .../crates/types/src/merkle_tree/variable_merkle_tree.nr | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr b/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr index 5e04ee351447..aa0973c11f46 100644 --- a/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr +++ b/noir-projects/noir-protocol-circuits/crates/types/src/merkle_tree/variable_merkle_tree.nr @@ -50,8 +50,8 @@ fn get_prev_power_2(value: u32) -> u32 { get_next_power_exponent(value, 0) }; - let prev_power_2 = 1 << (next_power_exponent - 1); - let next_power_2 = prev_power_2 * 2; + let next_power_2 = 1 << next_power_exponent; + let prev_power_2 = next_power_2 / 2; assert(prev_power_2 < value); assert(value <= next_power_2);