5#include <unordered_set>
43 contract_db.add_contract_class(contract_class.id, contract_class);
58 if (!derived_address.is_zero()) {
62 auto maybe_instance =
contract_db.get_contract_instance(derived_address);
63 if (maybe_instance.has_value()) {
64 contract_db.add_contract_instance(canonical_address, maybe_instance.value());
85 FF fee_required_da =
FF(
tx.gas_settings.gas_limits.da_gas) *
FF(
tx.gas_settings.max_fees_per_gas.fee_per_da_gas);
86 FF fee_required_l2 =
FF(
tx.gas_settings.gas_limits.l2_gas) *
FF(
tx.gas_settings.max_fees_per_gas.fee_per_l2_gas);
105 cpp_result = cpp_simulator.simulate(
ws_mgr,
112 fuzz_info(
"CppSimulator completed without exception");
113 fuzz_info(
"CppSimulator result: ", cpp_result);
115 }
catch (
const std::exception& e) {
116 fuzz_info(
"CppSimulator threw an exception: ", e.what());
121 .revert_reason = e.what(),
139 throw std::runtime_error(
"Simulator results are different");
141 fuzz_info(
"Simulator results match successfully");
166 .collect_call_metadata =
true,
167 .collect_public_inputs =
true,
172 .collect_call_metadata =
true,
173 .collect_hints =
true,
174 .collect_public_inputs =
true,
183 "fuzzer/simulate_fast",
187 }
catch (
const std::exception& e) {
189 fuzz_info(
"simulate_fast_with_existing_ws threw an exception: ", e.what());
196 "fuzzer/simulate_hints",
204 .hints = hint_result.
hints.value(),
214 "Simulation results do not match between simulate_fast, simulate_for_hint_collection, "
215 "and simulate_fast_with_hinted_dbs");
221 bool check_circuit_result = avm_api.
check_circuit(proving_inputs);
223 "check_circuit returned false in fuzzer with no exception, this indicates a failure");
227 vinfo(
"Running simulate_for_witgen in coverage build (skipping check_circuit)");
243 .global_variables = { .chain_id =
CHAIN_ID,
252 .protocol_contracts = {},
287 .private_functions_root = 0,
289 .public_bytecode_commitment = bytecode_commitment,
294 .current_contract_class_id =
class_id,
295 .original_contract_class_id =
class_id,
297 .nullifier_key = { 0, 0 },
299 .outgoing_viewing_key = { 0, 0 },
300 .tagging_key = { 0, 0 },
303 return {
bytecode, contract_class, contract_instance };
307 uint8_t* serialized_fuzzer_data,
308 size_t serialized_fuzzer_data_size,
315 msgpack::unpack((
reinterpret_cast<const char*
>(serialized_fuzzer_data)), serialized_fuzzer_data_size)
318 }
catch (
const std::exception&) {
319 fuzz_info(
"Failed to deserialize input in CustomMutator, creating default FuzzerTxData");
330 std::vector<AztecAddress> contract_addresses;
354 if (!contract_addresses.empty()) {
357 call.request.contract_address = contract_addresses[idx_dist(rng)];
360 call.request.contract_address = contract_addresses[idx_dist(rng)];
367 switch (mutation_choice) {
404 if (!derived_address.is_zero() && !valid_addresses.contains(derived_address)) {
417 .contract_address = contract_addresses[idx],
418 .is_static_call =
false,
419 .calldata_hash = calldata_hash },
435 auto [mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size] =
msgpack_encode_buffer(tx_data);
436 if (mutated_serialized_fuzzer_data_size > max_size) {
437 delete[] mutated_serialized_fuzzer_data;
440 memcpy(serialized_fuzzer_data, mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size);
441 delete[] mutated_serialized_fuzzer_data;
443 return mutated_serialized_fuzzer_data_size;
449 note_hash_leaf_index_pairs.reserve(tx_data.
note_hashes.size() +
454 uint64_t leaf_offset = 0;
456 for (uint64_t i = 0; i < tx_data.
note_hashes.size(); ++i) {
457 note_hash_leaf_index_pairs.push_back({ tx_data.
note_hashes[i], leaf_offset + i });
461 leaf_offset += tx_data.
note_hashes.size() + padding_leaves;
464 note_hash_leaf_index_pairs.push_back(
468 context.set_existing_note_hashes(note_hash_leaf_index_pairs);
#define BB_ASSERT(expression,...)
const uint32_t BLOCK_NUMBER
const AztecAddress FEE_RECIPIENT
const EthAddress COINBASE
constexpr uint128_t FEE_PER_DA_GAS
const bool IS_STATIC_CALL
constexpr uint128_t FEE_PER_L2_GAS
FF generate_random_field(std::mt19937_64 &rng)
std::shared_ptr< Napi::ThreadSafeFunction > bytecode
#define MAX_NOTE_HASHES_PER_TX
StrictMock< MockContractDB > contract_db
uses barretenberg/vm2 to simulate the bytecode
uses the yarn-project/simulator to simulate the bytecode Singleton, because initializing the simulato...
SimulatorResult simulate(fuzzer::FuzzerWorldStateManager &ws_mgr, fuzzer::FuzzerContractDB &contract_db, const Tx &tx, const GlobalVariables &globals, const std::vector< bb::crypto::merkle_tree::PublicDataLeafValue > &public_data_writes, const std::vector< FF > ¬e_hashes, const ProtocolContracts &protocol_contracts) override
static JsSimulator * getInstance()
T select(std::mt19937_64 &rng) const
bool check_circuit(const ProvingInputs &inputs)
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)
world_state::WorldState & get_world_state()
void register_contract_address(const AztecAddress &contract_address)
void append_note_hashes(const std::vector< FF > ¬e_hashes)
void write_fee_payer_balance(const AztecAddress &fee_payer, const FF &balance)
world_state::WorldStateRevision get_current_revision() const
void public_data_write(const bb::crypto::merkle_tree::PublicDataLeafValue &public_data)
static constexpr element one
Holds the Merkle trees responsible for storing the state of the Aztec protocol.
constexpr Uint64MutationConfig BASIC_UINT64_T_MUTATION_CONFIGURATION
AztecAddress contract_address
FuzzerWorldStateManager * ws_mgr
bool compare_cpp_simulator_results(const std::vector< TxSimulationResult > &results)
SimulatorResult fuzz_tx(FuzzerWorldStateManager &ws_mgr, FuzzerContractDB &contract_db, FuzzerTxData &tx_data)
Fuzz CPP vs JS simulator with 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)
@ ContractInstanceMutation
@ ProtocolContractsMutation
@ GlobalVariablesMutation
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)
void mutate_contract_instances(std::vector< ContractInstance > &contract_instances, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
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)
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)
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)
void mutate_gas_fees(GasFees &fees, std::mt19937_64 &rng)
GasFees compute_effective_gas_fees(const GasFees &gas_fees, const GasSettings &gas_settings)
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)
void write(B &buf, field2< base_field, Params > const &value)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bool compare_simulator_results(SimulatorResult &result1, SimulatorResult &result2)
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)
#define AVM_TRACK_TIME_V(key, body)
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
std::array< AztecAddress, MAX_PROTOCOL_CONTRACTS > derived_addresses
PublicCallRequest request
bool skip_fee_enforcement
GasFees effective_gas_fees
std::vector< PublicCallRequestWithCalldata > setup_enqueued_calls
std::vector< PublicCallRequestWithCalldata > app_logic_enqueued_calls
AccumulatedData non_revertible_accumulated_data
std::optional< ExecutionHints > hints
std::optional< PublicInputs > public_inputs
void mutate_uint64_t(uint64_t &value, std::mt19937_64 &rng, const Uint64MutationConfig &config)