Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
side_effect_tracker.test.cpp
Go to the documentation of this file.
3
4#include <gmock/gmock.h>
5#include <gtest/gtest.h>
6
7namespace bb::avm2::simulation {
8namespace {
9
10using ::testing::ElementsAre;
11using ::testing::Eq;
12using ::testing::IsEmpty;
13using ::testing::Pair;
14using ::testing::UnorderedElementsAre;
15
16TEST(SideEffectTrackerTest, GetNumUnencryptedLogFields)
17{
18 TrackedSideEffects side_effect_states = { .public_logs = {} };
19 EXPECT_EQ(side_effect_states.get_num_unencrypted_log_fields(), 0);
20
21 side_effect_states.public_logs.add_log(PublicLog{ { 1, 2 }, 0xdeadbeef });
22 EXPECT_EQ(side_effect_states.get_num_unencrypted_log_fields(), 2 + PUBLIC_LOG_HEADER_LENGTH);
23
24 side_effect_states.public_logs.add_log(PublicLog{ {
25 1,
26 2,
27 3,
28 4,
29 5,
30 },
31 0xdeadbeef });
32 EXPECT_EQ(side_effect_states.get_num_unencrypted_log_fields(), 5 + 2 + (2 * PUBLIC_LOG_HEADER_LENGTH));
33}
34
35TEST(SideEffectTrackerTest, AddNullifier)
36{
37 SideEffectTracker tracker;
38 EXPECT_THAT(tracker.get_side_effects().nullifiers, IsEmpty());
39
40 tracker.add_nullifier(FF(123));
41 EXPECT_THAT(tracker.get_side_effects().nullifiers, ElementsAre(FF(123)));
42
43 tracker.add_nullifier(FF(456));
44 EXPECT_THAT(tracker.get_side_effects().nullifiers, ElementsAre(FF(123), FF(456)));
45}
46
47TEST(SideEffectTrackerTest, AddNoteHash)
48{
49 SideEffectTracker tracker;
50 EXPECT_THAT(tracker.get_side_effects().note_hashes, IsEmpty());
51
52 tracker.add_note_hash(FF(789));
53 EXPECT_THAT(tracker.get_side_effects().note_hashes, ElementsAre(FF(789)));
54
55 tracker.add_note_hash(FF(101112));
56 EXPECT_THAT(tracker.get_side_effects().note_hashes, ElementsAre(FF(789), FF(101112)));
57}
58
59TEST(SideEffectTrackerTest, AddL2ToL1Message)
60{
61 SideEffectTracker tracker;
62 EXPECT_THAT(tracker.get_side_effects().l2_to_l1_messages, IsEmpty());
63
64 AztecAddress contract_addr(0x1234);
65 EthAddress recipient(0x5678);
66 FF content(999);
67
68 tracker.add_l2_to_l1_message(contract_addr, recipient, content);
69 EXPECT_THAT(tracker.get_side_effects().l2_to_l1_messages,
70 ElementsAre(ScopedL2ToL1Message{ .message = { .recipient = recipient, .content = content },
71 .contract_address = contract_addr }));
72}
73
74TEST(SideEffectTrackerTest, AddPublicLog)
75{
76 SideEffectTracker tracker;
77 EXPECT_EQ(tracker.get_side_effects().public_logs.length, 0);
78
79 AztecAddress contract_addr(0xabcd);
80 std::vector<FF> fields = { FF(1), FF(2), FF(3) };
81
82 tracker.add_public_log(contract_addr, fields);
83
84 PublicLogs expected_logs =
85 PublicLogs::from_logs({ PublicLog{ .fields = fields, .contract_address = contract_addr } });
86 EXPECT_EQ(tracker.get_side_effects().public_logs, expected_logs);
87}
88
89TEST(SideEffectTrackerTest, AddStorageWrite)
90{
91 SideEffectTracker tracker;
92 EXPECT_THAT(tracker.get_side_effects().storage_writes_slots_by_insertion, IsEmpty());
93
94 FF slot1(100);
95 FF value1(200);
96 tracker.add_storage_write(slot1, value1);
97 EXPECT_THAT(tracker.get_side_effects().storage_writes_slot_to_value, UnorderedElementsAre(Pair(slot1, value1)));
98 EXPECT_THAT(tracker.get_side_effects().storage_writes_slots_by_insertion, ElementsAre(slot1));
99}
100
101TEST(SideEffectTrackerTest, AddStorageWriteOverwrite)
102{
103 SideEffectTracker tracker;
104 FF slot(100);
105 FF value1(200);
106 FF value2(300);
107
108 tracker.add_storage_write(slot, value1);
109 EXPECT_THAT(tracker.get_side_effects().storage_writes_slot_to_value, UnorderedElementsAre(Pair(slot, value1)));
110 EXPECT_THAT(tracker.get_side_effects().storage_writes_slots_by_insertion, ElementsAre(slot));
111
112 tracker.add_storage_write(slot, value2);
113 EXPECT_THAT(tracker.get_side_effects().storage_writes_slot_to_value, UnorderedElementsAre(Pair(slot, value2)));
114 EXPECT_THAT(tracker.get_side_effects().storage_writes_slots_by_insertion, ElementsAre(slot));
115}
116
117TEST(SideEffectTrackerTest, CreateAndCommitCheckpoint)
118{
119 SideEffectTracker tracker;
120
121 auto expect_contents = [&]() {
122 EXPECT_THAT(tracker.get_side_effects().nullifiers, ElementsAre(FF(1), FF(3)));
123 EXPECT_THAT(tracker.get_side_effects().note_hashes, ElementsAre(FF(2), FF(4)));
124 EXPECT_THAT(tracker.get_side_effects().storage_writes_slots_by_insertion,
125 ElementsAre(FF(100), FF(200), FF(400)));
126 EXPECT_THAT(tracker.get_side_effects().storage_writes_slot_to_value,
127 UnorderedElementsAre(Pair(FF(100), FF(300)), Pair(FF(200), FF(300)), Pair(FF(400), FF(400))));
128 EXPECT_THAT(tracker.get_side_effects().public_logs,
130 { PublicLog{ .fields = { FF(1), FF(2), FF(3) }, .contract_address = AztecAddress(0x1234) },
131 PublicLog{ .fields = { FF(4), FF(5), FF(6) }, .contract_address = AztecAddress(0x2222) } })));
132 EXPECT_THAT(
133 tracker.get_side_effects().l2_to_l1_messages,
134 ElementsAre(ScopedL2ToL1Message{ .message = { .recipient = EthAddress(0x5678), .content = FF(999) },
135 .contract_address = AztecAddress(0x1234) },
136 ScopedL2ToL1Message{ .message = { .recipient = EthAddress(0x3333), .content = FF(1000) },
137 .contract_address = AztecAddress(0x2222) }));
138 };
139
140 tracker.add_nullifier(FF(1));
141 tracker.add_note_hash(FF(2));
142 tracker.add_storage_write(FF(100), FF(200));
143 tracker.add_storage_write(FF(200), FF(300));
144 tracker.add_public_log(AztecAddress(0x1234), { FF(1), FF(2), FF(3) });
145 tracker.add_l2_to_l1_message(AztecAddress(0x1234), EthAddress(0x5678), FF(999));
146 tracker.create_checkpoint();
147
148 tracker.add_nullifier(FF(3));
149 tracker.add_note_hash(FF(4));
150 tracker.add_storage_write(FF(100), FF(300));
151 tracker.add_storage_write(FF(400), FF(400));
152 tracker.add_public_log(AztecAddress(0x2222), { FF(4), FF(5), FF(6) });
153 tracker.add_l2_to_l1_message(AztecAddress(0x2222), EthAddress(0x3333), FF(1000));
154
155 expect_contents();
156
157 tracker.commit_checkpoint();
158
159 expect_contents();
160}
161
162TEST(SideEffectTrackerTest, CreateAndRevertCheckpoint)
163{
164 SideEffectTracker tracker;
165
166 auto expect_contents = [&]() {
167 EXPECT_THAT(tracker.get_side_effects().nullifiers, ElementsAre(FF(1)));
168 EXPECT_THAT(tracker.get_side_effects().note_hashes, ElementsAre(FF(2)));
169 EXPECT_THAT(tracker.get_side_effects().storage_writes_slots_by_insertion, ElementsAre(FF(100), FF(200)));
170 EXPECT_EQ(tracker.get_side_effects().storage_writes_slot_to_value.at(FF(100)), FF(200));
171 EXPECT_EQ(tracker.get_side_effects().storage_writes_slot_to_value.at(FF(200)), FF(300));
172 EXPECT_THAT(tracker.get_side_effects().public_logs,
174 { PublicLog{ .fields = { FF(1), FF(2), FF(3) }, .contract_address = AztecAddress(0x1234) } })));
175 EXPECT_THAT(tracker.get_side_effects().l2_to_l1_messages,
176 ElementsAre(ScopedL2ToL1Message{ .message = { .recipient = EthAddress(0x5678), .content = FF(999) },
177 .contract_address = AztecAddress(0x1234) }));
178 };
179
180 tracker.add_nullifier(FF(1));
181 tracker.add_note_hash(FF(2));
182 tracker.add_storage_write(FF(100), FF(200));
183 tracker.add_storage_write(FF(200), FF(300));
184 tracker.add_public_log(AztecAddress(0x1234), { FF(1), FF(2), FF(3) });
185 tracker.add_l2_to_l1_message(AztecAddress(0x1234), EthAddress(0x5678), FF(999));
186 tracker.create_checkpoint();
187
188 expect_contents();
189
190 tracker.add_nullifier(FF(3));
191 tracker.add_note_hash(FF(4));
192 tracker.add_storage_write(FF(100), FF(300));
193 tracker.add_storage_write(FF(400), FF(400));
194 tracker.add_public_log(AztecAddress(0x2222), { FF(4), FF(5), FF(6) });
195 tracker.add_l2_to_l1_message(AztecAddress(0x2222), EthAddress(0x3333), FF(1000));
196 tracker.revert_checkpoint();
197
198 expect_contents();
199}
200
201TEST(SideEffectTrackerTest, NestedCheckpoints)
202{
203 SideEffectTracker tracker;
204 tracker.add_nullifier(FF(1));
205
206 tracker.create_checkpoint();
207 tracker.add_nullifier(FF(2));
208
209 tracker.create_checkpoint();
210 tracker.add_nullifier(FF(3));
211 EXPECT_THAT(tracker.get_side_effects().nullifiers, ElementsAre(FF(1), FF(2), FF(3)));
212
213 tracker.commit_checkpoint();
214 EXPECT_THAT(tracker.get_side_effects().nullifiers, ElementsAre(FF(1), FF(2), FF(3)));
215
216 tracker.revert_checkpoint();
217 EXPECT_THAT(tracker.get_side_effects().nullifiers, ElementsAre(FF(1)));
218}
219
220} // namespace
221} // namespace bb::avm2::simulation
#define PUBLIC_LOG_HEADER_LENGTH
AvmFlavorSettings::FF FF
Definition field.hpp:10
TEST(BoomerangMegaCircuitBuilder, BasicCircuit)
static PublicLogs from_logs(const std::vector< PublicLog > &logs)