5#include <unordered_set>
34 contract_db.add_contract_class(contract_class.id, contract_class);
41 if (seen_addresses.insert(addr).second) {
42 fuzz_info(
"Registering contract address in world state: ", addr);
51 FF fee_required_da =
FF(
tx.gas_settings.gas_limits.da_gas) *
FF(
tx.gas_settings.max_fees_per_gas.fee_per_da_gas);
52 FF fee_required_l2 =
FF(
tx.gas_settings.gas_limits.l2_gas) *
FF(
tx.gas_settings.max_fees_per_gas.fee_per_l2_gas);
73 }
catch (
const std::exception& e) {
74 fuzz_info(
"CppSimulator threw an exception: ", e.what());
79 .revert_reason = e.what(),
91 throw std::runtime_error(
"Simulator results are different");
93 fuzz_info(
"Simulator results match successfully");
118 .collect_call_metadata =
true,
119 .collect_public_inputs =
true,
124 .collect_call_metadata =
true,
125 .collect_hints =
true,
126 .collect_public_inputs =
true,
135 "fuzzer/simulate_fast",
139 }
catch (
const std::exception& e) {
141 fuzz_info(
"simulate_fast_with_existing_ws threw an exception: ", e.what());
148 "fuzzer/simulate_hints",
156 .hints = hint_result.
hints.value(),
166 "Simulation results do not match between simulate_fast, simulate_for_hint_collection, "
167 "and simulate_fast_with_hinted_dbs");
173 bool check_circuit_result = avm_api.
check_circuit(proving_inputs);
175 "check_circuit returned false in fuzzer with no exception, this indicates a failure");
179 vinfo(
"Running simulate_for_witgen in coverage build (skipping check_circuit)");
194 .global_variables = { .chain_id =
CHAIN_ID,
203 .protocol_contracts = {},
228 .private_functions_root = 0,
234 .current_contract_class_id =
class_id,
235 .original_contract_class_id =
class_id,
237 .nullifier_key = { 0, 0 },
239 .outgoing_viewing_key = { 0, 0 },
240 .tagging_key = { 0, 0 },
243 return {
bytecode, contract_class, contract_instance };
247 uint8_t* serialized_fuzzer_data,
248 size_t serialized_fuzzer_data_size,
255 msgpack::unpack((
reinterpret_cast<const char*
>(serialized_fuzzer_data)), serialized_fuzzer_data_size)
258 }
catch (
const std::exception&) {
259 fuzz_info(
"Failed to deserialize input in CustomMutator, creating default FuzzerTxData");
265 for (uint8_t i = 0; i < num_mutations; i++) {
273 std::vector<AztecAddress> contract_addresses;
290 if (!contract_addresses.empty()) {
292 call.request.contract_address = contract_addresses[idx_dist(rng)];
295 call.request.contract_address = contract_addresses[idx_dist(rng)];
303 switch (mutation_choice) {
331 .contract_address = contract_addresses[idx],
332 .is_static_call =
false,
333 .calldata_hash = calldata_hash },
336 auto [mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size] =
msgpack_encode_buffer(tx_data);
337 if (mutated_serialized_fuzzer_data_size > max_size) {
338 delete[] mutated_serialized_fuzzer_data;
341 memcpy(serialized_fuzzer_data, mutated_serialized_fuzzer_data, mutated_serialized_fuzzer_data_size);
342 delete[] mutated_serialized_fuzzer_data;
344 return mutated_serialized_fuzzer_data_size;
#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
std::shared_ptr< Napi::ThreadSafeFunction > bytecode
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...
static JsSimulator * getInstance()
SimulatorResult simulate(fuzzer::FuzzerWorldStateManager &ws_mgr, fuzzer::FuzzerContractDB &contract_db, const Tx &tx) override
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)
world_state::WorldState & get_world_state()
void register_contract_address(const AztecAddress &contract_address)
void write_fee_payer_balance(const AztecAddress &fee_payer, const FF &balance)
world_state::WorldStateRevision get_current_revision() const
static constexpr element one
Holds the Merkle trees responsible for storing the state of the Aztec protocol.
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.
FuzzerTxData create_default_tx_data(std::mt19937_64 &rng, const FuzzerContext &context)
int 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)
void fund_fee_payer(FuzzerWorldStateManager &ws_mgr, const Tx &tx)
std::tuple< Bytecode, ContractClass, ContractInstance > ContractArtifacts
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)
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)
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)
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< std::vector< FuzzInstruction > > instruction_blocks
std::vector< AztecAddress > contract_addresses
std::vector< ContractClass > contract_classes
std::vector< FuzzerData > input_programs
std::vector< ContractInstance > contract_instances
GlobalVariables global_variables
PublicCallRequest request
bool skip_fee_enforcement
std::vector< PublicCallRequestWithCalldata > setup_enqueued_calls
std::vector< PublicCallRequestWithCalldata > app_logic_enqueued_calls
std::optional< ExecutionHints > hints
std::optional< PublicInputs > public_inputs