38 for (
const auto&
event : events) {
39 const size_t full_path_len =
event.sibling_path.size();
47 const bool write =
event.new_leaf_value.has_value();
50 FF read_node =
event.leaf_value;
51 FF write_node =
event.new_leaf_value.value_or(
FF(0));
52 uint64_t current_index_in_layer =
event.leaf_index;
54 const FF& root =
event.root;
55 const FF new_root =
event.new_root.value_or(
FF(0));
57 for (
size_t i = 0; i < full_path_len; ++i) {
58 const FF& sibling =
event.sibling_path[i];
61 const size_t path_len = full_path_len - i;
64 const bool end = path_len == 1;
65 const bool start = i == 0;
66 const bool index_is_even = current_index_in_layer % 2 == 0;
67 const FF read_left_node = index_is_even ? read_node : sibling;
68 const FF read_right_node = index_is_even ? sibling : read_node;
73 { { { C::merkle_check_sel, 1 },
74 { C::merkle_check_read_node, read_node },
75 { C::merkle_check_index, current_index_in_layer },
76 { C::merkle_check_path_len, path_len },
78 { C::merkle_check_path_len_min_one_inv, path_len - 1 },
79 { C::merkle_check_read_root, root },
80 { C::merkle_check_sibling, sibling },
81 { C::merkle_check_start, start ? 1 : 0 },
82 { C::merkle_check_end, end ? 1 : 0 },
83 { C::merkle_check_index_is_even, index_is_even ? 1 : 0 },
84 { C::merkle_check_read_left_node, read_left_node },
85 { C::merkle_check_read_right_node, read_right_node },
86 { C::merkle_check_read_output_hash, read_output_hash } } });
89 read_node = read_output_hash;
90 current_index_in_layer >>= 1;
95 const FF write_left_node = index_is_even ? write_node : sibling;
96 const FF write_right_node = index_is_even ? sibling : write_node;
97 const FF write_output_hash =
Poseidon2::hash({ write_left_node, write_right_node });
100 { { { C::merkle_check_write, 1 },
101 { C::merkle_check_write_root, new_root },
102 { C::merkle_check_write_node, write_node },
103 { C::merkle_check_write_left_node, write_left_node },
104 { C::merkle_check_write_right_node, write_right_node },
105 { C::merkle_check_write_output_hash, write_output_hash } } });
108 write_node = write_output_hash;
114 assert(current_index_in_layer == 0);
115 assert(read_node == root);
116 assert(write_node == new_root);
120 trace.invert_columns({ { C::merkle_check_path_len_min_one_inv } });