From 93a954dd33c8c9abd943c6a7a9fbead27259af3f Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Thu, 30 Mar 2023 14:27:49 +0000 Subject: [PATCH 1/2] compute merkle tree --- .../barretenberg/stdlib/merkle_tree/hash.hpp | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp b/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp index 27da44cf5a..f763f1fa45 100644 --- a/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp +++ b/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp @@ -58,6 +58,29 @@ inline barretenberg::fr compute_tree_root_native(std::vector c return layer[0]; } +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 From 730fd46796a312ca18cb2094a000a11ee043d891 Mon Sep 17 00:00:00 2001 From: dbanks12 Date: Thu, 30 Mar 2023 14:32:08 +0000 Subject: [PATCH 2/2] compute tree comment --- cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp b/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp index f763f1fa45..a99b2d6435 100644 --- a/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp +++ b/cpp/src/barretenberg/stdlib/merkle_tree/hash.hpp @@ -58,6 +58,7 @@ 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.