Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
accumulated_data.cpp
Go to the documentation of this file.
2
9
11using bb::avm2::FF;
12
13namespace {
14
15// Generate a random note hash
16FF generate_note_hash(std::mt19937_64& rng)
17{
18 return generate_random_field(rng);
19}
20
21void mutate_note_hash(FF& note_hash, std::mt19937_64& rng)
22{
24}
25
26// Generate a random nullifier. Can't be zero.
27FF generate_nullifier(std::mt19937_64& rng)
28{
29 FF nullifier = 0;
30 while (nullifier == 0) {
31 nullifier = generate_random_field(rng);
32 }
33 return nullifier;
34}
35
36// Mutate a nullifier. Can't be zero.
37void mutate_nullifier(FF& nullifier, std::mt19937_64& rng)
38{
40 while (nullifier == 0) {
42 }
43}
44
45// Generate a random L2 to L1 message
46ScopedL2ToL1Message generate_l2_to_l1_message(std::mt19937_64& rng)
47{
49 .message =
51 .contract_address = generate_random_field(rng),
52 };
53}
54
55void mutate_l2_to_l1_msg(ScopedL2ToL1Message& msg, std::mt19937_64& rng)
56{
57 auto choice = std::uniform_int_distribution<uint8_t>(0, 2)(rng);
58
59 switch (choice) {
60 case 0:
61 // Mutate recipient
63 break;
64 case 1:
65 // Mutate content
67 break;
68 case 2:
69 // Mutate contract_address
71 break;
72 default:
73 break;
74 }
75}
76
77AccumulatedData generate_accumulated_data(std::mt19937_64& rng)
78{
79 // When we generate new accumulated data we can simply generate a small number of entries
80 // We test the limits during mutation
81 std::vector<FF> note_hashes;
82 size_t num_note_hashes = std::uniform_int_distribution<size_t>(0, 4)(rng);
83 note_hashes.reserve(num_note_hashes);
84 for (size_t i = 0; i < num_note_hashes; i++) {
85 note_hashes.push_back(generate_note_hash(rng));
86 }
87 std::vector<FF> nullifiers;
88 size_t num_nullifiers = std::uniform_int_distribution<size_t>(0, 4)(rng);
89 nullifiers.reserve(num_nullifiers);
90 for (size_t i = 0; i < num_nullifiers; i++) {
91 nullifiers.push_back(generate_nullifier(rng));
92 }
93 std::vector<ScopedL2ToL1Message> l2_to_l1_messages;
94 size_t num_messages = std::uniform_int_distribution<size_t>(0, 4)(rng);
95 l2_to_l1_messages.reserve(num_messages);
96 for (size_t i = 0; i < num_messages; i++) {
97 l2_to_l1_messages.push_back(generate_l2_to_l1_message(rng));
98 }
99
100 return AccumulatedData{
101 .note_hashes = note_hashes,
102 .nullifiers = nullifiers,
103 .l2_to_l1_messages = l2_to_l1_messages,
104 };
105}
106
107void mutate_accumulated_data(AccumulatedData& input, std::mt19937_64& rng)
108{
109 using namespace bb::avm2::fuzzer;
110 // We only really care about the existence of note hashes, nullifiers, and L2 to L1 messages
111 // or if these values end up triggering limit errors during execution.
113 switch (choice) {
114 case AccumulatedDataMutationOptions::NoteHashes:
115 mutate_vec_with_limit<FF>(input.note_hashes,
116 rng,
117 mutate_note_hash,
118 generate_note_hash,
121 break;
122 case AccumulatedDataMutationOptions::NoteHashesLimit: {
123 size_t original_size = input.note_hashes.size();
125 for (size_t i = original_size; i < MAX_NOTE_HASHES_PER_TX; i++) {
126 input.note_hashes[i] = generate_note_hash(rng);
127 }
128 break;
129 }
130 case AccumulatedDataMutationOptions::Nullifiers:
131 mutate_vec_with_limit<FF>(input.nullifiers,
132 rng,
133 mutate_nullifier,
134 generate_nullifier,
137 break;
138 case AccumulatedDataMutationOptions::NullifiersLimit: {
139 size_t original_size = input.nullifiers.size();
140 input.nullifiers.resize(MAX_NULLIFIERS_PER_TX);
141 for (size_t i = original_size; i < MAX_NULLIFIERS_PER_TX; i++) {
142 input.nullifiers[i] = generate_nullifier(rng);
143 }
144 break;
145 }
146 case AccumulatedDataMutationOptions::L2ToL1Messages:
147 mutate_vec_with_limit<ScopedL2ToL1Message>(input.l2_to_l1_messages,
148 rng,
149 mutate_l2_to_l1_msg,
150 generate_l2_to_l1_message,
153 break;
154 case AccumulatedDataMutationOptions::L2ToL1MessagesLimit: {
155 size_t original_size = input.l2_to_l1_messages.size();
157 for (size_t i = original_size; i < MAX_L2_TO_L1_MSGS_PER_TX; i++) {
158 input.l2_to_l1_messages[i] = generate_l2_to_l1_message(rng);
159 }
160 break;
161 }
162 }
163}
164
165} // namespace
166
167namespace bb::avm2::fuzzer {
168
170{
171 AccumulatedData data = generate_accumulated_data(rng);
172 if (data.nullifiers.empty()) {
173 // Need to ensure the "tx nullifier" exists
174 data.nullifiers.push_back(generate_nullifier(rng));
175 }
176 return data;
177}
179{
180 mutate_accumulated_data(data, rng);
181 if (data.nullifiers.empty()) {
182 // Need to ensure the "tx nullifier" exists
183 data.nullifiers.push_back(generate_nullifier(rng));
184 }
185}
186
188{
189 return generate_accumulated_data(rng);
190}
191
193{
194 mutate_accumulated_data(data, rng);
195};
196
197} // namespace bb::avm2::fuzzer
FF generate_random_field(std::mt19937_64 &rng)
Definition field.cpp:25
void mutate_field(bb::avm2::FF &value, std::mt19937_64 &rng, const FieldMutationConfig &config)
Definition field.cpp:99
#define MAX_L2_TO_L1_MSGS_PER_TX
#define MAX_NOTE_HASHES_PER_TX
#define MAX_NULLIFIERS_PER_TX
T select(std::mt19937_64 &rng) const
constexpr FieldMutationConfig BASIC_FIELD_MUTATION_CONFIGURATION
constexpr VecMutationConfig BASIC_VEC_MUTATION_CONFIGURATION
const std::vector< MemoryValue > data
EthAddress generate_random_eth_address(std::mt19937_64 &rng)
AccumulatedData generate_non_revertible_accumulated_data(std::mt19937_64 &rng)
void mutate_non_revertible_accumulated_data(AccumulatedData &data, std::mt19937_64 &rng)
constexpr AccumulatedDataMutationConfig ACCUMULATED_DATA_MUTATION_CONFIGURATION
AccumulatedData generate_revertible_accumulated_data(std::mt19937_64 &rng)
void mutate_revertible_accumulated_data(AccumulatedData &data, std::mt19937_64 &rng)
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::vector< FF > nullifiers
Definition avm_io.hpp:318
std::vector< FF > note_hashes
Definition avm_io.hpp:317
std::vector< ScopedL2ToL1Message > l2_to_l1_messages
Definition avm_io.hpp:319