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
8
10using bb::avm2::FF;
11
12namespace {
13
14// Generate a random note hash
15FF generate_note_hash(std::mt19937_64& rng)
16{
17 return generate_random_field(rng);
18}
19
20void mutate_note_hash(FF& note_hash, std::mt19937_64& rng)
21{
23}
24
25// Generate a random nullifier. Can't be zero.
26FF generate_nullifier(std::mt19937_64& rng)
27{
28 FF nullifier = 0;
29 while (nullifier == 0) {
31 }
32 return nullifier;
33}
34
35// Mutate a nullifier. Can't be zero.
36void mutate_nullifier(FF& nullifier, std::mt19937_64& rng)
37{
39 while (nullifier == 0) {
41 }
42}
43
44// Generate a random L2 to L1 message
45ScopedL2ToL1Message generate_l2_to_l1_message(std::mt19937_64& rng)
46{
49 .contract_address = generate_random_field(rng),
50 };
51}
52
53void mutate_l2_to_l1_msg(ScopedL2ToL1Message& msg, std::mt19937_64& rng)
54{
55 auto choice = std::uniform_int_distribution<uint8_t>(0, 2)(rng);
56
57 switch (choice) {
58 case 0:
59 // Mutate recipient
61 break;
62 case 1:
63 // Mutate content
65 break;
66 case 2:
67 // Mutate contract_address
69 break;
70 default:
71 break;
72 }
73}
74
75AccumulatedData generate_accumulated_data(std::mt19937_64& rng)
76{
77 // When we generate new accumulated data we can simply generate a small number of entries
78 // We test the limits during mutation
79 std::vector<FF> note_hashes;
80 size_t num_note_hashes = std::uniform_int_distribution<size_t>(0, 4)(rng);
81 note_hashes.reserve(num_note_hashes);
82 for (size_t i = 0; i < num_note_hashes; i++) {
83 note_hashes.push_back(generate_note_hash(rng));
84 }
85 std::vector<FF> nullifiers;
86 size_t num_nullifiers = std::uniform_int_distribution<size_t>(0, 4)(rng);
87 nullifiers.reserve(num_nullifiers);
88 for (size_t i = 0; i < num_nullifiers; i++) {
89 nullifiers.push_back(generate_nullifier(rng));
90 }
91 std::vector<ScopedL2ToL1Message> l2_to_l1_messages;
92 size_t num_messages = std::uniform_int_distribution<size_t>(0, 4)(rng);
93 l2_to_l1_messages.reserve(num_messages);
94 for (size_t i = 0; i < num_messages; i++) {
95 l2_to_l1_messages.push_back(generate_l2_to_l1_message(rng));
96 }
97
98 return AccumulatedData{
99 .note_hashes = note_hashes,
100 .nullifiers = nullifiers,
101 .l2_to_l1_messages = l2_to_l1_messages,
102 };
103}
104
105void mutate_accumulated_data(AccumulatedData& input, std::mt19937_64& rng)
106{
107 using namespace bb::avm2::fuzzer;
108 // We only really care about the existence of note hashes, nullifiers, and L2 to L1 messages
109 // or if these values end up triggering limit errors during execution.
111 switch (choice) {
112 case AccumulatedDataMutationOptions::NoteHashes:
113 mutate_vec_with_limit<FF>(input.note_hashes,
114 rng,
115 mutate_note_hash,
116 generate_note_hash,
119 break;
120 case AccumulatedDataMutationOptions::NoteHashesLimit: {
121 size_t original_size = input.note_hashes.size();
123 for (size_t i = original_size; i < MAX_NOTE_HASHES_PER_TX; i++) {
124 input.note_hashes[i] = generate_note_hash(rng);
125 }
126 break;
127 }
128 case AccumulatedDataMutationOptions::Nullifiers:
129 mutate_vec_with_limit<FF>(input.nullifiers,
130 rng,
131 mutate_nullifier,
132 generate_nullifier,
135 break;
136 case AccumulatedDataMutationOptions::NullifiersLimit: {
137 size_t original_size = input.nullifiers.size();
138 input.nullifiers.resize(MAX_NULLIFIERS_PER_TX);
139 for (size_t i = original_size; i < MAX_NULLIFIERS_PER_TX; i++) {
140 input.nullifiers[i] = generate_nullifier(rng);
141 }
142 break;
143 }
144 case AccumulatedDataMutationOptions::L2ToL1Messages:
145 mutate_vec_with_limit<ScopedL2ToL1Message>(input.l2_to_l1_messages,
146 rng,
147 mutate_l2_to_l1_msg,
148 generate_l2_to_l1_message,
151 break;
152 case AccumulatedDataMutationOptions::L2ToL1MessagesLimit: {
153 size_t original_size = input.l2_to_l1_messages.size();
155 for (size_t i = original_size; i < MAX_L2_TO_L1_MSGS_PER_TX; i++) {
156 input.l2_to_l1_messages[i] = generate_l2_to_l1_message(rng);
157 }
158 break;
159 }
160 }
161}
162
163} // namespace
164
165namespace bb::avm2::fuzzer {
166
168{
169 AccumulatedData data = generate_accumulated_data(rng);
170 if (data.nullifiers.empty()) {
171 // Need to ensure the "tx nullifier" exists
172 data.nullifiers.push_back(generate_nullifier(rng));
173 }
174 return data;
175}
177{
178 mutate_accumulated_data(data, rng);
179 if (data.nullifiers.empty()) {
180 // Need to ensure the "tx nullifier" exists
181 data.nullifiers.push_back(generate_nullifier(rng));
182 }
183}
184
186{
187 return generate_accumulated_data(rng);
188}
189
191{
192 mutate_accumulated_data(data, rng);
193};
194
195} // 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
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:319
std::vector< FF > note_hashes
Definition avm_io.hpp:318
std::vector< ScopedL2ToL1Message > l2_to_l1_messages
Definition avm_io.hpp:320