Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
fuzzer_lib.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <random>
5#include <tuple>
6#include <vector>
7
15
16// A transaction with multiple enqueued calls and tx-level parameters
17// Almost identical to the fast simulation input
19 // Enqueued calls data
20 std::vector<FuzzerData> input_programs;
21 // These are the contract classes and instances that will be registered to addresses in the WS
22 // The contract addresses may contain duplicates if multiple contracts derive to the same address
25 std::vector<AztecAddress> contract_addresses;
26
27 Tx tx; // This tx has placeholders for enqueued calls, they will be filled in during fuzzing
30
35 tx,
38};
39
40inline std::ostream& operator<<(std::ostream& os, const FuzzerTxData& data)
41{
42 os << "FuzzerTxData { "
43 << "\n tx: " << data.tx << ","
44 << "\n global_variables: " << data.global_variables << ","
45 << "\n protocol_contracts: " << data.protocol_contracts << "\n}";
46 return os;
47}
48
49using Bytecode = std::vector<uint8_t>;
52
53// Mutation configuration
54enum class TxDataMutationType : uint8_t {
56 // todo: implement other mutation types
57 // BytecodeMutation,
58 // ContractClassMutation,
59 // ContractInstanceMutation,
60 // GlobalVariablesMutation,
61 // ProtocolContractsMutation
62};
63
64// Build bytecode and contract artifacts from fuzzer data
66
67// Create a default FuzzerTxData with sensible defaults
70
71// Setup fuzzer state: register contracts and addresses in the world state
74 const FuzzerTxData& tx_data);
75
76// Fund the fee payer with enough balance for the transaction
78
79// Run the differential fuzzer comparing CPP vs JS simulator
82 FuzzerTxData& tx_data);
83
84// Run the prover fuzzer: fast simulation, hint collection, comparison, and check_circuit
85// Returns 0 on success, -1 if the input should be rejected
88 FuzzerTxData& tx_data);
89
90// Common custom mutator logic shared between fuzzers
91// Returns the new size of the mutated data, or 0 if mutation failed
93 uint8_t* serialized_fuzzer_data,
94 size_t serialized_fuzzer_data_size,
95 size_t max_size,
96 unsigned int seed);
97
StrictMock< MockContractDB > contract_db
const std::vector< MemoryValue > data
FuzzerWorldStateManager * ws_mgr
Definition fuzz.test.cpp:16
void setup_fuzzer_state(bb::avm2::fuzzer::FuzzerWorldStateManager &ws_mgr, bb::avm2::fuzzer::FuzzerContractDB &contract_db, const FuzzerTxData &tx_data)
void fund_fee_payer(bb::avm2::fuzzer::FuzzerWorldStateManager &ws_mgr, const Tx &tx)
FuzzerTxData create_default_tx_data(std::mt19937_64 &rng, const FuzzerContext &context)
SimulatorResult fuzz_tx(bb::avm2::fuzzer::FuzzerWorldStateManager &ws_mgr, bb::avm2::fuzzer::FuzzerContractDB &contract_db, FuzzerTxData &tx_data)
Fuzz CPP vs JS simulator with a full transaction containing multiple enqueued calls.
ContractArtifacts build_bytecode_and_artifacts(FuzzerData &fuzzer_data)
std::ostream & operator<<(std::ostream &os, const FuzzerTxData &data)
TxDataMutationType
std::tuple< Bytecode, ContractClass, ContractInstance > ContractArtifacts
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)
int fuzz_prover(bb::avm2::fuzzer::FuzzerWorldStateManager &ws_mgr, bb::avm2::fuzzer::FuzzerContractDB &contract_db, FuzzerTxData &tx_data)
Run the prover fuzzer: fast simulation, hint collection, comparison, and check_circuit.
std::vector< uint8_t > Bytecode
bool compare_cpp_simulator_results(const std::vector< TxSimulationResult > &results)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
describes the data which will be used for fuzzing Should contain instructions, calldata,...
std::vector< AztecAddress > contract_addresses
ProtocolContracts protocol_contracts
std::vector< ContractClass > contract_classes
std::vector< FuzzerData > input_programs
MSGPACK_FIELDS(input_programs, contract_classes, contract_instances, contract_addresses, tx, global_variables, protocol_contracts)
std::vector< ContractInstance > contract_instances
GlobalVariables global_variables