2#include "barretenberg/stdlib/hash/pedersen/pedersen.hpp"
3#include "barretenberg/stdlib/primitives/byte_array/byte_array.hpp"
4#include "barretenberg/stdlib/primitives/field/field.hpp"
5#include "hash_path.hpp"
11template <
typename Builder>
using bit_vector = std::vector<bool_t<Builder>>;
25template <
typename Builder>
28 bit_vector<Builder>
const& index,
30 bool const is_updating_tree =
false)
33 for (
size_t i = at_height; i < hashes.size(); ++i) {
35 bool_t<Builder> path_bit = index[i];
44 if (is_updating_tree) {
45 current = pedersen_hash<Builder>::hash({ left, right }, 0);
47 current = pedersen_hash<Builder>::hash_skip_field_validation({ left, right }, 0);
68template <
typename Builder>
70 hash_path<Builder>
const& hashes,
72 bit_vector<Builder>
const& index,
74 bool const is_updating_tree =
false)
76 return (compute_subtree_root(hashes, value, index, at_height, is_updating_tree) == root);
92template <
typename Builder>
94 hash_path<Builder>
const& hashes,
96 bit_vector<Builder>
const& index,
98 bool const is_updating_tree =
false,
99 std::string
const& msg =
"assert_check_subtree_membership")
101 auto exists = check_subtree_membership(root, hashes, value, index, at_height, is_updating_tree);
102 exists.assert_equal(
true, msg);
116template <
typename Builder>
118 hash_path<Builder>
const& hashes,
120 bit_vector<Builder>
const& index,
121 bool const is_updating_tree =
false)
123 return check_subtree_membership(root, hashes, value, index, 0, is_updating_tree);
138template <
typename Builder>
140 hash_path<Builder>
const& hashes,
142 bit_vector<Builder>
const& index,
143 bool const is_updating_tree =
false,
144 std::string
const& msg =
"assert_check_membership")
146 auto exists = stdlib::merkle_tree::check_membership(root, hashes, value, index, is_updating_tree);
147 exists.assert_equal(
true, msg);
163template <
typename Builder>
167 hash_path<Builder>
const& old_hashes,
169 bit_vector<Builder>
const& index,
170 std::string
const& msg =
"update_membership")
173 assert_check_membership(old_root, old_hashes, old_value, index,
false, msg +
"_old_value");
176 assert_check_membership(new_root, old_hashes, new_value, index,
true, msg +
"_new_value");
190template <
typename Builder>
195 std::vector<hash_path<Builder>>
const& old_paths,
196 std::vector<bit_vector<Builder>>
const& old_indicies)
198 for (
size_t i = 0; i < old_indicies.size(); i++) {
200 new_roots[i], new_values[i], old_root, old_paths[i], old_values[i], old_indicies[i],
"update_memberships");
202 old_root = new_roots[i];
222template <
typename Builder>
226 hash_path<Builder>
const& old_hashes,
228 bit_vector<Builder>
const& index,
230 std::string
const& msg =
"update_subtree_membership")
233 assert_check_subtree_membership(
234 old_root, old_hashes, old_subtree_root, index, at_height,
false, msg +
"_old_subtree");
239 assert_check_subtree_membership(
240 new_root, old_hashes, new_subtree_root, index, at_height,
true, msg +
"_new_subtree");
252 ASSERT(input.size() > 0);
253 ASSERT(!(input.size() & (input.size() - 1)) ==
true);
255 while (layer.size() > 1) {
256 std::vector<field_t<Builder>> next_layer(layer.size() / 2);
257 for (
size_t i = 0; i < next_layer.size(); ++i) {
258 next_layer[i] = pedersen_hash<Builder>::hash({ layer[i * 2], layer[i * 2 + 1] });
260 layer = std::move(next_layer);
272template <
typename Builder>
275 return compute_tree_root(values) == root;
284template <
typename Builder>
287 auto valid = check_tree(root, values);
288 valid.assert_equal(
true,
"assert_check_tree");
302template <
typename Builder>
305 hash_path<Builder>
const& old_path,
308 std::string
const& msg =
"batch_update_membership")
310 size_t height = numeric::get_msb(new_values.size());
313 auto rollup_root = compute_tree_root(new_values);
315 update_subtree_membership(
316 new_root, rollup_root, old_root, old_path, zero_subtree_root, start_index.
decompose_into_bits(), height, msg);
std::vector< bool_t< Builder > > decompose_into_bits(size_t num_bits=256, std::function< witness_t< Builder >(Builder *ctx, uint64_t, uint256_t)> get_bit=[](Builder *ctx, uint64_t j, const uint256_t &val) { return witness_t< Builder >(ctx, val.get_bit(j));}) const
Build a circuit allowing a user to prove that they have deomposed this into bits.
Definition: field.cpp:1090
Definition: widget.bench.cpp:13