Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
public_call_request.cpp
Go to the documentation of this file.
2
10
12using bb::avm2::FF;
13
14namespace {
15
16void mutate_contract_address(AztecAddress& address, std::vector<AztecAddress>& contract_addresses, std::mt19937_64& rng)
17{
18 if (contract_addresses.empty()) {
20 }
21 // Most of the time we want to pick from the existing contract addresses, since a random address will fail early
22 auto contract_address_choice = std::uniform_int_distribution<size_t>(0, contract_addresses.size() - 1)(rng);
23 address = contract_addresses[contract_address_choice];
24
25 // 1 in 1000 chance for the contract address to be random
26 bool random_address = std::uniform_int_distribution<int>(0, 999)(rng) == 0;
27 if (random_address) {
28 fuzz_info("Mutating contract address to a random address");
30 }
31}
32
33void mutate_calldata(PublicCallRequestWithCalldata& request, std::mt19937_64& rng)
34{
35 mutate_calldata_vec(request.calldata, rng);
36 if (request.calldata.size() > fuzzer::MAX_CALLDATA_SIZE) {
37 request.calldata.resize(fuzzer::MAX_CALLDATA_SIZE);
38 }
39
41}
42
43} // namespace
44
45namespace bb::avm2::fuzzer {
46
48 std::vector<AztecAddress>& contract_addresses,
49 std::mt19937_64& rng)
50{
51 fuzz_info("Mutating public call request");
53
54 switch (choice) {
56 // Mutate contract_address
57 mutate_contract_address(request.request.contract_address, contract_addresses, rng);
58 break;
60 // Mutate msg_sender
62 break;
64 // Mutate is_static_call
66 break;
68 // Mutate calldata, this also updates the calldata_hash
69 mutate_calldata(request, rng);
70 break;
71 }
72}
73
74PublicCallRequestWithCalldata generate_public_call_request(std::vector<AztecAddress>& contract_addresses,
75 std::mt19937_64& rng)
76{
77 fuzz_info("Generating new public call request");
78 // Generate random calldata
80 std::vector<FF> calldata;
81 calldata.reserve(calldata_size);
82 for (size_t i = 0; i < calldata_size; ++i) {
83 calldata.push_back(generate_random_field(rng));
84 }
85
86 auto contract_address =
87 contract_addresses.empty()
89 : contract_addresses[std::uniform_int_distribution<size_t>(0, contract_addresses.size() - 1)(rng)];
90 fuzz_info("Using contract address: ", contract_address);
92
94 .request =
97 .contract_address = contract_address,
98 .is_static_call = (std::uniform_int_distribution<uint8_t>(0, 1)(rng) == 1),
99 .calldata_hash = calldata_hash,
100 },
101 .calldata = calldata,
102 };
103}
104
105} // namespace bb::avm2::fuzzer
#define fuzz_info(...)
Definition constants.hpp:51
FF generate_random_field(std::mt19937_64 &rng)
Definition field.cpp:23
void mutate_field(bb::avm2::FF &value, std::mt19937_64 &rng, const FieldMutationConfig &config)
Definition field.cpp:54
void mutate_calldata_vec(std::vector< bb::avm2::FF > &calldata, std::mt19937_64 &rng)
T select(std::mt19937_64 &rng) const
constexpr FieldMutationConfig BASIC_FIELD_MUTATION_CONFIGURATION
constexpr PublicCallRequestMutationConfig PUB_REQUEST_MUTATION_CONFIGURATION
constexpr uint16_t MAX_CALLDATA_SIZE
PublicCallRequestWithCalldata generate_public_call_request(std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
void mutate_public_call_request(PublicCallRequestWithCalldata &request, std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
FF compute_calldata_hash(std::span< const FF > calldata)
AvmFlavorSettings::FF FF
Definition field.hpp:10
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13