1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
19using testing::ElementsAre;
23using Poseidon2 = crypto::Poseidon2<crypto::Poseidon2Bn254ScalarFieldParams>;
24using simulation::MerkleCheckEvent;
26TEST(MerkleCheckTraceGenTest, MerkleRead)
28 TestTraceContainer
trace;
29 MerkleCheckTraceBuilder
builder;
31 FF leaf_value =
FF(123);
32 uint64_t leaf_index = 1;
35 FF sibling_value_1 =
FF(456);
38 FF left_node_1 = sibling_value_1;
39 FF right_node_1 = leaf_value;
43 FF sibling_value_2 =
FF(789);
46 FF left_node_2 = output_hash_1;
47 FF right_node_2 = sibling_value_2;
50 std::vector<FF> sibling_path = { sibling_value_1, sibling_value_2 };
51 FF root = output_hash_2;
54 .leaf_value = leaf_value,
55 .leaf_index = leaf_index,
56 .sibling_path = sibling_path,
71 ROW_FIELD_EQ(merkle_check_path_len_min_one_inv,
FF(2 - 1).invert()),
78 ROW_FIELD_EQ(merkle_check_read_right_node, right_node_1),
79 ROW_FIELD_EQ(merkle_check_read_output_hash, output_hash_1)),
93 ROW_FIELD_EQ(merkle_check_read_right_node, right_node_2),
94 ROW_FIELD_EQ(merkle_check_read_output_hash, output_hash_2))));
97TEST(MerkleCheckTraceGenTest, MerkleWrite)
99 TestTraceContainer
trace;
100 MerkleCheckTraceBuilder
builder;
102 FF leaf_value =
FF(123);
103 FF new_leaf_value =
FF(456);
104 uint64_t leaf_index = 1;
107 FF sibling_value_1 =
FF(456);
115 FF sibling_value_2 =
FF(789);
122 std::vector<FF> sibling_path = { sibling_value_1, sibling_value_2 };
123 FF read_root = read_output_hash_2;
124 FF write_root = write_output_hash_2;
127 .leaf_value = leaf_value,
128 .new_leaf_value = new_leaf_value,
129 .leaf_index = leaf_index,
130 .sibling_path = sibling_path,
132 .new_root = write_root };
147 ROW_FIELD_EQ(merkle_check_path_len_min_one_inv,
FF(2 - 1).invert()),
154 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_value_1),
156 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_value_1),
157 ROW_FIELD_EQ(merkle_check_write_right_node, new_leaf_value),
158 ROW_FIELD_EQ(merkle_check_read_output_hash, read_output_hash_1),
159 ROW_FIELD_EQ(merkle_check_write_output_hash, write_output_hash_1)),
163 ROW_FIELD_EQ(merkle_check_read_node, read_output_hash_1),
164 ROW_FIELD_EQ(merkle_check_write_node, write_output_hash_1),
174 ROW_FIELD_EQ(merkle_check_read_left_node, read_output_hash_1),
175 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_value_2),
176 ROW_FIELD_EQ(merkle_check_write_left_node, write_output_hash_1),
177 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;
189 FF leaf_value_1 =
FF(111);
190 uint64_t leaf_index_1 = 6;
191 FF sibling_1_level_0 =
FF(222);
192 FF sibling_1_level_1 =
FF(333);
193 FF sibling_1_level_2 =
FF(444);
203 .leaf_value = leaf_value_1,
204 .leaf_index = leaf_index_1,
205 .sibling_path = { sibling_1_level_0, sibling_1_level_1, sibling_1_level_2 },
210 FF leaf_value_2 =
FF(555);
211 FF new_leaf_value_2 =
FF(666);
212 uint64_t leaf_index_2 = 11;
213 FF sibling_2_level_0 =
FF(777);
214 FF sibling_2_level_1 =
FF(888);
215 FF sibling_2_level_2 =
FF(999);
216 FF sibling_2_level_3 =
FF(1010);
234 MerkleCheckEvent event2 = {
236 .leaf_value = leaf_value_2,
237 .new_leaf_value = new_leaf_value_2,
238 .leaf_index = leaf_index_2,
239 .sibling_path = { sibling_2_level_0, sibling_2_level_1, sibling_2_level_2, sibling_2_level_3 },
241 .new_root = write_root_2
262 ROW_FIELD_EQ(merkle_check_read_left_node, leaf_value_1),
263 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_1_level_0),
264 ROW_FIELD_EQ(merkle_check_read_output_hash, hash_1_level_0)),
277 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_1_level_1),
278 ROW_FIELD_EQ(merkle_check_read_right_node, hash_1_level_0),
279 ROW_FIELD_EQ(merkle_check_read_output_hash, hash_1_level_1)),
292 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_1_level_2),
293 ROW_FIELD_EQ(merkle_check_read_right_node, hash_1_level_1),
299 ROW_FIELD_EQ(merkle_check_write_node, new_leaf_value_2),
309 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_2_level_0),
310 ROW_FIELD_EQ(merkle_check_read_right_node, leaf_value_2),
311 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_2_level_0),
312 ROW_FIELD_EQ(merkle_check_write_right_node, new_leaf_value_2),
313 ROW_FIELD_EQ(merkle_check_read_output_hash, read_hash_2_level_0),
314 ROW_FIELD_EQ(merkle_check_write_output_hash, write_hash_2_level_0)),
318 ROW_FIELD_EQ(merkle_check_read_node, read_hash_2_level_0),
319 ROW_FIELD_EQ(merkle_check_write_node, write_hash_2_level_0),
329 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_2_level_1),
330 ROW_FIELD_EQ(merkle_check_read_right_node, read_hash_2_level_0),
331 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_2_level_1),
332 ROW_FIELD_EQ(merkle_check_write_right_node, write_hash_2_level_0),
333 ROW_FIELD_EQ(merkle_check_read_output_hash, read_hash_2_level_1),
334 ROW_FIELD_EQ(merkle_check_write_output_hash, write_hash_2_level_1)),
338 ROW_FIELD_EQ(merkle_check_read_node, read_hash_2_level_1),
339 ROW_FIELD_EQ(merkle_check_write_node, write_hash_2_level_1),
349 ROW_FIELD_EQ(merkle_check_read_left_node, read_hash_2_level_1),
350 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_2_level_2),
351 ROW_FIELD_EQ(merkle_check_write_left_node, write_hash_2_level_1),
352 ROW_FIELD_EQ(merkle_check_write_right_node, sibling_2_level_2),
353 ROW_FIELD_EQ(merkle_check_read_output_hash, read_hash_2_level_2),
354 ROW_FIELD_EQ(merkle_check_write_output_hash, write_hash_2_level_2)),
358 ROW_FIELD_EQ(merkle_check_read_node, read_hash_2_level_2),
359 ROW_FIELD_EQ(merkle_check_write_node, write_hash_2_level_2),
369 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_2_level_3),
370 ROW_FIELD_EQ(merkle_check_read_right_node, read_hash_2_level_2),
371 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_2_level_3),
372 ROW_FIELD_EQ(merkle_check_write_right_node, write_hash_2_level_2),
373 ROW_FIELD_EQ(merkle_check_read_output_hash, read_root_2),
374 ROW_FIELD_EQ(merkle_check_write_output_hash, write_root_2))));
#define DOM_SEP__MERKLE_HASH
void process(const simulation::EventEmitterInterface< simulation::AluEvent >::Container &events, TraceContainer &trace)
Process the ALU events and populate the ALU relevant columns in the trace.
std::vector< AvmFullRowConstRef > as_rows() const
Native Poseidon2 hash function implementation.
static FF hash(const std::vector< FF > &input)
Hashes a vector of field elements.
#define ROW_FIELD_EQ(field_name, expression)
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)