@aztec/simulator 0.0.0-test.1 → 0.0.1-commit.5476d83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -0
- 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 +5 -14
- 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 +12 -6
- package/dest/private/acvm/acvm.d.ts.map +1 -1
- package/dest/private/acvm/acvm.js +10 -16
- 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 +18 -19
- package/dest/private/acvm/deserialize.d.ts.map +1 -1
- package/dest/private/acvm/deserialize.js +31 -23
- 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 +20 -3
- package/dest/private/acvm/serialize.d.ts.map +1 -1
- package/dest/private/acvm/serialize.js +53 -0
- package/dest/private/acvm_native.d.ts +39 -0
- package/dest/private/acvm_native.d.ts.map +1 -0
- package/dest/private/{providers/acvm_native.js → acvm_native.js} +26 -20
- package/dest/private/acvm_wasm.d.ts +15 -0
- package/dest/private/acvm_wasm.d.ts.map +1 -0
- package/dest/private/{providers/acvm_wasm.js → acvm_wasm.js} +22 -19
- 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 +108 -0
- package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -0
- package/dest/private/circuit_recording/circuit_recorder.js +209 -0
- package/dest/private/circuit_recording/file_circuit_recorder.d.ts +31 -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 +5 -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} +2 -2
- package/dest/public/avm/avm_context.d.ts +6 -6
- package/dest/public/avm/avm_context.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.d.ts +5 -3
- package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.js +11 -7
- package/dest/public/avm/avm_execution_environment.d.ts +4 -2
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/public/avm/avm_execution_environment.js +4 -2
- 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 +27 -35
- package/dest/public/avm/avm_machine_state.d.ts +3 -1
- package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/public/avm/avm_machine_state.js +2 -0
- package/dest/public/avm/avm_memory_types.d.ts +99 -88
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/public/avm/avm_memory_types.js +17 -6
- package/dest/public/avm/avm_simulator.d.ts +6 -6
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +23 -35
- 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/errors.d.ts +7 -31
- package/dest/public/avm/errors.d.ts.map +1 -1
- package/dest/public/avm/errors.js +7 -57
- 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 +22 -15
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +7 -5
- package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
- package/dest/public/avm/fixtures/base_avm_simulation_tester.js +37 -14
- 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 +44 -0
- package/dest/public/avm/fixtures/utils.d.ts +38 -0
- package/dest/public/avm/fixtures/utils.d.ts.map +1 -0
- package/dest/public/avm/fixtures/utils.js +95 -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 +3 -3
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +28 -25
- 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 +17 -7
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/public/avm/opcodes/arithmetic.js +16 -2
- package/dest/public/avm/opcodes/bitwise.d.ts +10 -18
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/public/avm/opcodes/bitwise.js +19 -26
- package/dest/public/avm/opcodes/comparators.d.ts +4 -4
- 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 +2 -3
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +9 -10
- package/dest/public/avm/opcodes/control_flow.d.ts +1 -1
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/public/avm/opcodes/control_flow.js +10 -8
- package/dest/public/avm/opcodes/conversion.d.ts +2 -1
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +267 -3
- package/dest/public/avm/opcodes/ec_add.d.ts +2 -2
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +6 -6
- package/dest/public/avm/opcodes/environment_getters.d.ts +3 -3
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/public/avm/opcodes/environment_getters.js +17 -19
- package/dest/public/avm/opcodes/external_calls.d.ts +9 -8
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +39 -34
- package/dest/public/avm/opcodes/hashing.d.ts +2 -2
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/public/avm/opcodes/hashing.js +6 -6
- 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 +1 -1
- package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.d.ts +6 -6
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.js +37 -33
- package/dest/public/avm/opcodes/misc.d.ts +3 -2
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/public/avm/opcodes/misc.js +41 -16
- package/dest/public/avm/opcodes/storage.d.ts +3 -3
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/public/avm/opcodes/storage.js +7 -5
- 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 +38 -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 +70 -69
- package/dest/public/avm/serialization/instruction_serialization.d.ts +14 -5
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/instruction_serialization.js +70 -35
- package/dest/public/avm/test_utils.d.ts +11 -14
- package/dest/public/avm/test_utils.d.ts.map +1 -1
- package/dest/public/avm/test_utils.js +16 -24
- 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 +5 -0
- package/dest/public/debug_fn_name.d.ts.map +1 -0
- package/dest/public/debug_fn_name.js +9 -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 +37 -6
- 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 +326 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts +12 -0
- package/dest/public/fixtures/custom_bytecode_tester.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tester.js +29 -0
- package/dest/public/fixtures/custom_bytecode_tests.d.ts +9 -0
- package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -0
- package/dest/public/fixtures/custom_bytecode_tests.js +109 -0
- package/dest/public/fixtures/index.d.ts +8 -1
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +7 -0
- package/dest/public/fixtures/minimal_public_tx.d.ts +9 -0
- package/dest/public/fixtures/minimal_public_tx.d.ts.map +1 -0
- package/dest/public/fixtures/minimal_public_tx.js +29 -0
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +35 -14
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +100 -71
- package/dest/public/fixtures/simple_contract_data_source.d.ts +35 -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 +8 -0
- package/dest/public/fixtures/token_test.d.ts.map +1 -0
- package/dest/public/fixtures/token_test.js +94 -0
- package/dest/public/fixtures/utils.d.ts +17 -4
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +100 -58
- package/dest/public/hinting_db_sources.d.ts +78 -0
- package/dest/public/hinting_db_sources.d.ts.map +1 -0
- package/dest/public/hinting_db_sources.js +350 -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 +51 -101
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +219 -192
- 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 +49 -0
- package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -0
- package/dest/public/public_processor/guarded_merkle_tree.js +108 -0
- package/dest/public/public_processor/public_processor.d.ts +25 -37
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +154 -111
- package/dest/public/public_processor/public_processor_metrics.d.ts +3 -3
- package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor_metrics.js +1 -1
- package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +30 -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 +133 -0
- package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +66 -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 +210 -0
- package/dest/public/public_tx_simulator/index.d.ts +5 -0
- package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/index.js +2 -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 +23 -30
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +71 -91
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +36 -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 +208 -206
- package/dest/public/public_tx_simulator/public_tx_simulator_interface.d.ts +9 -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 +39 -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 +21 -67
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +71 -121
- package/dest/public/side_effect_trace_interface.d.ts +12 -24
- 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 +3 -6
- 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 +3 -3
- package/dest/public/state_manager/public_storage.d.ts.map +1 -0
- package/dest/public/state_manager/state_manager.d.ts +159 -0
- package/dest/public/state_manager/state_manager.d.ts.map +1 -0
- package/dest/public/state_manager/state_manager.js +392 -0
- package/dest/public/test_executor_metrics.d.ts +55 -0
- package/dest/public/test_executor_metrics.d.ts.map +1 -0
- package/dest/public/test_executor_metrics.js +307 -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 +79 -44
- package/src/common/index.ts +0 -1
- package/src/private/acvm/acvm.ts +17 -32
- package/src/private/acvm/acvm_types.ts +1 -1
- package/src/private/acvm/deserialize.ts +35 -29
- package/src/private/acvm/index.ts +0 -1
- package/src/private/acvm/serialize.ts +63 -0
- package/src/private/{providers/acvm_native.ts → acvm_native.ts} +47 -24
- package/src/private/acvm_wasm.ts +72 -0
- package/src/private/acvm_wasm_with_blobs.ts +54 -0
- package/src/private/circuit_recording/circuit_recorder.ts +260 -0
- package/src/private/circuit_recording/file_circuit_recorder.ts +158 -0
- package/src/private/circuit_recording/memory_circuit_recorder.ts +11 -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} +6 -6
- package/src/public/avm/avm_context.ts +4 -4
- package/src/public/avm/avm_contract_call_result.ts +17 -5
- package/src/public/avm/avm_execution_environment.ts +8 -1
- package/src/public/avm/avm_gas.ts +23 -35
- package/src/public/avm/avm_machine_state.ts +5 -0
- package/src/public/avm/avm_memory_types.ts +19 -6
- package/src/public/avm/avm_simulator.ts +43 -54
- package/src/public/avm/avm_simulator_interface.ts +8 -0
- package/src/public/avm/errors.ts +8 -77
- package/src/public/avm/fixtures/avm_simulation_tester.ts +32 -21
- package/src/public/avm/fixtures/base_avm_simulation_tester.ts +45 -12
- package/src/public/avm/fixtures/initializers.ts +102 -0
- package/src/public/avm/fixtures/utils.ts +150 -0
- package/src/public/avm/index.ts +0 -2
- package/src/public/avm/opcodes/accrued_substate.ts +64 -29
- package/src/public/avm/opcodes/addressing_mode.ts +56 -32
- package/src/public/avm/opcodes/arithmetic.ts +24 -2
- 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 +10 -7
- package/src/public/avm/opcodes/control_flow.ts +19 -10
- package/src/public/avm/opcodes/conversion.ts +27 -3
- package/src/public/avm/opcodes/ec_add.ts +9 -6
- package/src/public/avm/opcodes/environment_getters.ts +27 -22
- package/src/public/avm/opcodes/external_calls.ts +61 -29
- package/src/public/avm/opcodes/hashing.ts +28 -8
- package/src/public/avm/opcodes/instruction.ts +31 -21
- package/src/public/avm/opcodes/memory.ts +71 -32
- package/src/public/avm/opcodes/misc.ts +60 -18
- package/src/public/avm/opcodes/storage.ts +22 -6
- package/src/public/avm/revert_reason.ts +55 -0
- package/src/public/avm/serialization/buffer_cursor.ts +4 -1
- package/src/public/avm/serialization/bytecode_serialization.ts +72 -74
- package/src/public/avm/serialization/instruction_serialization.ts +75 -34
- package/src/public/avm/test_utils.ts +24 -41
- package/src/public/contracts_db_checkpoint.ts +41 -0
- package/src/public/db_interfaces.ts +76 -0
- package/src/{common → public}/debug_fn_name.ts +7 -7
- package/src/public/executor_metrics.ts +56 -6
- 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 +169 -0
- package/src/public/fixtures/custom_bytecode_tester.ts +49 -0
- package/src/public/fixtures/custom_bytecode_tests.ts +135 -0
- package/src/public/fixtures/index.ts +7 -0
- package/src/public/fixtures/minimal_public_tx.ts +35 -0
- package/src/public/fixtures/public_tx_simulation_tester.ts +166 -113
- package/src/public/{avm/fixtures → fixtures}/simple_contract_data_source.ts +36 -18
- package/src/public/fixtures/token_test.ts +139 -0
- package/src/public/fixtures/utils.ts +141 -68
- package/src/public/hinting_db_sources.ts +602 -0
- package/src/public/index.ts +5 -8
- package/src/public/public_db_sources.ts +278 -258
- package/src/public/public_errors.ts +14 -0
- package/src/public/public_processor/guarded_merkle_tree.ts +153 -0
- package/src/public/public_processor/public_processor.ts +212 -164
- package/src/public/public_processor/public_processor_metrics.ts +2 -2
- package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +162 -0
- package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +306 -0
- package/src/public/public_tx_simulator/index.ts +4 -0
- package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +105 -0
- package/src/public/public_tx_simulator/public_tx_context.ts +167 -194
- package/src/public/public_tx_simulator/public_tx_simulator.ts +292 -265
- package/src/public/public_tx_simulator/public_tx_simulator_interface.ts +10 -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 +94 -320
- package/src/public/side_effect_trace_interface.ts +10 -58
- package/src/public/state_manager/index.ts +1 -0
- package/src/public/{avm/journal → state_manager}/nullifiers.ts +5 -11
- package/src/public/{avm/journal → state_manager}/public_storage.ts +2 -2
- package/src/public/state_manager/state_manager.ts +553 -0
- package/src/public/test_executor_metrics.ts +397 -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_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/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
- /package/dest/public/{avm/journal → state_manager}/public_storage.js +0 -0
|
@@ -1,742 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
CANONICAL_AUTH_REGISTRY_ADDRESS,
|
|
3
|
-
DEPLOYER_CONTRACT_ADDRESS,
|
|
4
|
-
FEE_JUICE_ADDRESS,
|
|
5
|
-
MULTI_CALL_ENTRYPOINT_ADDRESS,
|
|
6
|
-
REGISTERER_CONTRACT_ADDRESS,
|
|
7
|
-
ROUTER_ADDRESS,
|
|
8
|
-
} from '@aztec/constants';
|
|
9
|
-
import { poseidon2Hash } from '@aztec/foundation/crypto';
|
|
10
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
11
|
-
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
12
|
-
import { createLogger } from '@aztec/foundation/log';
|
|
13
|
-
import type { IndexedTreeLeafPreimage } from '@aztec/foundation/trees';
|
|
14
|
-
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
15
|
-
import { AvmPublicDataReadTreeHint, PublicDataWrite } from '@aztec/stdlib/avm';
|
|
16
|
-
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
17
|
-
import { SerializableContractInstance } from '@aztec/stdlib/contract';
|
|
18
|
-
import type { ContractClassWithCommitment } from '@aztec/stdlib/contract';
|
|
19
|
-
import {
|
|
20
|
-
computeNoteHashNonce,
|
|
21
|
-
computePublicDataTreeLeafSlot,
|
|
22
|
-
computeUniqueNoteHash,
|
|
23
|
-
siloNoteHash,
|
|
24
|
-
siloNullifier,
|
|
25
|
-
} from '@aztec/stdlib/hash';
|
|
26
|
-
import type { IndexedTreeId, MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
27
|
-
import type { PublicCallRequest } from '@aztec/stdlib/kernel';
|
|
28
|
-
import { SharedMutableValues, SharedMutableValuesWithHash } from '@aztec/stdlib/shared-mutable';
|
|
29
|
-
import { MerkleTreeId, NullifierLeafPreimage, PublicDataTreeLeafPreimage } from '@aztec/stdlib/trees';
|
|
30
|
-
|
|
31
|
-
import { strict as assert } from 'assert';
|
|
32
|
-
import cloneDeep from 'lodash.clonedeep';
|
|
33
|
-
|
|
34
|
-
import { getPublicFunctionDebugName } from '../../../common/debug_fn_name.js';
|
|
35
|
-
import type { WorldStateDB } from '../../../public/public_db_sources.js';
|
|
36
|
-
import type { PublicSideEffectTraceInterface } from '../../side_effect_trace_interface.js';
|
|
37
|
-
import type { AvmExecutionEnvironment } from '../avm_execution_environment.js';
|
|
38
|
-
import { NullifierCollisionError, NullifierManager } from './nullifiers.js';
|
|
39
|
-
import { PublicStorage } from './public_storage.js';
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* The result of fetching a leaf from an indexed tree. Contains the preimage and wether the leaf was already present
|
|
43
|
-
* or it's a low leaf.
|
|
44
|
-
*/
|
|
45
|
-
type GetLeafResult<T extends IndexedTreeLeafPreimage> = {
|
|
46
|
-
preimage: T;
|
|
47
|
-
leafOrLowLeafIndex: bigint;
|
|
48
|
-
alreadyPresent: boolean;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
type NullifierMembershipResult = {
|
|
52
|
-
exists: boolean;
|
|
53
|
-
leafOrLowLeafPreimage: NullifierLeafPreimage;
|
|
54
|
-
leafOrLowLeafIndex: bigint;
|
|
55
|
-
leafOrLowLeafPath: Fr[];
|
|
56
|
-
};
|
|
57
|
-
|
|
58
|
-
/**
|
|
59
|
-
* A class to manage persistable AVM state for contract calls.
|
|
60
|
-
* Maintains a cache of the current world state,
|
|
61
|
-
* a trace of all side effects.
|
|
62
|
-
*
|
|
63
|
-
* The simulator should make any world state / tree queries through this object.
|
|
64
|
-
*
|
|
65
|
-
* Manages merging of successful/reverted child state into current state.
|
|
66
|
-
*/
|
|
67
|
-
export class AvmPersistableStateManager {
|
|
68
|
-
private readonly log = createLogger('simulator:avm:state_manager');
|
|
69
|
-
|
|
70
|
-
/** Make sure a forked state is never merged twice. */
|
|
71
|
-
private alreadyMergedIntoParent = false;
|
|
72
|
-
|
|
73
|
-
constructor(
|
|
74
|
-
/** Reference to node storage */
|
|
75
|
-
private readonly worldStateDB: WorldStateDB,
|
|
76
|
-
/** Side effect trace */
|
|
77
|
-
// TODO(5818): make private once no longer accessed in executor
|
|
78
|
-
public readonly trace: PublicSideEffectTraceInterface,
|
|
79
|
-
/** Public storage, including cached writes */
|
|
80
|
-
private readonly publicStorage: PublicStorage = new PublicStorage(worldStateDB),
|
|
81
|
-
/** Nullifier set, including cached/recently-emitted nullifiers */
|
|
82
|
-
private readonly nullifiers: NullifierManager = new NullifierManager(worldStateDB),
|
|
83
|
-
private readonly doMerkleOperations: boolean = false,
|
|
84
|
-
/** DB interface for merkle tree operations */
|
|
85
|
-
public db: MerkleTreeWriteOperations,
|
|
86
|
-
public readonly firstNullifier: Fr,
|
|
87
|
-
) {}
|
|
88
|
-
|
|
89
|
-
/**
|
|
90
|
-
* Create a new state manager
|
|
91
|
-
*/
|
|
92
|
-
public static create(
|
|
93
|
-
worldStateDB: WorldStateDB,
|
|
94
|
-
trace: PublicSideEffectTraceInterface,
|
|
95
|
-
doMerkleOperations: boolean = false,
|
|
96
|
-
firstNullifier: Fr,
|
|
97
|
-
): AvmPersistableStateManager {
|
|
98
|
-
// TODO(dbanks12): temporary until we establish a better world state interface
|
|
99
|
-
const db = worldStateDB.getMerkleInterface();
|
|
100
|
-
|
|
101
|
-
return new AvmPersistableStateManager(
|
|
102
|
-
worldStateDB,
|
|
103
|
-
trace,
|
|
104
|
-
/*publicStorage=*/ new PublicStorage(worldStateDB),
|
|
105
|
-
/*nullifiers=*/ new NullifierManager(worldStateDB),
|
|
106
|
-
/*doMerkleOperations=*/ doMerkleOperations,
|
|
107
|
-
db,
|
|
108
|
-
firstNullifier,
|
|
109
|
-
);
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
/**
|
|
113
|
-
* Create a new state manager forked from this one
|
|
114
|
-
*/
|
|
115
|
-
public async fork() {
|
|
116
|
-
await this.worldStateDB.createCheckpoint();
|
|
117
|
-
return new AvmPersistableStateManager(
|
|
118
|
-
this.worldStateDB,
|
|
119
|
-
this.trace.fork(),
|
|
120
|
-
this.publicStorage.fork(),
|
|
121
|
-
this.nullifiers.fork(),
|
|
122
|
-
this.doMerkleOperations,
|
|
123
|
-
this.db,
|
|
124
|
-
this.firstNullifier,
|
|
125
|
-
);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
/**
|
|
129
|
-
* Accept forked world state modifications & traced side effects / hints
|
|
130
|
-
*/
|
|
131
|
-
public async merge(forkedState: AvmPersistableStateManager) {
|
|
132
|
-
await this._merge(forkedState, /*reverted=*/ false);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/**
|
|
136
|
-
* Reject forked world state modifications & traced side effects, keep traced hints
|
|
137
|
-
*/
|
|
138
|
-
public async reject(forkedState: AvmPersistableStateManager) {
|
|
139
|
-
await this._merge(forkedState, /*reverted=*/ true);
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
private async _merge(forkedState: AvmPersistableStateManager, reverted: boolean) {
|
|
143
|
-
// sanity check to avoid merging the same forked trace twice
|
|
144
|
-
assert(
|
|
145
|
-
!forkedState.alreadyMergedIntoParent,
|
|
146
|
-
'Cannot merge forked state that has already been merged into its parent!',
|
|
147
|
-
);
|
|
148
|
-
forkedState.alreadyMergedIntoParent = true;
|
|
149
|
-
this.publicStorage.acceptAndMerge(forkedState.publicStorage);
|
|
150
|
-
this.nullifiers.acceptAndMerge(forkedState.nullifiers);
|
|
151
|
-
this.trace.merge(forkedState.trace, reverted);
|
|
152
|
-
if (reverted) {
|
|
153
|
-
await this.worldStateDB.revertCheckpoint();
|
|
154
|
-
if (this.doMerkleOperations) {
|
|
155
|
-
this.log.trace(
|
|
156
|
-
`Rolled back nullifier tree to root ${new Fr((await this.db.getTreeInfo(MerkleTreeId.NULLIFIER_TREE)).root)}`,
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
} else {
|
|
160
|
-
this.log.trace('Merging forked state into parent...');
|
|
161
|
-
await this.worldStateDB.commitCheckpoint();
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
/**
|
|
166
|
-
* Write to public storage, journal/trace the write.
|
|
167
|
-
*
|
|
168
|
-
* @param contractAddress - the address of the contract whose storage is being written to
|
|
169
|
-
* @param slot - the slot in the contract's storage being written to
|
|
170
|
-
* @param value - the value being written to the slot
|
|
171
|
-
*/
|
|
172
|
-
public async writeStorage(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite = false): Promise<void> {
|
|
173
|
-
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
174
|
-
this.log.trace(`Storage write (address=${contractAddress}, slot=${slot}): value=${value}, leafSlot=${leafSlot}`);
|
|
175
|
-
|
|
176
|
-
if (this.doMerkleOperations) {
|
|
177
|
-
// write to native merkle trees
|
|
178
|
-
const publicDataWrite = new PublicDataWrite(leafSlot, value);
|
|
179
|
-
const result = await this.db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [publicDataWrite.toBuffer()]);
|
|
180
|
-
assert(result !== undefined, 'Public data tree insertion error. You might want to disable doMerkleOperations.');
|
|
181
|
-
this.log.trace(`Inserted public data tree leaf at leafSlot ${leafSlot}, value: ${value}`);
|
|
182
|
-
|
|
183
|
-
// low leaf hint
|
|
184
|
-
const lowLeafPreimage = result.lowLeavesWitnessData[0].leafPreimage as PublicDataTreeLeafPreimage;
|
|
185
|
-
const lowLeafIndex = result.lowLeavesWitnessData[0].index;
|
|
186
|
-
const lowLeafPath = result.lowLeavesWitnessData[0].siblingPath.toFields();
|
|
187
|
-
// new leaf insertion
|
|
188
|
-
const newLeafPreimage: PublicDataTreeLeafPreimage = cloneDeep(lowLeafPreimage);
|
|
189
|
-
let insertionPath: Fr[] | undefined;
|
|
190
|
-
|
|
191
|
-
if (result.insertionWitnessData.length === 0) {
|
|
192
|
-
assert(
|
|
193
|
-
newLeafPreimage.value.equals(value),
|
|
194
|
-
`Value mismatch when performing public data write (got value: ${value}, value in tree: ${newLeafPreimage.value})`,
|
|
195
|
-
);
|
|
196
|
-
} else {
|
|
197
|
-
// The new leaf preimage should have the new value and slot
|
|
198
|
-
newLeafPreimage.slot = leafSlot;
|
|
199
|
-
newLeafPreimage.value = value;
|
|
200
|
-
// TODO: is this necessary?! Why doesn't sequentialInsert return the newLeafPreimage via
|
|
201
|
-
// result.insertionWitnessData[0].leafPreimage?
|
|
202
|
-
|
|
203
|
-
this.log.trace(
|
|
204
|
-
`newLeafPreimage.slot: ${newLeafPreimage.slot}, newLeafPreimage.value: ${newLeafPreimage.value}, insertionIndex: ${result.insertionWitnessData[0].index}`,
|
|
205
|
-
);
|
|
206
|
-
insertionPath = result.insertionWitnessData[0].siblingPath.toFields();
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
await this.trace.tracePublicStorageWrite(
|
|
210
|
-
contractAddress,
|
|
211
|
-
slot,
|
|
212
|
-
value,
|
|
213
|
-
protocolWrite,
|
|
214
|
-
lowLeafPreimage,
|
|
215
|
-
new Fr(lowLeafIndex),
|
|
216
|
-
lowLeafPath,
|
|
217
|
-
newLeafPreimage,
|
|
218
|
-
insertionPath,
|
|
219
|
-
);
|
|
220
|
-
} else {
|
|
221
|
-
// Cache storage writes for later reference/reads
|
|
222
|
-
this.publicStorage.write(contractAddress, slot, value);
|
|
223
|
-
await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite);
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
/**
|
|
228
|
-
* Read from public storage, trace the read.
|
|
229
|
-
*
|
|
230
|
-
* @param contractAddress - the address of the contract whose storage is being read from
|
|
231
|
-
* @param slot - the slot in the contract's storage being read from
|
|
232
|
-
* @returns the latest value written to slot, or 0 if never written to before
|
|
233
|
-
*/
|
|
234
|
-
public async readStorage(contractAddress: AztecAddress, slot: Fr): Promise<Fr> {
|
|
235
|
-
if (this.doMerkleOperations) {
|
|
236
|
-
const { value, leafPreimage, leafIndex, leafPath } = await this.getPublicDataMembership(contractAddress, slot);
|
|
237
|
-
this.trace.tracePublicStorageRead(contractAddress, slot, value, leafPreimage, leafIndex, leafPath);
|
|
238
|
-
return value;
|
|
239
|
-
} else {
|
|
240
|
-
const read = await this.publicStorage.read(contractAddress, slot);
|
|
241
|
-
this.log.trace(
|
|
242
|
-
`Storage read results (address=${contractAddress}, slot=${slot}): value=${read.value}, cached=${read.cached}`,
|
|
243
|
-
);
|
|
244
|
-
this.trace.tracePublicStorageRead(contractAddress, slot, read.value);
|
|
245
|
-
return read.value;
|
|
246
|
-
}
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
async getPublicDataMembership(
|
|
250
|
-
contractAddress: AztecAddress,
|
|
251
|
-
slot: Fr,
|
|
252
|
-
): Promise<{
|
|
253
|
-
value: Fr;
|
|
254
|
-
leafPreimage: PublicDataTreeLeafPreimage;
|
|
255
|
-
leafIndex: Fr;
|
|
256
|
-
leafPath: Fr[];
|
|
257
|
-
}> {
|
|
258
|
-
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
259
|
-
const treeId = MerkleTreeId.PUBLIC_DATA_TREE;
|
|
260
|
-
|
|
261
|
-
// Get leaf if present, low leaf if absent
|
|
262
|
-
// If leaf is present, hint/trace it. Otherwise, hint/trace the low leaf.
|
|
263
|
-
const { preimage, leafOrLowLeafIndex, alreadyPresent } = await this.getLeafOrLowLeafInfo<
|
|
264
|
-
typeof treeId,
|
|
265
|
-
PublicDataTreeLeafPreimage
|
|
266
|
-
>(treeId, leafSlot.toBigInt());
|
|
267
|
-
// The index and preimage here is either the low leaf or the leaf itself (depending on the value of update flag)
|
|
268
|
-
// In either case, we just want the sibling path to this leaf - it's up to the avm to distinguish if it's a low leaf or not
|
|
269
|
-
const leafPath = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafOrLowLeafIndex);
|
|
270
|
-
const leafPreimage = preimage as PublicDataTreeLeafPreimage;
|
|
271
|
-
|
|
272
|
-
const value = alreadyPresent ? leafPreimage.value : Fr.zero(); // default value of 0
|
|
273
|
-
if (!alreadyPresent) {
|
|
274
|
-
this.log.trace(`Slot has never been written before!`);
|
|
275
|
-
// Sanity check that the leaf slot is skipped by low leaf when it doesn't exist
|
|
276
|
-
assert(
|
|
277
|
-
leafPreimage.slot.toBigInt() < leafSlot.toBigInt() &&
|
|
278
|
-
(leafPreimage.nextIndex === 0n || leafPreimage.nextSlot.toBigInt() > leafSlot.toBigInt()),
|
|
279
|
-
'Public data tree low leaf should skip the target leaf slot when the target leaf does not exist or is the max value.',
|
|
280
|
-
);
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
this.log.trace(
|
|
284
|
-
`Storage read results (address=${contractAddress}, slot=${slot}, leafSlot=${leafSlot}): value=${value}, previouslyWritten=${alreadyPresent}`,
|
|
285
|
-
);
|
|
286
|
-
|
|
287
|
-
return {
|
|
288
|
-
value,
|
|
289
|
-
leafPreimage,
|
|
290
|
-
leafIndex: new Fr(leafOrLowLeafIndex),
|
|
291
|
-
leafPath: leafPath.toFields(),
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
|
|
295
|
-
/**
|
|
296
|
-
* Read from public storage, don't trace the read.
|
|
297
|
-
*
|
|
298
|
-
* @param contractAddress - the address of the contract whose storage is being read from
|
|
299
|
-
* @param slot - the slot in the contract's storage being read from
|
|
300
|
-
* @returns the latest value written to slot, or 0 if never written to before
|
|
301
|
-
*/
|
|
302
|
-
public async peekStorage(contractAddress: AztecAddress, slot: Fr): Promise<Fr> {
|
|
303
|
-
const { value, cached } = await this.publicStorage.read(contractAddress, slot);
|
|
304
|
-
this.log.trace(`Storage peek (address=${contractAddress}, slot=${slot}): value=${value}, cached=${cached}`);
|
|
305
|
-
return Promise.resolve(value);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
// TODO(4886): We currently don't silo note hashes.
|
|
309
|
-
/**
|
|
310
|
-
* Check if a note hash exists at the given leaf index, trace the check.
|
|
311
|
-
*
|
|
312
|
-
* @param contractAddress - the address of the contract whose storage is being read from
|
|
313
|
-
* @param noteHash - the unsiloed note hash being checked
|
|
314
|
-
* @param leafIndex - the leaf index being checked
|
|
315
|
-
* @returns true if the note hash exists at the given leaf index, false otherwise
|
|
316
|
-
*/
|
|
317
|
-
public async checkNoteHashExists(contractAddress: AztecAddress, noteHash: Fr, leafIndex: Fr): Promise<boolean> {
|
|
318
|
-
const gotLeafValue = (await this.worldStateDB.getCommitmentValue(leafIndex.toBigInt())) ?? Fr.ZERO;
|
|
319
|
-
const exists = gotLeafValue.equals(noteHash);
|
|
320
|
-
this.log.trace(
|
|
321
|
-
`noteHashes(${contractAddress})@${noteHash} ?? leafIndex: ${leafIndex} | gotLeafValue: ${gotLeafValue}, exists: ${exists}.`,
|
|
322
|
-
);
|
|
323
|
-
if (this.doMerkleOperations) {
|
|
324
|
-
const path = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
|
|
325
|
-
this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists, path.toFields());
|
|
326
|
-
} else {
|
|
327
|
-
this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists);
|
|
328
|
-
}
|
|
329
|
-
return Promise.resolve(exists);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
/**
|
|
333
|
-
* Write a raw note hash, silo it and make it unique, then trace the write.
|
|
334
|
-
* @param noteHash - the unsiloed note hash to write
|
|
335
|
-
*/
|
|
336
|
-
public async writeNoteHash(contractAddress: AztecAddress, noteHash: Fr): Promise<void> {
|
|
337
|
-
this.log.trace(`noteHashes(${contractAddress}) += ${noteHash}.`);
|
|
338
|
-
const siloedNoteHash = await siloNoteHash(contractAddress, noteHash);
|
|
339
|
-
|
|
340
|
-
await this.writeSiloedNoteHash(siloedNoteHash);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
/**
|
|
344
|
-
* Write a note hash, make it unique, trace the write.
|
|
345
|
-
* @param siloedNoteHash - the non unique note hash to write
|
|
346
|
-
*/
|
|
347
|
-
public async writeSiloedNoteHash(siloedNoteHash: Fr): Promise<void> {
|
|
348
|
-
const nonce = await computeNoteHashNonce(this.firstNullifier, this.trace.getNoteHashCount());
|
|
349
|
-
const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
|
|
350
|
-
|
|
351
|
-
await this.writeUniqueNoteHash(uniqueNoteHash);
|
|
352
|
-
}
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Write a note hash, trace the write.
|
|
356
|
-
* @param uniqueNoteHash - the siloed unique hash to write
|
|
357
|
-
*/
|
|
358
|
-
public async writeUniqueNoteHash(uniqueNoteHash: Fr): Promise<void> {
|
|
359
|
-
this.log.trace(`noteHashes += @${uniqueNoteHash}.`);
|
|
360
|
-
|
|
361
|
-
if (this.doMerkleOperations) {
|
|
362
|
-
// Should write a helper for this
|
|
363
|
-
const treeInfo = await this.db.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE);
|
|
364
|
-
const leafIndex = new Fr(treeInfo.size);
|
|
365
|
-
await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, [uniqueNoteHash]);
|
|
366
|
-
const insertionPath = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
|
|
367
|
-
this.trace.traceNewNoteHash(uniqueNoteHash, leafIndex, insertionPath.toFields());
|
|
368
|
-
} else {
|
|
369
|
-
this.trace.traceNewNoteHash(uniqueNoteHash);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
/**
|
|
374
|
-
* Check if a nullifier exists, trace the check.
|
|
375
|
-
* @param contractAddress - address of the contract that the nullifier is associated with
|
|
376
|
-
* @param nullifier - the unsiloed nullifier to check
|
|
377
|
-
* @returns exists - whether the nullifier exists in the nullifier set
|
|
378
|
-
*/
|
|
379
|
-
public async checkNullifierExists(contractAddress: AztecAddress, nullifier: Fr): Promise<boolean> {
|
|
380
|
-
this.log.trace(`Checking existence of nullifier (address=${contractAddress}, nullifier=${nullifier})`);
|
|
381
|
-
const siloedNullifier = await siloNullifier(contractAddress, nullifier);
|
|
382
|
-
|
|
383
|
-
if (this.doMerkleOperations) {
|
|
384
|
-
const { exists, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath } =
|
|
385
|
-
await this.getNullifierMembership(siloedNullifier);
|
|
386
|
-
this.trace.traceNullifierCheck(
|
|
387
|
-
siloedNullifier,
|
|
388
|
-
exists,
|
|
389
|
-
leafOrLowLeafPreimage,
|
|
390
|
-
new Fr(leafOrLowLeafIndex!),
|
|
391
|
-
leafOrLowLeafPath,
|
|
392
|
-
);
|
|
393
|
-
return Promise.resolve(exists);
|
|
394
|
-
} else {
|
|
395
|
-
const { exists, cacheHit } = await this.nullifiers.checkExists(siloedNullifier);
|
|
396
|
-
this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${exists}), cacheHit=${cacheHit}`);
|
|
397
|
-
this.trace.traceNullifierCheck(siloedNullifier, exists);
|
|
398
|
-
return Promise.resolve(exists);
|
|
399
|
-
}
|
|
400
|
-
}
|
|
401
|
-
|
|
402
|
-
/**
|
|
403
|
-
* Helper to get membership information for a siloed nullifier when checking its existence.
|
|
404
|
-
* Optionally trace the nullifier check.
|
|
405
|
-
*
|
|
406
|
-
* @param siloedNullifier - the siloed nullifier to get membership information for
|
|
407
|
-
* @returns
|
|
408
|
-
* - exists - whether the nullifier exists in the nullifier set
|
|
409
|
-
* - leafOrLowLeafPreimage - the preimage of the nullifier leaf or its low-leaf if it doesn't exist
|
|
410
|
-
* - leafOrLowLeafIndex - the leaf index of the nullifier leaf or its low-leaf if it doesn't exist
|
|
411
|
-
* - leafOrLowLeafPath - the sibling path of the nullifier leaf or its low-leaf if it doesn't exist
|
|
412
|
-
*/
|
|
413
|
-
private async getNullifierMembership(siloedNullifier: Fr): Promise<NullifierMembershipResult> {
|
|
414
|
-
// Get leaf if present, low leaf if absent
|
|
415
|
-
// If leaf is present, hint/trace it. Otherwise, hint/trace the low leaf.
|
|
416
|
-
const treeId = MerkleTreeId.NULLIFIER_TREE;
|
|
417
|
-
const {
|
|
418
|
-
preimage: leafPreimage,
|
|
419
|
-
leafOrLowLeafIndex,
|
|
420
|
-
alreadyPresent,
|
|
421
|
-
} = await this.getLeafOrLowLeafInfo<typeof treeId, NullifierLeafPreimage>(treeId, siloedNullifier.toBigInt());
|
|
422
|
-
this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${alreadyPresent})`);
|
|
423
|
-
|
|
424
|
-
const leafPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex!);
|
|
425
|
-
|
|
426
|
-
if (alreadyPresent) {
|
|
427
|
-
this.log.trace(`Siloed nullifier ${siloedNullifier} exists at leafIndex=${leafOrLowLeafIndex}`);
|
|
428
|
-
} else {
|
|
429
|
-
// Sanity check that the leaf value is skipped by low leaf when it doesn't exist
|
|
430
|
-
assert(
|
|
431
|
-
leafPreimage.nullifier.toBigInt() < siloedNullifier.toBigInt() &&
|
|
432
|
-
(leafPreimage.nextIndex === 0n || leafPreimage.nextNullifier.toBigInt() > siloedNullifier.toBigInt()),
|
|
433
|
-
'Nullifier tree low leaf should skip the target leaf nullifier when the target leaf does not exist.',
|
|
434
|
-
);
|
|
435
|
-
}
|
|
436
|
-
return {
|
|
437
|
-
exists: alreadyPresent,
|
|
438
|
-
leafOrLowLeafPreimage: leafPreimage,
|
|
439
|
-
leafOrLowLeafIndex,
|
|
440
|
-
leafOrLowLeafPath: leafPath.toFields(),
|
|
441
|
-
};
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
/**
|
|
445
|
-
* Write a nullifier to the nullifier set, trace the write.
|
|
446
|
-
* @param contractAddress - address of the contract that the nullifier is associated with
|
|
447
|
-
* @param nullifier - the unsiloed nullifier to write
|
|
448
|
-
*/
|
|
449
|
-
public async writeNullifier(contractAddress: AztecAddress, nullifier: Fr) {
|
|
450
|
-
this.log.trace(`Inserting new nullifier (address=${nullifier}, nullifier=${contractAddress})`);
|
|
451
|
-
const siloedNullifier = await siloNullifier(contractAddress, nullifier);
|
|
452
|
-
await this.writeSiloedNullifier(siloedNullifier);
|
|
453
|
-
}
|
|
454
|
-
|
|
455
|
-
/**
|
|
456
|
-
* Write a nullifier to the nullifier set, trace the write.
|
|
457
|
-
* @param siloedNullifier - the siloed nullifier to write
|
|
458
|
-
*/
|
|
459
|
-
public async writeSiloedNullifier(siloedNullifier: Fr) {
|
|
460
|
-
this.log.trace(`Inserting siloed nullifier=${siloedNullifier}`);
|
|
461
|
-
|
|
462
|
-
if (this.doMerkleOperations) {
|
|
463
|
-
const treeId = MerkleTreeId.NULLIFIER_TREE;
|
|
464
|
-
const {
|
|
465
|
-
preimage: leafPreimage,
|
|
466
|
-
leafOrLowLeafIndex,
|
|
467
|
-
alreadyPresent,
|
|
468
|
-
} = await this.getLeafOrLowLeafInfo<typeof treeId, NullifierLeafPreimage>(treeId, siloedNullifier.toBigInt());
|
|
469
|
-
|
|
470
|
-
if (alreadyPresent) {
|
|
471
|
-
this.log.verbose(`Siloed nullifier ${siloedNullifier} already present in tree at index ${leafOrLowLeafIndex}!`);
|
|
472
|
-
// If the nullifier is already present, we should not insert it again
|
|
473
|
-
// instead we provide the direct membership path
|
|
474
|
-
const membershipPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex);
|
|
475
|
-
// This just becomes a nullifier read hint
|
|
476
|
-
this.trace.traceNullifierCheck(
|
|
477
|
-
siloedNullifier,
|
|
478
|
-
/*exists=*/ alreadyPresent,
|
|
479
|
-
leafPreimage,
|
|
480
|
-
new Fr(leafOrLowLeafIndex),
|
|
481
|
-
membershipPath.toFields(),
|
|
482
|
-
);
|
|
483
|
-
throw new NullifierCollisionError(
|
|
484
|
-
`Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`,
|
|
485
|
-
);
|
|
486
|
-
} else {
|
|
487
|
-
const appendResult = await this.db.sequentialInsert(treeId, [siloedNullifier.toBuffer()]);
|
|
488
|
-
const lowLeafWitnessData = appendResult.lowLeavesWitnessData![0];
|
|
489
|
-
const lowLeafPreimage = lowLeafWitnessData.leafPreimage as NullifierLeafPreimage;
|
|
490
|
-
const lowLeafIndex = lowLeafWitnessData.index;
|
|
491
|
-
const lowLeafPath = lowLeafWitnessData.siblingPath.toFields();
|
|
492
|
-
const insertionPath = appendResult.insertionWitnessData[0].siblingPath.toFields();
|
|
493
|
-
|
|
494
|
-
this.trace.traceNewNullifier(
|
|
495
|
-
siloedNullifier,
|
|
496
|
-
lowLeafPreimage,
|
|
497
|
-
new Fr(lowLeafIndex),
|
|
498
|
-
lowLeafPath,
|
|
499
|
-
insertionPath,
|
|
500
|
-
);
|
|
501
|
-
}
|
|
502
|
-
} else {
|
|
503
|
-
// Cache pending nullifiers for later access
|
|
504
|
-
await this.nullifiers.append(siloedNullifier);
|
|
505
|
-
this.trace.traceNewNullifier(siloedNullifier);
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
public async writeSiloedNullifiersFromPrivate(siloedNullifiers: Fr[]) {
|
|
510
|
-
for (const siloedNullifier of siloedNullifiers.filter(n => !n.isEmpty())) {
|
|
511
|
-
await this.writeSiloedNullifier(siloedNullifier);
|
|
512
|
-
}
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
/**
|
|
516
|
-
* Check if an L1 to L2 message exists, trace the check.
|
|
517
|
-
* @param msgHash - the message hash to check existence of
|
|
518
|
-
* @param msgLeafIndex - the message leaf index to use in the check
|
|
519
|
-
* @returns exists - whether the message exists in the L1 to L2 Messages tree
|
|
520
|
-
*/
|
|
521
|
-
public async checkL1ToL2MessageExists(
|
|
522
|
-
contractAddress: AztecAddress,
|
|
523
|
-
msgHash: Fr,
|
|
524
|
-
msgLeafIndex: Fr,
|
|
525
|
-
): Promise<boolean> {
|
|
526
|
-
const valueAtIndex = (await this.worldStateDB.getL1ToL2LeafValue(msgLeafIndex.toBigInt())) ?? Fr.ZERO;
|
|
527
|
-
const exists = valueAtIndex.equals(msgHash);
|
|
528
|
-
this.log.trace(
|
|
529
|
-
`l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`,
|
|
530
|
-
);
|
|
531
|
-
|
|
532
|
-
if (this.doMerkleOperations) {
|
|
533
|
-
const path = await this.db.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, msgLeafIndex.toBigInt());
|
|
534
|
-
this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists, path.toFields());
|
|
535
|
-
} else {
|
|
536
|
-
this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists);
|
|
537
|
-
}
|
|
538
|
-
return Promise.resolve(exists);
|
|
539
|
-
}
|
|
540
|
-
|
|
541
|
-
/**
|
|
542
|
-
* Write an L2 to L1 message.
|
|
543
|
-
* @param contractAddress - L2 contract address that created this message
|
|
544
|
-
* @param recipient - L1 contract address to send the message to.
|
|
545
|
-
* @param content - Message content.
|
|
546
|
-
*/
|
|
547
|
-
public writeL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr) {
|
|
548
|
-
this.log.trace(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`);
|
|
549
|
-
this.trace.traceNewL2ToL1Message(contractAddress, recipient, content);
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
/**
|
|
553
|
-
* Write a public log
|
|
554
|
-
* @param contractAddress - address of the contract that emitted the log
|
|
555
|
-
* @param log - log contents
|
|
556
|
-
*/
|
|
557
|
-
public writePublicLog(contractAddress: AztecAddress, log: Fr[]) {
|
|
558
|
-
this.log.trace(`PublicLog(${contractAddress}) += event with ${log.length} fields.`);
|
|
559
|
-
this.trace.tracePublicLog(contractAddress, log);
|
|
560
|
-
}
|
|
561
|
-
|
|
562
|
-
/**
|
|
563
|
-
* Get a contract instance.
|
|
564
|
-
* @param contractAddress - address of the contract instance to retrieve.
|
|
565
|
-
* @returns the contract instance or undefined if it does not exist.
|
|
566
|
-
*/
|
|
567
|
-
public async getContractInstance(contractAddress: AztecAddress): Promise<SerializableContractInstance | undefined> {
|
|
568
|
-
this.log.trace(`Getting contract instance for address ${contractAddress}`);
|
|
569
|
-
const instanceWithAddress = await this.worldStateDB.getContractInstance(contractAddress);
|
|
570
|
-
const exists = instanceWithAddress !== undefined;
|
|
571
|
-
|
|
572
|
-
const instance = exists ? new SerializableContractInstance(instanceWithAddress) : undefined;
|
|
573
|
-
if (!exists) {
|
|
574
|
-
this.log.debug(`Contract instance NOT FOUND (address=${contractAddress})`);
|
|
575
|
-
this.trace.traceGetContractInstance(contractAddress, exists);
|
|
576
|
-
return undefined;
|
|
577
|
-
}
|
|
578
|
-
|
|
579
|
-
this.log.trace(`Got contract instance (address=${contractAddress}): instance=${jsonStringify(instance!)}`);
|
|
580
|
-
// Canonical addresses do not trigger nullifier & public storage checks
|
|
581
|
-
if (contractAddressIsCanonical(contractAddress)) {
|
|
582
|
-
this.trace.traceGetContractInstance(contractAddress, exists, instance);
|
|
583
|
-
return instance;
|
|
584
|
-
}
|
|
585
|
-
|
|
586
|
-
// This will decide internally whether to check the nullifier tree or not depending on doMerkleOperations.
|
|
587
|
-
const nullifierExistsInTree = await this.checkNullifierExists(
|
|
588
|
-
AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS),
|
|
589
|
-
contractAddress.toField(),
|
|
590
|
-
);
|
|
591
|
-
assert(
|
|
592
|
-
exists == nullifierExistsInTree,
|
|
593
|
-
'WorldStateDB contains contract instance, but nullifier tree does not contain contract address (or vice versa).... This is a bug!',
|
|
594
|
-
);
|
|
595
|
-
|
|
596
|
-
if (this.doMerkleOperations) {
|
|
597
|
-
// TODO(fcarreiro): this should be done via a public read.
|
|
598
|
-
const { updateMembership, updatePreimage } = await this.getContractUpdateHints(contractAddress);
|
|
599
|
-
|
|
600
|
-
this.trace.traceGetContractInstance(contractAddress, exists, instance, updateMembership, updatePreimage);
|
|
601
|
-
} else {
|
|
602
|
-
this.trace.traceGetContractInstance(contractAddress, exists, instance);
|
|
603
|
-
}
|
|
604
|
-
|
|
605
|
-
return instance;
|
|
606
|
-
}
|
|
607
|
-
|
|
608
|
-
/**
|
|
609
|
-
* Get a contract class.
|
|
610
|
-
* @param classId - class id to retrieve.
|
|
611
|
-
* @returns the contract class or undefined if it does not exist.
|
|
612
|
-
*/
|
|
613
|
-
public async getContractClass(classId: Fr): Promise<ContractClassWithCommitment | undefined> {
|
|
614
|
-
this.log.trace(`Getting contract class for id ${classId}`);
|
|
615
|
-
const klass = await this.worldStateDB.getContractClass(classId);
|
|
616
|
-
const exists = klass !== undefined;
|
|
617
|
-
let extendedClass: ContractClassWithCommitment | undefined = undefined;
|
|
618
|
-
|
|
619
|
-
// Note: We currently do not generate info to check the nullifier tree, because
|
|
620
|
-
// this is not needed for our use cases.
|
|
621
|
-
if (exists) {
|
|
622
|
-
this.log.trace(`Got contract class (id=${classId})`);
|
|
623
|
-
// Extend class information with public bytecode commitment.
|
|
624
|
-
const bytecodeCommitment = await this.worldStateDB.getBytecodeCommitment(classId);
|
|
625
|
-
assert(
|
|
626
|
-
bytecodeCommitment,
|
|
627
|
-
`Bytecode commitment was not found in DB for contract class (${classId}). This should not happen!`,
|
|
628
|
-
);
|
|
629
|
-
extendedClass = {
|
|
630
|
-
...klass,
|
|
631
|
-
publicBytecodeCommitment: bytecodeCommitment,
|
|
632
|
-
};
|
|
633
|
-
} else {
|
|
634
|
-
this.log.debug(`Contract instance NOT FOUND (id=${classId})`);
|
|
635
|
-
}
|
|
636
|
-
|
|
637
|
-
this.trace.traceGetContractClass(classId, exists, extendedClass);
|
|
638
|
-
return extendedClass;
|
|
639
|
-
}
|
|
640
|
-
|
|
641
|
-
/**
|
|
642
|
-
* Get a contract's bytecode from the contracts DB, also trace the contract class and instance indirectly.
|
|
643
|
-
*/
|
|
644
|
-
public async getBytecode(contractAddress: AztecAddress): Promise<Buffer | undefined> {
|
|
645
|
-
this.log.debug(`Getting bytecode for contract address ${contractAddress}`);
|
|
646
|
-
const contractInstance = await this.getContractInstance(contractAddress);
|
|
647
|
-
|
|
648
|
-
if (!contractInstance) {
|
|
649
|
-
return undefined;
|
|
650
|
-
}
|
|
651
|
-
|
|
652
|
-
const contractClass = await this.getContractClass(contractInstance.currentContractClassId);
|
|
653
|
-
assert(
|
|
654
|
-
contractClass,
|
|
655
|
-
`Contract class not found in DB, but a contract instance was found with this class ID (${contractInstance.currentContractClassId}). This should not happen!`,
|
|
656
|
-
);
|
|
657
|
-
|
|
658
|
-
// NOTE: If the contract instance is not found, we assume it has not been deployed.
|
|
659
|
-
// It doesnt matter what the values of the contract instance are in this case, as long as we tag it with exists=false.
|
|
660
|
-
// This will hint to the avm circuit to just perform the non-membership check on the address and disregard the bytecode hash
|
|
661
|
-
return contractClass.packedBytecode;
|
|
662
|
-
}
|
|
663
|
-
|
|
664
|
-
async getContractUpdateHints(contractAddress: AztecAddress) {
|
|
665
|
-
const { sharedMutableSlot, sharedMutableHashSlot } = await SharedMutableValuesWithHash.getContractUpdateSlots(
|
|
666
|
-
contractAddress,
|
|
667
|
-
);
|
|
668
|
-
|
|
669
|
-
const {
|
|
670
|
-
value: hash,
|
|
671
|
-
leafPreimage,
|
|
672
|
-
leafIndex,
|
|
673
|
-
leafPath,
|
|
674
|
-
} = await this.getPublicDataMembership(ProtocolContractAddress.ContractInstanceDeployer, sharedMutableHashSlot);
|
|
675
|
-
const updateMembership = new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, leafPath);
|
|
676
|
-
|
|
677
|
-
const readStorage = async (storageSlot: Fr) =>
|
|
678
|
-
(await this.publicStorage.read(ProtocolContractAddress.ContractInstanceDeployer, storageSlot)).value;
|
|
679
|
-
|
|
680
|
-
const sharedMutableValues = await SharedMutableValues.readFromTree(sharedMutableSlot, readStorage);
|
|
681
|
-
|
|
682
|
-
const updatePreimage = sharedMutableValues.toFields();
|
|
683
|
-
|
|
684
|
-
if (!hash.isZero()) {
|
|
685
|
-
const hashed = await poseidon2Hash(updatePreimage);
|
|
686
|
-
if (!hashed.equals(hash)) {
|
|
687
|
-
throw new Error(`Update hint hash mismatch: ${hash} != ${hashed}`);
|
|
688
|
-
}
|
|
689
|
-
this.log.trace(`Non empty update hint found for contract ${contractAddress}`);
|
|
690
|
-
} else {
|
|
691
|
-
if (updatePreimage.some(f => !f.isZero())) {
|
|
692
|
-
throw new Error(`Update hint hash is zero, but update preimage is not: ${updatePreimage}`);
|
|
693
|
-
}
|
|
694
|
-
this.log.trace(`No update hint found for contract ${contractAddress}`);
|
|
695
|
-
}
|
|
696
|
-
|
|
697
|
-
return {
|
|
698
|
-
updateMembership,
|
|
699
|
-
updatePreimage,
|
|
700
|
-
};
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
public traceEnqueuedCall(publicCallRequest: PublicCallRequest, calldata: Fr[], reverted: boolean) {
|
|
704
|
-
this.trace.traceEnqueuedCall(publicCallRequest, calldata, reverted);
|
|
705
|
-
}
|
|
706
|
-
|
|
707
|
-
public async getPublicFunctionDebugName(avmEnvironment: AvmExecutionEnvironment): Promise<string> {
|
|
708
|
-
return await getPublicFunctionDebugName(this.worldStateDB, avmEnvironment.address, avmEnvironment.calldata);
|
|
709
|
-
}
|
|
710
|
-
|
|
711
|
-
public async getLeafOrLowLeafInfo<ID extends IndexedTreeId, T extends IndexedTreeLeafPreimage>(
|
|
712
|
-
treeId: ID,
|
|
713
|
-
key: bigint,
|
|
714
|
-
): Promise<GetLeafResult<T>> {
|
|
715
|
-
// "key" is siloed slot (leafSlot) or siloed nullifier
|
|
716
|
-
const leafOrLowLeafInfo = await this.db.getPreviousValueIndex(treeId, key);
|
|
717
|
-
assert(
|
|
718
|
-
leafOrLowLeafInfo !== undefined,
|
|
719
|
-
`${MerkleTreeId[treeId]} low leaf index should always be found (even if target leaf does not exist)`,
|
|
720
|
-
);
|
|
721
|
-
const { index: leafOrLowLeafIndex, alreadyPresent } = leafOrLowLeafInfo;
|
|
722
|
-
|
|
723
|
-
const leafPreimage = await this.db.getLeafPreimage(treeId, leafOrLowLeafIndex);
|
|
724
|
-
assert(
|
|
725
|
-
leafPreimage !== undefined,
|
|
726
|
-
`${MerkleTreeId[treeId]} low leaf preimage should never be undefined (even if target leaf does not exist)`,
|
|
727
|
-
);
|
|
728
|
-
|
|
729
|
-
return { preimage: leafPreimage as T, leafOrLowLeafIndex, alreadyPresent };
|
|
730
|
-
}
|
|
731
|
-
}
|
|
732
|
-
|
|
733
|
-
function contractAddressIsCanonical(contractAddress: AztecAddress): boolean {
|
|
734
|
-
return (
|
|
735
|
-
contractAddress.equals(AztecAddress.fromNumber(CANONICAL_AUTH_REGISTRY_ADDRESS)) ||
|
|
736
|
-
contractAddress.equals(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS)) ||
|
|
737
|
-
contractAddress.equals(AztecAddress.fromNumber(REGISTERER_CONTRACT_ADDRESS)) ||
|
|
738
|
-
contractAddress.equals(AztecAddress.fromNumber(MULTI_CALL_ENTRYPOINT_ADDRESS)) ||
|
|
739
|
-
contractAddress.equals(AztecAddress.fromNumber(FEE_JUICE_ADDRESS)) ||
|
|
740
|
-
contractAddress.equals(AztecAddress.fromNumber(ROUTER_ADDRESS))
|
|
741
|
-
);
|
|
742
|
-
}
|