Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
tx_data.cpp
Go to the documentation of this file.
2
16
17#include <optional>
18#include <random>
19
20namespace {
21
22void mutate_enqueued_calls(std::vector<PublicCallRequestWithCalldata>& enqueued_calls,
23 std::vector<AztecAddress>& contract_addresses,
24 std::mt19937_64& rng)
25{
26 auto mutate_fn = [&](PublicCallRequestWithCalldata& call, std::mt19937_64& rng) {
27 bb::avm2::fuzzer::mutate_public_call_request(call, contract_addresses, rng);
28 };
29
30 auto gen_fn = [&](std::mt19937_64& rng) {
31 return bb::avm2::fuzzer::generate_public_call_request(contract_addresses, rng);
32 };
33
34 mutate_vec<PublicCallRequestWithCalldata>(enqueued_calls, rng, mutate_fn, gen_fn, BASIC_VEC_MUTATION_CONFIGURATION);
35};
36
37void mutate_teardown(std::optional<PublicCallRequestWithCalldata>& teardown_call,
38 std::vector<AztecAddress>& contract_addresses,
39 std::mt19937_64& rng)
40{
41 if (!teardown_call.has_value()) {
42 // Nothing to mutate, generate a new one
43 teardown_call = bb::avm2::fuzzer::generate_public_call_request(contract_addresses, rng);
44 return;
45 }
46
47 // If we already have a teardown call, there's a 1 in 10 chance we discard it
48 bool discard = std::uniform_int_distribution<int>(0, 9)(rng) == 0;
49 if (discard) {
50 fuzz_info("Discarding teardown enqueued call");
51 teardown_call = std::nullopt;
52 } else {
53 // Mutate existing teardown call
54 bb::avm2::fuzzer::mutate_public_call_request(teardown_call.value(), contract_addresses, rng);
55 }
56}
57
58} // namespace
59
60namespace bb::avm2::fuzzer {
61
62void mutate_tx(Tx& tx, std::vector<AztecAddress>& contract_addresses, std::mt19937_64& rng)
63{
64 auto choice = TX_MUTATION_CONFIGURATION.select(rng);
65
66 switch (choice) {
68 // Mutate setup enqueued calls
69 fuzz_info("Mutating setup enqueued calls: ", tx.setup_enqueued_calls.size());
70 mutate_enqueued_calls(tx.setup_enqueued_calls, contract_addresses, rng);
71 break;
73 // Mutate app logic enqueued calls
74 fuzz_info("Mutating app logic enqueued calls: ", tx.app_logic_enqueued_calls.size());
75 mutate_enqueued_calls(tx.app_logic_enqueued_calls, contract_addresses, rng);
76 break;
78 // Mutate teardown enqueued call
79 fuzz_info("Mutating teardown enqueued call");
80 mutate_teardown(tx.teardown_enqueued_call, contract_addresses, rng);
81 break;
83 // Mutate non-revertible accumulated data
84 fuzz_info("Mutating non-revertible accumulated data");
85 mutate_non_revertible_accumulated_data(tx.non_revertible_accumulated_data, rng);
86 break;
88 // Mutate revertible accumulated data
89 fuzz_info("Mutating revertible accumulated data");
90 mutate_revertible_accumulated_data(tx.revertible_accumulated_data, rng);
91 break;
93 // Mutate gas_settings
94 fuzz_info("Mutating gas settings");
95 mutate_gas_settings(tx.gas_settings, rng);
96 // Ensure effective_gas_fees <= max_fees_per_gas after mutation
97 tx.effective_gas_fees.fee_per_da_gas =
98 std::min(tx.effective_gas_fees.fee_per_da_gas, tx.gas_settings.max_fees_per_gas.fee_per_da_gas);
99 tx.effective_gas_fees.fee_per_l2_gas =
100 std::min(tx.effective_gas_fees.fee_per_l2_gas, tx.gas_settings.max_fees_per_gas.fee_per_l2_gas);
101 break;
103 // Mutate effective_gas_fees
104 fuzz_info("Mutating effective gas fees");
105 mutate_gas_fees(tx.effective_gas_fees, rng);
106 // Ensure effective_gas_fees <= max_fees_per_gas after mutation
107 tx.effective_gas_fees.fee_per_da_gas =
108 std::min(tx.effective_gas_fees.fee_per_da_gas, tx.gas_settings.max_fees_per_gas.fee_per_da_gas);
109 tx.effective_gas_fees.fee_per_l2_gas =
110 std::min(tx.effective_gas_fees.fee_per_l2_gas, tx.gas_settings.max_fees_per_gas.fee_per_l2_gas);
111 break;
113 // Mutate gas_used_by_private
114 fuzz_info("Mutating gas used by private");
115 mutate_gas(tx.gas_used_by_private, rng, tx.gas_settings.gas_limits);
116 break;
118 // Mutate fee_payer
119 fuzz_info("Mutating fee payer");
121 break;
122 }
123}
124
126 std::vector<FuzzerData>& enqueued_calls,
127 std::mt19937_64& rng,
128 size_t max_size)
129{
131
132 switch (choice) {
134 fuzz_info("Adding a new enqueued call");
135 // Add a new enqueued call
136 if (enqueued_calls.size() < max_size) {
137 enqueued_calls.push_back(generate_fuzzer_data(rng, context));
138 }
139 break;
140
142 // Mutate an existing enqueued call
143 fuzz_info("Mutating an existing enqueued call");
144 if (!enqueued_calls.empty()) {
145 size_t idx = std::uniform_int_distribution<size_t>(0, enqueued_calls.size() - 1)(rng);
146 fuzz_info("Mutating enqueued call at index: ", idx);
147 mutate_fuzzer_data(enqueued_calls[idx], rng, context);
148 add_default_instruction_block_if_empty(enqueued_calls[idx], rng, context);
149 }
150 break;
151 }
153 // Remove an existing enqueued call
154 fuzz_info("Removing an existing enqueued call");
155 if (!enqueued_calls.empty()) {
156 size_t idx = std::uniform_int_distribution<size_t>(0, enqueued_calls.size() - 1)(rng);
157 enqueued_calls.erase(enqueued_calls.begin() + static_cast<std::ptrdiff_t>(idx));
158 }
159 break;
160 }
161}
162
163} // namespace bb::avm2::fuzzer
#define fuzz_info(...)
Definition constants.hpp:51
void mutate_field(bb::avm2::FF &value, std::mt19937_64 &rng, const FieldMutationConfig &config)
Definition field.cpp:99
T select(std::mt19937_64 &rng) const
constexpr FieldMutationConfig BASIC_FIELD_MUTATION_CONFIGURATION
constexpr VecMutationConfig BASIC_VEC_MUTATION_CONFIGURATION
void mutate_tx(Tx &tx, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
Definition tx_data.cpp:62
void mutate_gas_settings(GasSettings &gas_settings, std::mt19937_64 &rng)
Definition gas.cpp:97
void mutate_non_revertible_accumulated_data(AccumulatedData &data, std::mt19937_64 &rng)
FuzzerData generate_fuzzer_data(std::mt19937_64 &rng, const FuzzerContext &context)
PublicCallRequestWithCalldata generate_public_call_request(std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
void mutate_fuzzer_data_vec(const FuzzerContext &context, std::vector< FuzzerData > &enqueued_calls, std::mt19937_64 &rng, size_t max_size)
Definition tx_data.cpp:125
void add_default_instruction_block_if_empty(FuzzerData &fuzzer_data, std::mt19937_64 &rng, const FuzzerContext &context)
void mutate_fuzzer_data(FuzzerData &fuzzer_data, std::mt19937_64 &rng, const FuzzerContext &context)
void mutate_gas_fees(GasFees &fees, std::mt19937_64 &rng)
Definition gas.cpp:66
void mutate_public_call_request(PublicCallRequestWithCalldata &request, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
void mutate_revertible_accumulated_data(AccumulatedData &data, std::mt19937_64 &rng)
void mutate_gas(Gas &gas, std::mt19937_64 &rng, const Gas &max)
Definition gas.cpp:39
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
constexpr EnqueuedCallMutationConfig ENQUEUED_CALL_MUTATION_CONFIGURATION
Definition tx_data.hpp:41
constexpr TxMutationConfig TX_MUTATION_CONFIGURATION
Definition tx_data.hpp:26