@aztec/simulator 0.0.0-test.0
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 +49 -0
- package/dest/client.d.ts +5 -0
- package/dest/client.d.ts.map +1 -0
- package/dest/client.js +3 -0
- package/dest/common/db_interfaces.d.ts +80 -0
- package/dest/common/db_interfaces.d.ts.map +1 -0
- package/dest/common/db_interfaces.js +1 -0
- package/dest/common/debug_fn_name.d.ts +5 -0
- package/dest/common/debug_fn_name.d.ts.map +1 -0
- package/dest/common/debug_fn_name.js +6 -0
- package/dest/common/errors.d.ts +54 -0
- package/dest/common/errors.d.ts.map +1 -0
- package/dest/common/errors.js +135 -0
- package/dest/common/index.d.ts +4 -0
- package/dest/common/index.d.ts.map +1 -0
- package/dest/common/index.js +3 -0
- package/dest/common/message_load_oracle_inputs.d.ts +15 -0
- package/dest/common/message_load_oracle_inputs.d.ts.map +1 -0
- package/dest/common/message_load_oracle_inputs.js +15 -0
- package/dest/common/stats/index.d.ts +2 -0
- package/dest/common/stats/index.d.ts.map +1 -0
- package/dest/common/stats/index.js +1 -0
- package/dest/common/stats/stats.d.ts +4 -0
- package/dest/common/stats/stats.d.ts.map +1 -0
- package/dest/common/stats/stats.js +10 -0
- package/dest/private/acvm/acvm.d.ts +35 -0
- package/dest/private/acvm/acvm.d.ts.map +1 -0
- package/dest/private/acvm/acvm.js +70 -0
- package/dest/private/acvm/acvm_types.d.ts +10 -0
- package/dest/private/acvm/acvm_types.d.ts.map +1 -0
- package/dest/private/acvm/acvm_types.js +3 -0
- package/dest/private/acvm/deserialize.d.ts +36 -0
- package/dest/private/acvm/deserialize.d.ts.map +1 -0
- package/dest/private/acvm/deserialize.js +42 -0
- package/dest/private/acvm/index.d.ts +6 -0
- package/dest/private/acvm/index.d.ts.map +1 -0
- package/dest/private/acvm/index.js +5 -0
- package/dest/private/acvm/oracle/index.d.ts +14 -0
- package/dest/private/acvm/oracle/index.d.ts.map +1 -0
- package/dest/private/acvm/oracle/index.js +2 -0
- package/dest/private/acvm/oracle/oracle.d.ts +49 -0
- package/dest/private/acvm/oracle/oracle.d.ts.map +1 -0
- package/dest/private/acvm/oracle/oracle.js +263 -0
- package/dest/private/acvm/oracle/typed_oracle.d.ts +83 -0
- package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -0
- package/dest/private/acvm/oracle/typed_oracle.js +132 -0
- package/dest/private/acvm/serialize.d.ts +24 -0
- package/dest/private/acvm/serialize.d.ts.map +1 -0
- package/dest/private/acvm/serialize.js +46 -0
- package/dest/private/execution_data_provider.d.ts +261 -0
- package/dest/private/execution_data_provider.d.ts.map +1 -0
- package/dest/private/execution_data_provider.js +14 -0
- package/dest/private/execution_note_cache.d.ts +93 -0
- package/dest/private/execution_note_cache.d.ts.map +1 -0
- package/dest/private/execution_note_cache.js +180 -0
- package/dest/private/hashed_values_cache.d.ts +28 -0
- package/dest/private/hashed_values_cache.d.ts.map +1 -0
- package/dest/private/hashed_values_cache.js +46 -0
- package/dest/private/index.d.ts +13 -0
- package/dest/private/index.d.ts.map +1 -0
- package/dest/private/index.js +12 -0
- package/dest/private/pick_notes.d.ts +85 -0
- package/dest/private/pick_notes.d.ts.map +1 -0
- package/dest/private/pick_notes.js +51 -0
- package/dest/private/private_execution.d.ts +25 -0
- package/dest/private/private_execution.d.ts.map +1 -0
- package/dest/private/private_execution.js +92 -0
- package/dest/private/private_execution_oracle.d.ts +215 -0
- package/dest/private/private_execution_oracle.d.ts.map +1 -0
- package/dest/private/private_execution_oracle.js +382 -0
- package/dest/private/providers/acvm_native.d.ts +40 -0
- package/dest/private/providers/acvm_native.d.ts.map +1 -0
- package/dest/private/providers/acvm_native.js +139 -0
- package/dest/private/providers/acvm_wasm.d.ts +15 -0
- package/dest/private/providers/acvm_wasm.d.ts.map +1 -0
- package/dest/private/providers/acvm_wasm.js +62 -0
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts +19 -0
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -0
- package/dest/private/providers/acvm_wasm_with_blobs.js +32 -0
- package/dest/private/providers/factory.d.ts +12 -0
- package/dest/private/providers/factory.d.ts.map +1 -0
- package/dest/private/providers/factory.js +27 -0
- package/dest/private/providers/simulation_provider.d.ts +19 -0
- package/dest/private/providers/simulation_provider.d.ts.map +1 -0
- package/dest/private/providers/simulation_provider.js +24 -0
- package/dest/private/simulator.d.ts +34 -0
- package/dest/private/simulator.d.ts.map +1 -0
- package/dest/private/simulator.js +76 -0
- package/dest/private/unconstrained_execution.d.ts +10 -0
- package/dest/private/unconstrained_execution.d.ts.map +1 -0
- package/dest/private/unconstrained_execution.js +27 -0
- package/dest/private/unconstrained_execution_oracle.d.ts +161 -0
- package/dest/private/unconstrained_execution_oracle.d.ts.map +1 -0
- package/dest/private/unconstrained_execution_oracle.js +258 -0
- package/dest/public/avm/avm_context.d.ts +41 -0
- package/dest/public/avm/avm_context.d.ts.map +1 -0
- package/dest/public/avm/avm_context.js +44 -0
- package/dest/public/avm/avm_contract_call_result.d.ts +30 -0
- package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -0
- package/dest/public/avm/avm_contract_call_result.js +50 -0
- package/dest/public/avm/avm_execution_environment.d.ts +21 -0
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -0
- package/dest/public/avm/avm_execution_environment.js +31 -0
- package/dest/public/avm/avm_gas.d.ts +60 -0
- package/dest/public/avm/avm_gas.d.ts.map +1 -0
- package/dest/public/avm/avm_gas.js +203 -0
- package/dest/public/avm/avm_machine_state.d.ts +95 -0
- package/dest/public/avm/avm_machine_state.d.ts.map +1 -0
- package/dest/public/avm/avm_machine_state.js +107 -0
- package/dest/public/avm/avm_memory_types.d.ts +264 -0
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -0
- package/dest/public/avm/avm_memory_types.js +340 -0
- package/dest/public/avm/avm_simulator.d.ts +40 -0
- package/dest/public/avm/avm_simulator.d.ts.map +1 -0
- package/dest/public/avm/avm_simulator.js +202 -0
- package/dest/public/avm/bytecode_utils.d.ts +5 -0
- package/dest/public/avm/bytecode_utils.d.ts.map +1 -0
- package/dest/public/avm/bytecode_utils.js +17 -0
- package/dest/public/avm/errors.d.ts +122 -0
- package/dest/public/avm/errors.d.ts.map +1 -0
- package/dest/public/avm/errors.js +179 -0
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +21 -0
- package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -0
- package/dest/public/avm/fixtures/avm_simulation_tester.js +76 -0
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +36 -0
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -0
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +83 -0
- package/dest/public/avm/fixtures/index.d.ts +84 -0
- package/dest/public/avm/fixtures/index.d.ts.map +1 -0
- package/dest/public/avm/fixtures/index.js +175 -0
- package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +35 -0
- package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +1 -0
- package/dest/public/avm/fixtures/simple_contract_data_source.js +74 -0
- package/dest/public/avm/index.d.ts +4 -0
- package/dest/public/avm/index.d.ts.map +1 -0
- package/dest/public/avm/index.js +3 -0
- package/dest/public/avm/journal/index.d.ts +2 -0
- package/dest/public/avm/journal/index.d.ts.map +1 -0
- package/dest/public/avm/journal/index.js +1 -0
- package/dest/public/avm/journal/journal.d.ts +209 -0
- package/dest/public/avm/journal/journal.d.ts.map +1 -0
- package/dest/public/avm/journal/journal.js +486 -0
- package/dest/public/avm/journal/nullifiers.d.ts +64 -0
- package/dest/public/avm/journal/nullifiers.d.ts.map +1 -0
- package/dest/public/avm/journal/nullifiers.js +97 -0
- package/dest/public/avm/journal/public_storage.d.ts +66 -0
- package/dest/public/avm/journal/public_storage.d.ts.map +1 -0
- package/dest/public/avm/journal/public_storage.js +145 -0
- package/dest/public/avm/opcodes/accrued_substate.d.ts +75 -0
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -0
- package/dest/public/avm/opcodes/accrued_substate.js +252 -0
- package/dest/public/avm/opcodes/addressing_mode.d.ts +27 -0
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -0
- package/dest/public/avm/opcodes/addressing_mode.js +74 -0
- package/dest/public/avm/opcodes/arithmetic.d.ts +37 -0
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -0
- package/dest/public/avm/opcodes/arithmetic.js +73 -0
- package/dest/public/avm/opcodes/bitwise.d.ts +50 -0
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -0
- package/dest/public/avm/opcodes/bitwise.js +106 -0
- package/dest/public/avm/opcodes/comparators.d.ts +25 -0
- package/dest/public/avm/opcodes/comparators.d.ts.map +1 -0
- package/dest/public/avm/opcodes/comparators.js +43 -0
- package/dest/public/avm/opcodes/contract.d.ts +21 -0
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -0
- package/dest/public/avm/opcodes/contract.js +66 -0
- package/dest/public/avm/opcodes/control_flow.d.ts +41 -0
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -0
- package/dest/public/avm/opcodes/control_flow.js +105 -0
- package/dest/public/avm/opcodes/conversion.d.ts +17 -0
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -0
- package/dest/public/avm/opcodes/conversion.js +69 -0
- package/dest/public/avm/opcodes/ec_add.d.ts +19 -0
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -0
- package/dest/public/avm/opcodes/ec_add.js +84 -0
- package/dest/public/avm/opcodes/environment_getters.d.ts +28 -0
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -0
- package/dest/public/avm/opcodes/environment_getters.js +79 -0
- package/dest/public/avm/opcodes/external_calls.d.ts +58 -0
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -0
- package/dest/public/avm/opcodes/external_calls.js +204 -0
- package/dest/public/avm/opcodes/hashing.d.ts +36 -0
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -0
- package/dest/public/avm/opcodes/hashing.js +114 -0
- package/dest/public/avm/opcodes/index.d.ts +16 -0
- package/dest/public/avm/opcodes/index.d.ts.map +1 -0
- package/dest/public/avm/opcodes/index.js +15 -0
- package/dest/public/avm/opcodes/instruction.d.ts +70 -0
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -0
- package/dest/public/avm/opcodes/instruction.js +91 -0
- package/dest/public/avm/opcodes/instruction_impl.d.ts +19 -0
- package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -0
- package/dest/public/avm/opcodes/instruction_impl.js +30 -0
- package/dest/public/avm/opcodes/memory.d.ts +74 -0
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -0
- package/dest/public/avm/opcodes/memory.js +253 -0
- package/dest/public/avm/opcodes/misc.d.ts +17 -0
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -0
- package/dest/public/avm/opcodes/misc.js +48 -0
- package/dest/public/avm/opcodes/storage.d.ts +24 -0
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -0
- package/dest/public/avm/opcodes/storage.js +66 -0
- package/dest/public/avm/serialization/buffer_cursor.d.ts +28 -0
- package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -0
- package/dest/public/avm/serialization/buffer_cursor.js +99 -0
- package/dest/public/avm/serialization/bytecode_serialization.d.ts +21 -0
- package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -0
- package/dest/public/avm/serialization/bytecode_serialization.js +332 -0
- package/dest/public/avm/serialization/instruction_serialization.d.ts +105 -0
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -0
- package/dest/public/avm/serialization/instruction_serialization.js +226 -0
- package/dest/public/avm/test_utils.d.ts +18 -0
- package/dest/public/avm/test_utils.d.ts.map +1 -0
- package/dest/public/avm/test_utils.js +52 -0
- package/dest/public/bytecode_errors.d.ts +4 -0
- package/dest/public/bytecode_errors.d.ts.map +1 -0
- package/dest/public/bytecode_errors.js +6 -0
- package/dest/public/execution.d.ts +108 -0
- package/dest/public/execution.d.ts.map +1 -0
- package/dest/public/execution.js +9 -0
- package/dest/public/executor_metrics.d.ts +13 -0
- package/dest/public/executor_metrics.d.ts.map +1 -0
- package/dest/public/executor_metrics.js +54 -0
- package/dest/public/fixtures/index.d.ts +3 -0
- package/dest/public/fixtures/index.d.ts.map +1 -0
- package/dest/public/fixtures/index.js +2 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +32 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -0
- package/dest/public/fixtures/public_tx_simulation_tester.js +93 -0
- package/dest/public/fixtures/utils.d.ts +13 -0
- package/dest/public/fixtures/utils.d.ts.map +1 -0
- package/dest/public/fixtures/utils.js +126 -0
- package/dest/public/index.d.ts +10 -0
- package/dest/public/index.d.ts.map +1 -0
- package/dest/public/index.js +8 -0
- package/dest/public/public_db_sources.d.ts +129 -0
- package/dest/public/public_db_sources.d.ts.map +1 -0
- package/dest/public/public_db_sources.js +264 -0
- package/dest/public/public_processor/public_processor.d.ts +74 -0
- package/dest/public/public_processor/public_processor.d.ts.map +1 -0
- package/dest/public/public_processor/public_processor.js +379 -0
- package/dest/public/public_processor/public_processor_metrics.d.ts +27 -0
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -0
- package/dest/public/public_processor/public_processor_metrics.js +125 -0
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +137 -0
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_context.js +320 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +102 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.js +334 -0
- package/dest/public/side_effect_errors.d.ts +4 -0
- package/dest/public/side_effect_errors.d.ts.map +1 -0
- package/dest/public/side_effect_errors.js +6 -0
- package/dest/public/side_effect_trace.d.ts +132 -0
- package/dest/public/side_effect_trace.d.ts.map +1 -0
- package/dest/public/side_effect_trace.js +249 -0
- package/dest/public/side_effect_trace_interface.d.ts +34 -0
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -0
- package/dest/public/side_effect_trace_interface.js +1 -0
- package/dest/public/tx_contract_cache.d.ts +41 -0
- package/dest/public/tx_contract_cache.d.ts.map +1 -0
- package/dest/public/tx_contract_cache.js +49 -0
- package/dest/public/unique_class_ids.d.ts +37 -0
- package/dest/public/unique_class_ids.d.ts.map +1 -0
- package/dest/public/unique_class_ids.js +61 -0
- package/dest/public/utils.d.ts +5 -0
- package/dest/public/utils.d.ts.map +1 -0
- package/dest/public/utils.js +35 -0
- package/dest/server.d.ts +6 -0
- package/dest/server.d.ts.map +1 -0
- package/dest/server.js +4 -0
- package/dest/test/utils.d.ts +13 -0
- package/dest/test/utils.d.ts.map +1 -0
- package/dest/test/utils.js +22 -0
- package/package.json +104 -0
- package/src/client.ts +4 -0
- package/src/common/db_interfaces.ts +94 -0
- package/src/common/debug_fn_name.ts +18 -0
- package/src/common/errors.ts +183 -0
- package/src/common/index.ts +3 -0
- package/src/common/message_load_oracle_inputs.ts +15 -0
- package/src/common/stats/index.ts +1 -0
- package/src/common/stats/stats.ts +20 -0
- package/src/private/acvm/acvm.ts +127 -0
- package/src/private/acvm/acvm_types.ts +11 -0
- package/src/private/acvm/deserialize.ts +52 -0
- package/src/private/acvm/index.ts +5 -0
- package/src/private/acvm/oracle/index.ts +16 -0
- package/src/private/acvm/oracle/oracle.ts +455 -0
- package/src/private/acvm/oracle/typed_oracle.ts +259 -0
- package/src/private/acvm/serialize.ts +60 -0
- package/src/private/execution_data_provider.ts +323 -0
- package/src/private/execution_note_cache.ts +217 -0
- package/src/private/hashed_values_cache.ts +55 -0
- package/src/private/index.ts +16 -0
- package/src/private/pick_notes.ts +141 -0
- package/src/private/private_execution.ts +151 -0
- package/src/private/private_execution_oracle.ts +614 -0
- package/src/private/providers/acvm_native.ts +171 -0
- package/src/private/providers/acvm_wasm.ts +63 -0
- package/src/private/providers/acvm_wasm_with_blobs.ts +50 -0
- package/src/private/providers/factory.ts +38 -0
- package/src/private/providers/simulation_provider.ts +45 -0
- package/src/private/simulator.ts +147 -0
- package/src/private/unconstrained_execution.ts +50 -0
- package/src/private/unconstrained_execution_oracle.ts +373 -0
- package/src/public/avm/avm_context.ts +61 -0
- package/src/public/avm/avm_contract_call_result.ts +55 -0
- package/src/public/avm/avm_execution_environment.ts +39 -0
- package/src/public/avm/avm_gas.ts +195 -0
- package/src/public/avm/avm_machine_state.ts +164 -0
- package/src/public/avm/avm_memory_types.ts +423 -0
- package/src/public/avm/avm_simulator.ts +284 -0
- package/src/public/avm/bytecode_utils.ts +17 -0
- package/src/public/avm/errors.ts +232 -0
- package/src/public/avm/fixtures/avm_simulation_tester.ts +105 -0
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +109 -0
- package/src/public/avm/fixtures/index.ts +296 -0
- package/src/public/avm/fixtures/simple_contract_data_source.ts +105 -0
- package/src/public/avm/index.ts +3 -0
- package/src/public/avm/journal/index.ts +1 -0
- package/src/public/avm/journal/journal.ts +742 -0
- package/src/public/avm/journal/nullifiers.ts +109 -0
- package/src/public/avm/journal/public_storage.ts +174 -0
- package/src/public/avm/opcodes/.eslintrc.cjs +8 -0
- package/src/public/avm/opcodes/accrued_substate.ts +253 -0
- package/src/public/avm/opcodes/addressing_mode.ts +87 -0
- package/src/public/avm/opcodes/arithmetic.ts +95 -0
- package/src/public/avm/opcodes/bitwise.ts +109 -0
- package/src/public/avm/opcodes/comparators.ts +52 -0
- package/src/public/avm/opcodes/contract.ts +72 -0
- package/src/public/avm/opcodes/control_flow.ts +114 -0
- package/src/public/avm/opcodes/conversion.ts +80 -0
- package/src/public/avm/opcodes/ec_add.ts +93 -0
- package/src/public/avm/opcodes/environment_getters.ts +82 -0
- package/src/public/avm/opcodes/external_calls.ts +228 -0
- package/src/public/avm/opcodes/hashing.ts +125 -0
- package/src/public/avm/opcodes/index.ts +15 -0
- package/src/public/avm/opcodes/instruction.ts +126 -0
- package/src/public/avm/opcodes/instruction_impl.ts +36 -0
- package/src/public/avm/opcodes/memory.ts +254 -0
- package/src/public/avm/opcodes/misc.ts +60 -0
- package/src/public/avm/opcodes/storage.ts +71 -0
- package/src/public/avm/serialization/buffer_cursor.ts +115 -0
- package/src/public/avm/serialization/bytecode_serialization.ts +206 -0
- package/src/public/avm/serialization/instruction_serialization.ts +208 -0
- package/src/public/avm/test_utils.ts +81 -0
- package/src/public/bytecode_errors.ts +6 -0
- package/src/public/execution.ts +140 -0
- package/src/public/executor_metrics.ts +71 -0
- package/src/public/fixtures/index.ts +2 -0
- package/src/public/fixtures/public_tx_simulation_tester.ts +179 -0
- package/src/public/fixtures/utils.ts +199 -0
- package/src/public/index.ts +9 -0
- package/src/public/public_db_sources.ts +369 -0
- package/src/public/public_processor/public_processor.ts +521 -0
- package/src/public/public_processor/public_processor_metrics.ts +154 -0
- package/src/public/public_tx_simulator/public_tx_context.ts +504 -0
- package/src/public/public_tx_simulator/public_tx_simulator.ts +474 -0
- package/src/public/side_effect_errors.ts +6 -0
- package/src/public/side_effect_trace.ts +516 -0
- package/src/public/side_effect_trace_interface.ts +76 -0
- package/src/public/tx_contract_cache.ts +69 -0
- package/src/public/unique_class_ids.ts +80 -0
- package/src/public/utils.ts +32 -0
- package/src/server.ts +5 -0
- package/src/test/utils.ts +36 -0
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import { runInDirectory } from '@aztec/foundation/fs';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { Timer } from '@aztec/foundation/timer';
|
|
4
|
+
import type { NoirCompiledCircuit } from '@aztec/stdlib/noir';
|
|
5
|
+
|
|
6
|
+
import type { WitnessMap } from '@noir-lang/types';
|
|
7
|
+
import * as proc from 'child_process';
|
|
8
|
+
import { promises as fs } from 'fs';
|
|
9
|
+
|
|
10
|
+
import type { ACIRCallback, ACIRExecutionResult } from '../acvm/acvm.js';
|
|
11
|
+
import type { ACVMWitness } from '../acvm/acvm_types.js';
|
|
12
|
+
import type { SimulationProvider } from './simulation_provider.js';
|
|
13
|
+
|
|
14
|
+
const logger = createLogger('simulator:acvm-native');
|
|
15
|
+
|
|
16
|
+
export enum ACVM_RESULT {
|
|
17
|
+
SUCCESS,
|
|
18
|
+
FAILURE,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export type ACVMSuccess = {
|
|
22
|
+
status: ACVM_RESULT.SUCCESS;
|
|
23
|
+
duration: number;
|
|
24
|
+
witness: Map<number, string>;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type ACVMFailure = {
|
|
28
|
+
status: ACVM_RESULT.FAILURE;
|
|
29
|
+
reason: string;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export type ACVMResult = ACVMSuccess | ACVMFailure;
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Parses a TOML format witness map string into a Map structure
|
|
36
|
+
* @param outputString - The witness map in TOML format
|
|
37
|
+
* @returns The parsed witness map
|
|
38
|
+
*/
|
|
39
|
+
function parseIntoWitnessMap(outputString: string) {
|
|
40
|
+
const lines = outputString.split('\n');
|
|
41
|
+
return new Map<number, string>(
|
|
42
|
+
lines
|
|
43
|
+
.filter((line: string) => line.length)
|
|
44
|
+
.map((line: string) => {
|
|
45
|
+
const pair = line.replaceAll(' ', '').split('=');
|
|
46
|
+
return [Number(pair[0]), pair[1].replaceAll('"', '')];
|
|
47
|
+
}),
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
*
|
|
53
|
+
* @param inputWitness - The circuit's input witness
|
|
54
|
+
* @param bytecode - The circuit bytecode
|
|
55
|
+
* @param workingDirectory - A directory to use for temporary files by the ACVM
|
|
56
|
+
* @param pathToAcvm - The path to the ACVM binary
|
|
57
|
+
* @param outputFilename - If specified, the output will be stored as a file, encoded using Bincode
|
|
58
|
+
* @returns The completed partial witness outputted from the circuit
|
|
59
|
+
*/
|
|
60
|
+
export async function executeNativeCircuit(
|
|
61
|
+
inputWitness: WitnessMap,
|
|
62
|
+
bytecode: Buffer,
|
|
63
|
+
workingDirectory: string,
|
|
64
|
+
pathToAcvm: string,
|
|
65
|
+
outputFilename?: string,
|
|
66
|
+
): Promise<ACVMResult> {
|
|
67
|
+
const bytecodeFilename = 'bytecode';
|
|
68
|
+
const witnessFilename = 'input_witness.toml';
|
|
69
|
+
|
|
70
|
+
// convert the witness map to TOML format
|
|
71
|
+
let witnessMap = '';
|
|
72
|
+
inputWitness.forEach((value: string, key: number) => {
|
|
73
|
+
witnessMap = witnessMap.concat(`${key} = '${value}'\n`);
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
try {
|
|
77
|
+
// Check that the directory exists
|
|
78
|
+
await fs.access(workingDirectory);
|
|
79
|
+
} catch (error) {
|
|
80
|
+
return { status: ACVM_RESULT.FAILURE, reason: `Working directory ${workingDirectory} does not exist` };
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
try {
|
|
84
|
+
// Write the bytecode and input witness to the working directory
|
|
85
|
+
await fs.writeFile(`${workingDirectory}/${bytecodeFilename}`, bytecode);
|
|
86
|
+
await fs.writeFile(`${workingDirectory}/${witnessFilename}`, witnessMap);
|
|
87
|
+
|
|
88
|
+
// Execute the ACVM using the given args
|
|
89
|
+
const args = [
|
|
90
|
+
`execute`,
|
|
91
|
+
`--working-directory`,
|
|
92
|
+
`${workingDirectory}`,
|
|
93
|
+
`--bytecode`,
|
|
94
|
+
`${bytecodeFilename}`,
|
|
95
|
+
`--input-witness`,
|
|
96
|
+
`${witnessFilename}`,
|
|
97
|
+
'--print',
|
|
98
|
+
'--output-witness',
|
|
99
|
+
'output-witness',
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
logger.debug(`Calling ACVM with ${args.join(' ')}`);
|
|
103
|
+
|
|
104
|
+
const processPromise = new Promise<string>((resolve, reject) => {
|
|
105
|
+
let outputWitness = Buffer.alloc(0);
|
|
106
|
+
let errorBuffer = Buffer.alloc(0);
|
|
107
|
+
const acvm = proc.spawn(pathToAcvm, args);
|
|
108
|
+
acvm.stdout.on('data', data => {
|
|
109
|
+
outputWitness = Buffer.concat([outputWitness, data]);
|
|
110
|
+
});
|
|
111
|
+
acvm.stderr.on('data', data => {
|
|
112
|
+
errorBuffer = Buffer.concat([errorBuffer, data]);
|
|
113
|
+
});
|
|
114
|
+
acvm.on('close', code => {
|
|
115
|
+
if (code === 0) {
|
|
116
|
+
resolve(outputWitness.toString('utf-8'));
|
|
117
|
+
} else {
|
|
118
|
+
logger.error(`From ACVM: ${errorBuffer.toString('utf-8')}`);
|
|
119
|
+
reject(errorBuffer.toString('utf-8'));
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
|
|
124
|
+
const duration = new Timer();
|
|
125
|
+
const output = await processPromise;
|
|
126
|
+
if (outputFilename) {
|
|
127
|
+
const outputWitnessFileName = `${workingDirectory}/output-witness.gz`;
|
|
128
|
+
await fs.copyFile(outputWitnessFileName, outputFilename);
|
|
129
|
+
}
|
|
130
|
+
const witness = parseIntoWitnessMap(output);
|
|
131
|
+
return { status: ACVM_RESULT.SUCCESS, witness, duration: duration.ms() };
|
|
132
|
+
} catch (error) {
|
|
133
|
+
return { status: ACVM_RESULT.FAILURE, reason: `${error}` };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export class NativeACVMSimulator implements SimulationProvider {
|
|
138
|
+
constructor(private workingDirectory: string, private pathToAcvm: string, private witnessFilename?: string) {}
|
|
139
|
+
async executeProtocolCircuit(input: WitnessMap, compiledCircuit: NoirCompiledCircuit): Promise<WitnessMap> {
|
|
140
|
+
// Execute the circuit on those initial witness values
|
|
141
|
+
|
|
142
|
+
const operation = async (directory: string) => {
|
|
143
|
+
// Decode the bytecode from base64 since the acvm does not know about base64 encoding
|
|
144
|
+
const decodedBytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
|
|
145
|
+
// Execute the circuit
|
|
146
|
+
const result = await executeNativeCircuit(
|
|
147
|
+
input,
|
|
148
|
+
decodedBytecode,
|
|
149
|
+
directory,
|
|
150
|
+
this.pathToAcvm,
|
|
151
|
+
this.witnessFilename,
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
if (result.status == ACVM_RESULT.FAILURE) {
|
|
155
|
+
throw new Error(`Failed to generate witness: ${result.reason}`);
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return result.witness;
|
|
159
|
+
};
|
|
160
|
+
|
|
161
|
+
return await runInDirectory(this.workingDirectory, operation, false, logger);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
executeUserCircuit(
|
|
165
|
+
_acir: Buffer,
|
|
166
|
+
_initialWitness: ACVMWitness,
|
|
167
|
+
_callback: ACIRCallback,
|
|
168
|
+
): Promise<ACIRExecutionResult> {
|
|
169
|
+
throw new Error('Not implemented');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
2
|
+
import { foreignCallHandler } from '@aztec/noir-protocol-circuits-types/client';
|
|
3
|
+
import type { NoirCompiledCircuit } from '@aztec/stdlib/noir';
|
|
4
|
+
|
|
5
|
+
import initACVM, { type ExecutionError, executeCircuit } from '@noir-lang/acvm_js';
|
|
6
|
+
import initAbi from '@noir-lang/noirc_abi';
|
|
7
|
+
import type { WitnessMap } from '@noir-lang/types';
|
|
8
|
+
|
|
9
|
+
import { type ACIRCallback, acvm } from '../acvm/acvm.js';
|
|
10
|
+
import type { ACVMWitness } from '../acvm/acvm_types.js';
|
|
11
|
+
import { type SimulationProvider, parseErrorPayload } from './simulation_provider.js';
|
|
12
|
+
|
|
13
|
+
export class WASMSimulator implements SimulationProvider {
|
|
14
|
+
constructor(protected log = createLogger('wasm-simulator')) {}
|
|
15
|
+
|
|
16
|
+
async init(): Promise<void> {
|
|
17
|
+
// If these are available, then we are in the
|
|
18
|
+
// web environment. For the node environment, this
|
|
19
|
+
// is a no-op.
|
|
20
|
+
if (typeof initAbi === 'function') {
|
|
21
|
+
/** @ts-expect-error The node bundle doesn't include these default imports, so TS complains */
|
|
22
|
+
await Promise.all([initAbi(), initACVM()]);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async executeProtocolCircuit(input: WitnessMap, compiledCircuit: NoirCompiledCircuit): Promise<WitnessMap> {
|
|
27
|
+
this.log.debug('init', { hash: compiledCircuit.hash });
|
|
28
|
+
await this.init();
|
|
29
|
+
// Execute the circuit on those initial witness values
|
|
30
|
+
//
|
|
31
|
+
// Decode the bytecode from base64 since the acvm does not know about base64 encoding
|
|
32
|
+
const decodedBytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
|
|
33
|
+
//
|
|
34
|
+
// Execute the circuit
|
|
35
|
+
try {
|
|
36
|
+
const _witnessMap = await executeCircuit(
|
|
37
|
+
decodedBytecode,
|
|
38
|
+
input,
|
|
39
|
+
foreignCallHandler, // handle calls to debug_log
|
|
40
|
+
);
|
|
41
|
+
this.log.debug('execution successful', { hash: compiledCircuit.hash });
|
|
42
|
+
return _witnessMap;
|
|
43
|
+
} catch (err) {
|
|
44
|
+
// Typescript types catched errors as unknown or any, so we need to narrow its type to check if it has raw assertion payload.
|
|
45
|
+
if (typeof err === 'object' && err !== null && 'rawAssertionPayload' in err) {
|
|
46
|
+
const parsed = parseErrorPayload(compiledCircuit.abi, err as ExecutionError);
|
|
47
|
+
this.log.debug('execution failed', {
|
|
48
|
+
hash: compiledCircuit.hash,
|
|
49
|
+
error: parsed,
|
|
50
|
+
message: parsed.message,
|
|
51
|
+
});
|
|
52
|
+
throw parsed;
|
|
53
|
+
}
|
|
54
|
+
this.log.debug('execution failed', { hash: compiledCircuit.hash, error: err });
|
|
55
|
+
throw new Error(`Circuit execution failed: ${err}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async executeUserCircuit(acir: Buffer, initialWitness: ACVMWitness, callback: ACIRCallback) {
|
|
60
|
+
await this.init();
|
|
61
|
+
return acvm(acir, initialWitness, callback);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { foreignCallHandler } from '@aztec/noir-protocol-circuits-types/server';
|
|
2
|
+
import type { NoirCompiledCircuit } from '@aztec/stdlib/noir';
|
|
3
|
+
|
|
4
|
+
import { type ExecutionError, executeCircuit } from '@noir-lang/acvm_js';
|
|
5
|
+
import type { WitnessMap } from '@noir-lang/types';
|
|
6
|
+
|
|
7
|
+
import type { ACIRCallback, ACIRExecutionResult } from '../acvm/acvm.js';
|
|
8
|
+
import type { ACVMWitness } from '../acvm/acvm_types.js';
|
|
9
|
+
import { type SimulationProvider, parseErrorPayload } from './simulation_provider.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* A simulation provider that uses the WASM simulator with the ability to handle blobs via the foreign call handler.
|
|
13
|
+
* This class is temporary while brillig cannot handle the blob math, and it is kept separate
|
|
14
|
+
* because the zkg commitment library used in the blob code is not browser compatible.
|
|
15
|
+
*
|
|
16
|
+
* It is only used in the context of server-side code executing simulated protocol circuits.
|
|
17
|
+
*/
|
|
18
|
+
export class WASMSimulatorWithBlobs implements SimulationProvider {
|
|
19
|
+
async executeProtocolCircuit(input: WitnessMap, compiledCircuit: NoirCompiledCircuit): Promise<WitnessMap> {
|
|
20
|
+
// Execute the circuit on those initial witness values
|
|
21
|
+
//
|
|
22
|
+
// Decode the bytecode from base64 since the acvm does not know about base64 encoding
|
|
23
|
+
const decodedBytecode = Buffer.from(compiledCircuit.bytecode, 'base64');
|
|
24
|
+
//
|
|
25
|
+
// Execute the circuit
|
|
26
|
+
try {
|
|
27
|
+
const _witnessMap = await executeCircuit(
|
|
28
|
+
decodedBytecode,
|
|
29
|
+
input,
|
|
30
|
+
foreignCallHandler, // handle calls to debug_log and evaluate_blobs mock
|
|
31
|
+
);
|
|
32
|
+
|
|
33
|
+
return _witnessMap;
|
|
34
|
+
} catch (err) {
|
|
35
|
+
// Typescript types catched errors as unknown or any, so we need to narrow its type to check if it has raw assertion payload.
|
|
36
|
+
if (typeof err === 'object' && err !== null && 'rawAssertionPayload' in err) {
|
|
37
|
+
throw parseErrorPayload(compiledCircuit.abi, err as ExecutionError);
|
|
38
|
+
}
|
|
39
|
+
throw new Error(`Circuit execution failed: ${err}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
executeUserCircuit(
|
|
44
|
+
_acir: Buffer,
|
|
45
|
+
_initialWitness: ACVMWitness,
|
|
46
|
+
_callback: ACIRCallback,
|
|
47
|
+
): Promise<ACIRExecutionResult> {
|
|
48
|
+
throw new Error('Not implemented');
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
2
|
+
|
|
3
|
+
import { promises as fs } from 'fs';
|
|
4
|
+
|
|
5
|
+
import { NativeACVMSimulator } from './acvm_native.js';
|
|
6
|
+
import { WASMSimulator } from './acvm_wasm.js';
|
|
7
|
+
import type { SimulationProvider } from './simulation_provider.js';
|
|
8
|
+
|
|
9
|
+
export type SimulationProviderConfig = {
|
|
10
|
+
acvmBinaryPath?: string;
|
|
11
|
+
acvmWorkingDirectory?: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export function getSimulationProviderConfigFromEnv() {
|
|
15
|
+
const { ACVM_BINARY_PATH, ACVM_WORKING_DIRECTORY } = process.env;
|
|
16
|
+
return {
|
|
17
|
+
acvmWorkingDirectory: ACVM_WORKING_DIRECTORY ? ACVM_WORKING_DIRECTORY : undefined,
|
|
18
|
+
acvmBinaryPath: ACVM_BINARY_PATH ? ACVM_BINARY_PATH : undefined,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export async function createSimulationProvider(
|
|
23
|
+
config: SimulationProviderConfig,
|
|
24
|
+
logger: Logger = createLogger('simulator'),
|
|
25
|
+
): Promise<SimulationProvider> {
|
|
26
|
+
if (config.acvmBinaryPath && config.acvmWorkingDirectory) {
|
|
27
|
+
try {
|
|
28
|
+
await fs.access(config.acvmBinaryPath, fs.constants.R_OK);
|
|
29
|
+
await fs.mkdir(config.acvmWorkingDirectory, { recursive: true });
|
|
30
|
+
logger.info(`Using native ACVM at ${config.acvmBinaryPath} and working directory ${config.acvmWorkingDirectory}`);
|
|
31
|
+
return new NativeACVMSimulator(config.acvmWorkingDirectory, config.acvmBinaryPath);
|
|
32
|
+
} catch {
|
|
33
|
+
logger.warn(`Failed to access ACVM at ${config.acvmBinaryPath}, falling back to WASM`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
logger.info('Using WASM ACVM simulation');
|
|
37
|
+
return new WASMSimulator();
|
|
38
|
+
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { NoirCompiledCircuit } from '@aztec/stdlib/noir';
|
|
2
|
+
|
|
3
|
+
import type { ExecutionError } from '@noir-lang/acvm_js';
|
|
4
|
+
import { abiDecodeError } from '@noir-lang/noirc_abi';
|
|
5
|
+
import type { Abi, WitnessMap } from '@noir-lang/types';
|
|
6
|
+
|
|
7
|
+
import type { ACIRCallback, ACIRExecutionResult } from '../acvm/acvm.js';
|
|
8
|
+
import type { ACVMWitness } from '../acvm/acvm_types.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Low level simulation interface
|
|
12
|
+
*/
|
|
13
|
+
export interface SimulationProvider {
|
|
14
|
+
executeProtocolCircuit(input: WitnessMap, compiledCircuit: NoirCompiledCircuit): Promise<WitnessMap>;
|
|
15
|
+
executeUserCircuit(acir: Buffer, initialWitness: ACVMWitness, callback: ACIRCallback): Promise<ACIRExecutionResult>;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export type ErrorWithPayload = ExecutionError & { decodedAssertionPayload?: any };
|
|
19
|
+
|
|
20
|
+
// Error handling taken from noir/noir-repo/tooling/noir_js/src/witness_generation.ts.
|
|
21
|
+
// TODO: import this in isolation without having to import noir_js in its entirety.
|
|
22
|
+
export function parseErrorPayload(abi: Abi, originalError: ExecutionError): Error {
|
|
23
|
+
const payload = originalError.rawAssertionPayload;
|
|
24
|
+
if (!payload) {
|
|
25
|
+
return originalError;
|
|
26
|
+
}
|
|
27
|
+
const enrichedError = originalError as ErrorWithPayload;
|
|
28
|
+
|
|
29
|
+
try {
|
|
30
|
+
// Decode the payload
|
|
31
|
+
const decodedPayload = abiDecodeError(abi, payload);
|
|
32
|
+
|
|
33
|
+
if (typeof decodedPayload === 'string') {
|
|
34
|
+
// If it's a string, just add it to the error message
|
|
35
|
+
enrichedError.message = `Circuit execution failed: ${decodedPayload}`;
|
|
36
|
+
} else {
|
|
37
|
+
// If not, attach the payload to the original error
|
|
38
|
+
enrichedError.decodedAssertionPayload = decodedPayload;
|
|
39
|
+
}
|
|
40
|
+
} catch (_errorDecoding) {
|
|
41
|
+
// Ignore errors decoding the payload
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
return enrichedError;
|
|
45
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { type Logger, createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import type { FunctionCall } from '@aztec/stdlib/abi';
|
|
4
|
+
import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
|
|
5
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
6
|
+
import { CallContext, PrivateExecutionResult, TxExecutionRequest } from '@aztec/stdlib/tx';
|
|
7
|
+
|
|
8
|
+
import { createSimulationError } from '../common/errors.js';
|
|
9
|
+
import type { ExecutionDataProvider } from './execution_data_provider.js';
|
|
10
|
+
import { ExecutionNoteCache } from './execution_note_cache.js';
|
|
11
|
+
import { HashedValuesCache } from './hashed_values_cache.js';
|
|
12
|
+
import { executePrivateFunction, verifyCurrentClassId } from './private_execution.js';
|
|
13
|
+
import { PrivateExecutionOracle } from './private_execution_oracle.js';
|
|
14
|
+
import type { SimulationProvider } from './providers/simulation_provider.js';
|
|
15
|
+
import { executeUnconstrainedFunction } from './unconstrained_execution.js';
|
|
16
|
+
import { UnconstrainedExecutionOracle } from './unconstrained_execution_oracle.js';
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* The ACIR simulator.
|
|
20
|
+
*/
|
|
21
|
+
export class AcirSimulator {
|
|
22
|
+
private log: Logger;
|
|
23
|
+
|
|
24
|
+
constructor(private executionDataProvider: ExecutionDataProvider, private simulationProvider: SimulationProvider) {
|
|
25
|
+
this.log = createLogger('simulator');
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Runs a private function.
|
|
30
|
+
* @param request - The transaction request.
|
|
31
|
+
* @param entryPointArtifact - The artifact of the entry point function.
|
|
32
|
+
* @param contractAddress - The address of the contract (should match request.origin)
|
|
33
|
+
* @param msgSender - The address calling the function. This can be replaced to simulate a call from another contract or a specific account.
|
|
34
|
+
* @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
35
|
+
* @returns The result of the execution.
|
|
36
|
+
*/
|
|
37
|
+
public async run(
|
|
38
|
+
request: TxExecutionRequest,
|
|
39
|
+
contractAddress: AztecAddress,
|
|
40
|
+
selector: FunctionSelector,
|
|
41
|
+
msgSender = AztecAddress.fromField(Fr.MAX_FIELD_VALUE),
|
|
42
|
+
scopes?: AztecAddress[],
|
|
43
|
+
): Promise<PrivateExecutionResult> {
|
|
44
|
+
const header = await this.executionDataProvider.getBlockHeader();
|
|
45
|
+
|
|
46
|
+
await verifyCurrentClassId(contractAddress, this.executionDataProvider);
|
|
47
|
+
const entryPointArtifact = await this.executionDataProvider.getFunctionArtifact(contractAddress, selector);
|
|
48
|
+
|
|
49
|
+
if (entryPointArtifact.functionType !== FunctionType.PRIVATE) {
|
|
50
|
+
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as private`);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (request.origin !== contractAddress) {
|
|
54
|
+
this.log.warn(
|
|
55
|
+
`Request origin does not match contract address in simulation. Request origin: ${request.origin}, contract address: ${contractAddress}`,
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// reserve the first side effect for the tx hash (inserted by the private kernel)
|
|
60
|
+
const startSideEffectCounter = 1;
|
|
61
|
+
|
|
62
|
+
const callContext = new CallContext(
|
|
63
|
+
msgSender,
|
|
64
|
+
contractAddress,
|
|
65
|
+
await FunctionSelector.fromNameAndParameters(entryPointArtifact.name, entryPointArtifact.parameters),
|
|
66
|
+
entryPointArtifact.isStatic,
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const txRequestHash = await request.toTxRequest().hash();
|
|
70
|
+
const noteCache = new ExecutionNoteCache(txRequestHash);
|
|
71
|
+
|
|
72
|
+
const context = new PrivateExecutionOracle(
|
|
73
|
+
request.firstCallArgsHash,
|
|
74
|
+
request.txContext,
|
|
75
|
+
callContext,
|
|
76
|
+
header,
|
|
77
|
+
request.authWitnesses,
|
|
78
|
+
request.capsules,
|
|
79
|
+
HashedValuesCache.create(request.argsOfCalls),
|
|
80
|
+
noteCache,
|
|
81
|
+
this.executionDataProvider,
|
|
82
|
+
this.simulationProvider,
|
|
83
|
+
/*totalPublicArgsCount=*/ 0,
|
|
84
|
+
startSideEffectCounter,
|
|
85
|
+
undefined,
|
|
86
|
+
scopes,
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
try {
|
|
90
|
+
const executionResult = await executePrivateFunction(
|
|
91
|
+
this.simulationProvider,
|
|
92
|
+
context,
|
|
93
|
+
entryPointArtifact,
|
|
94
|
+
contractAddress,
|
|
95
|
+
request.functionSelector,
|
|
96
|
+
);
|
|
97
|
+
const { usedTxRequestHashForNonces } = noteCache.finish();
|
|
98
|
+
const firstNullifierHint = usedTxRequestHashForNonces ? Fr.ZERO : noteCache.getAllNullifiers()[0];
|
|
99
|
+
return new PrivateExecutionResult(executionResult, firstNullifierHint);
|
|
100
|
+
} catch (err) {
|
|
101
|
+
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/**
|
|
106
|
+
* Runs an unconstrained function.
|
|
107
|
+
* @param request - The transaction request.
|
|
108
|
+
* @param entryPointArtifact - The artifact of the entry point function.
|
|
109
|
+
* @param contractAddress - The address of the contract.
|
|
110
|
+
* @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
111
|
+
*/
|
|
112
|
+
public async runUnconstrained(
|
|
113
|
+
request: FunctionCall,
|
|
114
|
+
contractAddress: AztecAddress,
|
|
115
|
+
selector: FunctionSelector,
|
|
116
|
+
scopes?: AztecAddress[],
|
|
117
|
+
) {
|
|
118
|
+
await verifyCurrentClassId(contractAddress, this.executionDataProvider);
|
|
119
|
+
const entryPointArtifact = await this.executionDataProvider.getFunctionArtifact(contractAddress, selector);
|
|
120
|
+
|
|
121
|
+
if (entryPointArtifact.functionType !== FunctionType.UNCONSTRAINED) {
|
|
122
|
+
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as unconstrained`);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const context = new UnconstrainedExecutionOracle(
|
|
126
|
+
contractAddress,
|
|
127
|
+
[],
|
|
128
|
+
[],
|
|
129
|
+
this.executionDataProvider,
|
|
130
|
+
undefined,
|
|
131
|
+
scopes,
|
|
132
|
+
);
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
return await executeUnconstrainedFunction(
|
|
136
|
+
this.simulationProvider,
|
|
137
|
+
context,
|
|
138
|
+
entryPointArtifact,
|
|
139
|
+
contractAddress,
|
|
140
|
+
request.selector,
|
|
141
|
+
request.args,
|
|
142
|
+
);
|
|
143
|
+
} catch (err) {
|
|
144
|
+
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { type AbiDecoded, type FunctionArtifact, type FunctionSelector, decodeFromAbi } from '@aztec/stdlib/abi';
|
|
4
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
+
|
|
6
|
+
import { ExecutionError, resolveAssertionMessageFromError } from '../common/errors.js';
|
|
7
|
+
import { witnessMapToFields } from './acvm/deserialize.js';
|
|
8
|
+
import { Oracle, extractCallStack, toACVMWitness } from './acvm/index.js';
|
|
9
|
+
import type { SimulationProvider } from './providers/simulation_provider.js';
|
|
10
|
+
import type { UnconstrainedExecutionOracle } from './unconstrained_execution_oracle.js';
|
|
11
|
+
|
|
12
|
+
// docs:start:execute_unconstrained_function
|
|
13
|
+
/**
|
|
14
|
+
* Execute an unconstrained function and return the decoded values.
|
|
15
|
+
*/
|
|
16
|
+
export async function executeUnconstrainedFunction(
|
|
17
|
+
simulatorProvider: SimulationProvider,
|
|
18
|
+
oracle: UnconstrainedExecutionOracle,
|
|
19
|
+
artifact: FunctionArtifact,
|
|
20
|
+
contractAddress: AztecAddress,
|
|
21
|
+
functionSelector: FunctionSelector,
|
|
22
|
+
args: Fr[],
|
|
23
|
+
log = createLogger('simulator:unconstrained_execution'),
|
|
24
|
+
): Promise<AbiDecoded> {
|
|
25
|
+
log.verbose(`Executing unconstrained function ${artifact.name}`, {
|
|
26
|
+
contract: contractAddress,
|
|
27
|
+
selector: functionSelector,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
const acir = artifact.bytecode;
|
|
31
|
+
const initialWitness = toACVMWitness(0, args);
|
|
32
|
+
const acirExecutionResult = await simulatorProvider
|
|
33
|
+
.executeUserCircuit(acir, initialWitness, new Oracle(oracle))
|
|
34
|
+
.catch((err: Error) => {
|
|
35
|
+
err.message = resolveAssertionMessageFromError(err, artifact);
|
|
36
|
+
throw new ExecutionError(
|
|
37
|
+
err.message,
|
|
38
|
+
{
|
|
39
|
+
contractAddress,
|
|
40
|
+
functionSelector,
|
|
41
|
+
},
|
|
42
|
+
extractCallStack(err, artifact.debug),
|
|
43
|
+
{ cause: err },
|
|
44
|
+
);
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const returnWitness = witnessMapToFields(acirExecutionResult.returnWitness);
|
|
48
|
+
return decodeFromAbi(artifact.returnTypes, returnWitness);
|
|
49
|
+
}
|
|
50
|
+
// docs:end:execute_unconstrained_function
|