Skip to content

Commit 010bf28

Browse files
authored
feat(avm): mutate global gas fees and timestamp (#19500)
Very very simple mutations for globals
1 parent 23a44ad commit 010bf28

File tree

7 files changed

+33
-17
lines changed

7 files changed

+33
-17
lines changed

barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzz_lib/fuzz.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,16 +40,20 @@ SimulatorResult fuzz_against_ts_simulator(FuzzerData& fuzzer_data, FuzzerContext
4040
FF fee_required_l2 = FF(tx.effective_gas_fees.fee_per_l2_gas) * FF(tx.gas_settings.gas_limits.l2_gas);
4141
ws_mgr->write_fee_payer_balance(tx.fee_payer, fee_required_da + fee_required_l2);
4242

43+
auto globals = create_default_globals();
44+
4345
try {
4446
ws_mgr->checkpoint();
45-
cpp_result = cpp_simulator.simulate(*ws_mgr, contract_db, tx, /*public_data_writes=*/{}, /*note_hashes=*/{});
47+
cpp_result =
48+
cpp_simulator.simulate(*ws_mgr, contract_db, tx, globals, /*public_data_writes=*/{}, /*note_hashes=*/{});
4649
ws_mgr->revert();
4750
} catch (const std::exception& e) {
4851
throw std::runtime_error(std::string("CppSimulator threw an exception: ") + e.what());
4952
}
5053

5154
ws_mgr->checkpoint();
52-
auto js_result = js_simulator->simulate(*ws_mgr, contract_db, tx, /*public_data_writes=*/{}, /*note_hashes=*/{});
55+
auto js_result =
56+
js_simulator->simulate(*ws_mgr, contract_db, tx, globals, /*public_data_writes=*/{}, /*note_hashes=*/{});
5357

5458
context.reset();
5559

barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzz_lib/fuzz.test.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,8 +63,9 @@ class FuzzTest : public ::testing::Test {
6363
FF fee_required_l2 = FF(tx.effective_gas_fees.fee_per_l2_gas) * FF(tx.gas_settings.gas_limits.l2_gas);
6464
ws_mgr->write_fee_payer_balance(tx.fee_payer, fee_required_da + fee_required_l2);
6565
auto cpp_simulator = CppSimulator();
66+
auto globals = create_default_globals();
6667

67-
auto result = cpp_simulator.simulate(*ws_mgr, contract_db, tx, {}, {});
68+
auto result = cpp_simulator.simulate(*ws_mgr, contract_db, tx, globals, /*public_data_writes=*/{}, {});
6869

6970
ws_mgr->revert();
7071

barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzz_lib/simulator.cpp

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,7 @@ SimulatorResult CppSimulator::simulate(
8181
fuzzer::FuzzerWorldStateManager& ws_mgr,
8282
fuzzer::FuzzerContractDB& contract_db,
8383
const Tx& tx,
84+
const GlobalVariables& globals,
8485
[[maybe_unused]] const std::vector<bb::crypto::merkle_tree::PublicDataLeafValue>& public_data_writes,
8586
[[maybe_unused]] const std::vector<FF>& note_hashes)
8687
{
@@ -97,8 +98,6 @@ SimulatorResult CppSimulator::simulate(
9798

9899
ProtocolContracts protocol_contracts{};
99100

100-
auto globals = create_default_globals();
101-
102101
WorldState& ws = ws_mgr.get_world_state();
103102
WorldStateRevision ws_rev = ws_mgr.get_current_revision();
104103

@@ -156,11 +155,10 @@ SimulatorResult JsSimulator::simulate(
156155
[[maybe_unused]] fuzzer::FuzzerWorldStateManager& ws_mgr,
157156
fuzzer::FuzzerContractDB& contract_db,
158157
const Tx& tx,
158+
const GlobalVariables& globals,
159159
const std::vector<bb::crypto::merkle_tree::PublicDataLeafValue>& public_data_writes,
160160
const std::vector<FF>& note_hashes)
161161
{
162-
auto globals = create_default_globals();
163-
164162
std::string serialized = serialize_simulation_request(tx, globals, contract_db, public_data_writes, note_hashes);
165163

166164
// Send the request

barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzz_lib/simulator.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ class Simulator {
6161
fuzzer::FuzzerWorldStateManager& ws_mgr,
6262
fuzzer::FuzzerContractDB& contract_db,
6363
const Tx& tx,
64+
const GlobalVariables& globals,
6465
const std::vector<bb::crypto::merkle_tree::PublicDataLeafValue>& public_data_writes,
6566
const std::vector<FF>& note_hashes) = 0;
6667
};
@@ -71,6 +72,7 @@ class CppSimulator : public Simulator {
7172
SimulatorResult simulate(fuzzer::FuzzerWorldStateManager& ws_mgr,
7273
fuzzer::FuzzerContractDB& contract_db,
7374
const Tx& tx,
75+
const GlobalVariables& globals,
7476
const std::vector<bb::crypto::merkle_tree::PublicDataLeafValue>& public_data_writes,
7577
const std::vector<FF>& note_hashes) override;
7678
};
@@ -97,6 +99,7 @@ class JsSimulator : public Simulator {
9799
SimulatorResult simulate(fuzzer::FuzzerWorldStateManager& ws_mgr,
98100
fuzzer::FuzzerContractDB& contract_db,
99101
const Tx& tx,
102+
const GlobalVariables& globals,
100103
const std::vector<bb::crypto::merkle_tree::PublicDataLeafValue>& public_data_writes,
101104
const std::vector<FF>& note_hashes) override;
102105
};
@@ -111,5 +114,3 @@ Tx create_default_tx(const AztecAddress& contract_address,
111114
const Gas& gas_limit);
112115

113116
bool compare_simulator_results(SimulatorResult& result1, SimulatorResult& result2);
114-
115-
GlobalVariables create_default_globals();

barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzzer_lib.cpp

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
#include "barretenberg/avm_fuzzer/fuzz_lib/fuzz.hpp"
1313
#include "barretenberg/avm_fuzzer/fuzzer_comparison_helper.hpp"
1414
#include "barretenberg/avm_fuzzer/mutations/basic_types/field.hpp"
15+
#include "barretenberg/avm_fuzzer/mutations/basic_types/uint64_t.hpp"
16+
#include "barretenberg/avm_fuzzer/mutations/configuration.hpp"
1517
#include "barretenberg/avm_fuzzer/mutations/fuzzer_data.hpp"
1618
#include "barretenberg/avm_fuzzer/mutations/tx_data.hpp"
1719
#include "barretenberg/avm_fuzzer/mutations/tx_types/gas.hpp"
@@ -83,8 +85,8 @@ SimulatorResult fuzz_tx(FuzzerWorldStateManager& ws_mgr, FuzzerContractDB& contr
8385

8486
try {
8587
ws_mgr.checkpoint();
86-
cpp_result =
87-
cpp_simulator.simulate(ws_mgr, contract_db, tx_data.tx, tx_data.public_data_writes, tx_data.note_hashes);
88+
cpp_result = cpp_simulator.simulate(
89+
ws_mgr, contract_db, tx_data.tx, tx_data.global_variables, tx_data.public_data_writes, tx_data.note_hashes);
8890
fuzz_info("CppSimulator completed without exception");
8991
fuzz_info("CppSimulator result: ", cpp_result);
9092
ws_mgr.revert();
@@ -100,8 +102,8 @@ SimulatorResult fuzz_tx(FuzzerWorldStateManager& ws_mgr, FuzzerContractDB& contr
100102
}
101103

102104
ws_mgr.checkpoint();
103-
auto js_result =
104-
js_simulator->simulate(ws_mgr, contract_db, tx_data.tx, tx_data.public_data_writes, tx_data.note_hashes);
105+
auto js_result = js_simulator->simulate(
106+
ws_mgr, contract_db, tx_data.tx, tx_data.global_variables, tx_data.public_data_writes, tx_data.note_hashes);
105107

106108
// If the results do not match
107109
if (!compare_simulator_results(cpp_result, js_result)) {
@@ -363,8 +365,16 @@ size_t mutate_tx_data(FuzzerContext& context,
363365
case FuzzerTxDataMutationType::ContractInstanceMutation:
364366
mutate_contract_instances(tx_data.contract_instances, tx_data.contract_addresses, rng);
365367
break;
366-
// case TxDataMutationType::GlobalVariablesMutation:
367-
// break;
368+
case FuzzerTxDataMutationType::GlobalVariablesMutation:
369+
// This is just mutating the gas values and timestamp
370+
mutate_uint64_t(tx_data.global_variables.timestamp, rng, BASIC_UINT64_T_MUTATION_CONFIGURATION);
371+
mutate_gas_fees(tx_data.global_variables.gas_fees, rng);
372+
// This must be less than or equal to the tx max fees per gas
373+
tx_data.global_variables.gas_fees.fee_per_da_gas = std::min(
374+
tx_data.global_variables.gas_fees.fee_per_da_gas, tx_data.tx.gas_settings.max_fees_per_gas.fee_per_da_gas);
375+
tx_data.global_variables.gas_fees.fee_per_l2_gas = std::min(
376+
tx_data.global_variables.gas_fees.fee_per_l2_gas, tx_data.tx.gas_settings.max_fees_per_gas.fee_per_l2_gas);
377+
break;
368378
// case TxDataMutationType::ProtocolContractsMutation:
369379
// break;
370380
}

barretenberg/cpp/src/barretenberg/avm_fuzzer/fuzzer_lib.hpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,17 +65,18 @@ enum class FuzzerTxDataMutationType : uint8_t {
6565
BytecodeMutation,
6666
ContractClassMutation,
6767
ContractInstanceMutation,
68-
// GlobalVariablesMutation,
68+
GlobalVariablesMutation,
6969
// ProtocolContractsMutation
7070
};
7171

72-
using FuzzerTxDataMutationConfig = WeightedSelectionConfig<FuzzerTxDataMutationType, 4>;
72+
using FuzzerTxDataMutationConfig = WeightedSelectionConfig<FuzzerTxDataMutationType, 5>;
7373

7474
constexpr FuzzerTxDataMutationConfig FUZZER_TX_DATA_MUTATION_CONFIGURATION = FuzzerTxDataMutationConfig({
7575
{ FuzzerTxDataMutationType::TxMutation, 10 },
7676
{ FuzzerTxDataMutationType::BytecodeMutation, 1 },
7777
{ FuzzerTxDataMutationType::ContractClassMutation, 1 },
7878
{ FuzzerTxDataMutationType::ContractInstanceMutation, 1 },
79+
{ FuzzerTxDataMutationType::GlobalVariablesMutation, 4 },
7980
});
8081

8182
// Build bytecode and contract artifacts from fuzzer data

barretenberg/cpp/src/barretenberg/avm_fuzzer/mutations/bytecode.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ void mutate_bytecode(std::vector<ContractClassWithCommitment>& contract_classes,
9898
FF delayed_public_mutable_slot = Poseidon2::hash({ FF(UPDATED_CLASS_IDS_SLOT), address });
9999

100100
// Build preimage
101+
// todo(ilyas): make this somewhat random but also take into account the mutation on global variables.timestamp
101102
FF metadata = 0; // The lower 32 bits are the timestamp_of_change, we set to 0 so it has "taken effect"
102103
FF hash = Poseidon2::hash({ metadata, original_class_id, new_class_id });
103104

0 commit comments

Comments
 (0)