23 for (
const auto&
event : events) {
24 const size_t full_path_len =
event.sibling_path.size();
31 bool write =
event.new_leaf_value.has_value();
34 FF read_node =
event.leaf_value;
35 FF write_node =
event.new_leaf_value.value_or(
FF(0));
38 FF new_root =
event.new_root.value_or(
FF(0));
40 uint64_t current_index_in_layer =
event.leaf_index;
41 for (
size_t i = 0; i < full_path_len; ++i) {
42 const FF sibling =
event.sibling_path[i];
45 const FF path_len =
FF(full_path_len - i);
46 const FF remaining_path_len = path_len - 1;
47 const FF remaining_path_len_inv = remaining_path_len == 0 ?
FF(0) : remaining_path_len.invert();
50 const bool end = remaining_path_len == 0;
51 const bool start = i == 0;
52 const bool index_is_even = current_index_in_layer % 2 == 0;
53 const FF read_left_node = index_is_even ? read_node : sibling;
54 const FF read_right_node = index_is_even ? sibling : read_node;
57 const FF write_left_node =
write ? index_is_even ? write_node : sibling :
FF(0);
58 const FF write_right_node =
write ? index_is_even ? sibling : write_node :
FF(0);
62 { { { C::merkle_check_sel, 1 },
63 { C::merkle_check_read_node, read_node },
64 { C::merkle_check_write,
write },
65 { C::merkle_check_write_node, write_node },
66 { C::merkle_check_index, current_index_in_layer },
67 { C::merkle_check_path_len, path_len },
68 { C::merkle_check_remaining_path_len_inv, remaining_path_len_inv },
69 { C::merkle_check_read_root, root },
70 { C::merkle_check_write_root, new_root },
71 { C::merkle_check_sibling, sibling },
72 { C::merkle_check_start, start },
73 { C::merkle_check_end, end },
74 { C::merkle_check_index_is_even, index_is_even },
75 { C::merkle_check_read_left_node, read_left_node },
76 { C::merkle_check_read_right_node, read_right_node },
77 { C::merkle_check_write_left_node, write_left_node },
78 { C::merkle_check_write_right_node, write_right_node },
79 { C::merkle_check_constant_2, 2 },
80 { C::merkle_check_read_output_hash, read_output_hash },
81 { C::merkle_check_write_output_hash, write_output_hash } } });
84 read_node = read_output_hash;
85 write_node = write_output_hash;
86 current_index_in_layer >>= 1;
90 assert(read_node == root);
91 assert(write_node == new_root);