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_path_len_min_one_inv,
FF(2 - 1).invert()),
75 ROW_FIELD_EQ(merkle_check_read_right_node, right_node_1),
76 ROW_FIELD_EQ(merkle_check_read_output_hash, output_hash_1)),
90 ROW_FIELD_EQ(merkle_check_read_right_node, right_node_2),
91 ROW_FIELD_EQ(merkle_check_read_output_hash, output_hash_2))));
94TEST(MerkleCheckTraceGenTest, MerkleWrite)
96 TestTraceContainer
trace;
97 MerkleCheckTraceBuilder
builder;
99 FF leaf_value =
FF(123);
100 FF new_leaf_value =
FF(456);
101 uint64_t leaf_index = 1;
104 FF sibling_value_1 =
FF(456);
112 FF sibling_value_2 =
FF(789);
116 FF read_output_hash_2 =
Poseidon2::hash({ read_output_hash_1, sibling_value_2 });
117 FF write_output_hash_2 =
Poseidon2::hash({ write_output_hash_1, sibling_value_2 });
119 std::vector<FF> sibling_path = { sibling_value_1, sibling_value_2 };
120 FF read_root = read_output_hash_2;
121 FF write_root = write_output_hash_2;
123 MerkleCheckEvent
event = { .leaf_value = leaf_value,
124 .new_leaf_value = new_leaf_value,
125 .leaf_index = leaf_index,
126 .sibling_path = sibling_path,
128 .new_root = write_root };
143 ROW_FIELD_EQ(merkle_check_path_len_min_one_inv,
FF(2 - 1).invert()),
150 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_value_1),
152 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_value_1),
153 ROW_FIELD_EQ(merkle_check_write_right_node, new_leaf_value),
154 ROW_FIELD_EQ(merkle_check_read_output_hash, read_output_hash_1),
155 ROW_FIELD_EQ(merkle_check_write_output_hash, write_output_hash_1)),
159 ROW_FIELD_EQ(merkle_check_read_node, read_output_hash_1),
160 ROW_FIELD_EQ(merkle_check_write_node, write_output_hash_1),
170 ROW_FIELD_EQ(merkle_check_read_left_node, read_output_hash_1),
171 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_value_2),
172 ROW_FIELD_EQ(merkle_check_write_left_node, write_output_hash_1),
173 ROW_FIELD_EQ(merkle_check_write_right_node, sibling_value_2),
174 ROW_FIELD_EQ(merkle_check_read_output_hash, read_output_hash_2),
175 ROW_FIELD_EQ(merkle_check_write_output_hash, write_output_hash_2))));
178TEST(MerkleCheckTraceGenTest, MixedEvents)
180 TestTraceContainer
trace;
181 MerkleCheckTraceBuilder
builder;
185 FF leaf_value_1 =
FF(111);
186 uint64_t leaf_index_1 = 6;
187 FF sibling_1_level_0 =
FF(222);
188 FF sibling_1_level_1 =
FF(333);
189 FF sibling_1_level_2 =
FF(444);
198 MerkleCheckEvent event1 = { .leaf_value = leaf_value_1,
199 .leaf_index = leaf_index_1,
200 .sibling_path = { sibling_1_level_0, sibling_1_level_1, sibling_1_level_2 },
205 FF leaf_value_2 =
FF(555);
206 FF new_leaf_value_2 =
FF(666);
207 uint64_t leaf_index_2 = 11;
208 FF sibling_2_level_0 =
FF(777);
209 FF sibling_2_level_1 =
FF(888);
210 FF sibling_2_level_2 =
FF(999);
211 FF sibling_2_level_3 =
FF(1010);
217 FF read_hash_2_level_1 =
Poseidon2::hash({ sibling_2_level_1, read_hash_2_level_0 });
219 FF read_hash_2_level_2 =
Poseidon2::hash({ read_hash_2_level_1, sibling_2_level_2 });
224 FF write_hash_2_level_0 =
Poseidon2::hash({ sibling_2_level_0, new_leaf_value_2 });
225 FF write_hash_2_level_1 =
Poseidon2::hash({ sibling_2_level_1, write_hash_2_level_0 });
226 FF write_hash_2_level_2 =
Poseidon2::hash({ write_hash_2_level_1, sibling_2_level_2 });
229 MerkleCheckEvent event2 = {
230 .leaf_value = leaf_value_2,
231 .new_leaf_value = new_leaf_value_2,
232 .leaf_index = leaf_index_2,
233 .sibling_path = { sibling_2_level_0, sibling_2_level_1, sibling_2_level_2, sibling_2_level_3 },
235 .new_root = write_root_2
256 ROW_FIELD_EQ(merkle_check_read_left_node, leaf_value_1),
257 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_1_level_0),
258 ROW_FIELD_EQ(merkle_check_read_output_hash, hash_1_level_0)),
271 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_1_level_1),
272 ROW_FIELD_EQ(merkle_check_read_right_node, hash_1_level_0),
273 ROW_FIELD_EQ(merkle_check_read_output_hash, hash_1_level_1)),
286 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_1_level_2),
287 ROW_FIELD_EQ(merkle_check_read_right_node, hash_1_level_1),
293 ROW_FIELD_EQ(merkle_check_write_node, new_leaf_value_2),
303 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_2_level_0),
304 ROW_FIELD_EQ(merkle_check_read_right_node, leaf_value_2),
305 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_2_level_0),
306 ROW_FIELD_EQ(merkle_check_write_right_node, new_leaf_value_2),
307 ROW_FIELD_EQ(merkle_check_read_output_hash, read_hash_2_level_0),
308 ROW_FIELD_EQ(merkle_check_write_output_hash, write_hash_2_level_0)),
312 ROW_FIELD_EQ(merkle_check_read_node, read_hash_2_level_0),
313 ROW_FIELD_EQ(merkle_check_write_node, write_hash_2_level_0),
323 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_2_level_1),
324 ROW_FIELD_EQ(merkle_check_read_right_node, read_hash_2_level_0),
325 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_2_level_1),
326 ROW_FIELD_EQ(merkle_check_write_right_node, write_hash_2_level_0),
327 ROW_FIELD_EQ(merkle_check_read_output_hash, read_hash_2_level_1),
328 ROW_FIELD_EQ(merkle_check_write_output_hash, write_hash_2_level_1)),
332 ROW_FIELD_EQ(merkle_check_read_node, read_hash_2_level_1),
333 ROW_FIELD_EQ(merkle_check_write_node, write_hash_2_level_1),
343 ROW_FIELD_EQ(merkle_check_read_left_node, read_hash_2_level_1),
344 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_2_level_2),
345 ROW_FIELD_EQ(merkle_check_write_left_node, write_hash_2_level_1),
346 ROW_FIELD_EQ(merkle_check_write_right_node, sibling_2_level_2),
347 ROW_FIELD_EQ(merkle_check_read_output_hash, read_hash_2_level_2),
348 ROW_FIELD_EQ(merkle_check_write_output_hash, write_hash_2_level_2)),
352 ROW_FIELD_EQ(merkle_check_read_node, read_hash_2_level_2),
353 ROW_FIELD_EQ(merkle_check_write_node, write_hash_2_level_2),
363 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_2_level_3),
364 ROW_FIELD_EQ(merkle_check_read_right_node, read_hash_2_level_2),
365 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_2_level_3),
366 ROW_FIELD_EQ(merkle_check_write_right_node, write_hash_2_level_2),
367 ROW_FIELD_EQ(merkle_check_read_output_hash, read_root_2),
368 ROW_FIELD_EQ(merkle_check_write_output_hash, write_root_2))));
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
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(BoomerangMegaCircuitBuilder, BasicCircuit)