@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.017a351
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 +12 -4
- package/dest/client.d.ts +6 -4
- package/dest/client.d.ts.map +1 -1
- package/dest/client.js +4 -2
- package/dest/common/errors.d.ts +6 -9
- package/dest/common/errors.d.ts.map +1 -1
- package/dest/common/errors.js +51 -32
- package/dest/common/index.d.ts +1 -2
- package/dest/common/index.d.ts.map +1 -1
- package/dest/common/index.js +0 -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 +15 -7
- package/dest/private/acvm/acvm.d.ts.map +1 -1
- package/dest/private/acvm/acvm.js +14 -19
- package/dest/private/acvm/acvm_types.d.ts +2 -2
- package/dest/private/acvm/acvm_types.d.ts.map +1 -1
- package/dest/private/acvm/deserialize.d.ts +19 -20
- package/dest/private/acvm/deserialize.d.ts.map +1 -1
- package/dest/private/acvm/deserialize.js +32 -24
- package/dest/private/acvm/index.d.ts +1 -2
- package/dest/private/acvm/index.d.ts.map +1 -1
- package/dest/private/acvm/index.js +0 -1
- package/dest/private/acvm/serialize.d.ts +21 -4
- package/dest/private/acvm/serialize.d.ts.map +1 -1
- package/dest/private/acvm/serialize.js +54 -1
- package/dest/private/acvm_native.d.ts +41 -0
- package/dest/private/acvm_native.d.ts.map +1 -0
- package/dest/private/{providers/acvm_native.js → acvm_native.js} +34 -26
- package/dest/private/acvm_wasm.d.ts +16 -0
- package/dest/private/acvm_wasm.d.ts.map +1 -0
- package/dest/private/acvm_wasm.js +67 -0
- package/dest/private/acvm_wasm_with_blobs.d.ts +20 -0
- package/dest/private/acvm_wasm_with_blobs.d.ts.map +1 -0
- package/dest/private/acvm_wasm_with_blobs.js +35 -0
- package/dest/private/circuit_recording/circuit_recorder.d.ts +109 -0
- package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
- package/dest/private/circuit_recording/circuit_recorder.js +212 -0
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts +32 -0
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -0
- package/dest/private/circuit_recording/file_circuit_recorder.js +135 -0
- package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +10 -0
- package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -0
- package/dest/private/circuit_recording/memory_circuit_recorder.js +9 -0
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts +21 -0
- package/dest/private/circuit_recording/simulator_recorder_wrapper.d.ts.map +1 -0
- package/dest/private/circuit_recording/simulator_recorder_wrapper.js +44 -0
- package/dest/private/circuit_simulator.d.ts +35 -0
- package/dest/private/circuit_simulator.d.ts.map +1 -0
- package/dest/private/circuit_simulator.js +43 -0
- package/dest/private/factory.d.ts +12 -0
- package/dest/private/factory.d.ts.map +1 -0
- package/dest/private/{providers/factory.js → factory.js} +8 -5
- package/dest/public/avm/avm_context.d.ts +8 -8
- package/dest/public/avm/avm_context.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.d.ts +8 -6
- package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.js +12 -8
- package/dest/public/avm/avm_execution_environment.d.ts +9 -6
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/public/avm/avm_execution_environment.js +5 -3
- package/dest/public/avm/avm_gas.d.ts +5 -21
- package/dest/public/avm/avm_gas.d.ts.map +1 -1
- package/dest/public/avm/avm_gas.js +29 -37
- package/dest/public/avm/avm_machine_state.d.ts +9 -6
- package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/public/avm/avm_machine_state.js +5 -2
- package/dest/public/avm/avm_memory_types.d.ts +100 -89
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/public/avm/avm_memory_types.js +21 -7
- package/dest/public/avm/avm_simulator.d.ts +8 -7
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +33 -43
- package/dest/public/avm/avm_simulator_interface.d.ts +9 -0
- package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -0
- package/dest/public/avm/avm_simulator_interface.js +3 -0
- 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 +11 -29
- package/dest/public/avm/errors.d.ts.map +1 -1
- package/dest/public/avm/errors.js +19 -57
- 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 +6 -5
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/avm_simulation_tester.js +26 -18
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +9 -6
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +53 -15
- package/dest/public/avm/fixtures/initializers.d.ts +42 -0
- package/dest/public/avm/fixtures/initializers.d.ts.map +1 -0
- package/dest/public/avm/fixtures/initializers.js +45 -0
- package/dest/public/avm/fixtures/utils.d.ts +39 -0
- package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
- package/dest/public/avm/fixtures/utils.js +99 -0
- package/dest/public/avm/index.d.ts +1 -3
- package/dest/public/avm/index.d.ts.map +1 -1
- package/dest/public/avm/index.js +0 -2
- package/dest/public/avm/opcodes/accrued_substate.d.ts +18 -19
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +61 -59
- package/dest/public/avm/opcodes/addressing_mode.d.ts +12 -8
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/public/avm/opcodes/addressing_mode.js +46 -26
- package/dest/public/avm/opcodes/arithmetic.d.ts +14 -2
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/public/avm/opcodes/arithmetic.js +27 -3
- package/dest/public/avm/opcodes/bitwise.d.ts +8 -16
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/public/avm/opcodes/bitwise.js +22 -29
- 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 +3 -3
- package/dest/public/avm/opcodes/contract.d.ts +5 -5
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +16 -13
- 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 +13 -11
- package/dest/public/avm/opcodes/conversion.d.ts +4 -3
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +270 -6
- 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 +28 -33
- 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 +20 -22
- package/dest/public/avm/opcodes/external_calls.d.ts +14 -13
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +52 -46
- 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 +24 -19
- package/dest/public/avm/opcodes/index.d.ts +1 -1
- package/dest/public/avm/opcodes/instruction.d.ts +15 -11
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/public/avm/opcodes/instruction.js +23 -19
- 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 +15 -15
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.js +52 -48
- package/dest/public/avm/opcodes/misc.d.ts +4 -3
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/public/avm/opcodes/misc.js +42 -17
- 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 +39 -27
- package/dest/public/avm/revert_reason.d.ts +18 -0
- package/dest/public/avm/revert_reason.d.ts.map +1 -0
- package/dest/public/avm/revert_reason.js +39 -0
- package/dest/public/avm/serialization/buffer_cursor.d.ts +1 -3
- package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.d.ts +3 -7
- package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.js +81 -77
- package/dest/public/avm/serialization/instruction_serialization.d.ts +15 -6
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/instruction_serialization.js +71 -36
- package/dest/public/avm/test_utils.d.ts +12 -15
- package/dest/public/avm/test_utils.d.ts.map +1 -1
- package/dest/public/avm/test_utils.js +17 -25
- 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 +68 -0
- package/dest/public/db_interfaces.d.ts.map +1 -0
- package/dest/public/db_interfaces.js +3 -0
- package/dest/public/debug_fn_name.d.ts +18 -0
- package/dest/public/debug_fn_name.d.ts.map +1 -0
- package/dest/public/debug_fn_name.js +37 -0
- package/dest/public/executor_metrics.d.ts +12 -4
- package/dest/public/executor_metrics.d.ts.map +1 -1
- package/dest/public/executor_metrics.js +33 -23
- package/dest/public/executor_metrics_interface.d.ts +10 -0
- package/dest/public/executor_metrics_interface.d.ts.map +1 -0
- package/dest/public/executor_metrics_interface.js +1 -0
- package/dest/public/fixtures/amm_test.d.ts +10 -0
- package/dest/public/fixtures/amm_test.d.ts.map +1 -0
- package/dest/public/fixtures/amm_test.js +213 -0
- package/dest/public/fixtures/bulk_test.d.ts +6 -0
- package/dest/public/fixtures/bulk_test.d.ts.map +1 -0
- package/dest/public/fixtures/bulk_test.js +289 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +34 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tester.js +53 -0
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +14 -0
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tests.js +234 -0
- package/dest/public/fixtures/index.d.ts +10 -1
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +9 -0
- package/dest/public/fixtures/minimal_public_tx.d.ts +4 -0
- package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
- package/dest/public/fixtures/minimal_public_tx.js +19 -0
- 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 +56 -15
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +164 -71
- package/dest/public/fixtures/simple_contract_data_source.d.ts +36 -0
- package/dest/public/fixtures/simple_contract_data_source.d.ts.map +1 -0
- package/dest/public/{avm/fixtures → fixtures}/simple_contract_data_source.js +31 -10
- package/dest/public/fixtures/token_test.d.ts +12 -0
- package/dest/public/fixtures/token_test.d.ts.map +1 -0
- package/dest/public/fixtures/token_test.js +96 -0
- package/dest/public/fixtures/utils.d.ts +18 -5
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +112 -70
- 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 +81 -0
- package/dest/public/hinting_db_sources.d.ts.map +1 -0
- package/dest/public/hinting_db_sources.js +359 -0
- package/dest/public/index.d.ts +6 -9
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +4 -7
- package/dest/public/public_db_sources.d.ts +58 -104
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +227 -194
- package/dest/public/public_errors.d.ts +12 -0
- package/dest/public/public_errors.d.ts.map +1 -0
- package/dest/public/public_errors.js +13 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts +52 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
- package/dest/public/public_processor/guarded_merkle_tree.js +116 -0
- package/dest/public/public_processor/public_processor.d.ts +32 -39
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +642 -167
- package/dest/public/public_processor/public_processor_metrics.d.ts +7 -4
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor_metrics.js +37 -46
- 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 +53 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +126 -0
- 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 +167 -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 +8 -0
- package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/index.js +5 -0
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +31 -0
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +51 -0
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +31 -33
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +83 -105
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +42 -58
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +225 -207
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +32 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.js +1 -0
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +21 -0
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +415 -0
- package/dest/public/side_effect_errors.d.ts +42 -2
- package/dest/public/side_effect_errors.d.ts.map +1 -1
- package/dest/public/side_effect_errors.js +70 -1
- package/dest/public/side_effect_trace.d.ts +24 -69
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +74 -124
- package/dest/public/side_effect_trace_interface.d.ts +13 -25
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/state_manager/index.d.ts +2 -0
- package/dest/public/state_manager/index.d.ts.map +1 -0
- package/dest/public/state_manager/index.js +1 -0
- package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +4 -7
- package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
- package/dest/public/{avm/journal → state_manager}/nullifiers.js +3 -8
- package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +4 -4
- package/dest/public/state_manager/public_storage.d.ts.map +1 -0
- package/dest/public/{avm/journal → state_manager}/public_storage.js +1 -1
- package/dest/public/state_manager/state_manager.d.ts +170 -0
- package/dest/public/state_manager/state_manager.d.ts.map +1 -0
- package/dest/public/state_manager/state_manager.js +402 -0
- package/dest/public/test_executor_metrics.d.ts +61 -0
- package/dest/public/test_executor_metrics.d.ts.map +1 -0
- package/dest/public/test_executor_metrics.js +329 -0
- 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 +3 -5
- package/dest/public/utils.d.ts.map +1 -1
- package/dest/public/utils.js +4 -21
- package/dest/server.d.ts +7 -4
- package/dest/server.d.ts.map +1 -1
- package/dest/server.js +5 -2
- package/dest/testing.d.ts +2 -0
- package/dest/testing.d.ts.map +1 -0
- package/dest/testing.js +1 -0
- package/package.json +39 -33
- package/src/client.ts +5 -3
- package/src/common/errors.ts +80 -45
- package/src/common/index.ts +0 -1
- package/src/private/acvm/acvm.ts +21 -35
- package/src/private/acvm/acvm_types.ts +1 -1
- package/src/private/acvm/deserialize.ts +36 -30
- package/src/private/acvm/index.ts +0 -1
- package/src/private/acvm/serialize.ts +64 -1
- package/src/private/{providers/acvm_native.ts → acvm_native.ts} +57 -28
- package/src/private/acvm_wasm.ts +79 -0
- package/src/private/acvm_wasm_with_blobs.ts +54 -0
- package/src/private/circuit_recording/circuit_recorder.ts +263 -0
- package/src/private/circuit_recording/file_circuit_recorder.ts +163 -0
- package/src/private/circuit_recording/memory_circuit_recorder.ts +13 -0
- package/src/private/circuit_recording/simulator_recorder_wrapper.ts +91 -0
- package/src/private/circuit_simulator.ts +90 -0
- package/src/private/{providers/factory.ts → factory.ts} +13 -10
- package/src/public/avm/avm_context.ts +6 -6
- package/src/public/avm/avm_contract_call_result.ts +23 -9
- package/src/public/avm/avm_execution_environment.ts +17 -5
- package/src/public/avm/avm_gas.ts +27 -39
- package/src/public/avm/avm_machine_state.ts +12 -6
- package/src/public/avm/avm_memory_types.ts +24 -7
- package/src/public/avm/avm_simulator.ts +58 -63
- package/src/public/avm/avm_simulator_interface.ts +8 -0
- package/src/public/avm/calldata.ts +101 -0
- package/src/public/avm/errors.ts +20 -75
- 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 +41 -24
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +66 -13
- package/src/public/avm/fixtures/initializers.ts +103 -0
- package/src/public/avm/fixtures/utils.ts +154 -0
- package/src/public/avm/index.ts +0 -2
- package/src/public/avm/opcodes/accrued_substate.ts +84 -52
- package/src/public/avm/opcodes/addressing_mode.ts +56 -32
- package/src/public/avm/opcodes/arithmetic.ts +37 -3
- package/src/public/avm/opcodes/bitwise.ts +33 -29
- package/src/public/avm/opcodes/comparators.ts +6 -3
- package/src/public/avm/opcodes/contract.ts +15 -11
- package/src/public/avm/opcodes/control_flow.ts +19 -10
- package/src/public/avm/opcodes/conversion.ts +29 -5
- package/src/public/avm/opcodes/ec_add.ts +30 -37
- package/src/public/avm/opcodes/environment_getters.ts +28 -23
- package/src/public/avm/opcodes/external_calls.ts +70 -36
- package/src/public/avm/opcodes/hashing.ts +39 -13
- package/src/public/avm/opcodes/instruction.ts +31 -21
- package/src/public/avm/opcodes/instruction_impl.ts +2 -2
- package/src/public/avm/opcodes/memory.ts +81 -42
- package/src/public/avm/opcodes/misc.ts +61 -19
- package/src/public/avm/opcodes/storage.ts +47 -23
- package/src/public/avm/revert_reason.ts +58 -0
- package/src/public/avm/serialization/buffer_cursor.ts +4 -1
- package/src/public/avm/serialization/bytecode_serialization.ts +90 -81
- package/src/public/avm/serialization/instruction_serialization.ts +76 -35
- package/src/public/avm/test_utils.ts +25 -42
- package/src/public/contracts_db_checkpoint.ts +41 -0
- package/src/public/db_interfaces.ts +76 -0
- package/src/public/debug_fn_name.ts +52 -0
- package/src/public/executor_metrics.ts +49 -23
- package/src/public/executor_metrics_interface.ts +15 -0
- package/src/public/fixtures/amm_test.ts +331 -0
- package/src/public/fixtures/bulk_test.ts +194 -0
- package/src/public/fixtures/custom_bytecode_tester.ts +83 -0
- package/src/public/fixtures/custom_bytecode_tests.ts +366 -0
- package/src/public/fixtures/index.ts +13 -0
- package/src/public/fixtures/minimal_public_tx.ts +26 -0
- package/src/public/fixtures/opcode_spammer.ts +1713 -0
- package/src/public/fixtures/public_tx_simulation_tester.ts +264 -114
- package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +37 -20
- package/src/public/fixtures/token_test.ts +148 -0
- package/src/public/fixtures/utils.ts +156 -80
- 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 +614 -0
- package/src/public/index.ts +11 -8
- package/src/public/public_db_sources.ts +295 -258
- package/src/public/public_errors.ts +14 -0
- package/src/public/public_processor/guarded_merkle_tree.ts +161 -0
- package/src/public/public_processor/public_processor.ts +354 -227
- package/src/public/public_processor/public_processor_metrics.ts +30 -46
- package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +125 -0
- package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +201 -0
- 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 +232 -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 +7 -0
- package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
- package/src/public/public_tx_simulator/public_tx_context.ts +187 -209
- package/src/public/public_tx_simulator/public_tx_simulator.ts +320 -263
- package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +33 -0
- package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +63 -0
- package/src/public/side_effect_errors.ts +91 -1
- package/src/public/side_effect_trace.ts +99 -322
- package/src/public/side_effect_trace_interface.ts +11 -59
- package/src/public/state_manager/index.ts +1 -0
- package/src/public/{avm/journal → state_manager}/nullifiers.ts +6 -12
- package/src/public/{avm/journal → state_manager}/public_storage.ts +3 -3
- package/src/public/state_manager/state_manager.ts +569 -0
- package/src/public/test_executor_metrics.ts +421 -0
- package/src/public/utils.ts +5 -21
- package/src/server.ts +6 -3
- package/src/testing.ts +1 -0
- package/dest/common/db_interfaces.d.ts +0 -80
- package/dest/common/db_interfaces.d.ts.map +0 -1
- package/dest/common/db_interfaces.js +0 -1
- package/dest/common/debug_fn_name.d.ts +0 -5
- package/dest/common/debug_fn_name.d.ts.map +0 -1
- package/dest/common/debug_fn_name.js +0 -6
- package/dest/common/message_load_oracle_inputs.d.ts +0 -15
- package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
- package/dest/common/message_load_oracle_inputs.js +0 -15
- package/dest/private/acvm/oracle/index.d.ts +0 -14
- package/dest/private/acvm/oracle/index.d.ts.map +0 -1
- package/dest/private/acvm/oracle/index.js +0 -2
- package/dest/private/acvm/oracle/oracle.d.ts +0 -49
- package/dest/private/acvm/oracle/oracle.d.ts.map +0 -1
- package/dest/private/acvm/oracle/oracle.js +0 -263
- package/dest/private/acvm/oracle/typed_oracle.d.ts +0 -83
- package/dest/private/acvm/oracle/typed_oracle.d.ts.map +0 -1
- package/dest/private/acvm/oracle/typed_oracle.js +0 -132
- package/dest/private/execution_data_provider.d.ts +0 -261
- package/dest/private/execution_data_provider.d.ts.map +0 -1
- package/dest/private/execution_data_provider.js +0 -14
- package/dest/private/execution_note_cache.d.ts +0 -93
- package/dest/private/execution_note_cache.d.ts.map +0 -1
- package/dest/private/execution_note_cache.js +0 -180
- package/dest/private/hashed_values_cache.d.ts +0 -28
- package/dest/private/hashed_values_cache.d.ts.map +0 -1
- package/dest/private/hashed_values_cache.js +0 -46
- package/dest/private/index.d.ts +0 -13
- package/dest/private/index.d.ts.map +0 -1
- package/dest/private/index.js +0 -12
- package/dest/private/pick_notes.d.ts +0 -85
- package/dest/private/pick_notes.d.ts.map +0 -1
- package/dest/private/pick_notes.js +0 -51
- package/dest/private/private_execution.d.ts +0 -25
- package/dest/private/private_execution.d.ts.map +0 -1
- package/dest/private/private_execution.js +0 -92
- package/dest/private/private_execution_oracle.d.ts +0 -215
- package/dest/private/private_execution_oracle.d.ts.map +0 -1
- package/dest/private/private_execution_oracle.js +0 -382
- package/dest/private/providers/acvm_native.d.ts +0 -40
- package/dest/private/providers/acvm_native.d.ts.map +0 -1
- package/dest/private/providers/acvm_wasm.d.ts +0 -15
- package/dest/private/providers/acvm_wasm.d.ts.map +0 -1
- package/dest/private/providers/acvm_wasm.js +0 -62
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts +0 -19
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
- package/dest/private/providers/acvm_wasm_with_blobs.js +0 -32
- package/dest/private/providers/factory.d.ts +0 -12
- package/dest/private/providers/factory.d.ts.map +0 -1
- package/dest/private/providers/simulation_provider.d.ts +0 -19
- package/dest/private/providers/simulation_provider.d.ts.map +0 -1
- package/dest/private/providers/simulation_provider.js +0 -24
- package/dest/private/simulator.d.ts +0 -34
- package/dest/private/simulator.d.ts.map +0 -1
- package/dest/private/simulator.js +0 -76
- package/dest/private/unconstrained_execution.d.ts +0 -10
- package/dest/private/unconstrained_execution.d.ts.map +0 -1
- package/dest/private/unconstrained_execution.js +0 -27
- package/dest/private/unconstrained_execution_oracle.d.ts +0 -161
- package/dest/private/unconstrained_execution_oracle.d.ts.map +0 -1
- package/dest/private/unconstrained_execution_oracle.js +0 -258
- package/dest/public/avm/bytecode_utils.d.ts +0 -5
- package/dest/public/avm/bytecode_utils.d.ts.map +0 -1
- package/dest/public/avm/bytecode_utils.js +0 -17
- package/dest/public/avm/fixtures/index.d.ts +0 -84
- package/dest/public/avm/fixtures/index.d.ts.map +0 -1
- package/dest/public/avm/fixtures/index.js +0 -175
- package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +0 -35
- package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
- package/dest/public/avm/journal/index.d.ts +0 -2
- package/dest/public/avm/journal/index.d.ts.map +0 -1
- package/dest/public/avm/journal/index.js +0 -1
- package/dest/public/avm/journal/journal.d.ts +0 -209
- package/dest/public/avm/journal/journal.d.ts.map +0 -1
- package/dest/public/avm/journal/journal.js +0 -486
- package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
- package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
- package/dest/public/bytecode_errors.d.ts +0 -4
- package/dest/public/bytecode_errors.d.ts.map +0 -1
- package/dest/public/bytecode_errors.js +0 -6
- package/dest/public/execution.d.ts +0 -108
- package/dest/public/execution.d.ts.map +0 -1
- package/dest/public/execution.js +0 -9
- 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/dest/test/utils.d.ts +0 -13
- package/dest/test/utils.d.ts.map +0 -1
- package/dest/test/utils.js +0 -22
- package/src/common/db_interfaces.ts +0 -94
- package/src/common/debug_fn_name.ts +0 -18
- package/src/common/message_load_oracle_inputs.ts +0 -15
- package/src/private/acvm/oracle/index.ts +0 -16
- package/src/private/acvm/oracle/oracle.ts +0 -455
- package/src/private/acvm/oracle/typed_oracle.ts +0 -259
- package/src/private/execution_data_provider.ts +0 -323
- package/src/private/execution_note_cache.ts +0 -217
- package/src/private/hashed_values_cache.ts +0 -55
- package/src/private/index.ts +0 -16
- package/src/private/pick_notes.ts +0 -141
- package/src/private/private_execution.ts +0 -151
- package/src/private/private_execution_oracle.ts +0 -614
- package/src/private/providers/acvm_wasm.ts +0 -63
- package/src/private/providers/acvm_wasm_with_blobs.ts +0 -50
- package/src/private/providers/simulation_provider.ts +0 -45
- package/src/private/simulator.ts +0 -147
- package/src/private/unconstrained_execution.ts +0 -50
- package/src/private/unconstrained_execution_oracle.ts +0 -373
- package/src/public/avm/bytecode_utils.ts +0 -17
- package/src/public/avm/fixtures/index.ts +0 -296
- package/src/public/avm/journal/index.ts +0 -1
- package/src/public/avm/journal/journal.ts +0 -742
- package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
- package/src/public/bytecode_errors.ts +0 -6
- package/src/public/execution.ts +0 -140
- package/src/public/tx_contract_cache.ts +0 -69
- package/src/test/utils.ts +0 -36
|
@@ -1,25 +1,40 @@
|
|
|
1
1
|
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
|
|
2
2
|
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
|
-
import { Fr } from '@aztec/foundation/
|
|
4
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
5
|
-
import {
|
|
3
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
+
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
5
|
+
import { sleep } from '@aztec/foundation/sleep';
|
|
6
|
+
import { DateProvider, Timer, elapsed, execWithSignal } from '@aztec/foundation/timer';
|
|
6
7
|
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
7
|
-
import {
|
|
8
|
+
import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
|
|
8
9
|
import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
|
|
9
|
-
import {
|
|
10
|
+
import {
|
|
11
|
+
AvmCircuitInputs,
|
|
12
|
+
AvmCircuitPublicInputs,
|
|
13
|
+
AvmExecutionHints,
|
|
14
|
+
type AvmProvingRequest,
|
|
15
|
+
PublicDataWrite,
|
|
16
|
+
PublicSimulatorConfig,
|
|
17
|
+
} from '@aztec/stdlib/avm';
|
|
10
18
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
11
19
|
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
20
|
+
import { computeTransactionFee } from '@aztec/stdlib/fees';
|
|
12
21
|
import { Gas } from '@aztec/stdlib/gas';
|
|
13
|
-
import type {
|
|
22
|
+
import type {
|
|
23
|
+
MerkleTreeWriteOperations,
|
|
24
|
+
PublicProcessorLimits,
|
|
25
|
+
PublicProcessorValidator,
|
|
26
|
+
SequencerConfig,
|
|
27
|
+
} from '@aztec/stdlib/interfaces/server';
|
|
28
|
+
import { type DebugLog, type DebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs';
|
|
29
|
+
import { ProvingRequestType } from '@aztec/stdlib/proofs';
|
|
14
30
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
15
31
|
import {
|
|
16
32
|
type FailedTx,
|
|
17
33
|
GlobalVariables,
|
|
18
34
|
NestedProcessReturnValues,
|
|
19
35
|
type ProcessedTx,
|
|
36
|
+
StateReference,
|
|
20
37
|
Tx,
|
|
21
|
-
TxExecutionPhase,
|
|
22
|
-
type TxValidator,
|
|
23
38
|
makeProcessedTxFromPrivateOnlyTx,
|
|
24
39
|
makeProcessedTxFromTxWithPublicCalls,
|
|
25
40
|
} from '@aztec/stdlib/tx';
|
|
@@ -33,67 +48,70 @@ import {
|
|
|
33
48
|
} from '@aztec/telemetry-client';
|
|
34
49
|
import { ForkCheckpoint } from '@aztec/world-state/native';
|
|
35
50
|
|
|
36
|
-
import {
|
|
37
|
-
|
|
51
|
+
import { AssertionError } from 'assert';
|
|
52
|
+
|
|
53
|
+
import { PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
|
|
54
|
+
import {
|
|
55
|
+
type PublicTxSimulatorConfig,
|
|
56
|
+
type PublicTxSimulatorInterface,
|
|
57
|
+
TelemetryCppPublicTxSimulator,
|
|
58
|
+
} from '../public_tx_simulator/index.js';
|
|
59
|
+
import { GuardedMerkleTreeOperations } from './guarded_merkle_tree.js';
|
|
38
60
|
import { PublicProcessorMetrics } from './public_processor_metrics.js';
|
|
39
61
|
|
|
40
62
|
/**
|
|
41
63
|
* Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
|
|
42
64
|
*/
|
|
43
65
|
export class PublicProcessorFactory {
|
|
66
|
+
private log: Logger;
|
|
44
67
|
constructor(
|
|
45
68
|
private contractDataSource: ContractDataSource,
|
|
46
|
-
private dateProvider: DateProvider,
|
|
47
|
-
|
|
48
|
-
|
|
69
|
+
private dateProvider: DateProvider = new DateProvider(),
|
|
70
|
+
protected telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
71
|
+
bindings?: LoggerBindings,
|
|
72
|
+
) {
|
|
73
|
+
this.log = createLogger('simulator:public-processor-factory', bindings);
|
|
74
|
+
}
|
|
49
75
|
|
|
50
76
|
/**
|
|
51
77
|
* Creates a new instance of a PublicProcessor.
|
|
52
|
-
* @param historicalHeader - The header of a block previous to the one in which the tx is included.
|
|
53
78
|
* @param globalVariables - The global variables for the block being processed.
|
|
54
|
-
* @param
|
|
79
|
+
* @param contractsDB - Optional pre-populated contracts DB; a fresh one is constructed if omitted.
|
|
55
80
|
* @returns A new instance of a PublicProcessor.
|
|
56
81
|
*/
|
|
57
82
|
public create(
|
|
58
83
|
merkleTree: MerkleTreeWriteOperations,
|
|
59
84
|
globalVariables: GlobalVariables,
|
|
60
|
-
|
|
85
|
+
config: PublicSimulatorConfig,
|
|
86
|
+
contractsDB: PublicContractsDB = new PublicContractsDB(this.contractDataSource, this.log.getBindings()),
|
|
61
87
|
): PublicProcessor {
|
|
62
|
-
const
|
|
63
|
-
const publicTxSimulator = this.createPublicTxSimulator(
|
|
64
|
-
merkleTree,
|
|
65
|
-
worldStateDB,
|
|
66
|
-
globalVariables,
|
|
67
|
-
/*doMerkleOperations=*/ true,
|
|
68
|
-
skipFeeEnforcement,
|
|
69
|
-
this.telemetryClient,
|
|
70
|
-
);
|
|
88
|
+
const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
|
|
89
|
+
const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
|
|
71
90
|
|
|
72
91
|
return new PublicProcessor(
|
|
73
|
-
merkleTree,
|
|
74
92
|
globalVariables,
|
|
75
|
-
|
|
93
|
+
guardedFork,
|
|
94
|
+
contractsDB,
|
|
76
95
|
publicTxSimulator,
|
|
77
96
|
this.dateProvider,
|
|
78
97
|
this.telemetryClient,
|
|
98
|
+
createLogger('simulator:public-processor', this.log.getBindings()),
|
|
79
99
|
);
|
|
80
100
|
}
|
|
81
101
|
|
|
82
102
|
protected createPublicTxSimulator(
|
|
83
|
-
|
|
84
|
-
|
|
103
|
+
merkleTree: MerkleTreeWriteOperations,
|
|
104
|
+
contractsDB: PublicContractsDB,
|
|
85
105
|
globalVariables: GlobalVariables,
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
db,
|
|
92
|
-
worldStateDB,
|
|
106
|
+
config?: Partial<PublicTxSimulatorConfig>,
|
|
107
|
+
): PublicTxSimulatorInterface {
|
|
108
|
+
return new TelemetryCppPublicTxSimulator(
|
|
109
|
+
merkleTree,
|
|
110
|
+
contractsDB,
|
|
93
111
|
globalVariables,
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
112
|
+
this.telemetryClient,
|
|
113
|
+
config,
|
|
114
|
+
this.log.getBindings(),
|
|
97
115
|
);
|
|
98
116
|
}
|
|
99
117
|
}
|
|
@@ -105,6 +123,17 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
105
123
|
}
|
|
106
124
|
}
|
|
107
125
|
|
|
126
|
+
class PublicProcessorAbortError extends Error {
|
|
127
|
+
constructor(message: string = 'Aborted while processing tx') {
|
|
128
|
+
super(message);
|
|
129
|
+
this.name = 'PublicProcessorAbortError';
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function isPublicProcessorInterruptError(err: any) {
|
|
134
|
+
return err?.name === 'PublicProcessorTimeoutError' || err?.name === 'PublicProcessorAbortError';
|
|
135
|
+
}
|
|
136
|
+
|
|
108
137
|
/**
|
|
109
138
|
* Converts Txs lifted from the P2P module into ProcessedTx objects by executing
|
|
110
139
|
* any public function calls in them. Txs with private calls only are unaffected.
|
|
@@ -112,13 +141,15 @@ class PublicProcessorTimeoutError extends Error {
|
|
|
112
141
|
export class PublicProcessor implements Traceable {
|
|
113
142
|
private metrics: PublicProcessorMetrics;
|
|
114
143
|
constructor(
|
|
115
|
-
protected db: MerkleTreeWriteOperations,
|
|
116
144
|
protected globalVariables: GlobalVariables,
|
|
117
|
-
|
|
118
|
-
protected
|
|
145
|
+
private guardedMerkleTree: GuardedMerkleTreeOperations,
|
|
146
|
+
protected contractsDB: PublicContractsDB,
|
|
147
|
+
protected publicTxSimulator: PublicTxSimulatorInterface,
|
|
119
148
|
private dateProvider: DateProvider,
|
|
120
149
|
telemetryClient: TelemetryClient = getTelemetryClient(),
|
|
121
|
-
private log
|
|
150
|
+
private log: Logger,
|
|
151
|
+
private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs' | 'fakeThrowAfterProcessingTxCount'> = {},
|
|
152
|
+
private debugLogStore: DebugLogStore = new NullDebugLogStore(),
|
|
122
153
|
) {
|
|
123
154
|
this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
|
|
124
155
|
}
|
|
@@ -130,63 +161,65 @@ export class PublicProcessor implements Traceable {
|
|
|
130
161
|
/**
|
|
131
162
|
* Run each tx through the public circuit and the public kernel circuit if needed.
|
|
132
163
|
* @param txs - Txs to process.
|
|
133
|
-
* @param
|
|
164
|
+
* @param limits - Limits for processing the txs.
|
|
165
|
+
* @param validator - Pre-process validator and nullifier cache to use for processing the txs.
|
|
134
166
|
* @returns The list of processed txs with their circuit simulation outputs.
|
|
135
167
|
*/
|
|
136
168
|
public async process(
|
|
137
169
|
txs: Iterable<Tx> | AsyncIterable<Tx>,
|
|
138
|
-
limits: {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
} = {},
|
|
144
|
-
validators: {
|
|
145
|
-
preprocessValidator?: TxValidator<Tx>;
|
|
146
|
-
postprocessValidator?: TxValidator<ProcessedTx>;
|
|
147
|
-
nullifierCache?: { addNullifiers: (nullifiers: Buffer[]) => void };
|
|
148
|
-
} = {},
|
|
149
|
-
): Promise<[ProcessedTx[], FailedTx[], NestedProcessReturnValues[]]> {
|
|
150
|
-
const { maxTransactions, maxBlockSize, deadline, maxBlockGas } = limits;
|
|
151
|
-
const { preprocessValidator, postprocessValidator, nullifierCache } = validators;
|
|
170
|
+
limits: PublicProcessorLimits = {},
|
|
171
|
+
validator: PublicProcessorValidator = {},
|
|
172
|
+
): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], DebugLog[]]> {
|
|
173
|
+
const { maxTransactions, deadline, maxBlockGas, maxBlobFields, isBuildingProposal, signal } = limits;
|
|
174
|
+
const { preprocessValidator, nullifierCache } = validator;
|
|
152
175
|
const result: ProcessedTx[] = [];
|
|
176
|
+
const usedTxs: Tx[] = [];
|
|
153
177
|
const failed: FailedTx[] = [];
|
|
178
|
+
const debugLogs: DebugLog[] = [];
|
|
154
179
|
const timer = new Timer();
|
|
155
180
|
|
|
156
181
|
let totalSizeInBytes = 0;
|
|
157
182
|
let returns: NestedProcessReturnValues[] = [];
|
|
158
183
|
let totalPublicGas = new Gas(0, 0);
|
|
159
184
|
let totalBlockGas = new Gas(0, 0);
|
|
185
|
+
let totalBlobFields = 0;
|
|
186
|
+
let silentlySkippedCount = 0;
|
|
187
|
+
let totalSilentlySkippedDurationMs = 0;
|
|
160
188
|
|
|
161
|
-
for await (const
|
|
189
|
+
for await (const tx of txs) {
|
|
162
190
|
// Only process up to the max tx limit
|
|
163
191
|
if (maxTransactions !== undefined && result.length >= maxTransactions) {
|
|
164
192
|
this.log.debug(`Stopping tx processing due to reaching the max tx limit.`);
|
|
165
193
|
break;
|
|
166
194
|
}
|
|
167
195
|
|
|
168
|
-
// Bail if we've hit the deadline
|
|
196
|
+
// Bail if we've hit the deadline or have been interrupted.
|
|
169
197
|
if (deadline && this.dateProvider.now() > +deadline) {
|
|
170
198
|
this.log.warn(`Stopping tx processing due to timeout.`);
|
|
171
199
|
break;
|
|
172
200
|
}
|
|
201
|
+
if (signal?.aborted) {
|
|
202
|
+
this.log.warn(`Stopping tx processing due to abort signal.`);
|
|
203
|
+
break;
|
|
204
|
+
}
|
|
173
205
|
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
206
|
+
const txHash = tx.getTxHash().toString();
|
|
207
|
+
|
|
208
|
+
// Skip this tx if its estimated blob fields would exceed the limit.
|
|
209
|
+
// Only done during proposal building: during re-execution we must process the exact txs from the proposal.
|
|
210
|
+
const txBlobFields = tx.getPrivateTxEffectsSizeInFields();
|
|
211
|
+
if (isBuildingProposal && maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
|
|
212
|
+
this.log.warn(
|
|
213
|
+
`Skipping tx ${txHash} with ${txBlobFields} fields from private side effects due to blob fields limit`,
|
|
214
|
+
{ txHash, txBlobFields, totalBlobFields, maxBlobFields },
|
|
215
|
+
);
|
|
184
216
|
continue;
|
|
185
217
|
}
|
|
186
218
|
|
|
187
|
-
// Skip this tx if its gas limit would exceed the block gas limit
|
|
188
|
-
|
|
189
|
-
|
|
219
|
+
// Skip this tx if its gas limit would exceed the block gas limit (either da or l2).
|
|
220
|
+
// Only done during proposal building: during re-execution we must process the exact txs from the proposal.
|
|
221
|
+
const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
|
|
222
|
+
if (isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
|
|
190
223
|
this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
|
|
191
224
|
txHash,
|
|
192
225
|
txGasLimit,
|
|
@@ -196,24 +229,16 @@ export class PublicProcessor implements Traceable {
|
|
|
196
229
|
continue;
|
|
197
230
|
}
|
|
198
231
|
|
|
199
|
-
// The processor modifies the tx objects in place, so we need to clone them.
|
|
200
|
-
const tx = Tx.clone(origTx);
|
|
201
|
-
|
|
202
232
|
// We validate the tx before processing it, to avoid unnecessary work.
|
|
203
233
|
if (preprocessValidator) {
|
|
204
234
|
const result = await preprocessValidator.validateTx(tx);
|
|
205
|
-
const txHash =
|
|
235
|
+
const txHash = tx.getTxHash();
|
|
206
236
|
if (result.result === 'invalid') {
|
|
207
237
|
const reason = result.reason.join(', ');
|
|
208
|
-
this.log.
|
|
238
|
+
this.log.debug(`Rejecting tx ${txHash.toString()} due to pre-process validation fail: ${reason}`);
|
|
209
239
|
failed.push({ tx, error: new Error(`Tx failed preprocess validation: ${reason}`) });
|
|
210
240
|
returns.push(new NestedProcessReturnValues([]));
|
|
211
241
|
continue;
|
|
212
|
-
} else if (result.result === 'skipped') {
|
|
213
|
-
const reason = result.reason.join(', ');
|
|
214
|
-
this.log.warn(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
|
|
215
|
-
returns.push(new NestedProcessReturnValues([]));
|
|
216
|
-
continue;
|
|
217
242
|
} else {
|
|
218
243
|
this.log.trace(`Tx ${txHash.toString()} is valid before processing.`);
|
|
219
244
|
}
|
|
@@ -222,79 +247,128 @@ export class PublicProcessor implements Traceable {
|
|
|
222
247
|
// We checkpoint the transaction here, then within the try/catch we
|
|
223
248
|
// 1. Revert the checkpoint if the tx fails or needs to be discarded for any reason
|
|
224
249
|
// 2. Commit the transaction in the finally block. Note that by using the ForkCheckpoint lifecycle only the first commit/revert takes effect
|
|
225
|
-
|
|
250
|
+
// By doing this, every transaction starts on a fresh checkpoint and it's state updates only make it to the fork if this checkpoint is committed.
|
|
251
|
+
// Note: We use the underlying fork here not the guarded one, this ensures that it's not impacted by stopping the guarded version
|
|
252
|
+
const checkpoint = await ForkCheckpoint.new(this.guardedMerkleTree.getUnderlyingFork());
|
|
253
|
+
const startStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
|
|
254
|
+
this.contractsDB.createCheckpoint();
|
|
226
255
|
|
|
227
256
|
try {
|
|
228
|
-
const [processedTx, returnValues] = await
|
|
257
|
+
const [txProcessingTimeMs, [processedTx, returnValues, txDebugLogs]] = await elapsed(() =>
|
|
258
|
+
this.processTx(tx, deadline, signal),
|
|
259
|
+
);
|
|
260
|
+
|
|
261
|
+
// Inject a fake processing failure after N txs if requested
|
|
262
|
+
const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
|
|
263
|
+
if (fakeThrowAfter !== undefined && result.length + failed.length + 1 >= fakeThrowAfter) {
|
|
264
|
+
throw new Error(`Fake error after processing ${fakeThrowAfter} txs`);
|
|
265
|
+
}
|
|
229
266
|
|
|
230
|
-
|
|
231
|
-
const txSize =
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
267
|
+
const txBlobFields = processedTx.txEffect.getNumBlobFields();
|
|
268
|
+
const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
|
|
269
|
+
|
|
270
|
+
// If the actual blob fields of this tx would exceed the limit, skip it.
|
|
271
|
+
// Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
|
|
272
|
+
if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
|
|
273
|
+
this.log.debug(
|
|
274
|
+
`Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`,
|
|
275
|
+
{
|
|
276
|
+
txHash,
|
|
277
|
+
txBlobFields,
|
|
278
|
+
totalBlobFields,
|
|
279
|
+
maxBlobFields,
|
|
280
|
+
txProcessingTimeMs,
|
|
281
|
+
},
|
|
282
|
+
);
|
|
283
|
+
silentlySkippedCount += 1;
|
|
284
|
+
totalSilentlySkippedDurationMs += txProcessingTimeMs;
|
|
285
|
+
this.metrics.recordSilentlySkipped(txProcessingTimeMs);
|
|
239
286
|
// Need to revert the checkpoint here and don't go any further
|
|
240
287
|
await checkpoint.revert();
|
|
288
|
+
this.contractsDB.revertCheckpoint();
|
|
241
289
|
continue;
|
|
242
290
|
}
|
|
243
291
|
|
|
244
|
-
//
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
if (!tx.hasPublicCalls()) {
|
|
265
|
-
// If there are no public calls, perform all tree insertions for side effects from private
|
|
266
|
-
// When there are public calls, the PublicTxSimulator & AVM handle tree insertions.
|
|
267
|
-
await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
|
|
268
|
-
// Add any contracts registered/deployed in this private-only tx to the block-level cache
|
|
269
|
-
// (add to tx-level cache and then commit to block-level cache)
|
|
270
|
-
await this.worldStateDB.addNewContracts(tx);
|
|
271
|
-
this.worldStateDB.commitContractsForTx();
|
|
292
|
+
// During re-execution, check if the actual gas used by this tx would push the block over the gas limit.
|
|
293
|
+
// Unlike the proposal-building check (which uses declared gas limits pessimistically before processing),
|
|
294
|
+
// this uses actual gas and stops processing when the limit is exceeded.
|
|
295
|
+
if (
|
|
296
|
+
!isBuildingProposal &&
|
|
297
|
+
maxBlockGas !== undefined &&
|
|
298
|
+
totalBlockGas.add(processedTx.gasUsed.totalGas).gtAny(maxBlockGas)
|
|
299
|
+
) {
|
|
300
|
+
this.log.warn(`Stopping re-execution since tx ${txHash} would push block gas over limit`, {
|
|
301
|
+
txHash,
|
|
302
|
+
txGas: processedTx.gasUsed.totalGas,
|
|
303
|
+
totalBlockGas,
|
|
304
|
+
maxBlockGas,
|
|
305
|
+
});
|
|
306
|
+
await checkpoint.revert();
|
|
307
|
+
this.contractsDB.revertCheckpoint();
|
|
308
|
+
break;
|
|
272
309
|
}
|
|
273
310
|
|
|
311
|
+
// FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
|
|
312
|
+
// I'd rather pass the validators the processedTx as well and let them deal with it.
|
|
274
313
|
nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map(n => n.toBuffer()));
|
|
275
314
|
result.push(processedTx);
|
|
315
|
+
usedTxs.push(tx);
|
|
276
316
|
returns = returns.concat(returnValues);
|
|
317
|
+
debugLogs.push(...txDebugLogs);
|
|
318
|
+
|
|
319
|
+
this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
|
|
277
320
|
|
|
278
321
|
totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
|
|
279
322
|
totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
|
|
280
323
|
totalSizeInBytes += txSize;
|
|
324
|
+
totalBlobFields += txBlobFields;
|
|
325
|
+
|
|
326
|
+
// Commit the tx-level contracts checkpoint on success
|
|
327
|
+
this.contractsDB.commitCheckpoint();
|
|
281
328
|
} catch (err: any) {
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
329
|
+
if (isPublicProcessorInterruptError(err)) {
|
|
330
|
+
const interruptReason = err.name === 'PublicProcessorTimeoutError' ? 'timeout' : 'abort signal';
|
|
331
|
+
this.log.warn(`Stopping tx processing due to ${interruptReason}.`);
|
|
332
|
+
// The tx may still be executing on a worker thread (C++ via NAPI).
|
|
333
|
+
// Signal cancellation AND WAIT for the simulation to actually stop before touching fork checkpoints.
|
|
334
|
+
await this.publicTxSimulator.cancel?.();
|
|
335
|
+
|
|
336
|
+
// Now stop the guarded fork to prevent any further TS-side access to the world state.
|
|
337
|
+
await this.guardedMerkleTree.stop();
|
|
338
|
+
|
|
339
|
+
// We now know there can't be any further access to world state. The fork is in a state where there is:
|
|
340
|
+
// 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
|
|
341
|
+
// 2. Possible state updates on that checkpoint or any others created during execution.
|
|
342
|
+
|
|
343
|
+
// Revert all checkpoints at or above this checkpoint's depth (inclusive), destroying any outstanding state
|
|
344
|
+
// updates from this tx and any nested checkpoints created during execution. This preserves any checkpoints
|
|
345
|
+
// created by callers below our depth.
|
|
346
|
+
await checkpoint.revertToCheckpoint();
|
|
347
|
+
|
|
348
|
+
// Revert any contracts added to the DB for the tx.
|
|
349
|
+
this.contractsDB.revertCheckpoint();
|
|
350
|
+
|
|
351
|
+
// Ensure we're at the same state as when we started processing this tx.
|
|
352
|
+
await this.checkWorldStateUnchanged(startStateReference, txHash, err);
|
|
353
|
+
|
|
354
|
+
// We should now be in a position where the fork is in a clean state and no further updates can be made to it.
|
|
286
355
|
break;
|
|
287
356
|
}
|
|
288
|
-
const errorMessage = err instanceof Error ? err.message : 'Unknown error';
|
|
289
|
-
this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
|
|
290
357
|
|
|
358
|
+
// Roll back state to start of TX before proceeding to next TX.
|
|
359
|
+
// Reverts all checkpoints at or above this checkpoint's depth, preserving any caller checkpoints below.
|
|
360
|
+
await checkpoint.revertToCheckpoint();
|
|
361
|
+
this.contractsDB.revertCheckpoint();
|
|
362
|
+
const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
|
|
363
|
+
this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
|
|
291
364
|
failed.push({ tx, error: err instanceof Error ? err : new Error(errorMessage) });
|
|
292
365
|
returns.push(new NestedProcessReturnValues([]));
|
|
366
|
+
|
|
367
|
+
// Ensure we're at the same state as when we started processing this tx.
|
|
368
|
+
await this.checkWorldStateUnchanged(startStateReference, txHash, err);
|
|
293
369
|
} finally {
|
|
294
|
-
// Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was reverted
|
|
370
|
+
// Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
|
|
295
371
|
await checkpoint.commit();
|
|
296
|
-
// The tx-level contracts cache should not live on to the next tx
|
|
297
|
-
this.worldStateDB.clearContractsForTx();
|
|
298
372
|
}
|
|
299
373
|
}
|
|
300
374
|
|
|
@@ -302,25 +376,58 @@ export class PublicProcessor implements Traceable {
|
|
|
302
376
|
const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
|
|
303
377
|
this.metrics.recordAllTxs(totalPublicGas, rate);
|
|
304
378
|
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
379
|
+
const silentlySkippedDurationMs = Math.round(totalSilentlySkippedDurationMs);
|
|
380
|
+
this.log.info(
|
|
381
|
+
`Processed ${result.length} successful txs and ${failed.length} failed txs ` +
|
|
382
|
+
`(${silentlySkippedCount} silently skipped, ${silentlySkippedDurationMs}ms wasted) ` +
|
|
383
|
+
`in ${duration}s`,
|
|
384
|
+
{
|
|
385
|
+
blockNumber: this.globalVariables.blockNumber,
|
|
386
|
+
successfulCount: result.length,
|
|
387
|
+
failedCount: failed.length,
|
|
388
|
+
duration,
|
|
389
|
+
rate,
|
|
390
|
+
totalPublicGas,
|
|
391
|
+
totalBlockGas,
|
|
392
|
+
totalSizeInBytes,
|
|
393
|
+
silentlySkippedCount,
|
|
394
|
+
silentlySkippedDurationMs,
|
|
395
|
+
},
|
|
396
|
+
);
|
|
312
397
|
|
|
313
|
-
return [result, failed, returns];
|
|
398
|
+
return [result, failed, usedTxs, returns, debugLogs];
|
|
314
399
|
}
|
|
315
400
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
401
|
+
private async checkWorldStateUnchanged(
|
|
402
|
+
startStateReference: StateReference,
|
|
403
|
+
txHash: `0x${string}`,
|
|
404
|
+
cause: Error,
|
|
405
|
+
): Promise<void> {
|
|
406
|
+
const endStateReference = await this.guardedMerkleTree.getUnderlyingFork().getStateReference();
|
|
407
|
+
if (!startStateReference.equals(endStateReference)) {
|
|
408
|
+
this.log.warn(`Fork state reference changed by tx ${txHash} after error in public processor`, {
|
|
409
|
+
expected: startStateReference.toInspect(),
|
|
410
|
+
actual: endStateReference.toInspect(),
|
|
411
|
+
cause,
|
|
412
|
+
});
|
|
413
|
+
throw new Error(`Fork state reference changed by tx ${txHash} after error in public processor`, { cause });
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
|
|
417
|
+
@trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString() }))
|
|
418
|
+
private async processTx(
|
|
419
|
+
tx: Tx,
|
|
420
|
+
deadline: Date | undefined,
|
|
421
|
+
signal: AbortSignal | undefined,
|
|
422
|
+
): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
|
|
423
|
+
const [time, [processedTx, returnValues, debugLogs]] = await elapsed(() =>
|
|
424
|
+
this.processTxWithinDeadline(tx, deadline, signal),
|
|
425
|
+
);
|
|
319
426
|
|
|
320
427
|
this.log.verbose(
|
|
321
428
|
!tx.hasPublicCalls()
|
|
322
429
|
? `Processed tx ${processedTx.hash} with no public calls in ${time}ms`
|
|
323
|
-
: `Processed tx ${processedTx.hash} with ${tx.
|
|
430
|
+
: `Processed tx ${processedTx.hash} with ${tx.numberOfPublicCalls()} public calls in ${time}ms`,
|
|
324
431
|
{
|
|
325
432
|
txHash: processedTx.hash,
|
|
326
433
|
txFee: processedTx.txEffect.transactionFee.toBigInt(),
|
|
@@ -338,13 +445,10 @@ export class PublicProcessor implements Traceable {
|
|
|
338
445
|
},
|
|
339
446
|
);
|
|
340
447
|
|
|
341
|
-
return [processedTx, returnValues ?? []];
|
|
448
|
+
return [processedTx, returnValues ?? [], debugLogs];
|
|
342
449
|
}
|
|
343
450
|
|
|
344
|
-
private async doTreeInsertionsForPrivateOnlyTx(
|
|
345
|
-
processedTx: ProcessedTx,
|
|
346
|
-
txValidator?: TxValidator<ProcessedTx>,
|
|
347
|
-
): Promise<void> {
|
|
451
|
+
private async doTreeInsertionsForPrivateOnlyTx(processedTx: ProcessedTx): Promise<void> {
|
|
348
452
|
const treeInsertionStart = process.hrtime.bigint();
|
|
349
453
|
|
|
350
454
|
// Update the state so that the next tx in the loop has the correct .startState
|
|
@@ -353,65 +457,77 @@ export class PublicProcessor implements Traceable {
|
|
|
353
457
|
// b) always had a txHandler with the same db passed to it as this.db, which updated the db in buildBaseRollupHints in this loop
|
|
354
458
|
// To see how this ^ happens, move back to one shared db in test_context and run orchestrator_multi_public_functions.test.ts
|
|
355
459
|
// The below is taken from buildBaseRollupHints:
|
|
356
|
-
await this.
|
|
460
|
+
await this.guardedMerkleTree.appendLeaves(
|
|
357
461
|
MerkleTreeId.NOTE_HASH_TREE,
|
|
358
462
|
padArrayEnd(processedTx.txEffect.noteHashes, Fr.ZERO, MAX_NOTE_HASHES_PER_TX),
|
|
359
463
|
);
|
|
360
464
|
try {
|
|
361
|
-
await this.
|
|
465
|
+
await this.guardedMerkleTree.batchInsert(
|
|
362
466
|
MerkleTreeId.NULLIFIER_TREE,
|
|
363
467
|
padArrayEnd(processedTx.txEffect.nullifiers, Fr.ZERO, MAX_NULLIFIERS_PER_TX).map(n => n.toBuffer()),
|
|
364
468
|
NULLIFIER_SUBTREE_HEIGHT,
|
|
365
469
|
);
|
|
366
|
-
} catch (
|
|
367
|
-
|
|
368
|
-
// Ideally the validator has already caught this above, but just in case:
|
|
369
|
-
throw new Error(`Transaction ${processedTx.hash} invalid after processing public functions`);
|
|
370
|
-
} else {
|
|
371
|
-
// We have no validator and assume this call should blindly process txs with duplicates being caught later
|
|
372
|
-
this.log.warn(`Detected duplicate nullifier after public processing for: ${processedTx.hash}.`);
|
|
373
|
-
}
|
|
470
|
+
} catch (cause) {
|
|
471
|
+
throw new Error(`Transaction ${processedTx.hash} failed with duplicate nullifiers`, { cause });
|
|
374
472
|
}
|
|
375
473
|
|
|
376
|
-
// The only public data write should be for fee payment
|
|
377
|
-
await this.db.sequentialInsert(
|
|
378
|
-
MerkleTreeId.PUBLIC_DATA_TREE,
|
|
379
|
-
processedTx.txEffect.publicDataWrites.map(x => x.toBuffer()),
|
|
380
|
-
);
|
|
381
474
|
const treeInsertionEnd = process.hrtime.bigint();
|
|
382
475
|
this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
|
|
383
476
|
}
|
|
384
477
|
|
|
385
|
-
/** Processes the given tx within deadline
|
|
478
|
+
/** Processes the given tx within deadline or until the signal is aborted. */
|
|
386
479
|
private async processTxWithinDeadline(
|
|
387
480
|
tx: Tx,
|
|
388
|
-
deadline
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
: () => this.processPrivateOnlyTx(tx);
|
|
481
|
+
deadline: Date | undefined,
|
|
482
|
+
signal: AbortSignal | undefined,
|
|
483
|
+
): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> {
|
|
484
|
+
const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> =
|
|
485
|
+
tx.hasPublicCalls() ? () => this.processTxWithPublicCalls(tx) : () => this.processPrivateOnlyTx(tx);
|
|
486
|
+
|
|
487
|
+
// Fake a delay per tx if instructed (used for tests)
|
|
488
|
+
const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
|
|
489
|
+
const processFn =
|
|
490
|
+
fakeDelayPerTxMs && fakeDelayPerTxMs > 0
|
|
491
|
+
? async () => {
|
|
492
|
+
const result = await innerProcessFn();
|
|
493
|
+
this.log.warn(`Sleeping ${fakeDelayPerTxMs}ms after processing tx ${tx.getTxHash().toString()}`);
|
|
494
|
+
await sleep(fakeDelayPerTxMs);
|
|
495
|
+
return result;
|
|
496
|
+
}
|
|
497
|
+
: innerProcessFn;
|
|
393
498
|
|
|
394
|
-
|
|
499
|
+
const processingSignal = this.getProcessingSignal(tx, deadline, signal);
|
|
500
|
+
if (!processingSignal) {
|
|
395
501
|
return await processFn();
|
|
396
502
|
}
|
|
397
503
|
|
|
398
|
-
|
|
504
|
+
return await execWithSignal(
|
|
505
|
+
() => processFn(),
|
|
506
|
+
processingSignal,
|
|
507
|
+
signal =>
|
|
508
|
+
signal.reason?.name === 'TimeoutError' ? new PublicProcessorTimeoutError() : new PublicProcessorAbortError(),
|
|
509
|
+
);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
private getProcessingSignal(tx: Tx, deadline: Date | undefined, signal: AbortSignal | undefined) {
|
|
513
|
+
if (!deadline) {
|
|
514
|
+
return signal;
|
|
515
|
+
}
|
|
516
|
+
|
|
399
517
|
const timeout = +deadline - this.dateProvider.now();
|
|
400
518
|
if (timeout <= 0) {
|
|
401
519
|
throw new PublicProcessorTimeoutError();
|
|
402
520
|
}
|
|
403
521
|
|
|
522
|
+
const txHash = tx.getTxHash();
|
|
404
523
|
this.log.debug(`Processing tx ${txHash.toString()} within ${timeout}ms`, {
|
|
405
524
|
deadline: deadline.toISOString(),
|
|
406
525
|
now: new Date(this.dateProvider.now()).toISOString(),
|
|
407
526
|
txHash,
|
|
408
527
|
});
|
|
409
528
|
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
timeout,
|
|
413
|
-
() => new PublicProcessorTimeoutError(),
|
|
414
|
-
);
|
|
529
|
+
const timeoutSignal = AbortSignal.timeout(timeout);
|
|
530
|
+
return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
|
|
415
531
|
}
|
|
416
532
|
|
|
417
533
|
/**
|
|
@@ -419,14 +535,16 @@ export class PublicProcessor implements Traceable {
|
|
|
419
535
|
* This is used in private only txs, since for txs with public calls
|
|
420
536
|
* the avm handles the fee payment itself.
|
|
421
537
|
*/
|
|
422
|
-
private async
|
|
538
|
+
private async performFeePaymentPublicDataWrite(txFee: Fr, feePayer: AztecAddress): Promise<PublicDataWrite> {
|
|
423
539
|
const feeJuiceAddress = ProtocolContractAddress.FeeJuice;
|
|
424
540
|
const balanceSlot = await computeFeePayerBalanceStorageSlot(feePayer);
|
|
425
541
|
const leafSlot = await computeFeePayerBalanceLeafSlot(feePayer);
|
|
542
|
+
// This high-level db is used as a convenient helper. It could be done with the merkleTree directly.
|
|
543
|
+
const treesDB = new PublicTreesDB(this.guardedMerkleTree);
|
|
426
544
|
|
|
427
545
|
this.log.debug(`Deducting ${txFee.toBigInt()} balance in Fee Juice for ${feePayer}`);
|
|
428
546
|
|
|
429
|
-
const balance = await
|
|
547
|
+
const balance = await treesDB.storageRead(feeJuiceAddress, balanceSlot);
|
|
430
548
|
|
|
431
549
|
if (balance.lt(txFee)) {
|
|
432
550
|
throw new Error(
|
|
@@ -435,87 +553,96 @@ export class PublicProcessor implements Traceable {
|
|
|
435
553
|
}
|
|
436
554
|
|
|
437
555
|
const updatedBalance = balance.sub(txFee);
|
|
438
|
-
await
|
|
556
|
+
await treesDB.storageWrite(feeJuiceAddress, balanceSlot, updatedBalance);
|
|
439
557
|
|
|
440
558
|
return new PublicDataWrite(leafSlot, updatedBalance);
|
|
441
559
|
}
|
|
442
560
|
|
|
443
|
-
@trackSpan('PublicProcessor.processPrivateOnlyTx',
|
|
444
|
-
[Attributes.TX_HASH]:
|
|
561
|
+
@trackSpan('PublicProcessor.processPrivateOnlyTx', (tx: Tx) => ({
|
|
562
|
+
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
445
563
|
}))
|
|
446
|
-
private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined]> {
|
|
564
|
+
private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined, DebugLog[]]> {
|
|
447
565
|
const gasFees = this.globalVariables.gasFees;
|
|
448
|
-
const transactionFee = tx.data.gasUsed
|
|
566
|
+
const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed);
|
|
449
567
|
|
|
450
|
-
const feePaymentPublicDataWrite = await this.
|
|
568
|
+
const feePaymentPublicDataWrite = await this.performFeePaymentPublicDataWrite(transactionFee, tx.data.feePayer);
|
|
451
569
|
|
|
452
|
-
const processedTx =
|
|
570
|
+
const processedTx = makeProcessedTxFromPrivateOnlyTx(
|
|
453
571
|
tx,
|
|
454
572
|
transactionFee,
|
|
455
573
|
feePaymentPublicDataWrite,
|
|
456
574
|
this.globalVariables,
|
|
457
575
|
);
|
|
458
576
|
|
|
459
|
-
|
|
460
|
-
tx
|
|
461
|
-
|
|
577
|
+
this.metrics.recordClassPublication(
|
|
578
|
+
...tx
|
|
579
|
+
.getContractClassLogs()
|
|
580
|
+
.filter(log => ContractClassPublishedEvent.isContractClassPublishedEvent(log))
|
|
581
|
+
.map(log => ContractClassPublishedEvent.fromLog(log)),
|
|
462
582
|
);
|
|
463
583
|
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
return [processedTx, undefined];
|
|
584
|
+
// Fee payment insertion has already been done. Do the rest.
|
|
585
|
+
await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
|
|
586
|
+
|
|
587
|
+
this.contractsDB.addNewContracts(tx);
|
|
588
|
+
|
|
589
|
+
return [processedTx, undefined, []];
|
|
470
590
|
}
|
|
471
591
|
|
|
472
|
-
@trackSpan('PublicProcessor.processTxWithPublicCalls',
|
|
473
|
-
[Attributes.TX_HASH]:
|
|
592
|
+
@trackSpan('PublicProcessor.processTxWithPublicCalls', tx => ({
|
|
593
|
+
[Attributes.TX_HASH]: tx.getTxHash().toString(),
|
|
474
594
|
}))
|
|
475
|
-
private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
|
|
595
|
+
private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
|
|
476
596
|
const timer = new Timer();
|
|
477
597
|
|
|
478
|
-
const
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
} else {
|
|
490
|
-
this.metrics.recordPhaseDuration(phase.phase, phase.durationMs);
|
|
491
|
-
}
|
|
492
|
-
});
|
|
493
|
-
|
|
494
|
-
const siloedContractClassLogs = await tx.filterContractClassLogs(
|
|
495
|
-
tx.data.getNonEmptyContractClassLogsHashes(),
|
|
496
|
-
true,
|
|
497
|
-
);
|
|
498
|
-
|
|
499
|
-
this.metrics.recordClassRegistration(
|
|
500
|
-
...siloedContractClassLogs
|
|
501
|
-
.filter(log => ContractClassRegisteredEvent.isContractClassRegisteredEvent(log))
|
|
502
|
-
.map(log => ContractClassRegisteredEvent.fromLog(log)),
|
|
598
|
+
const result = await this.publicTxSimulator.simulate(tx);
|
|
599
|
+
// TODO: use the callStackMetadata here to extract more data about public execution
|
|
600
|
+
const { hints, publicInputs, publicTxEffect, gasUsed, revertCode /*callStackMetadata*/ } = result;
|
|
601
|
+
|
|
602
|
+
const contractClassLogs = revertCode.isOK()
|
|
603
|
+
? tx.getContractClassLogs()
|
|
604
|
+
: tx.getSplitContractClassLogs(false /* revertible */);
|
|
605
|
+
this.metrics.recordClassPublication(
|
|
606
|
+
...contractClassLogs
|
|
607
|
+
.filter(log => ContractClassPublishedEvent.isContractClassPublishedEvent(log))
|
|
608
|
+
.map(log => ContractClassPublishedEvent.fromLog(log)),
|
|
503
609
|
);
|
|
504
610
|
|
|
505
|
-
|
|
611
|
+
// TODO(fcarreiro): remove phase count metric.
|
|
506
612
|
const durationMs = timer.ms();
|
|
507
|
-
this.metrics.recordTx(phaseCount, durationMs, gasUsed.publicGas);
|
|
613
|
+
this.metrics.recordTx(/*phaseCount=*/ 1, durationMs, gasUsed.publicGas);
|
|
508
614
|
|
|
509
|
-
|
|
615
|
+
// Extract the return values from the call stack metadata.
|
|
616
|
+
const appLogicReturnValues: NestedProcessReturnValues[] = result.getAppLogicReturnValues();
|
|
617
|
+
// Extract the revert reason from the call stack metadata.
|
|
618
|
+
const revertReason = result.findRevertReason();
|
|
619
|
+
// Create proving request if we have hints and public inputs.
|
|
620
|
+
const avmProvingRequest =
|
|
621
|
+
hints && publicInputs ? PublicProcessor.generateProvingRequest(publicInputs, hints) : undefined;
|
|
622
|
+
|
|
623
|
+
const processedTx = makeProcessedTxFromTxWithPublicCalls(
|
|
510
624
|
tx,
|
|
625
|
+
this.globalVariables,
|
|
511
626
|
avmProvingRequest,
|
|
627
|
+
publicTxEffect,
|
|
512
628
|
gasUsed,
|
|
513
629
|
revertCode,
|
|
514
630
|
revertReason,
|
|
515
631
|
);
|
|
516
632
|
|
|
517
|
-
|
|
633
|
+
return [processedTx, appLogicReturnValues, result.logs ?? []];
|
|
634
|
+
}
|
|
518
635
|
|
|
519
|
-
|
|
636
|
+
/**
|
|
637
|
+
* Generate the proving request for the AVM circuit.
|
|
638
|
+
*/
|
|
639
|
+
private static generateProvingRequest(
|
|
640
|
+
publicInputs: AvmCircuitPublicInputs,
|
|
641
|
+
hints: AvmExecutionHints = AvmExecutionHints.empty(),
|
|
642
|
+
): AvmProvingRequest {
|
|
643
|
+
return {
|
|
644
|
+
type: ProvingRequestType.PUBLIC_VM,
|
|
645
|
+
inputs: new AvmCircuitInputs(hints, publicInputs),
|
|
646
|
+
};
|
|
520
647
|
}
|
|
521
648
|
}
|