Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
side_effect_tracking_db.test.cpp
Go to the documentation of this file.
5
6#include <gmock/gmock.h>
7#include <gtest/gtest.h>
8
9namespace bb::avm2::simulation {
10namespace {
11
12using ::testing::Return;
13using ::testing::ReturnRef;
14using ::testing::StrictMock;
15
16class SideEffectTrackingDBTest : public ::testing::Test {
17 protected:
19 StrictMock<MockHighLevelMerkleDB> mock_merkle_db;
20 StrictMock<MockSideEffectTracker> mock_tracker;
21 TrackedSideEffects tracked_effects;
22};
23
24TEST_F(SideEffectTrackingDBTest, StorageRead)
25{
26 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
27 AztecAddress contract_addr(0x1234);
28 FF slot(100);
29 FF expected_value(200);
30
31 EXPECT_CALL(mock_merkle_db, storage_read(contract_addr, slot)).WillOnce(Return(expected_value));
32
33 FF result = db.storage_read(contract_addr, slot);
34 EXPECT_EQ(result, expected_value);
35}
36
37TEST_F(SideEffectTrackingDBTest, WasStorageWritten)
38{
39 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
40 AztecAddress contract_addr(0x1234);
41 FF slot(100);
42
43 EXPECT_CALL(mock_merkle_db, was_storage_written(contract_addr, slot)).WillOnce(Return(true));
44
45 bool result = db.was_storage_written(contract_addr, slot);
46 EXPECT_TRUE(result);
47}
48
49TEST_F(SideEffectTrackingDBTest, NullifierExists)
50{
51 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
52 AztecAddress contract_addr(0x1234);
53 FF nullifier(999);
54
55 EXPECT_CALL(mock_merkle_db, nullifier_exists(contract_addr, nullifier)).WillOnce(Return(false));
56
57 bool result = db.nullifier_exists(contract_addr, nullifier);
58 EXPECT_FALSE(result);
59}
60
61TEST_F(SideEffectTrackingDBTest, SiloedNullifierExists)
62{
63 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
64 FF nullifier(888);
65
66 EXPECT_CALL(mock_merkle_db, siloed_nullifier_exists(nullifier)).WillOnce(Return(true));
67
68 bool result = db.siloed_nullifier_exists(nullifier);
69 EXPECT_TRUE(result);
70}
71
72TEST_F(SideEffectTrackingDBTest, NoteHashExists)
73{
74 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
75 uint64_t leaf_index = 5;
76 FF unique_note_hash(777);
77
78 EXPECT_CALL(mock_merkle_db, note_hash_exists(leaf_index, unique_note_hash)).WillOnce(Return(true));
79
80 bool result = db.note_hash_exists(leaf_index, unique_note_hash);
81 EXPECT_TRUE(result);
82}
83
84TEST_F(SideEffectTrackingDBTest, L1ToL2MsgExists)
85{
86 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
87 uint64_t leaf_index = 10;
88 FF msg_hash(666);
89
90 EXPECT_CALL(mock_merkle_db, l1_to_l2_msg_exists(leaf_index, msg_hash)).WillOnce(Return(false));
91
92 bool result = db.l1_to_l2_msg_exists(leaf_index, msg_hash);
93 EXPECT_FALSE(result);
94}
95
96TEST_F(SideEffectTrackingDBTest, GetCheckpointId)
97{
98 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
99 uint32_t expected_id = 123;
100
101 EXPECT_CALL(mock_merkle_db, get_checkpoint_id()).WillOnce(Return(expected_id));
102
103 uint32_t result = db.get_checkpoint_id();
104 EXPECT_EQ(result, expected_id);
105}
106
107TEST_F(SideEffectTrackingDBTest, GetTreeState)
108{
109 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
110 TreeStates expected_states = {
111 .note_hash_tree = { .tree = { .root = FF(1), .next_available_leaf_index = 2 }, .counter = 2 },
112 .nullifier_tree = { .tree = { .root = FF(3), .next_available_leaf_index = 4 }, .counter = 4 },
113 .l1_to_l2_message_tree = { .tree = { .root = FF(5), .next_available_leaf_index = 6 }, .counter = 6 },
114 .public_data_tree = { .tree = { .root = FF(7), .next_available_leaf_index = 8 }, .counter = 8 },
115 };
116
117 EXPECT_CALL(mock_merkle_db, get_tree_state()).WillOnce(Return(expected_states));
118
119 TreeStates result = db.get_tree_state();
120 EXPECT_EQ(result, expected_states);
121}
122
123TEST_F(SideEffectTrackingDBTest, StorageWrite)
124{
125 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
126 AztecAddress contract_addr(0x1234);
127 FF slot(100);
128 FF value(200);
129 bool is_protocol_write = false;
130 FF leaf_slot = unconstrained_compute_leaf_slot(contract_addr, slot);
131
132 EXPECT_CALL(mock_merkle_db, storage_write(contract_addr, slot, value, is_protocol_write));
133 EXPECT_CALL(mock_tracker, add_storage_write(leaf_slot, value));
134
135 db.storage_write(contract_addr, slot, value, is_protocol_write);
136}
137
138TEST_F(SideEffectTrackingDBTest, NullifierWrite)
139{
140 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
141 AztecAddress contract_addr(0x1234);
142 FF nullifier(999);
143 FF siloed_nullifier = unconstrained_silo_nullifier(contract_addr, nullifier);
144
145 EXPECT_CALL(mock_merkle_db, nullifier_write(contract_addr, nullifier));
146 EXPECT_CALL(mock_tracker, add_nullifier(siloed_nullifier));
147
148 db.nullifier_write(contract_addr, nullifier);
149}
150
151TEST_F(SideEffectTrackingDBTest, SiloedNullifierWrite)
152{
153 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
154 FF nullifier(888);
155
156 EXPECT_CALL(mock_merkle_db, siloed_nullifier_write(nullifier));
157 EXPECT_CALL(mock_tracker, add_nullifier(nullifier));
158
159 db.siloed_nullifier_write(nullifier);
160}
161
162TEST_F(SideEffectTrackingDBTest, NoteHashWrite)
163{
164 TrackedSideEffects tracked_effects = { .note_hashes = { FF(2) } };
165 const uint32_t note_hash_counter = static_cast<uint32_t>(tracked_effects.note_hashes.size());
166
167 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
168 AztecAddress contract_addr(0x1234);
169 FF note_hash(777);
170 FF unique_note_hash = unconstrained_make_unique_note_hash(
171 unconstrained_silo_note_hash(contract_addr, note_hash), first_nullifier, note_hash_counter);
172
173 EXPECT_CALL(mock_tracker, get_side_effects()).WillOnce(ReturnRef(tracked_effects));
174 EXPECT_CALL(mock_merkle_db, note_hash_write(contract_addr, note_hash));
175 EXPECT_CALL(mock_tracker, add_note_hash(unique_note_hash));
176
177 db.note_hash_write(contract_addr, note_hash);
178}
179
180TEST_F(SideEffectTrackingDBTest, SiloedNoteHashWrite)
181{
182 TrackedSideEffects tracked_effects = { .note_hashes = { FF(2) } };
183 const uint32_t note_hash_counter = static_cast<uint32_t>(tracked_effects.note_hashes.size());
184
185 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
186 FF siloed_note_hash(555);
187 FF unique_note_hash = unconstrained_make_unique_note_hash(siloed_note_hash, first_nullifier, note_hash_counter);
188
189 EXPECT_CALL(mock_tracker, get_side_effects()).WillOnce(ReturnRef(tracked_effects));
190 EXPECT_CALL(mock_merkle_db, siloed_note_hash_write(siloed_note_hash));
191 EXPECT_CALL(mock_tracker, add_note_hash(unique_note_hash));
192
193 db.siloed_note_hash_write(siloed_note_hash);
194}
195
196TEST_F(SideEffectTrackingDBTest, UniqueNoteHashWrite)
197{
198 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
199 FF unique_note_hash(444);
200
201 EXPECT_CALL(mock_merkle_db, unique_note_hash_write(unique_note_hash));
202 EXPECT_CALL(mock_tracker, add_note_hash(unique_note_hash));
203
204 db.unique_note_hash_write(unique_note_hash);
205}
206
207TEST_F(SideEffectTrackingDBTest, CreateCheckpoint)
208{
209 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
210
211 EXPECT_CALL(mock_merkle_db, create_checkpoint());
212 EXPECT_CALL(mock_tracker, create_checkpoint());
213
214 db.create_checkpoint();
215}
216
217TEST_F(SideEffectTrackingDBTest, CommitCheckpoint)
218{
219 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
220
221 EXPECT_CALL(mock_merkle_db, commit_checkpoint());
222 EXPECT_CALL(mock_tracker, commit_checkpoint());
223
224 db.commit_checkpoint();
225}
226
227TEST_F(SideEffectTrackingDBTest, RevertCheckpoint)
228{
229 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
230
231 EXPECT_CALL(mock_merkle_db, revert_checkpoint());
232 EXPECT_CALL(mock_tracker, revert_checkpoint());
233
234 db.revert_checkpoint();
235}
236
237TEST_F(SideEffectTrackingDBTest, PadTrees)
238{
239 SideEffectTrackingDB db(first_nullifier, mock_merkle_db, mock_tracker);
240
241 EXPECT_CALL(mock_merkle_db, pad_trees());
242
243 db.pad_trees();
244}
245
246} // namespace
247} // namespace bb::avm2::simulation
std::shared_ptr< Napi::ThreadSafeFunction > revert_checkpoint
std::shared_ptr< Napi::ThreadSafeFunction > commit_checkpoint
std::shared_ptr< Napi::ThreadSafeFunction > create_checkpoint
FF unconstrained_make_unique_note_hash(const FF &siloed_note_hash, const FF &first_nullifier, uint64_t note_hash_counter)
Definition merkle.cpp:41
FF unconstrained_compute_leaf_slot(const AztecAddress &contract_address, const FF &slot)
Definition merkle.cpp:26
FF unconstrained_silo_note_hash(const AztecAddress &contract_address, const FF &note_hash)
Definition merkle.cpp:36
FF unconstrained_silo_nullifier(const AztecAddress &contract_address, const FF &nullifier)
Definition merkle.cpp:31
AvmFlavorSettings::FF FF
Definition field.hpp:10
TEST_F(IPATest, ChallengesAreZero)
Definition ipa.test.cpp:185
TrackedSideEffects tracked_effects
StrictMock< MockSideEffectTracker > mock_tracker
StrictMock< MockHighLevelMerkleDB > mock_merkle_db