1#include <gmock/gmock.h>
2#include <gtest/gtest.h>
7#include "barretenberg/aztec/aztec_constants.hpp"
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;
40 FF output_hash_1 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), left_node_1, right_node_1 });
43 FF sibling_value_2 =
FF(789);
46 FF left_node_2 = output_hash_1;
47 FF right_node_2 = sibling_value_2;
48 FF output_hash_2 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), left_node_2, right_node_2 });
50 std::vector<FF> sibling_path = { sibling_value_1, sibling_value_2 };
51 FF root = output_hash_2;
53 MerkleCheckEvent
event = { .merkle_hash_domain_separator = DOM_SEP__MERKLE_HASH,
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);
111 FF read_output_hash_1 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_value_1, leaf_value });
112 FF write_output_hash_1 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_value_1, new_leaf_value });
115 FF sibling_value_2 =
FF(789);
119 FF read_output_hash_2 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), read_output_hash_1, sibling_value_2 });
120 FF write_output_hash_2 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), write_output_hash_1, sibling_value_2 });
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;
126 MerkleCheckEvent
event = { .merkle_hash_domain_separator = DOM_SEP__MERKLE_HASH,
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);
196 FF hash_1_level_0 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), leaf_value_1, sibling_1_level_0 });
198 FF hash_1_level_1 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_1_level_1, hash_1_level_0 });
200 FF root_1 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_1_level_2, hash_1_level_1 });
202 MerkleCheckEvent event1 = { .merkle_hash_domain_separator = DOM_SEP__MERKLE_HASH,
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);
220 FF read_hash_2_level_0 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_2_level_0, leaf_value_2 });
222 FF read_hash_2_level_1 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_2_level_1, read_hash_2_level_0 });
224 FF read_hash_2_level_2 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), read_hash_2_level_1, sibling_2_level_2 });
226 FF read_root_2 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_2_level_3, read_hash_2_level_2 });
229 FF write_hash_2_level_0 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_2_level_0, new_leaf_value_2 });
230 FF write_hash_2_level_1 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_2_level_1, write_hash_2_level_0 });
231 FF write_hash_2_level_2 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), write_hash_2_level_1, sibling_2_level_2 });
232 FF write_root_2 =
Poseidon2::hash({
FF(DOM_SEP__MERKLE_HASH), sibling_2_level_3, write_hash_2_level_2 });
234 MerkleCheckEvent event2 = {
235 .merkle_hash_domain_separator = DOM_SEP__MERKLE_HASH,
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))));
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)