Barretenberg
The ZK-SNARK library at the core of Aztec
Loading...
Searching...
No Matches
protocol_contracts.cpp
Go to the documentation of this file.
2
5
6namespace bb::avm2::fuzzer {
7
8namespace {
9
10void update_enqueued_calls_for_protocol_contract(Tx& tx,
11 const AztecAddress& prev_address,
12 const AztecAddress& new_address)
13{
14 // Update setup_enqueued_calls
15 for (auto& call : tx.setup_enqueued_calls) {
16 if (call.request.contract_address == prev_address) {
17 call.request.contract_address = new_address;
18 }
19 }
20 // Update app_logic_enqueued_calls
21 for (auto& call : tx.app_logic_enqueued_calls) {
22 if (call.request.contract_address == prev_address) {
23 call.request.contract_address = new_address;
24 }
25 }
26 // Update teardown_enqueued_call
27 if (tx.teardown_enqueued_call.has_value() && tx.teardown_enqueued_call->request.contract_address == prev_address) {
28 tx.teardown_enqueued_call->request.contract_address = new_address;
29 }
30}
31
32} // namespace
33
35 Tx& tx,
36 const std::vector<AztecAddress>& contract_addresses,
37 std::mt19937_64& rng)
38{
39 if (contract_addresses.empty()) {
40 return;
41 }
42
44 switch (choice) {
46 // Pick a random index and add a protocol contract
47 auto protocol_contract_index = std::uniform_int_distribution<size_t>(0, MAX_PROTOCOL_CONTRACTS - 1)(rng);
48 auto contract_address_index = std::uniform_int_distribution<size_t>(0, contract_addresses.size() - 1)(rng);
49
50 AztecAddress derived_address = contract_addresses[contract_address_index];
51 protocol_contracts.derived_addresses[protocol_contract_index] = derived_address;
52
53 // The index of the protocol contracts array maps to canonical address.
54 // Add 1 because canonical addresses are 1-indexed
55 AztecAddress canonical_address(static_cast<uint256_t>(protocol_contract_index + 1));
56
57 // todo(ilyas): there should be a more efficient way to do this
58 // Update any enqueued calls that reference the derived address to now use the canonical address
59 update_enqueued_calls_for_protocol_contract(
60 tx, /*prev_address=*/derived_address, /*new_address=*/canonical_address);
61 break;
62 }
64 // Pick an index, and zero it out, removing the protocol contract. It may already be zero but the fuzzer should
65 // figure out better mutations
67 AztecAddress canonical_address(static_cast<uint256_t>(idx + 1));
68 AztecAddress derived_address = protocol_contracts.derived_addresses[idx];
69 // Update any enqueued calls that reference the canonical address to use the derived address
70 update_enqueued_calls_for_protocol_contract(
71 tx, /*prev_address=*/canonical_address, /*new_address=*/derived_address);
72 // Set the derived address to zero
73 protocol_contracts.derived_addresses[idx] = AztecAddress(0);
74 break;
75 }
76 }
77}
78
79} // namespace bb::avm2::fuzzer
#define MAX_PROTOCOL_CONTRACTS
T select(std::mt19937_64 &rng) const
constexpr ProtocolContractsMutationConfig PROTOCOL_CONTRACTS_MUTATION_CONFIGURATION
void mutate_protocol_contracts(ProtocolContracts &protocol_contracts, Tx &tx, const std::vector< AztecAddress > &contract_addresses, std::mt19937_64 &rng)
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
Definition tuple.hpp:13
std::array< AztecAddress, MAX_PROTOCOL_CONTRACTS > derived_addresses