Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
fuzzer_lib.cpp
Go to the documentation of this file.
2
3#include <cstdint>
4#include <string>
5#include <unordered_set>
6#include <vector>
7
28
29using namespace bb::avm2::fuzzer;
30using namespace bb::avm2::simulation;
31using namespace bb::world_state;
32
33extern size_t LLVMFuzzerMutate(uint8_t* Data, size_t Size, size_t MaxSize);
34
36{
37 // Add all contract classes and instances to the contract DB
38 // There may be more classes than instances because of the possibility of mutated bytecodes that are used in
39 // upgrades - these are not directly instantiated
40 for (size_t i = 0; i < tx_data.contract_classes.size(); ++i) {
41 const auto& contract_class = tx_data.contract_classes[i];
42 contract_db.add_contract_class(contract_class.id, contract_class);
43 }
44
45 // Add contract instances to the contract DB
46 for (size_t i = 0; i < tx_data.contract_instances.size(); ++i) {
47 const auto& contract_instance = tx_data.contract_instances[i];
48 auto contract_address = tx_data.contract_addresses[i];
49 contract_db.add_contract_instance(contract_address, contract_instance);
50 }
51
52 // For protocol contracts, also add instances keyed by canonical address (1-11).
53 // This is needed because protocol contracts are looked up by canonical address,
54 // but the derived address in protocol_contracts.derived_addresses maps to the actual instance.
55 for (size_t i = 0; i < tx_data.protocol_contracts.derived_addresses.size(); ++i) {
56 const auto& derived_address = tx_data.protocol_contracts.derived_addresses[i];
57 if (!derived_address.is_zero()) {
58 // Canonical address is index + 1 (addresses 1-11 map to indices 0-10)
59 AztecAddress canonical_address(static_cast<uint256_t>(i + 1));
60 // Find the instance for this derived address and also add it by canonical address
61 auto maybe_instance = contract_db.get_contract_instance(derived_address);
62 if (maybe_instance.has_value()) {
63 // Protocol contracts are not upgradeable, so the canonical-address copy must have
64 // current == original. The derived-address instance may have been upgraded by
65 // mutate_bytecode before the protocol-contracts mutation promoted it; that upgrade
66 // is irrelevant for the canonical (protocol) view. Enforces the
67 // PROTOCOL_CONTRACT_CLASS_ID_IS_ORIGINAL relation in contract_instance_retrieval.pil.
68 ContractInstance protocol_instance = maybe_instance.value();
69 protocol_instance.current_contract_class_id = protocol_instance.original_contract_class_id;
70 contract_db.add_contract_instance(canonical_address, protocol_instance);
71 }
72 }
73 }
74
75 // Register contract addresses in the world state
76 for (const auto& addr : tx_data.contract_addresses) {
78 }
79
80 // Apply public data tree writes (e.g., for contract instance upgrades)
81 for (const auto& write : tx_data.public_data_writes) {
83 }
84
86}
87
89{
90 // Compute fee from gas limits and max fees per gas (upper bound on fee)
91 FF fee_required_da = FF(tx.gas_settings.gas_limits.da_gas) * FF(tx.gas_settings.max_fees_per_gas.fee_per_da_gas);
92 FF fee_required_l2 = FF(tx.gas_settings.gas_limits.l2_gas) * FF(tx.gas_settings.max_fees_per_gas.fee_per_l2_gas);
93
94 // Fund fee payer with required fee
95 ws_mgr.write_fee_payer_balance(tx.fee_payer, fee_required_da + fee_required_l2);
96}
97
102{
103 auto cpp_simulator = CppSimulator();
104 SimulatorResult cpp_result;
105
106 try {
108 cpp_result = cpp_simulator.simulate(ws_mgr,
110 tx_data.tx,
111 tx_data.global_variables,
112 tx_data.public_data_writes,
113 tx_data.note_hashes,
114 tx_data.protocol_contracts);
115 fuzz_info("CppSimulator completed without exception");
116 fuzz_info("CppSimulator result: ", cpp_result);
117 ws_mgr.revert();
118 } catch (const std::exception& e) {
119 fuzz_info("CppSimulator threw an exception: ", e.what());
120 cpp_result = SimulatorResult{
121 .reverted = true,
122 .output = {},
123 .end_tree_snapshots = TreeSnapshots(),
124 .revert_reason = e.what(),
125 };
126 ws_mgr.revert();
127 }
128
129 return cpp_result;
130}
131
139{
140 ProtocolContracts& protocol_contracts = tx_data.protocol_contracts;
143 AvmSimulationHelper helper;
144
145 // Reset stats for this iteration
147
148 const PublicSimulatorConfig sim_fast_config{
149 .skip_fee_enforcement = false,
150 .collect_call_metadata = true,
151 .collect_public_inputs = true,
152 };
153
154 const PublicSimulatorConfig sim_hint_config{
155 .skip_fee_enforcement = false,
156 .collect_call_metadata = true,
157 .collect_hints = true,
158 .collect_public_inputs = true,
159 };
160
161 // 1. Run simulate_fast_with_existing_ws
162 // It is the only one that may throw, so we wrap it in try-catch. If it fails, we do not proceed
163 TxSimulationResult fast_result;
164 try {
166 fast_result = AVM_TRACK_TIME_V(
167 "fuzzer/simulate_fast",
169 contract_db, ws_rev, ws, sim_fast_config, tx_data.tx, tx_data.global_variables, protocol_contracts));
170 ws_mgr.revert();
171 } catch (const std::exception& e) {
172 ws_mgr.revert();
173 fuzz_info("simulate_fast_with_existing_ws threw an exception: ", e.what());
174 return {};
175 }
176
177 // 2. Run simulate_for_hint_collection
180 "fuzzer/simulate_hints",
182 contract_db, ws_rev, ws, sim_hint_config, tx_data.tx, tx_data.global_variables, protocol_contracts));
183 ws_mgr.revert();
184
185 // 2a. Construct proving inputs from hint result
186 bb::avm2::AvmProvingInputs proving_inputs{
187 .public_inputs = hint_result.public_inputs.value(),
188 .hints = hint_result.hints.value(),
189 };
190
191 // 3. (optional) Simulate Fast with hinted db
192 TxSimulationResult sim_fast_hinted_result =
193 helper.simulate_fast_with_hinted_dbs(proving_inputs.hints, sim_fast_config);
194
195 // 4. Compare results from all 3 simulations
196 bool result = compare_cpp_simulator_results({ fast_result, hint_result, sim_fast_hinted_result });
198 "Simulation results do not match between simulate_fast, simulate_for_hint_collection, "
199 "and simulate_fast_with_hinted_dbs");
200
201 // 5. Run check_circuit (skip in coverage builds since it's slow and not needed for coverage measurement)
202
203#ifndef COVERAGE_AVM
204 avm2::AvmAPI avm_api;
205 bool check_circuit_result = avm_api.check_circuit(proving_inputs);
206 BB_ASSERT(check_circuit_result,
207 "check_circuit returned false in fuzzer with no exception, this indicates a failure");
208
209 // 6. Prove and verify
210 auto proof = avm_api.prove(proving_inputs);
211 bool verified = avm_api.verify(proof, proving_inputs.public_inputs);
212 BB_ASSERT(verified, "Proof verification failed");
213#else
214 // In coverage builds, run simulate_for_witgen and tracegen instead of check_circuit
215 // This gives us coverage the the event and tracegen code paths without the overhead of check_circuit
216 vinfo("Running simulate_for_witgen in coverage build (skipping check_circuit)");
217 avm2::AvmSimulationHelper simulation_helper;
218 auto events = simulation_helper.simulate_for_witgen(proving_inputs.hints);
219 AvmTraceGenHelper tracegen_helper;
221 tracegen_helper.fill_trace_columns(trace, std::move(events), hint_result.public_inputs.value());
222#endif
223
224 return fast_result;
225}
226
227// Initialize FuzzerTxData with sensible defaults
229{
230 FuzzerTxData tx_data = {
232 .global_variables = { .chain_id = CHAIN_ID,
233 .version = VERSION,
234 .block_number = BLOCK_NUMBER,
235 .slot_number = SLOT_NUMBER,
236 .timestamp = TIMESTAMP,
237 .coinbase = COINBASE,
238 .fee_recipient = FEE_RECIPIENT,
239 .gas_fees =
240 GasFees{ .fee_per_da_gas = FEE_PER_DA_GAS, .fee_per_l2_gas = FEE_PER_L2_GAS } },
241 .protocol_contracts = {},
242 // We can write proper mutations for this. However it might not be of much value since we have variability from
243 // nonrevertible note hashes.
244 .note_hashes = { generate_random_field(rng), generate_random_field(rng), generate_random_field(rng) }
245 };
246
247 // TODO(alvaro): This is messy, we mutate when creating default tx data. Maybe we should just remove the mutation
248 // from generate_fuzzer_data altogether.
250 FuzzerData fuzzer_data = generate_fuzzer_data(rng, context);
251 tx_data.input_programs.push_back(fuzzer_data);
252
253 return tx_data;
254}
255
261
263{
264 fuzz_info("Building bytecode from fuzzer data: ", fuzzer_data.instruction_blocks);
265 auto control_flow = ControlFlow(fuzzer_data.instruction_blocks);
266 for (const auto& cfg_instruction : fuzzer_data.cfg_instructions) {
267 control_flow.process_cfg_instruction(cfg_instruction);
268 }
269 auto bytecode = control_flow.build_bytecode(fuzzer_data.return_options);
270
271 auto bytecode_commitment = compute_public_bytecode_commitment(bytecode);
272 auto class_id = compute_contract_class_id(/*artifact_hash=*/0, /*private_fn_root=*/0, bytecode_commitment);
273 ContractClassWithCommitment contract_class{
274 .id = class_id,
275 .artifact_hash = 0,
276 .private_functions_root = 0,
277 .packed_bytecode = bytecode,
278 .public_bytecode_commitment = bytecode_commitment,
279 };
280 ContractInstance contract_instance{
281 .salt = 0,
282 .deployer = MSG_SENDER,
283 .current_contract_class_id = class_id, // Initial and current are the same
284 .original_contract_class_id = class_id,
285 .public_keys = {
286 .nullifier_key_hash = 0,
287 .incoming_viewing_key = grumpkin::g1::element::one(),
288 .outgoing_viewing_key_hash = 0,
289 .tagging_key_hash = 0,
290 },
291 };
292 return { bytecode, contract_class, contract_instance };
293}
294
296 uint8_t* serialized_fuzzer_data,
297 size_t serialized_fuzzer_data_size,
298 size_t max_size,
299 unsigned int seed)
300{
301 auto rng = std::mt19937_64(seed);
302 FuzzerTxData tx_data;
303 try {
304 msgpack::unpack((reinterpret_cast<const char*>(serialized_fuzzer_data)), serialized_fuzzer_data_size)
305 .get()
306 .convert(tx_data);
307 } catch (const std::exception&) {
308 fuzz_info("Failed to deserialize input in CustomMutator, creating default FuzzerTxData");
309 tx_data = create_default_tx_data(rng, context);
310 }
311
313
314 // Build up bytecodes, contract classes and instances from the fuzzer data
315 tx_data.contract_classes.clear();
316 tx_data.contract_instances.clear();
317 tx_data.contract_addresses.clear();
318 tx_data.public_data_writes.clear();
319 std::vector<AztecAddress> contract_addresses;
320
322 for (auto& fuzzer_data : tx_data.input_programs) {
323 const auto [bytecode, contract_class, contract_instance] = build_bytecode_and_artifacts(fuzzer_data);
324
325 auto contract_address = simulation::compute_contract_address(contract_instance);
326
327 // Skip duplicate addresses - multiple input_programs can generate the same address
328 if (seen_addresses.contains(contract_address)) {
329 fuzz_info("Skipping duplicate contract address: ", contract_address);
330 continue;
331 }
332 seen_addresses.insert(contract_address);
333
334 contract_addresses.push_back(contract_address);
335 tx_data.contract_classes.push_back(contract_class);
336 tx_data.contract_instances.push_back(contract_instance);
337 }
338
339 tx_data.contract_addresses = contract_addresses;
340
341 // Ensure all enqueued calls have valid contract addresses (not placeholders)
342 // We may add more advanced mutation to change contract addresses later, right now we just ensure they are valid
343 if (!contract_addresses.empty()) {
344 auto idx_dist = std::uniform_int_distribution<size_t>(0, contract_addresses.size() - 1);
345 for (auto& call : tx_data.tx.setup_enqueued_calls) {
346 call.request.contract_address = contract_addresses[idx_dist(rng)];
347 }
348 for (auto& call : tx_data.tx.app_logic_enqueued_calls) {
349 call.request.contract_address = contract_addresses[idx_dist(rng)];
350 }
351 }
352
353 // Select mutation type (weighted against bytecode mutations) -- todo
355
356 switch (mutation_choice) {
359 break;
361 mutate_tx(tx_data.tx, contract_addresses, rng);
362 break;
365 tx_data.contract_instances,
366 tx_data.contract_addresses,
367 tx_data.public_data_writes,
368 rng);
369 break;
370
373 break;
376 break;
378 // This is just mutating the gas values and timestamp
381 break;
384 break;
385 }
386
387 // Clear any protocol contract derived addresses that reference addresses no longer in the contract set.
388 // This can happen when mutations (e.g., ContractClassMutation, ContractInstanceMutation) change contract addresses.
389 // Must run AFTER all mutations since some mutations modify contract_addresses.
390 std::unordered_set<AztecAddress> valid_addresses(tx_data.contract_addresses.begin(),
391 tx_data.contract_addresses.end());
392 for (auto& derived_address : tx_data.protocol_contracts.derived_addresses) {
393 if (!derived_address.is_zero() && !valid_addresses.contains(derived_address)) {
394 derived_address = AztecAddress(0);
395 }
396 }
397
398 // Ensure at least 1 app_logic enqueued call exists (mutations may have deleted all), the public base kernel circuit
399 // guarantees that there is at least 1 enqueued call in an public tx (so this is a valid assumption)
400 if (tx_data.tx.app_logic_enqueued_calls.empty() && !contract_addresses.empty()) {
401 auto idx = std::uniform_int_distribution<size_t>(0, contract_addresses.size() - 1)(rng);
402 std::vector<FF> calldata = {};
403 auto calldata_hash = compute_calldata_hash(calldata);
404 tx_data.tx.app_logic_enqueued_calls.push_back(
406 .contract_address = contract_addresses[idx],
407 .is_static_call = false,
408 .calldata_hash = calldata_hash },
409 .calldata = calldata });
410 }
411
412 // Ensure global gas_fees <= max_fees_per_gas (required for compute_effective_gas_fees)
413 // This must run after ANY mutation since TxMutation can reduce max_fees_per_gas
414 tx_data.global_variables.gas_fees.fee_per_da_gas = std::min(
416 tx_data.global_variables.gas_fees.fee_per_l2_gas = std::min(
418
419 // Compute effective gas fees matching TS computeEffectiveGasFees
420 // This must be done after any mutation that could affect gas settings or global variables
421 tx_data.tx.effective_gas_fees =
423
424 auto [mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size] = msgpack_encode_buffer(tx_data);
425 if (mutated_serialized_fuzzer_data_size > max_size) {
426 delete[] mutated_serialized_fuzzer_data;
427 return 0; // Can't fit mutated data in buffer, skip this mutation
428 }
429 memcpy(serialized_fuzzer_data, mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size);
430 delete[] mutated_serialized_fuzzer_data;
431
432 return mutated_serialized_fuzzer_data_size;
433}
434
436{
437 std::vector<std::pair<FF, uint64_t>> note_hash_leaf_index_pairs;
438 note_hash_leaf_index_pairs.reserve(tx_data.note_hashes.size() +
440
441 // For note hashes we assume we start from an empty tree. We could read size everytime but it'd slow things down.
442 // If you're having trouble with that check initialization on FuzzerWorldStateManager::initialize()
443 uint64_t leaf_offset = 0;
444
445 for (uint64_t i = 0; i < tx_data.note_hashes.size(); ++i) {
446 note_hash_leaf_index_pairs.push_back({ tx_data.note_hashes[i], leaf_offset + i });
447 }
448
449 uint64_t padding_leaves = MAX_NOTE_HASHES_PER_TX - (tx_data.note_hashes.size() % MAX_NOTE_HASHES_PER_TX);
450 leaf_offset += tx_data.note_hashes.size() + padding_leaves;
451
452 for (uint64_t i = 0; i < tx_data.tx.non_revertible_accumulated_data.note_hashes.size(); ++i) {
453 note_hash_leaf_index_pairs.push_back(
454 { tx_data.tx.non_revertible_accumulated_data.note_hashes[i], leaf_offset + i });
455 }
456
457 context.set_existing_note_hashes(note_hash_leaf_index_pairs);
458
459 context.set_existing_contract_addresses(tx_data.contract_addresses);
460}
#define BB_ASSERT(expression,...)
Definition assert.hpp:70
const uint32_t BLOCK_NUMBER
Definition constants.hpp:16
#define fuzz_info(...)
Definition constants.hpp:51
const AztecAddress FEE_RECIPIENT
Definition constants.hpp:20
const Gas GAS_LIMIT
Definition constants.hpp:40
const FF TRANSACTION_FEE
Definition constants.hpp:38
const EthAddress COINBASE
Definition constants.hpp:19
const FF MSG_SENDER
Definition constants.hpp:33
const FF SLOT_NUMBER
Definition constants.hpp:17
const FF CHAIN_ID
Definition constants.hpp:14
constexpr uint128_t FEE_PER_DA_GAS
Definition constants.hpp:21
const bool IS_STATIC_CALL
Definition constants.hpp:39
constexpr uint128_t FEE_PER_L2_GAS
Definition constants.hpp:22
FF generate_random_field(std::mt19937_64 &rng)
Definition field.cpp:25
StrictMock< MockContractDB > contract_db
uses barretenberg/vm2 to simulate the bytecode
Definition simulator.hpp:44
T select(std::mt19937_64 &rng) const
bool check_circuit(const ProvingInputs &inputs)
Definition avm_api.cpp:36
bool verify(const AvmProof &proof, const PublicInputs &pi)
Definition avm_api.cpp:66
AvmProof prove(const ProvingInputs &inputs)
Definition avm_api.cpp:13
TxSimulationResult simulate_for_hint_collection(simulation::ContractDBInterface &raw_contract_db, const world_state::WorldStateRevision &world_state_revision, world_state::WorldState &ws, const PublicSimulatorConfig &config, const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts, simulation::CancellationTokenPtr cancellation_token=nullptr)
TxSimulationResult simulate_fast_with_hinted_dbs(const ExecutionHints &hints, const PublicSimulatorConfig &config)
TxSimulationResult simulate_fast_with_existing_ws(simulation::ContractDBInterface &raw_contract_db, const world_state::WorldStateRevision &world_state_revision, world_state::WorldState &ws, const PublicSimulatorConfig &config, const Tx &tx, const GlobalVariables &global_variables, const ProtocolContracts &protocol_contracts, simulation::CancellationTokenPtr cancellation_token=nullptr)
simulation::EventsContainer simulate_for_witgen(const ExecutionHints &hints)
void fill_trace_columns(tracegen::TraceContainer &trace, simulation::EventsContainer &&events, const PublicInputs &public_inputs)
static Stats & get()
Definition stats.cpp:10
void reset()
Definition stats.cpp:16
world_state::WorldState & get_world_state()
Definition dbs.hpp:96
void register_contract_address(const AztecAddress &contract_address)
Definition dbs.cpp:225
void append_note_hashes(const std::vector< FF > &note_hashes)
Definition dbs.cpp:254
void write_fee_payer_balance(const AztecAddress &fee_payer, const FF &balance)
Definition dbs.cpp:234
world_state::WorldStateRevision get_current_revision() const
Definition dbs.cpp:206
void public_data_write(const bb::crypto::merkle_tree::PublicDataLeafValue &public_data)
Definition dbs.cpp:248
static constexpr element one
Definition group.hpp:48
Holds the Merkle trees responsible for storing the state of the Aztec protocol.
#define vinfo(...)
Definition log.hpp:94
constexpr Uint64MutationConfig BASIC_UINT64_T_MUTATION_CONFIGURATION
TestTraceContainer trace
std::vector< uint8_t > bytecode
FuzzerWorldStateManager * ws_mgr
Definition fuzz.test.cpp:15
bool compare_cpp_simulator_results(const std::vector< TxSimulationResult > &results)
SimulatorResult fuzz_tx(FuzzerWorldStateManager &ws_mgr, FuzzerContractDB &contract_db, FuzzerTxData &tx_data)
Run the C++ simulator on a full transaction containing multiple enqueued calls.
void populate_context_from_tx_data(FuzzerContext &context, const FuzzerTxData &tx_data)
size_t LLVMFuzzerMutate(uint8_t *Data, size_t Size, size_t MaxSize)
TxSimulationResult fuzz_prover(FuzzerWorldStateManager &ws_mgr, FuzzerContractDB &contract_db, FuzzerTxData &tx_data)
Run the prover fuzzer: fast simulation, hint collection, comparison, and check_circuit.
ContractArtifacts build_bytecode_and_artifacts(FuzzerData &fuzzer_data)
void setup_fuzzer_state(FuzzerWorldStateManager &ws_mgr, FuzzerContractDB &contract_db, const FuzzerTxData &tx_data)
size_t mutate_tx_data(FuzzerContext &context, uint8_t *serialized_fuzzer_data, size_t serialized_fuzzer_data_size, size_t max_size, unsigned int seed)
FuzzerTxData create_default_tx_data(std::mt19937_64 &rng, FuzzerContext &context)
void fund_fee_payer(FuzzerWorldStateManager &ws_mgr, const Tx &tx)
FuzzerTxDataMutationType
std::tuple< Bytecode, ContractClassWithCommitment, ContractInstance > ContractArtifacts
constexpr FuzzerTxDataMutationConfig FUZZER_TX_DATA_MUTATION_CONFIGURATION
std::pair< uint8_t *, size_t > msgpack_encode_buffer(auto &&obj, uint8_t *scratch_buf=nullptr, size_t scratch_size=0)
void mutate_tx(Tx &tx, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
Definition tx_data.cpp:62
void mutate_contract_instances(std::vector< ContractInstance > &contract_instances, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
Definition bytecode.cpp:176
void mutate_protocol_contracts(ProtocolContracts &protocol_contracts, Tx &tx, const std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
void mutate_contract_classes(std::vector< ContractClassWithCommitment > &contract_classes, std::vector< ContractInstance > &contract_instances, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
Definition bytecode.cpp:116
FuzzerData generate_fuzzer_data(std::mt19937_64 &rng, const FuzzerContext &context)
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 mutate_bytecode(std::vector< ContractClassWithCommitment > &contract_classes, std::vector< ContractInstance > &contract_instances, const std::vector< AztecAddress > &contract_addresses, std::vector< bb::crypto::merkle_tree::PublicDataLeafValue > &public_data_writes, std::mt19937_64 &rng)
Definition bytecode.cpp:43
void mutate_gas_fees(GasFees &fees, std::mt19937_64 &rng)
Definition gas.cpp:66
GasFees compute_effective_gas_fees(const GasFees &gas_fees, const GasSettings &gas_settings)
Definition gas.cpp:121
AVM range check gadget for witness generation.
FF compute_public_bytecode_commitment(std::span< const uint8_t > bytecode)
FF compute_contract_class_id(const FF &artifact_hash, const FF &private_fn_root, const FF &public_bytecode_commitment)
FF compute_calldata_hash(std::span< const FF > calldata)
FF compute_contract_address(const ContractInstance &contract_instance)
AvmFlavorSettings::FF FF
Definition field.hpp:10
void write(B &buf, field2< base_field, Params > const &value)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
Tx create_default_tx(const AztecAddress &contract_address, const AztecAddress &sender_address, const std::vector< FF > &calldata, const FF &transaction_fee, bool is_static_call, const Gas &gas_limit)
Definition simulator.cpp:96
#define AVM_TRACK_TIME_V(key, body)
Definition stats.hpp:20
describes the data which will be used for fuzzing Should contain instructions, calldata,...
ReturnOptions return_options
std::vector< CFGInstruction > cfg_instructions
std::vector< InstructionBlock > instruction_blocks
std::vector< AztecAddress > contract_addresses
ProtocolContracts protocol_contracts
std::vector< FF > note_hashes
std::vector< FuzzerData > input_programs
std::vector< ContractInstance > contract_instances
std::vector< ContractClassWithCommitment > contract_classes
GlobalVariables global_variables
std::vector< bb::crypto::merkle_tree::PublicDataLeafValue > public_data_writes
std::vector< FF > note_hashes
Definition avm_io.hpp:321
PublicInputs public_inputs
Definition avm_io.hpp:421
ContractClassId current_contract_class_id
ContractClassId original_contract_class_id
uint128_t fee_per_l2_gas
uint128_t fee_per_da_gas
std::array< AztecAddress, MAX_PROTOCOL_CONTRACTS > derived_addresses
GasFees effective_gas_fees
Definition avm_io.hpp:335
std::vector< PublicCallRequestWithCalldata > setup_enqueued_calls
Definition avm_io.hpp:340
std::vector< PublicCallRequestWithCalldata > app_logic_enqueued_calls
Definition avm_io.hpp:341
AccumulatedData non_revertible_accumulated_data
Definition avm_io.hpp:338
GasSettings gas_settings
Definition avm_io.hpp:334
std::optional< ExecutionHints > hints
Definition avm_io.hpp:561
std::optional< PublicInputs > public_inputs
Definition avm_io.hpp:560
void mutate_uint64_t(uint64_t &value, std::mt19937_64 &rng, const Uint64MutationConfig &config)
Definition uint64_t.cpp:4
VectorField result