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),
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_remaining_path_len_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;
184 FF leaf_value_1 =
FF(111);
185 uint64_t leaf_index_1 = 6;
186 FF sibling_value_1 =
FF(222);
189 MerkleCheckEvent event1 = { .leaf_value = leaf_value_1,
190 .leaf_index = leaf_index_1,
191 .sibling_path = { sibling_value_1 },
192 .root = output_hash_1 };
195 FF leaf_value_2 =
FF(333);
196 FF new_leaf_value_2 =
FF(444);
197 uint64_t leaf_index_2 = 11;
198 FF sibling_value_2 =
FF(444);
202 MerkleCheckEvent event2 = { .leaf_value = leaf_value_2,
203 .new_leaf_value = new_leaf_value_2,
204 .leaf_index = leaf_index_2,
205 .sibling_path = { sibling_value_2 },
206 .root = read_output_hash_2,
207 .new_root = write_output_hash_2 };
227 ROW_FIELD_EQ(merkle_check_read_left_node, leaf_value_1),
228 ROW_FIELD_EQ(merkle_check_read_right_node, sibling_value_1),
229 ROW_FIELD_EQ(merkle_check_read_output_hash, output_hash_1)),
234 ROW_FIELD_EQ(merkle_check_write_node, new_leaf_value_2),
238 ROW_FIELD_EQ(merkle_check_read_root, read_output_hash_2),
239 ROW_FIELD_EQ(merkle_check_write_root, write_output_hash_2),
244 ROW_FIELD_EQ(merkle_check_read_left_node, sibling_value_2),
245 ROW_FIELD_EQ(merkle_check_read_right_node, leaf_value_2),
246 ROW_FIELD_EQ(merkle_check_write_left_node, sibling_value_2),
247 ROW_FIELD_EQ(merkle_check_write_right_node, new_leaf_value_2),
248 ROW_FIELD_EQ(merkle_check_read_output_hash, read_output_hash_2),
249 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)