@aztec/simulator 0.0.1-commit.24de95ac → 0.0.1-commit.2606882
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -4
- package/dest/client.d.ts +1 -1
- package/dest/common/errors.d.ts +2 -2
- package/dest/common/errors.d.ts.map +1 -1
- package/dest/common/index.d.ts +1 -1
- package/dest/common/stats/index.d.ts +1 -1
- package/dest/common/stats/stats.d.ts +1 -1
- package/dest/private/acvm/acvm.d.ts +4 -2
- package/dest/private/acvm/acvm.d.ts.map +1 -1
- package/dest/private/acvm/acvm.js +4 -3
- package/dest/private/acvm/acvm_types.d.ts +1 -1
- package/dest/private/acvm/deserialize.d.ts +2 -2
- package/dest/private/acvm/deserialize.d.ts.map +1 -1
- package/dest/private/acvm/deserialize.js +1 -1
- package/dest/private/acvm/index.d.ts +1 -1
- package/dest/private/acvm/serialize.d.ts +2 -2
- package/dest/private/acvm/serialize.d.ts.map +1 -1
- package/dest/private/acvm/serialize.js +1 -1
- package/dest/private/acvm_native.d.ts +5 -3
- package/dest/private/acvm_native.d.ts.map +1 -1
- package/dest/private/acvm_native.js +8 -6
- package/dest/private/acvm_wasm.d.ts +4 -3
- package/dest/private/acvm_wasm.d.ts.map +1 -1
- package/dest/private/acvm_wasm.js +7 -5
- package/dest/private/acvm_wasm_with_blobs.d.ts +1 -1
- package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -1
- package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
- package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/circuit_recorder.js +23 -20
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
- package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
- package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
- package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +1 -1
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -1
- package/dest/private/circuit_simulator.d.ts +1 -1
- package/dest/private/factory.d.ts +3 -3
- package/dest/private/factory.d.ts.map +1 -1
- package/dest/private/factory.js +7 -4
- package/dest/public/avm/avm_context.d.ts +3 -3
- package/dest/public/avm/avm_context.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.d.ts +6 -6
- package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.js +3 -3
- package/dest/public/avm/avm_execution_environment.d.ts +9 -8
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/public/avm/avm_execution_environment.js +5 -8
- package/dest/public/avm/avm_gas.d.ts +2 -2
- package/dest/public/avm/avm_gas.d.ts.map +1 -1
- package/dest/public/avm/avm_gas.js +3 -3
- package/dest/public/avm/avm_machine_state.d.ts +7 -6
- package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/public/avm/avm_machine_state.js +3 -2
- package/dest/public/avm/avm_memory_types.d.ts +14 -14
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/public/avm/avm_memory_types.js +4 -1
- package/dest/public/avm/avm_simulator.d.ts +5 -3
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +14 -12
- package/dest/public/avm/avm_simulator_interface.d.ts +1 -1
- package/dest/public/avm/calldata.d.ts +51 -0
- package/dest/public/avm/calldata.d.ts.map +1 -0
- package/dest/public/avm/calldata.js +64 -0
- package/dest/public/avm/errors.d.ts +8 -2
- package/dest/public/avm/errors.d.ts.map +1 -1
- package/dest/public/avm/errors.js +14 -2
- package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
- package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
- package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.js +15 -5
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +3 -2
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +18 -3
- package/dest/public/avm/fixtures/initializers.d.ts +2 -3
- package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
- package/dest/public/avm/fixtures/initializers.js +8 -5
- package/dest/public/avm/fixtures/utils.d.ts +4 -3
- package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
- package/dest/public/avm/fixtures/utils.js +6 -2
- package/dest/public/avm/index.d.ts +1 -1
- package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +42 -43
- package/dest/public/avm/opcodes/addressing_mode.d.ts +1 -1
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/public/avm/opcodes/addressing_mode.js +2 -2
- package/dest/public/avm/opcodes/arithmetic.d.ts +3 -1
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/public/avm/opcodes/arithmetic.js +12 -2
- package/dest/public/avm/opcodes/bitwise.d.ts +3 -3
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/public/avm/opcodes/bitwise.js +5 -5
- package/dest/public/avm/opcodes/comparators.d.ts +1 -1
- package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/public/avm/opcodes/comparators.js +1 -1
- package/dest/public/avm/opcodes/contract.d.ts +5 -4
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +13 -9
- package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/public/avm/opcodes/control_flow.js +4 -4
- package/dest/public/avm/opcodes/conversion.d.ts +3 -3
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +4 -4
- package/dest/public/avm/opcodes/ec_add.d.ts +3 -5
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +24 -29
- package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/public/avm/opcodes/environment_getters.js +6 -6
- package/dest/public/avm/opcodes/external_calls.d.ts +9 -9
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +23 -22
- package/dest/public/avm/opcodes/hashing.d.ts +7 -7
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/public/avm/opcodes/hashing.js +21 -16
- package/dest/public/avm/opcodes/index.d.ts +1 -1
- package/dest/public/avm/opcodes/instruction.d.ts +2 -2
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
- package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction_impl.js +4 -4
- package/dest/public/avm/opcodes/memory.d.ts +13 -13
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.js +26 -26
- package/dest/public/avm/opcodes/misc.d.ts +3 -3
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/public/avm/opcodes/misc.js +8 -8
- package/dest/public/avm/opcodes/storage.d.ts +14 -13
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/public/avm/opcodes/storage.js +34 -24
- package/dest/public/avm/revert_reason.d.ts +2 -2
- package/dest/public/avm/revert_reason.d.ts.map +1 -1
- package/dest/public/avm/revert_reason.js +3 -2
- package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -1
- package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.d.ts +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.js +12 -9
- package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/instruction_serialization.js +2 -2
- package/dest/public/avm/test_utils.d.ts +2 -2
- package/dest/public/avm/test_utils.d.ts.map +1 -1
- package/dest/public/avm/test_utils.js +1 -1
- package/dest/public/contracts_db_checkpoint.d.ts +16 -0
- package/dest/public/contracts_db_checkpoint.d.ts.map +1 -0
- package/dest/public/contracts_db_checkpoint.js +30 -0
- package/dest/public/db_interfaces.d.ts +14 -2
- package/dest/public/db_interfaces.d.ts.map +1 -1
- package/dest/public/debug_fn_name.d.ts +16 -3
- package/dest/public/debug_fn_name.d.ts.map +1 -1
- package/dest/public/debug_fn_name.js +31 -3
- package/dest/public/executor_metrics.d.ts +3 -2
- package/dest/public/executor_metrics.d.ts.map +1 -1
- package/dest/public/executor_metrics.js +13 -34
- package/dest/public/executor_metrics_interface.d.ts +3 -2
- package/dest/public/executor_metrics_interface.d.ts.map +1 -1
- package/dest/public/fixtures/amm_test.d.ts +1 -1
- package/dest/public/fixtures/amm_test.js +4 -4
- package/dest/public/fixtures/bulk_test.d.ts +3 -3
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
- package/dest/public/fixtures/bulk_test.js +36 -73
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +29 -7
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -1
- package/dest/public/fixtures/custom_bytecode_tester.js +36 -12
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +13 -8
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
- package/dest/public/fixtures/custom_bytecode_tests.js +143 -18
- package/dest/public/fixtures/index.d.ts +4 -2
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +3 -1
- package/dest/public/fixtures/minimal_public_tx.d.ts +2 -8
- package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -1
- package/dest/public/fixtures/minimal_public_tx.js +6 -16
- package/dest/public/fixtures/opcode_spammer.d.ts +122 -0
- package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -0
- package/dest/public/fixtures/opcode_spammer.js +1645 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +29 -10
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +97 -29
- package/dest/public/fixtures/simple_contract_data_source.d.ts +5 -4
- package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -1
- package/dest/public/fixtures/simple_contract_data_source.js +4 -4
- package/dest/public/fixtures/token_test.d.ts +6 -2
- package/dest/public/fixtures/token_test.d.ts.map +1 -1
- package/dest/public/fixtures/token_test.js +13 -12
- package/dest/public/fixtures/utils.d.ts +3 -3
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +23 -23
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +60 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -0
- package/dest/public/fuzzing/avm_fuzzer_simulator.js +171 -0
- package/dest/public/fuzzing/avm_simulator_bin.d.ts +2 -0
- package/dest/public/fuzzing/avm_simulator_bin.d.ts.map +1 -0
- package/dest/public/fuzzing/avm_simulator_bin.js +118 -0
- package/dest/public/hinting_db_sources.d.ts +17 -7
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +77 -18
- package/dest/public/index.d.ts +3 -2
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +1 -1
- package/dest/public/public_db_sources.d.ts +29 -66
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +83 -134
- package/dest/public/public_errors.d.ts +1 -1
- package/dest/public/public_errors.d.ts.map +1 -1
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +9 -7
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
- package/dest/public/public_processor/guarded_merkle_tree.js +9 -4
- package/dest/public/public_processor/public_processor.d.ts +19 -21
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +554 -124
- package/dest/public/public_processor/public_processor_metrics.d.ts +5 -2
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor_metrics.js +36 -45
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +19 -0
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +99 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +35 -23
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +95 -53
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +42 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +86 -0
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +30 -0
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +171 -0
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +23 -0
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +52 -0
- package/dest/public/public_tx_simulator/factories.d.ts +14 -0
- package/dest/public/public_tx_simulator/factories.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/factories.js +28 -0
- package/dest/public/public_tx_simulator/index.d.ts +5 -1
- package/dest/public/public_tx_simulator/index.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/index.js +3 -0
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +14 -7
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +5 -5
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +14 -6
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +25 -19
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +20 -34
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +127 -134
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +25 -2
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +4 -4
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +395 -19
- package/dest/public/side_effect_errors.d.ts +1 -1
- package/dest/public/side_effect_errors.d.ts.map +1 -1
- package/dest/public/side_effect_trace.d.ts +5 -5
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +4 -4
- package/dest/public/side_effect_trace_interface.d.ts +3 -4
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/state_manager/index.d.ts +1 -1
- package/dest/public/state_manager/nullifiers.d.ts +2 -2
- package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
- package/dest/public/state_manager/public_storage.d.ts +2 -2
- package/dest/public/state_manager/public_storage.d.ts.map +1 -1
- package/dest/public/state_manager/public_storage.js +1 -1
- package/dest/public/state_manager/state_manager.d.ts +16 -12
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +21 -10
- package/dest/public/test_executor_metrics.d.ts +11 -4
- package/dest/public/test_executor_metrics.d.ts.map +1 -1
- package/dest/public/test_executor_metrics.js +29 -6
- package/dest/public/unique_class_ids.d.ts +1 -1
- package/dest/public/unique_class_ids.d.ts.map +1 -1
- package/dest/public/utils.d.ts +1 -1
- package/dest/server.d.ts +1 -1
- package/dest/testing.d.ts +1 -1
- package/package.json +21 -20
- package/src/common/errors.ts +1 -1
- package/src/private/acvm/acvm.ts +4 -3
- package/src/private/acvm/deserialize.ts +1 -1
- package/src/private/acvm/serialize.ts +1 -1
- package/src/private/acvm_native.ts +11 -5
- package/src/private/acvm_wasm.ts +11 -4
- package/src/private/circuit_recording/circuit_recorder.ts +24 -21
- package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
- package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
- package/src/private/factory.ts +7 -4
- package/src/public/avm/avm_context.ts +2 -2
- package/src/public/avm/avm_contract_call_result.ts +8 -6
- package/src/public/avm/avm_execution_environment.ts +13 -10
- package/src/public/avm/avm_gas.ts +5 -5
- package/src/public/avm/avm_machine_state.ts +7 -6
- package/src/public/avm/avm_memory_types.ts +5 -1
- package/src/public/avm/avm_simulator.ts +20 -15
- package/src/public/avm/calldata.ts +101 -0
- package/src/public/avm/errors.ts +17 -3
- package/src/public/avm/fixtures/account_proof.json +553 -0
- package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
- package/src/public/avm/fixtures/avm_simulation_tester.ts +18 -4
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +23 -3
- package/src/public/avm/fixtures/initializers.ts +10 -11
- package/src/public/avm/fixtures/utils.ts +6 -2
- package/src/public/avm/opcodes/accrued_substate.ts +31 -34
- package/src/public/avm/opcodes/addressing_mode.ts +2 -2
- package/src/public/avm/opcodes/arithmetic.ts +14 -2
- package/src/public/avm/opcodes/bitwise.ts +3 -3
- package/src/public/avm/opcodes/comparators.ts +1 -1
- package/src/public/avm/opcodes/contract.ts +9 -8
- package/src/public/avm/opcodes/control_flow.ts +2 -2
- package/src/public/avm/opcodes/conversion.ts +3 -3
- package/src/public/avm/opcodes/ec_add.ts +23 -33
- package/src/public/avm/opcodes/environment_getters.ts +7 -7
- package/src/public/avm/opcodes/external_calls.ts +18 -16
- package/src/public/avm/opcodes/hashing.ts +16 -10
- package/src/public/avm/opcodes/instruction_impl.ts +2 -2
- package/src/public/avm/opcodes/memory.ts +20 -20
- package/src/public/avm/opcodes/misc.ts +6 -6
- package/src/public/avm/opcodes/storage.ts +30 -22
- package/src/public/avm/revert_reason.ts +6 -3
- package/src/public/avm/serialization/bytecode_serialization.ts +19 -8
- package/src/public/avm/serialization/instruction_serialization.ts +2 -2
- package/src/public/avm/test_utils.ts +1 -1
- package/src/public/contracts_db_checkpoint.ts +41 -0
- package/src/public/db_interfaces.ts +16 -1
- package/src/public/debug_fn_name.ts +39 -5
- package/src/public/executor_metrics.ts +11 -34
- package/src/public/executor_metrics_interface.ts +2 -1
- package/src/public/fixtures/amm_test.ts +4 -4
- package/src/public/fixtures/bulk_test.ts +38 -13
- package/src/public/fixtures/custom_bytecode_tester.ts +54 -20
- package/src/public/fixtures/custom_bytecode_tests.ts +249 -18
- package/src/public/fixtures/index.ts +7 -1
- package/src/public/fixtures/minimal_public_tx.ts +7 -17
- package/src/public/fixtures/opcode_spammer.ts +1713 -0
- package/src/public/fixtures/public_tx_simulation_tester.ts +129 -24
- package/src/public/fixtures/simple_contract_data_source.ts +8 -9
- package/src/public/fixtures/token_test.ts +18 -10
- package/src/public/fixtures/utils.ts +28 -25
- package/src/public/fuzzing/avm_fuzzer_simulator.ts +288 -0
- package/src/public/fuzzing/avm_simulator_bin.ts +175 -0
- package/src/public/hinting_db_sources.ts +121 -16
- package/src/public/index.ts +6 -4
- package/src/public/public_db_sources.ts +112 -174
- package/src/public/public_processor/guarded_merkle_tree.ts +13 -8
- package/src/public/public_processor/public_processor.ts +226 -137
- package/src/public/public_processor/public_processor_metrics.ts +28 -44
- package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +125 -0
- package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +141 -59
- package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +134 -0
- package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +239 -0
- package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +83 -0
- package/src/public/public_tx_simulator/factories.ts +44 -0
- package/src/public/public_tx_simulator/index.ts +4 -0
- package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +10 -14
- package/src/public/public_tx_simulator/public_tx_context.ts +30 -19
- package/src/public/public_tx_simulator/public_tx_simulator.ts +185 -202
- package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +24 -2
- package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +3 -3
- package/src/public/side_effect_trace.ts +6 -3
- package/src/public/side_effect_trace_interface.ts +1 -1
- package/src/public/state_manager/nullifiers.ts +1 -1
- package/src/public/state_manager/public_storage.ts +1 -1
- package/src/public/state_manager/state_manager.ts +35 -26
- package/src/public/test_executor_metrics.ts +34 -8
- package/dest/public/tx_contract_cache.d.ts +0 -41
- package/dest/public/tx_contract_cache.d.ts.map +0 -1
- package/dest/public/tx_contract_cache.js +0 -49
- package/src/public/tx_contract_cache.ts +0 -69
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MAX_ENQUEUED_CALLS_PER_TX,
|
|
3
|
+
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
4
|
+
MAX_NOTE_HASHES_PER_TX,
|
|
5
|
+
MAX_NULLIFIERS_PER_TX,
|
|
6
|
+
MAX_PRIVATE_LOGS_PER_TX,
|
|
7
|
+
MAX_PROTOCOL_CONTRACTS,
|
|
8
|
+
} from '@aztec/constants';
|
|
9
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
10
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
11
|
+
import { AvmTxHint, type PublicTxResult } from '@aztec/stdlib/avm';
|
|
12
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
13
|
+
import { contractClassPublicFromPlainObject, contractInstanceWithAddressFromPlainObject } from '@aztec/stdlib/contract';
|
|
14
|
+
import {
|
|
15
|
+
PartialPrivateTailPublicInputsForPublic,
|
|
16
|
+
PrivateKernelTailCircuitPublicInputs,
|
|
17
|
+
PrivateToPublicAccumulatedData,
|
|
18
|
+
PublicCallRequest,
|
|
19
|
+
} from '@aztec/stdlib/kernel';
|
|
20
|
+
import { PrivateLog } from '@aztec/stdlib/logs';
|
|
21
|
+
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
22
|
+
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
23
|
+
import { MerkleTreeId, type MerkleTreeWriteOperations, PublicDataTreeLeaf } from '@aztec/stdlib/trees';
|
|
24
|
+
import {
|
|
25
|
+
BlockHeader,
|
|
26
|
+
GlobalVariables,
|
|
27
|
+
HashedValues,
|
|
28
|
+
ProtocolContracts,
|
|
29
|
+
Tx,
|
|
30
|
+
TxConstantData,
|
|
31
|
+
TxContext,
|
|
32
|
+
TxHash,
|
|
33
|
+
} from '@aztec/stdlib/tx';
|
|
34
|
+
import type { NativeWorldStateService } from '@aztec/world-state';
|
|
35
|
+
|
|
36
|
+
import { BaseAvmSimulationTester } from '../avm/fixtures/base_avm_simulation_tester.js';
|
|
37
|
+
import { SimpleContractDataSource } from '../fixtures/simple_contract_data_source.js';
|
|
38
|
+
import { PublicContractsDB } from '../public_db_sources.js';
|
|
39
|
+
import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js';
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Request structure for fuzzer simulation communication from C++.
|
|
43
|
+
* Matches the C++ FuzzerSimulationRequest struct
|
|
44
|
+
*/
|
|
45
|
+
export class FuzzerSimulationRequest {
|
|
46
|
+
constructor(
|
|
47
|
+
public readonly wsDataDir: string,
|
|
48
|
+
public readonly wsMapSizeKb: number,
|
|
49
|
+
public readonly tx: AvmTxHint,
|
|
50
|
+
public readonly globals: GlobalVariables,
|
|
51
|
+
public readonly contractClasses: any[], // Raw, processed by addContractClassFromCpp
|
|
52
|
+
public readonly contractInstances: [any, any][], // Raw pairs [address, instance]
|
|
53
|
+
public readonly publicDataWrites: any[], // Raw public data tree writes to apply before simulation
|
|
54
|
+
public readonly noteHashes: any[], // Raw note hashes to apply before simulation
|
|
55
|
+
public readonly protocolContracts: ProtocolContracts, // Protocol contracts mapping from C++
|
|
56
|
+
) {}
|
|
57
|
+
|
|
58
|
+
static fromPlainObject(obj: any): FuzzerSimulationRequest {
|
|
59
|
+
if (obj instanceof FuzzerSimulationRequest) {
|
|
60
|
+
return obj;
|
|
61
|
+
}
|
|
62
|
+
return new FuzzerSimulationRequest(
|
|
63
|
+
obj.wsDataDir,
|
|
64
|
+
obj.wsMapSizeKb,
|
|
65
|
+
AvmTxHint.fromPlainObject(obj.tx),
|
|
66
|
+
GlobalVariables.fromPlainObject(obj.globals),
|
|
67
|
+
obj.contractClasses,
|
|
68
|
+
obj.contractInstances,
|
|
69
|
+
obj.publicDataWrites ?? [],
|
|
70
|
+
obj.noteHashes ?? [],
|
|
71
|
+
ProtocolContracts.fromPlainObject(obj.protocolContracts),
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Creates a TypeScript Tx object from a deserialized C++ Tx (AvmTxHint-like structure).
|
|
78
|
+
* This allows using PublicTxSimulator.simulate() with fuzzer-generated transactions.
|
|
79
|
+
*/
|
|
80
|
+
async function createTxFromHint(cppTx: AvmTxHint): Promise<Tx> {
|
|
81
|
+
// Create TxHash from the C++ tx hash string
|
|
82
|
+
if (!cppTx.hash) {
|
|
83
|
+
throw new Error(`cppTx.hash is undefined. Keys: ${Object.keys(cppTx || {}).join(', ')}`);
|
|
84
|
+
}
|
|
85
|
+
const txHash = TxHash.fromString(cppTx.hash);
|
|
86
|
+
|
|
87
|
+
// Extract PublicCallRequest instances from enqueued calls
|
|
88
|
+
const setupCallRequests = cppTx.setupEnqueuedCalls.map(call => call.request);
|
|
89
|
+
const paddedSetupCalls = padArrayEnd(setupCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX);
|
|
90
|
+
|
|
91
|
+
const appLogicCallRequests = cppTx.appLogicEnqueuedCalls.map(call => call.request);
|
|
92
|
+
const paddedAppLogicCalls = padArrayEnd(appLogicCallRequests, PublicCallRequest.empty(), MAX_ENQUEUED_CALLS_PER_TX);
|
|
93
|
+
|
|
94
|
+
// Build non-revertible accumulated data from C++ tx
|
|
95
|
+
const emptyNonRevertible = PrivateToPublicAccumulatedData.empty();
|
|
96
|
+
const nonRevertibleAccumulatedData = new PrivateToPublicAccumulatedData(
|
|
97
|
+
padArrayEnd(cppTx.nonRevertibleAccumulatedData.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
|
|
98
|
+
padArrayEnd(cppTx.nonRevertibleAccumulatedData.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX),
|
|
99
|
+
padArrayEnd(
|
|
100
|
+
cppTx.nonRevertibleAccumulatedData.l2ToL1Messages,
|
|
101
|
+
ScopedL2ToL1Message.empty(),
|
|
102
|
+
MAX_L2_TO_L1_MSGS_PER_TX,
|
|
103
|
+
),
|
|
104
|
+
padArrayEnd(cppTx.nonRevertibleContractDeploymentData.privateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
|
|
105
|
+
emptyNonRevertible.contractClassLogsHashes,
|
|
106
|
+
paddedSetupCalls,
|
|
107
|
+
);
|
|
108
|
+
|
|
109
|
+
// Build revertible accumulated data from C++ tx
|
|
110
|
+
const emptyRevertible = PrivateToPublicAccumulatedData.empty();
|
|
111
|
+
const revertibleAccumulatedData = new PrivateToPublicAccumulatedData(
|
|
112
|
+
padArrayEnd(cppTx.revertibleAccumulatedData.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
|
|
113
|
+
padArrayEnd(cppTx.revertibleAccumulatedData.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX),
|
|
114
|
+
padArrayEnd(cppTx.revertibleAccumulatedData.l2ToL1Messages, ScopedL2ToL1Message.empty(), MAX_L2_TO_L1_MSGS_PER_TX),
|
|
115
|
+
padArrayEnd(cppTx.revertibleContractDeploymentData.privateLogs, PrivateLog.empty(), MAX_PRIVATE_LOGS_PER_TX),
|
|
116
|
+
emptyRevertible.contractClassLogsHashes,
|
|
117
|
+
paddedAppLogicCalls,
|
|
118
|
+
);
|
|
119
|
+
|
|
120
|
+
// Build teardown call request (if exists)
|
|
121
|
+
const teardownCallRequest = cppTx.teardownEnqueuedCall?.request ?? PublicCallRequest.empty();
|
|
122
|
+
|
|
123
|
+
// Create forPublic structure
|
|
124
|
+
const forPublic = new PartialPrivateTailPublicInputsForPublic(
|
|
125
|
+
nonRevertibleAccumulatedData,
|
|
126
|
+
revertibleAccumulatedData,
|
|
127
|
+
teardownCallRequest,
|
|
128
|
+
);
|
|
129
|
+
|
|
130
|
+
// Build TxContext - gasSettings is already a proper GasSettings after AvmTxHint.fromPlainObject
|
|
131
|
+
const txContext = new TxContext(
|
|
132
|
+
Fr.ZERO, // chainId - this is fine because simulation actually reads from globalVariables not here
|
|
133
|
+
Fr.ZERO, // version - this is fine because simulation actually reads from globalVariables not here
|
|
134
|
+
cppTx.gasSettings,
|
|
135
|
+
);
|
|
136
|
+
|
|
137
|
+
// Build TxConstantData
|
|
138
|
+
const constants = new TxConstantData(
|
|
139
|
+
BlockHeader.empty(), // anchorBlockHeader (unused in simulation)
|
|
140
|
+
txContext,
|
|
141
|
+
Fr.ZERO, // vkTreeRoot - not needed for public simulation
|
|
142
|
+
Fr.ZERO, // protocolContractsHash - not needed for public simulation
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
const data = new PrivateKernelTailCircuitPublicInputs(
|
|
146
|
+
constants,
|
|
147
|
+
cppTx.gasUsedByPrivate,
|
|
148
|
+
cppTx.feePayer,
|
|
149
|
+
0n, // expirationTimestamp
|
|
150
|
+
forPublic,
|
|
151
|
+
undefined, // forRollup - not needed for public simulation
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
// Build publicFunctionCalldata from all enqueued calls
|
|
155
|
+
// Calldata is already Fr[] after AvmTxHint.fromPlainObject
|
|
156
|
+
const publicFunctionCalldata: HashedValues[] = [];
|
|
157
|
+
|
|
158
|
+
// Add setup calls
|
|
159
|
+
for (const call of cppTx.setupEnqueuedCalls || []) {
|
|
160
|
+
publicFunctionCalldata.push(await HashedValues.fromCalldata(call.calldata));
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// Add app logic calls
|
|
164
|
+
for (const call of cppTx.appLogicEnqueuedCalls || []) {
|
|
165
|
+
publicFunctionCalldata.push(await HashedValues.fromCalldata(call.calldata));
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// Add teardown call if present
|
|
169
|
+
if (cppTx.teardownEnqueuedCall) {
|
|
170
|
+
publicFunctionCalldata.push(await HashedValues.fromCalldata(cppTx.teardownEnqueuedCall.calldata));
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
// Extract contract class log fields from ContractDeploymentData
|
|
174
|
+
const contractClassLogFields = [
|
|
175
|
+
...cppTx.nonRevertibleContractDeploymentData.contractClassLogs.map(log => log.fields),
|
|
176
|
+
...cppTx.revertibleContractDeploymentData.contractClassLogs.map(log => log.fields),
|
|
177
|
+
];
|
|
178
|
+
|
|
179
|
+
// Create the Tx
|
|
180
|
+
return new Tx(
|
|
181
|
+
txHash,
|
|
182
|
+
data,
|
|
183
|
+
ChonkProof.empty(), // No real proof needed for simulation
|
|
184
|
+
contractClassLogFields,
|
|
185
|
+
publicFunctionCalldata,
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/**
|
|
190
|
+
* A simulator class for the AVM fuzzer that extends BaseAvmSimulationTester.
|
|
191
|
+
* It provides methods for registering contracts from C++ msgpack data and simulating transactions.
|
|
192
|
+
*/
|
|
193
|
+
export class AvmFuzzerSimulator extends BaseAvmSimulationTester {
|
|
194
|
+
private simulator: PublicTxSimulator;
|
|
195
|
+
|
|
196
|
+
constructor(
|
|
197
|
+
merkleTrees: MerkleTreeWriteOperations,
|
|
198
|
+
contractDataSource: SimpleContractDataSource,
|
|
199
|
+
globals: GlobalVariables,
|
|
200
|
+
protocolContracts: ProtocolContracts,
|
|
201
|
+
) {
|
|
202
|
+
super(contractDataSource, merkleTrees);
|
|
203
|
+
const contractsDb = new PublicContractsDB(contractDataSource);
|
|
204
|
+
this.simulator = new PublicTxSimulator(
|
|
205
|
+
merkleTrees,
|
|
206
|
+
contractsDb,
|
|
207
|
+
globals,
|
|
208
|
+
{
|
|
209
|
+
skipFeeEnforcement: false,
|
|
210
|
+
collectDebugLogs: false,
|
|
211
|
+
collectHints: false,
|
|
212
|
+
collectStatistics: false,
|
|
213
|
+
collectCallMetadata: false,
|
|
214
|
+
},
|
|
215
|
+
protocolContracts,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Static factory method to create an AvmFuzzerSimulator.
|
|
221
|
+
*/
|
|
222
|
+
public static async create(
|
|
223
|
+
worldStateService: NativeWorldStateService,
|
|
224
|
+
globals: GlobalVariables,
|
|
225
|
+
protocolContracts: ProtocolContracts,
|
|
226
|
+
): Promise<AvmFuzzerSimulator> {
|
|
227
|
+
const contractDataSource = new SimpleContractDataSource();
|
|
228
|
+
const merkleTrees = await worldStateService.fork();
|
|
229
|
+
return new AvmFuzzerSimulator(merkleTrees, contractDataSource, globals, protocolContracts);
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Simulate a transaction from a C++ AvmTxHint.
|
|
234
|
+
*/
|
|
235
|
+
public async simulate(txHint: AvmTxHint): Promise<PublicTxResult> {
|
|
236
|
+
// Compute fee from gas limits and max fees per gas (upper bound on fee)
|
|
237
|
+
const totalFee =
|
|
238
|
+
BigInt(txHint.gasSettings.gasLimits.daGas) * txHint.gasSettings.maxFeesPerGas.feePerDaGas +
|
|
239
|
+
BigInt(txHint.gasSettings.gasLimits.l2Gas) * txHint.gasSettings.maxFeesPerGas.feePerL2Gas;
|
|
240
|
+
|
|
241
|
+
await this.setFeePayerBalance(txHint.feePayer, new Fr(totalFee));
|
|
242
|
+
|
|
243
|
+
const tx = await createTxFromHint(txHint);
|
|
244
|
+
return await this.simulator.simulate(tx);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/**
|
|
248
|
+
* Add a contract class from C++ raw msgpack data.
|
|
249
|
+
*/
|
|
250
|
+
public async addContractClassFromCpp(rawClass: any): Promise<void> {
|
|
251
|
+
const contractClass = contractClassPublicFromPlainObject(rawClass);
|
|
252
|
+
await this.contractDataSource.addContractClass(contractClass);
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
/**
|
|
256
|
+
* Add a contract instance from C++ raw msgpack data.
|
|
257
|
+
* This also inserts the contract address nullifier into the nullifier tree,
|
|
258
|
+
* unless the address is a protocol canonical address (1-11).
|
|
259
|
+
*/
|
|
260
|
+
public async addContractInstanceFromCpp(rawAddress: any, rawInstance: any): Promise<void> {
|
|
261
|
+
const address = AztecAddress.fromPlainObject(rawAddress);
|
|
262
|
+
const instance = contractInstanceWithAddressFromPlainObject(address, rawInstance);
|
|
263
|
+
// Protocol canonical addresses (1-11) should not have nullifiers inserted
|
|
264
|
+
const isProtocolCanonicalAddress = address.toBigInt() <= MAX_PROTOCOL_CONTRACTS && address.toBigInt() >= 1n;
|
|
265
|
+
await this.addContractInstance(instance, /* skipNullifierInsertion */ isProtocolCanonicalAddress);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
/**
|
|
269
|
+
* Apply public data tree writes from C++ raw msgpack data.
|
|
270
|
+
* This is used to pre-populate the public data tree before simulation (e.g., for bytecode upgrades).
|
|
271
|
+
*/
|
|
272
|
+
public async applyPublicDataWrites(rawWrites: any[]): Promise<void> {
|
|
273
|
+
for (const rawWrite of rawWrites) {
|
|
274
|
+
const leaf = PublicDataTreeLeaf.fromPlainObject(rawWrite);
|
|
275
|
+
await this.merkleTrees.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [leaf.toBuffer()]);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Apply note hashes from C++ raw msgpack data.
|
|
281
|
+
* This is used to pre-populate the note hash tree before simulation.
|
|
282
|
+
*/
|
|
283
|
+
public async applyNoteHashes(rawNoteHashes: any[]): Promise<void> {
|
|
284
|
+
const paddingLeaves = MAX_NOTE_HASHES_PER_TX - (rawNoteHashes.length % MAX_NOTE_HASHES_PER_TX);
|
|
285
|
+
const paddedNoteHashes = [...rawNoteHashes, ...Array(paddingLeaves).fill(Fr.ZERO)];
|
|
286
|
+
await this.merkleTrees.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, paddedNoteHashes);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
|
+
import {
|
|
4
|
+
AvmCircuitPublicInputs,
|
|
5
|
+
type AvmTxHint,
|
|
6
|
+
PublicTxEffect,
|
|
7
|
+
deserializeFromMessagePack,
|
|
8
|
+
serializeWithMessagePack,
|
|
9
|
+
} from '@aztec/stdlib/avm';
|
|
10
|
+
import { GlobalVariables, ProtocolContracts, TreeSnapshots } from '@aztec/stdlib/tx';
|
|
11
|
+
import { NativeWorldStateService } from '@aztec/world-state';
|
|
12
|
+
|
|
13
|
+
import { createInterface } from 'readline';
|
|
14
|
+
|
|
15
|
+
import { AvmFuzzerSimulator, FuzzerSimulationRequest } from './avm_fuzzer_simulator.js';
|
|
16
|
+
|
|
17
|
+
/** Write data to stdout, letting Node handle buffering. */
|
|
18
|
+
function writeOutput(data: string): Promise<void> {
|
|
19
|
+
return new Promise<void>((resolve, reject) => {
|
|
20
|
+
process.stdout.write(data, err => {
|
|
21
|
+
if (err) {
|
|
22
|
+
reject(err);
|
|
23
|
+
} else {
|
|
24
|
+
resolve();
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// This cache holds opened world states to avoid reopening them for each invocation.
|
|
31
|
+
// It's a map so that in the future we could support multiple world states (if we had multiple fuzzers).
|
|
32
|
+
const worldStateCache = new Map<string, NativeWorldStateService>();
|
|
33
|
+
|
|
34
|
+
async function openExistingWorldState(dataDir: string, mapSizeKb: number): Promise<NativeWorldStateService> {
|
|
35
|
+
const cached = worldStateCache.get(dataDir);
|
|
36
|
+
if (cached) {
|
|
37
|
+
return cached;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const ws = await NativeWorldStateService.new(EthAddress.ZERO, dataDir, {
|
|
41
|
+
archiveTreeMapSizeKb: mapSizeKb,
|
|
42
|
+
nullifierTreeMapSizeKb: mapSizeKb,
|
|
43
|
+
noteHashTreeMapSizeKb: mapSizeKb,
|
|
44
|
+
messageTreeMapSizeKb: mapSizeKb,
|
|
45
|
+
publicDataTreeMapSizeKb: mapSizeKb,
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
worldStateCache.set(dataDir, ws);
|
|
49
|
+
return ws;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
async function simulateWithFuzzer(
|
|
53
|
+
dataDir: string,
|
|
54
|
+
mapSizeKb: number,
|
|
55
|
+
txHint: AvmTxHint,
|
|
56
|
+
globals: GlobalVariables,
|
|
57
|
+
rawContractClasses: any[], // Replace these when we are moving contract classes to TS
|
|
58
|
+
rawContractInstances: [any, any][], // Replace these when we are moving contract instances to TS
|
|
59
|
+
rawPublicDataWrites: any[], // Public data tree writes to apply before simulation
|
|
60
|
+
rawNoteHashes: any[], // Note hashes to apply before simulation
|
|
61
|
+
protocolContracts: ProtocolContracts, // Protocol contracts mapping from C++
|
|
62
|
+
): Promise<{
|
|
63
|
+
reverted: boolean;
|
|
64
|
+
output: Fr[];
|
|
65
|
+
revertReason?: string;
|
|
66
|
+
publicInputs: AvmCircuitPublicInputs;
|
|
67
|
+
publicTxEffect: PublicTxEffect;
|
|
68
|
+
}> {
|
|
69
|
+
const worldStateService = await openExistingWorldState(dataDir, mapSizeKb);
|
|
70
|
+
|
|
71
|
+
const simulator = await AvmFuzzerSimulator.create(worldStateService, globals, protocolContracts);
|
|
72
|
+
|
|
73
|
+
await simulator.applyNoteHashes(rawNoteHashes);
|
|
74
|
+
|
|
75
|
+
// Register contract classes from C++ (must happen before public data writes to match C++ order)
|
|
76
|
+
for (const rawClass of rawContractClasses) {
|
|
77
|
+
await simulator.addContractClassFromCpp(rawClass);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// Register contract instances from C++
|
|
81
|
+
for (const [rawAddress, rawInstance] of rawContractInstances) {
|
|
82
|
+
await simulator.addContractInstanceFromCpp(rawAddress, rawInstance);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Apply public data writes after contract registration (e.g., for bytecode upgrades)
|
|
86
|
+
// This must happen last to match C++ setup_fuzzer_state ordering
|
|
87
|
+
await simulator.applyPublicDataWrites(rawPublicDataWrites);
|
|
88
|
+
|
|
89
|
+
const result = await simulator.simulate(txHint);
|
|
90
|
+
|
|
91
|
+
const output = result
|
|
92
|
+
.getAppLogicReturnValues()
|
|
93
|
+
.flatMap((rv: { values?: Fr[] } | undefined) => rv?.values?.filter((v: Fr | null | undefined) => v != null) ?? []);
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
reverted: !result.revertCode.isOK(),
|
|
97
|
+
output,
|
|
98
|
+
revertReason: result.findRevertReason()?.message,
|
|
99
|
+
publicInputs: result.publicInputs!,
|
|
100
|
+
publicTxEffect: result.publicTxEffect,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function execute(base64Line: string): Promise<void> {
|
|
105
|
+
try {
|
|
106
|
+
// Decode base64 and deserialize the entire request from msgpack
|
|
107
|
+
const buffer = Buffer.from(base64Line.trim(), 'base64');
|
|
108
|
+
const rawRequest = deserializeFromMessagePack(buffer);
|
|
109
|
+
const request = FuzzerSimulationRequest.fromPlainObject(rawRequest);
|
|
110
|
+
|
|
111
|
+
// Run the TS simulation
|
|
112
|
+
const result = await simulateWithFuzzer(
|
|
113
|
+
request.wsDataDir,
|
|
114
|
+
request.wsMapSizeKb,
|
|
115
|
+
request.tx,
|
|
116
|
+
request.globals,
|
|
117
|
+
request.contractClasses,
|
|
118
|
+
request.contractInstances,
|
|
119
|
+
request.publicDataWrites,
|
|
120
|
+
request.noteHashes,
|
|
121
|
+
request.protocolContracts,
|
|
122
|
+
);
|
|
123
|
+
|
|
124
|
+
// Serialize the result to msgpack and encode it in base64 for output
|
|
125
|
+
const resultBuffer = serializeWithMessagePack({
|
|
126
|
+
reverted: result.reverted,
|
|
127
|
+
output: result.output,
|
|
128
|
+
revertReason: result.revertReason ?? '',
|
|
129
|
+
endTreeSnapshots: result.publicInputs.endTreeSnapshots,
|
|
130
|
+
publicTxEffect: result.publicTxEffect,
|
|
131
|
+
});
|
|
132
|
+
const base64Response = resultBuffer.toString('base64') + '\n';
|
|
133
|
+
await writeOutput(base64Response);
|
|
134
|
+
} catch (error: any) {
|
|
135
|
+
// If we error, treat as reverted
|
|
136
|
+
const errorResult = serializeWithMessagePack({
|
|
137
|
+
reverted: true,
|
|
138
|
+
output: [] as Fr[],
|
|
139
|
+
revertReason: `Unexpected Error ${error.message}`,
|
|
140
|
+
endTreeSnapshots: TreeSnapshots.empty(),
|
|
141
|
+
publicTxEffect: PublicTxEffect.empty(),
|
|
142
|
+
});
|
|
143
|
+
await writeOutput(errorResult.toString('base64') + '\n');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
function mainLoop() {
|
|
148
|
+
const rl = createInterface({ input: process.stdin, terminal: false });
|
|
149
|
+
|
|
150
|
+
// Process lines sequentially to avoid race conditions in responses
|
|
151
|
+
const lineQueue: string[] = [];
|
|
152
|
+
let processing = false;
|
|
153
|
+
|
|
154
|
+
async function processQueue() {
|
|
155
|
+
if (processing || lineQueue.length === 0) {
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
processing = true;
|
|
159
|
+
while (lineQueue.length > 0) {
|
|
160
|
+
const line = lineQueue.shift()!;
|
|
161
|
+
await execute(line);
|
|
162
|
+
}
|
|
163
|
+
processing = false;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
rl.on('line', (line: string) => {
|
|
167
|
+
if (line.trim()) {
|
|
168
|
+
lineQueue.push(line);
|
|
169
|
+
void processQueue();
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
rl.on('close', () => process.exit(0));
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
void mainLoop();
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
|
+
import { sha256Trunc } from '@aztec/foundation/crypto/sha256';
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
4
|
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
4
5
|
import type { IndexedTreeLeafPreimage, SiblingPath } from '@aztec/foundation/trees';
|
|
5
6
|
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
@@ -8,8 +9,12 @@ import {
|
|
|
8
9
|
AvmBytecodeCommitmentHint,
|
|
9
10
|
AvmCommitCheckpointHint,
|
|
10
11
|
AvmContractClassHint,
|
|
12
|
+
AvmContractDbCommitCheckpointHint,
|
|
13
|
+
AvmContractDbCreateCheckpointHint,
|
|
14
|
+
AvmContractDbRevertCheckpointHint,
|
|
11
15
|
AvmContractInstanceHint,
|
|
12
16
|
AvmCreateCheckpointHint,
|
|
17
|
+
AvmDebugFunctionNameHint,
|
|
13
18
|
type AvmExecutionHints,
|
|
14
19
|
AvmGetLeafPreimageHintNullifierTree,
|
|
15
20
|
AvmGetLeafPreimageHintPublicDataTree,
|
|
@@ -50,8 +55,11 @@ import type { PublicContractsDBInterface } from './db_interfaces.js';
|
|
|
50
55
|
* A public contracts database that forwards requests and collects AVM hints.
|
|
51
56
|
*/
|
|
52
57
|
export class HintingPublicContractsDB implements PublicContractsDBInterface {
|
|
53
|
-
|
|
54
|
-
|
|
58
|
+
private static readonly log: Logger = createLogger('simulator:hinting-public-contracts-db');
|
|
59
|
+
|
|
60
|
+
private checkpointActionCounter: number = 0;
|
|
61
|
+
private nextCheckpointId: number = 1;
|
|
62
|
+
private checkpointStack: number[] = [0];
|
|
55
63
|
|
|
56
64
|
constructor(
|
|
57
65
|
private readonly db: PublicContractsDBInterface,
|
|
@@ -64,34 +72,46 @@ export class HintingPublicContractsDB implements PublicContractsDBInterface {
|
|
|
64
72
|
): Promise<ContractInstanceWithAddress | undefined> {
|
|
65
73
|
const instance = await this.db.getContractInstance(address, timestamp);
|
|
66
74
|
if (instance) {
|
|
67
|
-
|
|
75
|
+
const hintKey = this.getHintKey();
|
|
76
|
+
|
|
68
77
|
this.hints.contractInstances.push(
|
|
69
78
|
new AvmContractInstanceHint(
|
|
79
|
+
hintKey,
|
|
70
80
|
instance.address,
|
|
71
81
|
instance.salt,
|
|
72
82
|
instance.deployer,
|
|
73
83
|
instance.currentContractClassId,
|
|
74
84
|
instance.originalContractClassId,
|
|
75
85
|
instance.initializationHash,
|
|
86
|
+
instance.immutablesHash,
|
|
76
87
|
instance.publicKeys,
|
|
77
88
|
),
|
|
78
89
|
);
|
|
90
|
+
|
|
91
|
+
HintingPublicContractsDB.log.trace(
|
|
92
|
+
`[getContractInstance:${hintKey}] Added contract instance ${instance.address.toString()} to hints.`,
|
|
93
|
+
);
|
|
79
94
|
}
|
|
80
95
|
return instance;
|
|
81
96
|
}
|
|
82
97
|
|
|
83
98
|
public async getContractClass(contractClassId: Fr): Promise<ContractClassPublic | undefined> {
|
|
84
99
|
const contractClass = await this.db.getContractClass(contractClassId);
|
|
85
|
-
if (contractClass
|
|
86
|
-
this.
|
|
100
|
+
if (contractClass) {
|
|
101
|
+
const hintKey = this.getHintKey();
|
|
87
102
|
this.hints.contractClasses.push(
|
|
88
103
|
new AvmContractClassHint(
|
|
104
|
+
hintKey,
|
|
89
105
|
contractClass.id,
|
|
90
106
|
contractClass.artifactHash,
|
|
91
107
|
contractClass.privateFunctionsRoot,
|
|
92
108
|
contractClass.packedBytecode,
|
|
93
109
|
),
|
|
94
110
|
);
|
|
111
|
+
|
|
112
|
+
HintingPublicContractsDB.log.trace(
|
|
113
|
+
`[getContractClass:${hintKey}] Added contract class ${contractClassId.toString()} to hints.`,
|
|
114
|
+
);
|
|
95
115
|
}
|
|
96
116
|
return contractClass;
|
|
97
117
|
}
|
|
@@ -99,7 +119,12 @@ export class HintingPublicContractsDB implements PublicContractsDBInterface {
|
|
|
99
119
|
public async getBytecodeCommitment(contractClassId: Fr): Promise<Fr | undefined> {
|
|
100
120
|
const commitment = await this.db.getBytecodeCommitment(contractClassId);
|
|
101
121
|
if (commitment) {
|
|
102
|
-
this.
|
|
122
|
+
const hintKey = this.getHintKey();
|
|
123
|
+
this.hints.bytecodeCommitments.push(new AvmBytecodeCommitmentHint(hintKey, contractClassId, commitment));
|
|
124
|
+
|
|
125
|
+
HintingPublicContractsDB.log.trace(
|
|
126
|
+
`[getBytecodeCommitment:${hintKey}] Added bytecode commitment ${commitment.toString()} to hints for contract class ${contractClassId.toString()}.`,
|
|
127
|
+
);
|
|
103
128
|
}
|
|
104
129
|
return commitment;
|
|
105
130
|
}
|
|
@@ -108,7 +133,81 @@ export class HintingPublicContractsDB implements PublicContractsDBInterface {
|
|
|
108
133
|
contractAddress: AztecAddress,
|
|
109
134
|
selector: FunctionSelector,
|
|
110
135
|
): Promise<string | undefined> {
|
|
111
|
-
|
|
136
|
+
const name = await this.db.getDebugFunctionName(contractAddress, selector);
|
|
137
|
+
if (name) {
|
|
138
|
+
HintingPublicContractsDB.log.debug(
|
|
139
|
+
`[getDebugFunctionName] Adding debug function name ${name} to hints for contract ${contractAddress.toString()} and selector ${selector.toString()}.`,
|
|
140
|
+
);
|
|
141
|
+
// We hint selector as a field to make things way simpler in C++.
|
|
142
|
+
this.hints.debugFunctionNames.push(new AvmDebugFunctionNameHint(contractAddress, selector.toField(), name));
|
|
143
|
+
}
|
|
144
|
+
return name;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
public createCheckpoint(): void {
|
|
148
|
+
const hintKey = this.getHintKey();
|
|
149
|
+
this.checkpointActionCounter++;
|
|
150
|
+
const oldCheckpointId = this.getCurrentCheckpointId();
|
|
151
|
+
|
|
152
|
+
this.db.createCheckpoint();
|
|
153
|
+
|
|
154
|
+
const newCheckpointId = this.nextCheckpointId++;
|
|
155
|
+
this.checkpointStack.push(newCheckpointId);
|
|
156
|
+
|
|
157
|
+
this.hints.contractDbCreateCheckpointHints.push(
|
|
158
|
+
new AvmContractDbCreateCheckpointHint(hintKey, oldCheckpointId, newCheckpointId),
|
|
159
|
+
);
|
|
160
|
+
|
|
161
|
+
HintingPublicContractsDB.log.trace(
|
|
162
|
+
`[createCheckpoint:${hintKey}] Checkpoint evolved ${oldCheckpointId} -> ${newCheckpointId}.`,
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
public commitCheckpoint(): void {
|
|
167
|
+
const hintKey = this.getHintKey();
|
|
168
|
+
this.checkpointActionCounter++;
|
|
169
|
+
const oldCheckpointId = this.getCurrentCheckpointId();
|
|
170
|
+
|
|
171
|
+
this.db.commitCheckpoint();
|
|
172
|
+
|
|
173
|
+
this.checkpointStack.pop();
|
|
174
|
+
const newCheckpointId = this.getCurrentCheckpointId();
|
|
175
|
+
|
|
176
|
+
this.hints.contractDbCommitCheckpointHints.push(
|
|
177
|
+
new AvmContractDbCommitCheckpointHint(hintKey, oldCheckpointId, newCheckpointId),
|
|
178
|
+
);
|
|
179
|
+
|
|
180
|
+
HintingPublicContractsDB.log.trace(
|
|
181
|
+
`[commitCheckpoint:${hintKey}] Checkpoint evolved ${oldCheckpointId} -> ${newCheckpointId}.`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
public revertCheckpoint(): void {
|
|
186
|
+
const hintKey = this.getHintKey();
|
|
187
|
+
this.checkpointActionCounter++;
|
|
188
|
+
const oldCheckpointId = this.getCurrentCheckpointId();
|
|
189
|
+
|
|
190
|
+
this.db.revertCheckpoint();
|
|
191
|
+
|
|
192
|
+
this.checkpointStack.pop();
|
|
193
|
+
const newCheckpointId = this.getCurrentCheckpointId();
|
|
194
|
+
|
|
195
|
+
this.hints.contractDbRevertCheckpointHints.push(
|
|
196
|
+
new AvmContractDbRevertCheckpointHint(hintKey, oldCheckpointId, newCheckpointId),
|
|
197
|
+
);
|
|
198
|
+
|
|
199
|
+
HintingPublicContractsDB.log.trace(
|
|
200
|
+
`[revertCheckpoint:${hintKey}] Checkpoint evolved ${oldCheckpointId} -> ${newCheckpointId}.`,
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// Private methods.
|
|
205
|
+
private getHintKey(): number {
|
|
206
|
+
return this.checkpointActionCounter;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
private getCurrentCheckpointId(): number {
|
|
210
|
+
return this.checkpointStack[this.checkpointStack.length - 1];
|
|
112
211
|
}
|
|
113
212
|
}
|
|
114
213
|
|
|
@@ -312,12 +411,12 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
|
|
|
312
411
|
}
|
|
313
412
|
}
|
|
314
413
|
|
|
315
|
-
public async createCheckpoint(): Promise<
|
|
414
|
+
public async createCheckpoint(): Promise<number> {
|
|
316
415
|
const actionCounter = this.checkpointActionCounter++;
|
|
317
416
|
const oldCheckpointId = this.getCurrentCheckpointId();
|
|
318
417
|
const treesStateHash = await this.getTreesStateHash();
|
|
319
418
|
|
|
320
|
-
await this.db.createCheckpoint();
|
|
419
|
+
const depth = await this.db.createCheckpoint();
|
|
321
420
|
this.checkpointStack.push(this.nextCheckpointId++);
|
|
322
421
|
const newCheckpointId = this.getCurrentCheckpointId();
|
|
323
422
|
|
|
@@ -326,14 +425,16 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
|
|
|
326
425
|
HintingMerkleWriteOperations.log.trace(
|
|
327
426
|
`[createCheckpoint:${actionCounter}] Checkpoint evolved ${oldCheckpointId} -> ${newCheckpointId} at trees state ${treesStateHash}.`,
|
|
328
427
|
);
|
|
428
|
+
|
|
429
|
+
return depth;
|
|
329
430
|
}
|
|
330
431
|
|
|
331
|
-
public
|
|
332
|
-
throw new Error('
|
|
432
|
+
public commitAllCheckpointsTo(_depth: number): Promise<void> {
|
|
433
|
+
throw new Error('commitAllCheckpointsTo is not supported in HintingMerkleWriteOperations.');
|
|
333
434
|
}
|
|
334
435
|
|
|
335
|
-
public
|
|
336
|
-
throw new Error('
|
|
436
|
+
public revertAllCheckpointsTo(_depth: number): Promise<void> {
|
|
437
|
+
throw new Error('revertAllCheckpointsTo is not supported in HintingMerkleWriteOperations.');
|
|
337
438
|
}
|
|
338
439
|
|
|
339
440
|
public async commitCheckpoint(): Promise<void> {
|
|
@@ -474,6 +575,10 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
|
|
|
474
575
|
return await this.db.close();
|
|
475
576
|
}
|
|
476
577
|
|
|
578
|
+
async [Symbol.asyncDispose](): Promise<void> {
|
|
579
|
+
await this.close();
|
|
580
|
+
}
|
|
581
|
+
|
|
477
582
|
public async findLeafIndices<ID extends MerkleTreeId>(
|
|
478
583
|
treeId: ID,
|
|
479
584
|
values: MerkleTreeLeafType<ID>[],
|
|
@@ -499,7 +604,7 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
|
|
|
499
604
|
public async getBlockNumbersForLeafIndices<ID extends MerkleTreeId>(
|
|
500
605
|
treeId: ID,
|
|
501
606
|
leafIndices: bigint[],
|
|
502
|
-
): Promise<(
|
|
607
|
+
): Promise<(BlockNumber | undefined)[]> {
|
|
503
608
|
return await this.db.getBlockNumbersForLeafIndices(treeId, leafIndices);
|
|
504
609
|
}
|
|
505
610
|
}
|