39 for (
const auto&
event : events) {
40 const size_t full_path_len =
event.sibling_path.size();
48 const bool write =
event.new_leaf_value.has_value();
51 FF read_node =
event.leaf_value;
52 FF write_node =
event.new_leaf_value.value_or(
FF(0));
53 uint64_t current_index_in_layer =
event.leaf_index;
55 const FF& root =
event.root;
56 const FF new_root =
event.new_root.value_or(
FF(0));
57 const uint64_t sep =
event.merkle_hash_domain_separator;
59 for (
size_t i = 0; i < full_path_len; ++i) {
60 const FF& sibling =
event.sibling_path[i];
63 const size_t path_len = full_path_len - i;
66 const bool end = path_len == 1;
67 const bool start = i == 0;
68 const bool index_is_even = current_index_in_layer % 2 == 0;
69 const FF read_left_node = index_is_even ? read_node : sibling;
70 const FF read_right_node = index_is_even ? sibling : read_node;
75 { { { C::merkle_check_sel, 1 },
76 { C::merkle_check_const_three, 3 },
77 { C::merkle_check_merkle_hash_separator, sep },
78 { C::merkle_check_read_node, read_node },
79 { C::merkle_check_index, current_index_in_layer },
80 { C::merkle_check_path_len, path_len },
82 { C::merkle_check_path_len_min_one_inv, path_len - 1 },
83 { C::merkle_check_read_root, root },
84 { C::merkle_check_sibling, sibling },
85 { C::merkle_check_start, start ? 1 : 0 },
86 { C::merkle_check_end, end ? 1 : 0 },
87 { C::merkle_check_index_is_even, index_is_even ? 1 : 0 },
88 { C::merkle_check_read_left_node, read_left_node },
89 { C::merkle_check_read_right_node, read_right_node },
90 { C::merkle_check_read_output_hash, read_output_hash } } });
93 read_node = read_output_hash;
94 current_index_in_layer >>= 1;
99 const FF write_left_node = index_is_even ? write_node : sibling;
100 const FF write_right_node = index_is_even ? sibling : write_node;
101 const FF write_output_hash =
Poseidon2::hash({
FF(sep), write_left_node, write_right_node });
104 { { { C::merkle_check_write, 1 },
105 { C::merkle_check_write_root, new_root },
106 { C::merkle_check_write_node, write_node },
107 { C::merkle_check_write_left_node, write_left_node },
108 { C::merkle_check_write_right_node, write_right_node },
109 { C::merkle_check_write_output_hash, write_output_hash } } });
112 write_node = write_output_hash;
119 static_cast<decltype(current_index_in_layer)
>(0),
120 "Current index in layer is not 0");
121 BB_ASSERT_EQ(read_node, root,
"Read node is not equal to root");
122 BB_ASSERT_EQ(write_node, new_root,
"Write node is not equal to new root");
126 trace.invert_columns({ { C::merkle_check_path_len_min_one_inv } });