@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
|
@@ -1,24 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { Fr } from '@aztec/foundation/
|
|
3
|
-
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
1
|
+
import { MAX_PROCESSABLE_L2_GAS } from '@aztec/constants';
|
|
2
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
3
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { ProtocolContractAddress, ProtocolContractsList } from '@aztec/protocol-contracts';
|
|
5
5
|
import { computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
6
|
-
import {
|
|
7
|
-
AvmCircuitInputs,
|
|
8
|
-
AvmCircuitPublicInputs,
|
|
9
|
-
AvmExecutionHints,
|
|
10
|
-
type AvmProvingRequest,
|
|
11
|
-
AvmTxHint,
|
|
12
|
-
type RevertCode,
|
|
13
|
-
} from '@aztec/stdlib/avm';
|
|
6
|
+
import { AvmExecutionHints, AvmTxHint, PublicSimulatorConfig, PublicTxEffect, PublicTxResult } from '@aztec/stdlib/avm';
|
|
14
7
|
import { SimulationError } from '@aztec/stdlib/errors';
|
|
15
|
-
import
|
|
16
|
-
import type { DebugLog } from '@aztec/stdlib/logs';
|
|
17
|
-
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
8
|
+
import { Gas } from '@aztec/stdlib/gas';
|
|
18
9
|
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
|
|
19
10
|
import {
|
|
20
11
|
type GlobalVariables,
|
|
21
12
|
NestedProcessReturnValues,
|
|
13
|
+
ProtocolContracts,
|
|
22
14
|
PublicCallRequestWithCalldata,
|
|
23
15
|
Tx,
|
|
24
16
|
TxExecutionPhase,
|
|
@@ -27,6 +19,7 @@ import {
|
|
|
27
19
|
import { strict as assert } from 'assert';
|
|
28
20
|
|
|
29
21
|
import type { AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
|
|
22
|
+
import { CallDataArray } from '../avm/calldata.js';
|
|
30
23
|
import { AvmSimulator } from '../avm/index.js';
|
|
31
24
|
import { getPublicFunctionDebugName } from '../debug_fn_name.js';
|
|
32
25
|
import { HintingMerkleWriteOperations, HintingPublicContractsDB } from '../hinting_db_sources.js';
|
|
@@ -34,40 +27,12 @@ import { type PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
|
|
|
34
27
|
import {
|
|
35
28
|
L2ToL1MessageLimitReachedError,
|
|
36
29
|
NoteHashLimitReachedError,
|
|
37
|
-
NullifierCollisionError,
|
|
38
30
|
NullifierLimitReachedError,
|
|
39
31
|
} from '../side_effect_errors.js';
|
|
40
32
|
import type { PublicPersistableStateManager } from '../state_manager/state_manager.js';
|
|
41
33
|
import { PublicTxContext } from './public_tx_context.js';
|
|
42
34
|
import type { PublicTxSimulatorInterface } from './public_tx_simulator_interface.js';
|
|
43
35
|
|
|
44
|
-
export type ProcessedPhase = {
|
|
45
|
-
phase: TxExecutionPhase;
|
|
46
|
-
durationMs?: number;
|
|
47
|
-
returnValues: NestedProcessReturnValues[];
|
|
48
|
-
reverted: boolean;
|
|
49
|
-
revertReason?: SimulationError;
|
|
50
|
-
};
|
|
51
|
-
|
|
52
|
-
export type PublicTxResult = {
|
|
53
|
-
avmProvingRequest: AvmProvingRequest;
|
|
54
|
-
/** Gas used during the execution of this tx */
|
|
55
|
-
gasUsed: GasUsed;
|
|
56
|
-
revertCode: RevertCode;
|
|
57
|
-
/** Revert reason, if any */
|
|
58
|
-
revertReason?: SimulationError;
|
|
59
|
-
processedPhases: ProcessedPhase[];
|
|
60
|
-
logs: DebugLog[];
|
|
61
|
-
};
|
|
62
|
-
|
|
63
|
-
export type PublicTxSimulatorConfig = {
|
|
64
|
-
proverId: Fr;
|
|
65
|
-
doMerkleOperations: boolean;
|
|
66
|
-
skipFeeEnforcement: boolean;
|
|
67
|
-
clientInitiatedSimulation: boolean;
|
|
68
|
-
maxDebugLogMemoryReads: number;
|
|
69
|
-
};
|
|
70
|
-
|
|
71
36
|
// The errors below are only thrown here in the public tx simulator,
|
|
72
37
|
// and only during revertible phases (revertible insertions, app logic and teardown).
|
|
73
38
|
// These are strictly "checked" errors (not exported and never propagated).
|
|
@@ -103,24 +68,31 @@ class TxSimTeardownRevert extends Error {
|
|
|
103
68
|
}
|
|
104
69
|
}
|
|
105
70
|
|
|
71
|
+
/** Only used internally. */
|
|
72
|
+
type ProcessedPhase = {
|
|
73
|
+
phase: TxExecutionPhase;
|
|
74
|
+
durationMs?: number;
|
|
75
|
+
returnValues: NestedProcessReturnValues[];
|
|
76
|
+
reverted: boolean;
|
|
77
|
+
revertReason?: SimulationError;
|
|
78
|
+
};
|
|
79
|
+
|
|
106
80
|
export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
107
81
|
protected log: Logger;
|
|
108
|
-
|
|
82
|
+
protected readonly config: PublicSimulatorConfig;
|
|
83
|
+
protected readonly bindings?: LoggerBindings;
|
|
109
84
|
|
|
110
85
|
constructor(
|
|
111
86
|
protected merkleTree: MerkleTreeWriteOperations,
|
|
112
87
|
protected contractsDB: PublicContractsDB,
|
|
113
88
|
protected globalVariables: GlobalVariables,
|
|
114
|
-
config?: Partial<
|
|
89
|
+
config?: Partial<PublicSimulatorConfig>,
|
|
90
|
+
protected protocolContracts: ProtocolContracts = ProtocolContractsList,
|
|
91
|
+
bindings?: LoggerBindings,
|
|
115
92
|
) {
|
|
116
|
-
this.config = {
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
skipFeeEnforcement: config?.skipFeeEnforcement ?? false,
|
|
120
|
-
clientInitiatedSimulation: config?.clientInitiatedSimulation ?? false,
|
|
121
|
-
maxDebugLogMemoryReads: config?.maxDebugLogMemoryReads ?? DEFAULT_MAX_DEBUG_LOG_MEMORY_READS,
|
|
122
|
-
};
|
|
123
|
-
this.log = createLogger(`simulator:public_tx_simulator`);
|
|
93
|
+
this.config = PublicSimulatorConfig.from(config ?? {});
|
|
94
|
+
this.bindings = bindings;
|
|
95
|
+
this.log = createLogger(`simulator:public_tx_simulator`, bindings);
|
|
124
96
|
}
|
|
125
97
|
|
|
126
98
|
/**
|
|
@@ -129,136 +101,145 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
129
101
|
* @returns The result of the transaction's public execution.
|
|
130
102
|
*/
|
|
131
103
|
public async simulate(tx: Tx): Promise<PublicTxResult> {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
this.log.debug(`Simulating ${tx.publicFunctionCalldata.length} public calls for tx ${txHash}`, { txHash });
|
|
135
|
-
|
|
136
|
-
// Create hinting DBs.
|
|
137
|
-
const hints = new AvmExecutionHints(
|
|
138
|
-
this.globalVariables,
|
|
139
|
-
AvmTxHint.fromTx(tx, this.globalVariables.gasFees),
|
|
140
|
-
ProtocolContractsList, // imported from file
|
|
141
|
-
);
|
|
142
|
-
const hintingMerkleTree = await HintingMerkleWriteOperations.create(this.merkleTree, hints);
|
|
143
|
-
const hintingTreesDB = new PublicTreesDB(hintingMerkleTree);
|
|
144
|
-
const hintingContractsDB = new HintingPublicContractsDB(this.contractsDB, hints);
|
|
145
|
-
|
|
146
|
-
const context = await PublicTxContext.create(
|
|
147
|
-
hintingTreesDB,
|
|
148
|
-
hintingContractsDB,
|
|
149
|
-
tx,
|
|
150
|
-
this.globalVariables,
|
|
151
|
-
ProtocolContractsList, // imported from file
|
|
152
|
-
this.config.doMerkleOperations,
|
|
153
|
-
this.config.proverId,
|
|
154
|
-
);
|
|
104
|
+
const txHash = this.computeTxHash(tx);
|
|
105
|
+
this.log.debug(`Simulating ${tx.publicFunctionCalldata.length} public calls for tx ${txHash}`, { txHash });
|
|
155
106
|
|
|
156
|
-
|
|
107
|
+
// Create hinting DBs.
|
|
108
|
+
const hints = new AvmExecutionHints(
|
|
109
|
+
this.globalVariables,
|
|
110
|
+
AvmTxHint.fromTx(tx, this.globalVariables.gasFees),
|
|
111
|
+
this.protocolContracts,
|
|
112
|
+
);
|
|
113
|
+
const hintingMerkleTree = await HintingMerkleWriteOperations.create(this.merkleTree, hints);
|
|
114
|
+
const hintingTreesDB = new PublicTreesDB(hintingMerkleTree);
|
|
115
|
+
const hintingContractsDB = new HintingPublicContractsDB(this.contractsDB, hints);
|
|
116
|
+
|
|
117
|
+
const context = await PublicTxContext.create(
|
|
118
|
+
hintingTreesDB,
|
|
119
|
+
hintingContractsDB,
|
|
120
|
+
tx,
|
|
121
|
+
this.globalVariables,
|
|
122
|
+
this.protocolContracts,
|
|
123
|
+
this.config.proverId,
|
|
124
|
+
this.bindings,
|
|
125
|
+
);
|
|
126
|
+
|
|
127
|
+
// This will throw if there is a nullifier collision.
|
|
128
|
+
// In that case the transaction will be thrown out.
|
|
129
|
+
await this.insertNonRevertiblesFromPrivate(context);
|
|
130
|
+
|
|
131
|
+
const processedPhases: ProcessedPhase[] = [];
|
|
132
|
+
if (context.hasPhase(TxExecutionPhase.SETUP)) {
|
|
133
|
+
// This will throw if the setup phase reverts.
|
|
157
134
|
// In that case the transaction will be thrown out.
|
|
158
|
-
await this.
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
// In that case the transaction will be thrown out.
|
|
164
|
-
const setupResult = await this.simulatePhase(TxExecutionPhase.SETUP, context);
|
|
165
|
-
if (setupResult.reverted) {
|
|
166
|
-
throw new Error(
|
|
167
|
-
`Setup phase reverted! The transaction will be thrown out. ${setupResult.revertReason?.message}`,
|
|
168
|
-
);
|
|
169
|
-
}
|
|
170
|
-
processedPhases.push(setupResult);
|
|
135
|
+
const setupResult = await this.simulatePhase(TxExecutionPhase.SETUP, context);
|
|
136
|
+
if (setupResult.reverted) {
|
|
137
|
+
throw new Error(
|
|
138
|
+
`[SETUP] UNRECOVERABLE ERROR! The transaction will be thrown out. ${setupResult.revertReason?.message}`,
|
|
139
|
+
);
|
|
171
140
|
}
|
|
141
|
+
processedPhases.push(setupResult);
|
|
142
|
+
}
|
|
172
143
|
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
try {
|
|
177
|
-
// This will throw if there is a nullifier collision or other insertion error (limit reached).
|
|
178
|
-
await this.insertRevertiblesFromPrivate(context, tx);
|
|
144
|
+
// The checkpoint we should go back to if anything from now on reverts.
|
|
145
|
+
await context.state.fork();
|
|
146
|
+
hintingContractsDB.createCheckpoint();
|
|
179
147
|
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
if (
|
|
190
|
-
|
|
191
|
-
await context.state.discardForkedState();
|
|
192
|
-
// But we also create a new fork so that the teardown phase can transparently
|
|
193
|
-
// commit or rollback at the end of teardown.
|
|
194
|
-
await context.state.fork();
|
|
195
|
-
} else {
|
|
196
|
-
// Unchecked/unknown error - re-throw as-is
|
|
197
|
-
throw e;
|
|
148
|
+
try {
|
|
149
|
+
// This may throw: a side-effect limit error triggers a soft revert (caught below), while a
|
|
150
|
+
// nullifier collision is unrecoverable and propagates out of simulate() to throw out the tx.
|
|
151
|
+
await this.insertRevertiblesFromPrivate(context);
|
|
152
|
+
|
|
153
|
+
// Only proceed with app logic if there was no revert during revertible insertion.
|
|
154
|
+
if (context.hasPhase(TxExecutionPhase.APP_LOGIC)) {
|
|
155
|
+
const appLogicResult = await this.simulatePhase(TxExecutionPhase.APP_LOGIC, context);
|
|
156
|
+
processedPhases.push(appLogicResult);
|
|
157
|
+
if (appLogicResult.reverted) {
|
|
158
|
+
throw new TxSimAppLogicRevert();
|
|
198
159
|
}
|
|
199
160
|
}
|
|
161
|
+
} catch (e: any) {
|
|
162
|
+
if (e instanceof TxSimRevertibleInsertionsRevert || e instanceof TxSimAppLogicRevert) {
|
|
163
|
+
// We revert to the post-setup state.
|
|
164
|
+
await context.state.discardForkedState();
|
|
165
|
+
hintingContractsDB.revertCheckpoint();
|
|
166
|
+
// But we also create a new fork so that the teardown phase can transparently
|
|
167
|
+
// commit or rollback at the end of teardown.
|
|
168
|
+
await context.state.fork();
|
|
169
|
+
hintingContractsDB.createCheckpoint();
|
|
170
|
+
} else {
|
|
171
|
+
// Unchecked/unknown error - re-throw as-is
|
|
172
|
+
throw e;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
200
175
|
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
}
|
|
208
|
-
}
|
|
209
|
-
// We commit the forked state and we are done.
|
|
210
|
-
await context.state.mergeForkedState();
|
|
211
|
-
} catch (e: any) {
|
|
212
|
-
if (e instanceof TxSimTeardownRevert) {
|
|
213
|
-
// We revert to the post-setup state and we are done.
|
|
214
|
-
await context.state.discardForkedState();
|
|
215
|
-
} else {
|
|
216
|
-
// Unchecked/unknown error - re-throw as-is
|
|
217
|
-
throw e;
|
|
176
|
+
try {
|
|
177
|
+
if (context.hasPhase(TxExecutionPhase.TEARDOWN)) {
|
|
178
|
+
const teardownResult = await this.simulatePhase(TxExecutionPhase.TEARDOWN, context);
|
|
179
|
+
processedPhases.push(teardownResult);
|
|
180
|
+
if (teardownResult.reverted) {
|
|
181
|
+
throw new TxSimTeardownRevert();
|
|
218
182
|
}
|
|
219
183
|
}
|
|
184
|
+
// We commit the forked state and we are done.
|
|
185
|
+
await context.state.mergeForkedState();
|
|
186
|
+
hintingContractsDB.commitCheckpoint();
|
|
187
|
+
} catch (e: any) {
|
|
188
|
+
if (e instanceof TxSimTeardownRevert) {
|
|
189
|
+
// We revert to the post-setup state and we are done.
|
|
190
|
+
await context.state.discardForkedState();
|
|
191
|
+
hintingContractsDB.revertCheckpoint();
|
|
192
|
+
} else {
|
|
193
|
+
// Unchecked/unknown error - re-throw as-is
|
|
194
|
+
throw e;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
220
197
|
|
|
221
|
-
|
|
198
|
+
context.halt();
|
|
222
199
|
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
this.contractsDB.commitContractsForTx(/*onlyNonRevertibles=*/ !revertCode.isOK());
|
|
241
|
-
|
|
242
|
-
return {
|
|
243
|
-
avmProvingRequest,
|
|
244
|
-
gasUsed: {
|
|
245
|
-
totalGas: context.getActualGasUsed(),
|
|
246
|
-
teardownGas: context.teardownGasUsed,
|
|
247
|
-
publicGas: context.getActualPublicGasUsed(),
|
|
248
|
-
billedGas: context.getTotalGasUsed(),
|
|
249
|
-
},
|
|
250
|
-
revertCode,
|
|
251
|
-
revertReason: context.revertReason,
|
|
252
|
-
processedPhases: processedPhases,
|
|
253
|
-
logs: context.state.getActiveStateManager().getLogs(),
|
|
254
|
-
};
|
|
255
|
-
} finally {
|
|
256
|
-
// Make sure there are no new contracts in the tx-level cache.
|
|
257
|
-
// They should either be committed to block-level cache or cleared.
|
|
258
|
-
// FIXME(fcarreiro): this should conceptually use the hinted contracts db.
|
|
259
|
-
// However things should work as they are now because the hinted db would still pick up the new contracts.
|
|
260
|
-
this.contractsDB.clearContractsForTx();
|
|
200
|
+
// Such transactions should be filtered by GasTxValidator.
|
|
201
|
+
assert(
|
|
202
|
+
context.getActualGasUsed().l2Gas <= MAX_PROCESSABLE_L2_GAS,
|
|
203
|
+
`Transaction consumes ${context.getActualGasUsed().l2Gas} L2 gas, which exceeds the maximum processable gas of ${MAX_PROCESSABLE_L2_GAS}`,
|
|
204
|
+
);
|
|
205
|
+
await this.payFee(context);
|
|
206
|
+
|
|
207
|
+
const publicInputs = await context.generateAvmCircuitPublicInputs();
|
|
208
|
+
const revertCode = context.getFinalRevertCode();
|
|
209
|
+
|
|
210
|
+
// We only return the app logic phase information, and only 1 per phase.
|
|
211
|
+
const appLogicReturnValues: NestedProcessReturnValues[] =
|
|
212
|
+
processedPhases.find(({ phase }) => phase === TxExecutionPhase.APP_LOGIC)?.returnValues ?? [];
|
|
213
|
+
|
|
214
|
+
// TODO(fcarreiro): This is a temporary backwards compatibility layer until we migrate to the C++ simulator.
|
|
215
|
+
if (context.revertReason !== undefined) {
|
|
216
|
+
(appLogicReturnValues as any).revertReason = context.revertReason;
|
|
261
217
|
}
|
|
218
|
+
|
|
219
|
+
// Create PublicTxEffect from PublicInputs.
|
|
220
|
+
const publicTxEffect = new PublicTxEffect(
|
|
221
|
+
publicInputs.transactionFee,
|
|
222
|
+
publicInputs.accumulatedData.noteHashes.filter(h => !h.isEmpty()),
|
|
223
|
+
publicInputs.accumulatedData.nullifiers.filter(n => !n.isEmpty()),
|
|
224
|
+
publicInputs.accumulatedData.l2ToL1Msgs.filter(m => !m.isEmpty()),
|
|
225
|
+
publicInputs.accumulatedData.publicLogs.toLogs(),
|
|
226
|
+
publicInputs.accumulatedData.publicDataWrites.filter(w => !w.isEmpty()),
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
return new PublicTxResult(
|
|
230
|
+
/*gasUsed=*/ {
|
|
231
|
+
totalGas: context.getActualGasUsed(),
|
|
232
|
+
teardownGas: context.teardownGasUsed,
|
|
233
|
+
publicGas: context.getActualPublicGasUsed(),
|
|
234
|
+
billedGas: context.getTotalGasUsed(),
|
|
235
|
+
},
|
|
236
|
+
/*revertCode=*/ revertCode,
|
|
237
|
+
/*publicTxEffect=*/ publicTxEffect,
|
|
238
|
+
/*callStackMetadata=*/ appLogicReturnValues,
|
|
239
|
+
/*logs=*/ context.state.getActiveStateManager().getLogs(),
|
|
240
|
+
/*hints=*/ hints,
|
|
241
|
+
/*publicInputs=*/ publicInputs,
|
|
242
|
+
);
|
|
262
243
|
}
|
|
263
244
|
|
|
264
245
|
protected computeTxHash(tx: Tx) {
|
|
@@ -291,7 +272,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
291
272
|
|
|
292
273
|
const enqueuedCallResult = await this.simulateEnqueuedCall(phase, context, callRequest);
|
|
293
274
|
|
|
294
|
-
returnValues.push(new NestedProcessReturnValues(enqueuedCallResult.output));
|
|
275
|
+
returnValues.push(new NestedProcessReturnValues(enqueuedCallResult.output.bestEffortReadAll()));
|
|
295
276
|
|
|
296
277
|
if (enqueuedCallResult.reverted) {
|
|
297
278
|
reverted = true;
|
|
@@ -321,7 +302,11 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
321
302
|
): Promise<AvmFinalizedCallResult> {
|
|
322
303
|
const stateManager = context.state.getActiveStateManager();
|
|
323
304
|
const contractAddress = callRequest.request.contractAddress;
|
|
324
|
-
const fnName = await getPublicFunctionDebugName(
|
|
305
|
+
const fnName = await getPublicFunctionDebugName(
|
|
306
|
+
this.contractsDB,
|
|
307
|
+
contractAddress,
|
|
308
|
+
new CallDataArray(callRequest.calldata),
|
|
309
|
+
);
|
|
325
310
|
|
|
326
311
|
const allocatedGas = context.getGasLeftAtPhase(phase);
|
|
327
312
|
|
|
@@ -340,7 +325,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
340
325
|
);
|
|
341
326
|
|
|
342
327
|
if (result.reverted) {
|
|
343
|
-
const culprit = `${contractAddress}:${
|
|
328
|
+
const culprit = `${contractAddress}:${fnName}`;
|
|
344
329
|
context.revert(phase, result.revertReason, culprit);
|
|
345
330
|
}
|
|
346
331
|
|
|
@@ -381,10 +366,9 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
381
366
|
transactionFee,
|
|
382
367
|
this.globalVariables,
|
|
383
368
|
request.isStaticCall,
|
|
384
|
-
calldata,
|
|
369
|
+
new CallDataArray(calldata),
|
|
385
370
|
allocatedGas,
|
|
386
|
-
this.config
|
|
387
|
-
this.config.maxDebugLogMemoryReads,
|
|
371
|
+
this.config,
|
|
388
372
|
);
|
|
389
373
|
const avmCallResult = await simulator.execute();
|
|
390
374
|
return avmCallResult.finalize();
|
|
@@ -393,7 +377,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
393
377
|
/**
|
|
394
378
|
* Insert the non-revertible accumulated data from private into the public state.
|
|
395
379
|
*/
|
|
396
|
-
protected async insertNonRevertiblesFromPrivate(context: PublicTxContext
|
|
380
|
+
protected async insertNonRevertiblesFromPrivate(context: PublicTxContext) {
|
|
397
381
|
const stateManager = context.state.getActiveStateManager();
|
|
398
382
|
|
|
399
383
|
for (const siloedNullifier of context.nonRevertibleAccumulatedDataFromPrivate.nullifiers.filter(
|
|
@@ -412,11 +396,12 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
412
396
|
}
|
|
413
397
|
}
|
|
414
398
|
|
|
415
|
-
// add new contracts to the contracts db so that their
|
|
416
|
-
//
|
|
417
|
-
//
|
|
418
|
-
//
|
|
419
|
-
|
|
399
|
+
// add new contracts to the contracts db so that their code may be found and called
|
|
400
|
+
// FIXME(fcarreiro): this should conceptually use the hinting contracts db.
|
|
401
|
+
// However, things work as expected because later calls to getters on the hintingContractsDB
|
|
402
|
+
// will pick up the new contracts and will generate the necessary hints.
|
|
403
|
+
// So, a consumer of the hints will always see the new contracts.
|
|
404
|
+
this.contractsDB.addContractsFromLogs(context.nonRevertibleContractDeploymentData);
|
|
420
405
|
}
|
|
421
406
|
|
|
422
407
|
/**
|
|
@@ -424,11 +409,15 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
424
409
|
* Throws TxSimRevertibleInsertionsRevert if there is some checked error during revertible insertions.
|
|
425
410
|
* This function checks for the following errors:
|
|
426
411
|
* - NullifierLimitReachedError
|
|
427
|
-
* - NullifierCollisionError
|
|
428
412
|
* - NoteHashLimitReachedError
|
|
429
413
|
* - L2ToL1MessageLimitReachedError
|
|
414
|
+
*
|
|
415
|
+
* Note: NullifierCollisionError is intentionally NOT caught here. A nullifier collision
|
|
416
|
+
* during revertible insertions is unprovable (the nullifier originated from private, so
|
|
417
|
+
* a collision indicates the tx should never have been proposed). It propagates as-is to
|
|
418
|
+
* make the transaction unrecoverable, matching the AVM circuit behavior.
|
|
430
419
|
*/
|
|
431
|
-
protected async insertRevertiblesFromPrivate(context: PublicTxContext
|
|
420
|
+
protected async insertRevertiblesFromPrivate(context: PublicTxContext) {
|
|
432
421
|
const stateManager = context.state.getActiveStateManager();
|
|
433
422
|
|
|
434
423
|
try {
|
|
@@ -436,7 +425,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
436
425
|
await stateManager.writeSiloedNullifier(siloedNullifier);
|
|
437
426
|
}
|
|
438
427
|
} catch (e: any) {
|
|
439
|
-
if (e instanceof NullifierLimitReachedError
|
|
428
|
+
if (e instanceof NullifierLimitReachedError) {
|
|
440
429
|
context.revert(
|
|
441
430
|
TxExecutionPhase.APP_LOGIC,
|
|
442
431
|
new SimulationError(
|
|
@@ -446,7 +435,7 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
446
435
|
);
|
|
447
436
|
throw new TxSimRevertibleInsertionsRevert();
|
|
448
437
|
} else {
|
|
449
|
-
// Unchecked/unknown error - re-throw as-is
|
|
438
|
+
// Unchecked/unknown error or NullifierCollisionError (unrecoverable) - re-throw as-is
|
|
450
439
|
throw e;
|
|
451
440
|
}
|
|
452
441
|
}
|
|
@@ -497,16 +486,21 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
497
486
|
}
|
|
498
487
|
|
|
499
488
|
// add new contracts to the contracts db so that their functions may be found and called
|
|
500
|
-
// FIXME(fcarreiro): this should conceptually use the
|
|
501
|
-
// However things
|
|
502
|
-
|
|
489
|
+
// FIXME(fcarreiro): this should conceptually use the hinting contracts db.
|
|
490
|
+
// However, things work as expected because later calls to getters on the hintingContractsDB
|
|
491
|
+
// will pick up the new contracts and will generate the necessary hints.
|
|
492
|
+
// So, a consumer of the hints will always see the new contracts.
|
|
493
|
+
this.contractsDB.addContractsFromLogs(context.revertibleContractDeploymentData);
|
|
503
494
|
}
|
|
504
495
|
|
|
505
496
|
private async payFee(context: PublicTxContext) {
|
|
506
497
|
const txFee = context.getTransactionFee(TxExecutionPhase.TEARDOWN);
|
|
507
498
|
|
|
508
499
|
if (context.feePayer.isZero()) {
|
|
509
|
-
|
|
500
|
+
// Real transactions are enforced by private kernel to have nonzero fee payer.
|
|
501
|
+
// Real transactions cannot skip fee enforcement (skipping fee enforcement makes them unprovable).
|
|
502
|
+
assert(this.config.skipFeeEnforcement, 'Fee payer cannot be 0 unless skipping fee enforcement for simulation');
|
|
503
|
+
this.log.debug(`Fee payer is 0. Skipping fee enforcement. No one is paying the fee of ${txFee.toBigInt()}`);
|
|
510
504
|
return;
|
|
511
505
|
}
|
|
512
506
|
|
|
@@ -526,23 +520,12 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
|
|
|
526
520
|
this.config.skipFeeEnforcement,
|
|
527
521
|
`Not enough balance for fee payer to pay for transaction (got ${currentBalance.toBigInt()} needs ${txFee.toBigInt()})`,
|
|
528
522
|
);
|
|
523
|
+
this.log.debug(`Fee payer balance insufficient, but we're skipping fee enforcement`);
|
|
524
|
+
// We still proceed and perform the storage write to minimize deviation from normal execution.
|
|
529
525
|
currentBalance = txFee;
|
|
530
526
|
}
|
|
531
527
|
|
|
532
528
|
const updatedBalance = currentBalance.sub(txFee);
|
|
533
529
|
await stateManager.writeStorage(feeJuiceAddress, balanceSlot, updatedBalance, true);
|
|
534
530
|
}
|
|
535
|
-
|
|
536
|
-
/**
|
|
537
|
-
* Generate the proving request for the AVM circuit.
|
|
538
|
-
*/
|
|
539
|
-
private static generateProvingRequest(
|
|
540
|
-
publicInputs: AvmCircuitPublicInputs,
|
|
541
|
-
hints: AvmExecutionHints,
|
|
542
|
-
): AvmProvingRequest {
|
|
543
|
-
return {
|
|
544
|
-
type: ProvingRequestType.PUBLIC_VM,
|
|
545
|
-
inputs: new AvmCircuitInputs(hints, publicInputs),
|
|
546
|
-
};
|
|
547
|
-
}
|
|
548
531
|
}
|
|
@@ -1,11 +1,33 @@
|
|
|
1
|
+
import type { PublicTxResult } from '@aztec/stdlib/avm';
|
|
1
2
|
import type { Tx } from '@aztec/stdlib/tx';
|
|
2
3
|
|
|
3
|
-
import type { PublicTxResult } from './public_tx_simulator.js';
|
|
4
|
-
|
|
5
4
|
export interface PublicTxSimulatorInterface {
|
|
6
5
|
simulate(tx: Tx): Promise<PublicTxResult>;
|
|
6
|
+
/**
|
|
7
|
+
* Cancel the current simulation if one is in progress.
|
|
8
|
+
* This signals the underlying simulator (e.g., C++) to stop at the next safe point.
|
|
9
|
+
* Safe to call even if no simulation is in progress.
|
|
10
|
+
* Optional - not all implementations support cancellation.
|
|
11
|
+
*
|
|
12
|
+
* @param waitTimeoutMs - If provided, wait up to this many ms for the simulation to actually stop.
|
|
13
|
+
* This is important because signaling cancellation doesn't immediately stop C++ -
|
|
14
|
+
* it only sets a flag that C++ checks at certain points. If C++ is in the middle
|
|
15
|
+
* of a slow operation (e.g., pad_trees), it won't stop until that completes.
|
|
16
|
+
* @returns Promise that resolves when cancellation is signaled (and optionally when simulation stops)
|
|
17
|
+
*/
|
|
18
|
+
cancel?(waitTimeoutMs?: number): Promise<void>;
|
|
7
19
|
}
|
|
8
20
|
|
|
9
21
|
export interface MeasuredPublicTxSimulatorInterface {
|
|
10
22
|
simulate(tx: Tx, txLabel: string): Promise<PublicTxResult>;
|
|
23
|
+
/**
|
|
24
|
+
* Cancel the current simulation if one is in progress.
|
|
25
|
+
* This signals the underlying simulator (e.g., C++) to stop at the next safe point.
|
|
26
|
+
* Safe to call even if no simulation is in progress.
|
|
27
|
+
* Optional - not all implementations support cancellation.
|
|
28
|
+
*
|
|
29
|
+
* @param waitTimeoutMs - If provided, wait up to this many ms for the simulation to actually stop.
|
|
30
|
+
* @returns Promise that resolves when cancellation is signaled (and optionally when simulation stops)
|
|
31
|
+
*/
|
|
32
|
+
cancel?(waitTimeoutMs?: number): Promise<void>;
|
|
11
33
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { Fr } from '@aztec/foundation/
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import type { PublicSimulatorConfig } from '@aztec/stdlib/avm';
|
|
2
3
|
import type { Gas } from '@aztec/stdlib/gas';
|
|
3
4
|
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/trees';
|
|
4
5
|
import { type GlobalVariables, PublicCallRequestWithCalldata, TxExecutionPhase } from '@aztec/stdlib/tx';
|
|
@@ -10,7 +11,6 @@ import type { PublicContractsDB } from '../public_db_sources.js';
|
|
|
10
11
|
import type { PublicPersistableStateManager } from '../state_manager/state_manager.js';
|
|
11
12
|
import { MeasuredPublicTxSimulator } from './measured_public_tx_simulator.js';
|
|
12
13
|
import { PublicTxContext } from './public_tx_context.js';
|
|
13
|
-
import type { PublicTxSimulatorConfig } from './public_tx_simulator.js';
|
|
14
14
|
|
|
15
15
|
/**
|
|
16
16
|
* A public tx simulator that tracks runtime/production metrics with telemetry.
|
|
@@ -24,7 +24,7 @@ export class TelemetryPublicTxSimulator extends MeasuredPublicTxSimulator {
|
|
|
24
24
|
contractsDB: PublicContractsDB,
|
|
25
25
|
globalVariables: GlobalVariables,
|
|
26
26
|
telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
27
|
-
config?: Partial<
|
|
27
|
+
config?: Partial<PublicSimulatorConfig>,
|
|
28
28
|
) {
|
|
29
29
|
const metrics = new ExecutorMetrics(telemetryClient, 'PublicTxSimulator');
|
|
30
30
|
super(merkleTree, contractsDB, globalVariables, metrics, config);
|
|
@@ -7,9 +7,9 @@ import {
|
|
|
7
7
|
MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
8
8
|
PROTOCOL_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
|
|
9
9
|
} from '@aztec/constants';
|
|
10
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
10
11
|
import { EthAddress } from '@aztec/foundation/eth-address';
|
|
11
|
-
import {
|
|
12
|
-
import { type LogLevel, createLogger } from '@aztec/foundation/log';
|
|
12
|
+
import { type LogLevel, type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
13
13
|
import { PublicDataUpdateRequest } from '@aztec/stdlib/avm';
|
|
14
14
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
15
15
|
import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
|
|
@@ -61,7 +61,7 @@ export class SideEffectArrayLengths {
|
|
|
61
61
|
* Trace side effects for an enqueued public call's execution.
|
|
62
62
|
*/
|
|
63
63
|
export class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
64
|
-
public log
|
|
64
|
+
public log: Logger;
|
|
65
65
|
|
|
66
66
|
/** The side effect counter increments with every call to the trace. */
|
|
67
67
|
private sideEffectCounter: number;
|
|
@@ -79,6 +79,7 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
79
79
|
constructor(
|
|
80
80
|
/** The counter of this trace's first side effect. */
|
|
81
81
|
public readonly startSideEffectCounter: number = 0,
|
|
82
|
+
bindings?: LoggerBindings,
|
|
82
83
|
/** Track parent's (or previous kernel's) lengths so the AVM can properly enforce TX-wide limits,
|
|
83
84
|
* otherwise the public kernel can fail to prove because TX limits are breached.
|
|
84
85
|
*/
|
|
@@ -90,11 +91,13 @@ export class SideEffectTrace implements PublicSideEffectTraceInterface {
|
|
|
90
91
|
private debugLogMemoryReads: number = 0,
|
|
91
92
|
) {
|
|
92
93
|
this.sideEffectCounter = startSideEffectCounter;
|
|
94
|
+
this.log = createLogger('simulator:side_effect_trace', bindings);
|
|
93
95
|
}
|
|
94
96
|
|
|
95
97
|
public fork() {
|
|
96
98
|
return new SideEffectTrace(
|
|
97
99
|
this.sideEffectCounter,
|
|
100
|
+
this.log.getBindings(),
|
|
98
101
|
new SideEffectArrayLengths(
|
|
99
102
|
this.previousSideEffectArrayLengths.publicDataWrites + this.userPublicDataWritesLength,
|
|
100
103
|
this.previousSideEffectArrayLengths.protocolPublicDataWrites + this.protocolPublicDataWritesLength,
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { Fr } from '@aztec/foundation/
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
2
|
import type { LogLevel } from '@aztec/foundation/log';
|
|
3
3
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
4
|
import type { DebugLog } from '@aztec/stdlib/logs';
|