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
26FF generate_nullifier(std::mt19937_64& rng)
27{
28 return generate_random_field(rng);
29}
30
31void mutate_nullifier(FF& nullifier, std::mt19937_64& rng)
32{
34}
35
36// Generate a random L2 to L1 message
37ScopedL2ToL1Message generate_l2_to_l1_message(std::mt19937_64& rng)
38{
41 .contract_address = generate_random_field(rng),
42 };
43}
44
45void mutate_l2_to_l1_msg(ScopedL2ToL1Message& msg, std::mt19937_64& rng)
46{
47 auto choice = std::uniform_int_distribution<uint8_t>(0, 2)(rng);
48
49 switch (choice) {
50 case 0:
51 // Mutate recipient
53 break;
54 case 1:
55 // Mutate content
57 break;
58 case 2:
59 // Mutate contract_address
61 break;
62 default:
63 break;
64 }
65}
66
67AccumulatedData generate_accumulated_data(std::mt19937_64& rng)
68{
69 // When we generate new accumulated data we can simply generate a small number of entries
70 // We test the limits during mutation
71 std::vector<FF> note_hashes;
72 size_t num_note_hashes = std::uniform_int_distribution<size_t>(0, 4)(rng);
73 note_hashes.reserve(num_note_hashes);
74 for (size_t i = 0; i < num_note_hashes; i++) {
75 note_hashes.push_back(generate_note_hash(rng));
76 }
77 std::vector<FF> nullifiers;
78 size_t num_nullifiers = std::uniform_int_distribution<size_t>(0, 4)(rng);
79 nullifiers.reserve(num_nullifiers);
80 for (size_t i = 0; i < num_nullifiers; i++) {
81 nullifiers.push_back(generate_nullifier(rng));
82 }
83 std::vector<ScopedL2ToL1Message> l2_to_l1_messages;
84 size_t num_messages = std::uniform_int_distribution<size_t>(0, 4)(rng);
85 l2_to_l1_messages.reserve(num_messages);
86 for (size_t i = 0; i < num_messages; i++) {
87 l2_to_l1_messages.push_back(generate_l2_to_l1_message(rng));
88 }
89
90 return AccumulatedData{
91 .note_hashes = note_hashes,
92 .nullifiers = nullifiers,
93 .l2_to_l1_messages = l2_to_l1_messages,
94 };
95}
96
97void mutate_accumulated_data(AccumulatedData& input, std::mt19937_64& rng)
98{
99 using namespace bb::avm2::fuzzer;
100 // We only really care about the existence of note hashes, nullifiers, and L2 to L1 messages
101 // or if these values end up triggering limit errors during execution.
103 switch (choice) {
104 case AccumulatedDataMutationOptions::NoteHashes:
105 mutate_vec_with_limit<FF>(input.note_hashes,
106 rng,
107 mutate_note_hash,
108 generate_note_hash,
111 break;
112 case AccumulatedDataMutationOptions::NoteHashesLimit: {
113 size_t original_size = input.note_hashes.size();
115 for (size_t i = original_size; i < MAX_NOTE_HASHES_PER_TX; i++) {
116 input.note_hashes[i] = generate_note_hash(rng);
117 }
118 break;
119 }
120 case AccumulatedDataMutationOptions::Nullifiers:
121 mutate_vec_with_limit<FF>(input.nullifiers,
122 rng,
123 mutate_nullifier,
124 generate_nullifier,
127 break;
128 case AccumulatedDataMutationOptions::NullifiersLimit: {
129 size_t original_size = input.nullifiers.size();
130 input.nullifiers.resize(MAX_NULLIFIERS_PER_TX);
131 for (size_t i = original_size; i < MAX_NULLIFIERS_PER_TX; i++) {
132 input.nullifiers[i] = generate_nullifier(rng);
133 }
134 break;
135 }
136 case AccumulatedDataMutationOptions::L2ToL1Messages:
137 mutate_vec_with_limit<ScopedL2ToL1Message>(input.l2_to_l1_messages,
138 rng,
139 mutate_l2_to_l1_msg,
140 generate_l2_to_l1_message,
143 break;
144 case AccumulatedDataMutationOptions::L2ToL1MessagesLimit: {
145 size_t original_size = input.l2_to_l1_messages.size();
147 for (size_t i = original_size; i < MAX_L2_TO_L1_MSGS_PER_TX; i++) {
148 input.l2_to_l1_messages[i] = generate_l2_to_l1_message(rng);
149 }
150 break;
151 }
152 }
153}
154
155} // namespace
156
157namespace bb::avm2::fuzzer {
158
160{
161 AccumulatedData data = generate_accumulated_data(rng);
162 if (data.nullifiers.empty()) {
163 // Need to ensure the "tx nullifier" exists
164 data.nullifiers.push_back(generate_nullifier(rng));
165 }
166 return data;
167}
169{
170 mutate_accumulated_data(data, rng);
171 if (data.nullifiers.empty()) {
172 // Need to ensure the "tx nullifier" exists
173 data.nullifiers.push_back(generate_nullifier(rng));
174 }
175}
176
178{
179 return generate_accumulated_data(rng);
180}
181
183{
184 mutate_accumulated_data(data, rng);
185};
186
187} // namespace bb::avm2::fuzzer
FF generate_random_field(std::mt19937_64 &rng)
Definition field.cpp:23
void mutate_field(bb::avm2::FF &value, std::mt19937_64 &rng, const FieldMutationConfig &config)
Definition field.cpp:54
#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