diff --git a/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp b/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp index 27da44cf5a..a99b2d6435 100644 --- a/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp +++ b/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp @@ -58,6 +58,30 @@ inline barretenberg::fr compute_tree_root_native(std::vector c return layer[0]; } +// TODO write test +inline std::vector compute_tree_native(std::vector const& input) +{ + // Check if the input vector size is a power of 2. + ASSERT(input.size() > 0); + ASSERT(numeric::is_power_of_two(input.size())); + auto layer = input; + std::vector tree(input); + while (layer.size() > 1) { + std::vector next_layer(layer.size() / 2); + for (size_t i = 0; i < next_layer.size(); ++i) { + if (plonk::SYSTEM_COMPOSER == plonk::PLOOKUP) { + next_layer[i] = crypto::pedersen_hash::lookup::hash_multiple({ layer[i * 2], layer[i * 2 + 1] }); + } else { + next_layer[i] = crypto::pedersen_hash::hash_multiple({ layer[i * 2], layer[i * 2 + 1] }); + } + tree.push_back(next_layer[i]); + } + layer = std::move(next_layer); + } + + return tree; +} + } // namespace merkle_tree } // namespace stdlib } // namespace plonk