1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
18using testing::ElementsAre;
22using Poseidon2 = crypto::Poseidon2<crypto::Poseidon2Bn254ScalarFieldParams>;
23using simulation::MerkleCheckEvent;
25TEST(MerkleCheckTraceGenTest, MerkleRead)
27 TestTraceContainer
trace;
28 MerkleCheckTraceBuilder
builder;
30 FF leaf_value =
FF(123);
31 uint64_t leaf_index = 1;
34 FF sibling_value_1 =
FF(456);
37 FF left_node_1 = sibling_value_1;
38 FF right_node_1 = leaf_value;
42 FF sibling_value_2 =
FF(789);
45 FF left_node_2 = output_hash_1;
46 FF right_node_2 = sibling_value_2;
49 std::vector<FF> sibling_path = { sibling_value_1, sibling_value_2 };
50 FF root = output_hash_2;
52 MerkleCheckEvent
event = {
53 .leaf_value = leaf_value, .leaf_index = leaf_index, .sibling_path = sibling_path, .root = root
68 ROW_FIELD_EQ(merkle_check_remaining_path_len_inv,
FF(2 - 1).invert()),
75 ROW_FIELD_EQ(merkle_check_read_right_node, right_node_1),
77 ROW_FIELD_EQ(merkle_check_read_output_hash, output_hash_1)),
91 ROW_FIELD_EQ(merkle_check_read_right_node, right_node_2),
93 ROW_FIELD_EQ(merkle_check_read_output_hash, output_hash_2))));
96TEST(MerkleCheckTraceGenTest, MerkleWrite)
98 TestTraceContainer
trace;
99 MerkleCheckTraceBuilder
builder;
101 FF leaf_value =
FF(123);
102 FF new_leaf_value =
FF(456);
103 uint64_t leaf_index = 1;
106 FF sibling_value_1 =
FF(456);
114 FF sibling_value_2 =
FF(789);
118 FF read_output_hash_2 =
Poseidon2::hash({ read_output_hash_1, sibling_value_2 });
119 FF write_output_hash_2 =
Poseidon2::hash({ write_output_hash_1, sibling_value_2 });
121 std::vector<FF> sibling_path = { sibling_value_1, sibling_value_2 };
122 FF read_root = read_output_hash_2;
123 FF write_root = write_output_hash_2;
125 MerkleCheckEvent
event = { .leaf_value = leaf_value,
126 .new_leaf_value = new_leaf_value,
127 .leaf_index = leaf_index,
128 .sibling_path = sibling_path,
130 .new_root = write_root };
145 ROW_FIELD_EQ(merkle_check_remaining_path_len_inv,
FF(2 - 1).invert()),
152 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_value_1),
154 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_value_1),
155 ROW_FIELD_EQ(merkle_check_write_right_node, new_leaf_value),
157 ROW_FIELD_EQ(merkle_check_read_output_hash, read_output_hash_1),
158 ROW_FIELD_EQ(merkle_check_write_output_hash, write_output_hash_1)),
162 ROW_FIELD_EQ(merkle_check_read_node, read_output_hash_1),
163 ROW_FIELD_EQ(merkle_check_write_node, write_output_hash_1),
173 ROW_FIELD_EQ(merkle_check_read_left_node, read_output_hash_1),
174 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_value_2),
175 ROW_FIELD_EQ(merkle_check_write_left_node, write_output_hash_1),
176 ROW_FIELD_EQ(merkle_check_write_right_node, sibling_value_2),
178 ROW_FIELD_EQ(merkle_check_read_output_hash, read_output_hash_2),
179 ROW_FIELD_EQ(merkle_check_write_output_hash, write_output_hash_2))));
182TEST(MerkleCheckTraceGenTest, MixedEvents)
184 TestTraceContainer
trace;
185 MerkleCheckTraceBuilder
builder;
188 FF leaf_value_1 =
FF(111);
189 uint64_t leaf_index_1 = 6;
190 FF sibling_value_1 =
FF(222);
193 MerkleCheckEvent event1 = { .leaf_value = leaf_value_1,
194 .leaf_index = leaf_index_1,
195 .sibling_path = { sibling_value_1 },
196 .root = output_hash_1 };
199 FF leaf_value_2 =
FF(333);
200 FF new_leaf_value_2 =
FF(444);
201 uint64_t leaf_index_2 = 11;
202 FF sibling_value_2 =
FF(444);
206 MerkleCheckEvent event2 = { .leaf_value = leaf_value_2,
207 .new_leaf_value = new_leaf_value_2,
208 .leaf_index = leaf_index_2,
209 .sibling_path = { sibling_value_2 },
210 .root = read_output_hash_2,
211 .new_root = write_output_hash_2 };
231 ROW_FIELD_EQ(merkle_check_read_left_node, leaf_value_1),
232 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_value_1),
234 ROW_FIELD_EQ(merkle_check_read_output_hash, output_hash_1)),
239 ROW_FIELD_EQ(merkle_check_write_node, new_leaf_value_2),
243 ROW_FIELD_EQ(merkle_check_read_root, read_output_hash_2),
244 ROW_FIELD_EQ(merkle_check_write_root, write_output_hash_2),
249 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_value_2),
250 ROW_FIELD_EQ(merkle_check_read_right_node, leaf_value_2),
251 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_value_2),
252 ROW_FIELD_EQ(merkle_check_write_right_node, new_leaf_value_2),
254 ROW_FIELD_EQ(merkle_check_read_output_hash, read_output_hash_2),
255 ROW_FIELD_EQ(merkle_check_write_output_hash, write_output_hash_2))));
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
std::vector< AvmFullRowConstRef > as_rows() const
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
Implements a parallelized batch insertion indexed tree Accepts template argument of the type of store...
#define ROW_FIELD_EQ(field_name, expression)
TEST(EmitUnencryptedLogTest, Basic)