@aztec/simulator 0.76.4 → 0.77.0-testnet-ignition.21
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 +3 -3
- package/dest/client.d.ts +5 -0
- package/dest/client.d.ts.map +1 -0
- package/dest/client.js +3 -0
- package/dest/{public → common}/db_interfaces.d.ts +8 -33
- 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 +3 -2
- package/dest/common/debug_fn_name.d.ts.map +1 -1
- package/dest/common/debug_fn_name.js +2 -5
- package/dest/common/errors.d.ts +4 -4
- package/dest/common/errors.d.ts.map +1 -1
- package/dest/common/errors.js +30 -39
- package/dest/common/index.d.ts +2 -1
- package/dest/common/index.d.ts.map +1 -1
- package/dest/common/index.js +2 -2
- package/dest/common/message_load_oracle_inputs.d.ts +2 -2
- package/dest/common/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/common/message_load_oracle_inputs.js +8 -8
- package/dest/common/stats/index.d.ts.map +1 -0
- package/dest/{stats → common/stats}/stats.d.ts +2 -2
- package/dest/common/stats/stats.d.ts.map +1 -0
- package/dest/common/stats/stats.js +10 -0
- package/dest/{acvm → private/acvm}/acvm.d.ts +4 -4
- package/dest/private/acvm/acvm.d.ts.map +1 -0
- package/dest/private/acvm/acvm.js +70 -0
- package/dest/{acvm → private/acvm}/acvm_types.d.ts +1 -1
- package/dest/private/acvm/acvm_types.d.ts.map +1 -0
- package/dest/private/acvm/acvm_types.js +3 -0
- package/dest/{acvm → private/acvm}/deserialize.d.ts +2 -2
- 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.map +1 -0
- package/dest/private/acvm/index.js +5 -0
- package/dest/{acvm → private/acvm}/oracle/index.d.ts +1 -1
- package/dest/private/acvm/oracle/index.d.ts.map +1 -0
- package/dest/private/acvm/oracle/index.js +2 -0
- package/dest/{acvm → private/acvm}/oracle/oracle.d.ts +4 -3
- package/dest/private/acvm/oracle/oracle.d.ts.map +1 -0
- package/dest/private/acvm/oracle/oracle.js +263 -0
- package/dest/{acvm → private/acvm}/oracle/typed_oracle.d.ts +12 -6
- package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -0
- package/dest/private/acvm/oracle/typed_oracle.js +132 -0
- package/dest/{acvm → private/acvm}/serialize.d.ts +7 -3
- package/dest/private/acvm/serialize.d.ts.map +1 -0
- package/dest/private/acvm/serialize.js +46 -0
- package/dest/{client → private}/client_execution_context.d.ts +20 -17
- package/dest/private/client_execution_context.d.ts.map +1 -0
- package/dest/private/client_execution_context.js +378 -0
- package/dest/{client → private}/db_oracle.d.ts +19 -7
- package/dest/private/db_oracle.d.ts.map +1 -0
- package/dest/private/db_oracle.js +14 -0
- package/dest/{client → private}/execution_note_cache.d.ts +2 -2
- package/dest/private/execution_note_cache.d.ts.map +1 -0
- package/dest/private/execution_note_cache.js +180 -0
- package/dest/{common → private}/hashed_values_cache.d.ts +2 -2
- 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/{client → private}/pick_notes.d.ts +1 -1
- 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 +24 -0
- package/dest/private/private_execution.d.ts.map +1 -0
- package/dest/private/private_execution.js +90 -0
- package/dest/{providers → private/providers}/acvm_native.d.ts +5 -5
- package/dest/private/providers/acvm_native.d.ts.map +1 -0
- package/dest/private/providers/acvm_native.js +139 -0
- package/dest/{providers → private/providers}/acvm_wasm.d.ts +4 -4
- package/dest/private/providers/acvm_wasm.d.ts.map +1 -0
- package/dest/private/providers/acvm_wasm.js +62 -0
- package/dest/{providers → private/providers}/acvm_wasm_with_blobs.d.ts +5 -5
- package/dest/private/providers/acvm_wasm_with_blobs.d.ts.map +1 -0
- package/dest/{providers → private/providers}/acvm_wasm_with_blobs.js +3 -6
- package/dest/{providers → private/providers}/factory.d.ts +1 -1
- package/dest/private/providers/factory.d.ts.map +1 -0
- package/dest/private/providers/factory.js +27 -0
- package/dest/{common → private/providers}/simulation_provider.d.ts +5 -5
- 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 +36 -0
- package/dest/private/simulator.d.ts.map +1 -0
- package/dest/private/simulator.js +78 -0
- package/dest/{client → private}/unconstrained_execution.d.ts +5 -5
- package/dest/private/unconstrained_execution.d.ts.map +1 -0
- package/dest/private/unconstrained_execution.js +27 -0
- package/dest/{client → private}/view_data_oracle.d.ts +15 -7
- package/dest/private/view_data_oracle.d.ts.map +1 -0
- package/dest/private/view_data_oracle.js +260 -0
- package/dest/{avm → public/avm}/avm_context.d.ts +7 -5
- package/dest/public/avm/avm_context.d.ts.map +1 -0
- package/dest/public/avm/avm_context.js +44 -0
- package/dest/{avm → public/avm}/avm_contract_call_result.d.ts +5 -5
- 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/{avm → public/avm}/avm_execution_environment.d.ts +2 -2
- 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.map +1 -0
- package/dest/public/avm/avm_gas.js +202 -0
- package/dest/{avm → public/avm}/avm_machine_state.d.ts +2 -2
- package/dest/public/avm/avm_machine_state.d.ts.map +1 -0
- package/dest/public/avm/avm_machine_state.js +106 -0
- package/dest/{avm → public/avm}/avm_memory_types.d.ts +2 -2
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -0
- package/dest/public/avm/avm_memory_types.js +340 -0
- package/dest/{avm → public/avm}/avm_simulator.d.ts +5 -3
- 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.map +1 -0
- package/dest/public/avm/bytecode_utils.js +17 -0
- package/dest/{avm → public/avm}/errors.d.ts +5 -4
- package/dest/public/avm/errors.d.ts.map +1 -0
- package/dest/public/avm/errors.js +179 -0
- package/dest/{avm → public/avm}/fixtures/avm_simulation_tester.d.ts +6 -6
- 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/{avm → public/avm}/fixtures/base_avm_simulation_tester.d.ts +13 -12
- 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/{avm → public/avm}/fixtures/index.d.ts +24 -7
- package/dest/public/avm/fixtures/index.d.ts.map +1 -0
- package/dest/public/avm/fixtures/index.js +175 -0
- package/dest/{avm → public/avm}/fixtures/simple_contract_data_source.d.ts +10 -6
- 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/{avm/index.d.ts → public/avm/index.js} +1 -2
- package/dest/public/avm/journal/index.d.ts.map +1 -0
- package/dest/{avm → public/avm}/journal/journal.d.ts +51 -18
- package/dest/public/avm/journal/journal.d.ts.map +1 -0
- package/dest/public/avm/journal/journal.js +486 -0
- package/dest/{avm → public/avm}/journal/nullifiers.d.ts +8 -6
- package/dest/public/avm/journal/nullifiers.d.ts.map +1 -0
- package/dest/public/avm/journal/nullifiers.js +97 -0
- package/dest/{avm → public/avm}/journal/public_storage.d.ts +2 -2
- 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.map +1 -0
- package/dest/public/avm/opcodes/accrued_substate.js +252 -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.map +1 -0
- package/dest/public/avm/opcodes/arithmetic.js +73 -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.map +1 -0
- package/dest/public/avm/opcodes/comparators.js +43 -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.map +1 -0
- package/dest/public/avm/opcodes/control_flow.js +105 -0
- package/dest/{avm → public/avm}/opcodes/conversion.d.ts +1 -1
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -0
- package/dest/public/avm/opcodes/conversion.js +69 -0
- package/dest/{avm → public/avm}/opcodes/ec_add.d.ts +1 -1
- 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.map +1 -0
- package/dest/public/avm/opcodes/environment_getters.js +79 -0
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -0
- package/dest/public/avm/opcodes/external_calls.js +180 -0
- package/dest/{avm → public/avm}/opcodes/hashing.d.ts +1 -1
- 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.map +1 -0
- package/dest/{avm → public/avm}/opcodes/instruction.d.ts +2 -2
- 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.map +1 -0
- package/dest/public/avm/opcodes/instruction_impl.js +30 -0
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -0
- package/dest/public/avm/opcodes/memory.js +253 -0
- package/dest/{avm → public/avm}/opcodes/misc.d.ts +1 -1
- 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.map +1 -0
- package/dest/public/avm/opcodes/storage.js +66 -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/{avm → public/avm}/serialization/bytecode_serialization.d.ts +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -0
- package/dest/public/avm/serialization/bytecode_serialization.js +328 -0
- package/dest/{avm → public/avm}/serialization/instruction_serialization.d.ts +1 -2
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -0
- package/dest/public/avm/serialization/instruction_serialization.js +225 -0
- package/dest/{avm → public/avm}/test_utils.d.ts +6 -4
- 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.js +1 -2
- package/dest/public/execution.d.ts +8 -2
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +4 -5
- package/dest/public/executor_metrics.js +16 -12
- package/dest/public/fixtures/index.js +0 -1
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +15 -9
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +54 -53
- package/dest/public/fixtures/utils.d.ts +7 -11
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +92 -32
- package/dest/public/index.d.ts +5 -4
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +5 -5
- package/dest/public/public_db_sources.d.ts +82 -34
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +171 -196
- package/dest/public/{public_processor.d.ts → public_processor/public_processor.d.ts} +10 -8
- 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_metrics.d.ts → public_processor/public_processor_metrics.d.ts} +3 -3
- 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_context.d.ts → public_tx_simulator/public_tx_context.d.ts} +14 -8
- 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.d.ts → public_tx_simulator/public_tx_simulator.d.ts} +10 -7
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -0
- package/dest/public/public_tx_simulator/public_tx_simulator.js +325 -0
- package/dest/public/side_effect_errors.js +1 -2
- package/dest/public/side_effect_trace.d.ts +16 -10
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +82 -149
- package/dest/public/side_effect_trace_interface.d.ts +9 -7
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/side_effect_trace_interface.js +1 -2
- 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.js +23 -28
- package/dest/public/utils.d.ts +2 -2
- package/dest/public/utils.d.ts.map +1 -1
- package/dest/public/utils.js +17 -12
- package/dest/server.d.ts +4 -4
- package/dest/server.d.ts.map +1 -1
- package/dest/server.js +3 -5
- package/dest/test/utils.d.ts +3 -2
- package/dest/test/utils.d.ts.map +1 -1
- package/dest/test/utils.js +9 -7
- package/package.json +19 -21
- package/src/client.ts +4 -0
- package/src/{public → common}/db_interfaces.ts +8 -40
- package/src/common/debug_fn_name.ts +4 -2
- package/src/common/errors.ts +5 -5
- package/src/common/index.ts +2 -1
- package/src/common/message_load_oracle_inputs.ts +2 -2
- package/src/common/stats/index.ts +1 -0
- package/src/{stats → common/stats}/stats.ts +2 -2
- package/src/{acvm → private/acvm}/acvm.ts +5 -5
- package/src/{acvm → private/acvm}/acvm_types.ts +1 -1
- package/src/{acvm → private/acvm}/deserialize.ts +2 -2
- package/src/{acvm → private/acvm}/oracle/index.ts +1 -1
- package/src/{acvm → private/acvm}/oracle/oracle.ts +22 -12
- package/src/{acvm → private/acvm}/oracle/typed_oracle.ts +50 -55
- package/src/{acvm → private/acvm}/serialize.ts +10 -3
- package/src/{client → private}/client_execution_context.ts +54 -37
- package/src/{client → private}/db_oracle.ts +20 -20
- package/src/{client → private}/execution_note_cache.ts +3 -3
- package/src/{common → private}/hashed_values_cache.ts +2 -2
- package/src/private/index.ts +12 -0
- package/src/{client → private}/pick_notes.ts +1 -1
- package/src/{client → private}/private_execution.ts +46 -14
- package/src/{providers → private/providers}/acvm_native.ts +6 -6
- package/src/{providers → private/providers}/acvm_wasm.ts +4 -4
- package/src/{providers → private/providers}/acvm_wasm_with_blobs.ts +5 -5
- package/src/{providers → private/providers}/factory.ts +1 -1
- package/src/{common → private/providers}/simulation_provider.ts +5 -5
- package/src/{client → private}/simulator.ts +31 -123
- package/src/{client → private}/unconstrained_execution.ts +7 -7
- package/src/{client → private}/view_data_oracle.ts +25 -28
- package/src/{avm → public/avm}/avm_context.ts +12 -7
- package/src/{avm → public/avm}/avm_contract_call_result.ts +6 -6
- package/src/{avm → public/avm}/avm_execution_environment.ts +2 -2
- package/src/{avm → public/avm}/avm_gas.ts +1 -3
- package/src/{avm → public/avm}/avm_machine_state.ts +2 -2
- package/src/{avm → public/avm}/avm_memory_types.ts +4 -4
- package/src/{avm → public/avm}/avm_simulator.ts +12 -6
- package/src/{avm → public/avm}/errors.ts +5 -4
- package/src/{avm → public/avm}/fixtures/avm_simulation_tester.ts +16 -15
- package/src/{avm → public/avm}/fixtures/base_avm_simulation_tester.ts +45 -40
- package/src/{avm → public/avm}/fixtures/index.ts +77 -12
- package/src/{avm → public/avm}/fixtures/simple_contract_data_source.ts +26 -19
- package/src/{avm → public/avm}/index.ts +1 -1
- package/src/public/avm/journal/index.ts +1 -0
- package/src/{avm → public/avm}/journal/journal.ts +330 -305
- package/src/{avm → public/avm}/journal/nullifiers.ts +20 -19
- package/src/{avm → public/avm}/journal/public_storage.ts +2 -2
- package/src/{avm → public/avm}/opcodes/contract.ts +1 -1
- package/src/{avm → public/avm}/opcodes/control_flow.ts +1 -1
- package/src/{avm → public/avm}/opcodes/conversion.ts +1 -1
- package/src/{avm → public/avm}/opcodes/ec_add.ts +2 -2
- package/src/{avm → public/avm}/opcodes/external_calls.ts +5 -6
- package/src/{avm → public/avm}/opcodes/hashing.ts +1 -1
- package/src/public/avm/opcodes/index.ts +15 -0
- package/src/{avm → public/avm}/opcodes/instruction.ts +2 -2
- package/src/{avm → public/avm}/opcodes/misc.ts +1 -1
- package/src/public/avm/serialization/bytecode_serialization.ts +204 -0
- package/src/{avm → public/avm}/serialization/instruction_serialization.ts +0 -1
- package/src/{avm → public/avm}/test_utils.ts +10 -7
- package/src/public/execution.ts +9 -12
- package/src/public/fixtures/public_tx_simulation_tester.ts +66 -72
- package/src/public/fixtures/utils.ts +122 -33
- package/src/public/index.ts +5 -4
- package/src/public/public_db_sources.ts +216 -222
- package/src/public/{public_processor.ts → public_processor/public_processor.ts} +78 -53
- package/src/public/{public_processor_metrics.ts → public_processor/public_processor_metrics.ts} +3 -3
- package/src/public/{public_tx_context.ts → public_tx_simulator/public_tx_context.ts} +70 -75
- package/src/public/{public_tx_simulator.ts → public_tx_simulator/public_tx_simulator.ts} +104 -91
- package/src/public/side_effect_trace.ts +85 -160
- package/src/public/side_effect_trace_interface.ts +10 -23
- package/src/public/tx_contract_cache.ts +69 -0
- package/src/public/unique_class_ids.ts +1 -1
- package/src/public/utils.ts +2 -2
- package/src/server.ts +4 -4
- package/src/test/utils.ts +5 -3
- package/dest/acvm/acvm.d.ts.map +0 -1
- package/dest/acvm/acvm.js +0 -73
- package/dest/acvm/acvm_types.d.ts.map +0 -1
- package/dest/acvm/acvm_types.js +0 -2
- package/dest/acvm/deserialize.d.ts.map +0 -1
- package/dest/acvm/deserialize.js +0 -46
- package/dest/acvm/index.d.ts.map +0 -1
- package/dest/acvm/index.js +0 -6
- package/dest/acvm/oracle/index.d.ts.map +0 -1
- package/dest/acvm/oracle/index.js +0 -3
- package/dest/acvm/oracle/oracle.d.ts.map +0 -1
- package/dest/acvm/oracle/oracle.js +0 -230
- package/dest/acvm/oracle/typed_oracle.d.ts.map +0 -1
- package/dest/acvm/oracle/typed_oracle.js +0 -131
- package/dest/acvm/serialize.d.ts.map +0 -1
- package/dest/acvm/serialize.js +0 -48
- package/dest/avm/avm_context.d.ts.map +0 -1
- package/dest/avm/avm_context.js +0 -44
- package/dest/avm/avm_contract_call_result.d.ts.map +0 -1
- package/dest/avm/avm_contract_call_result.js +0 -45
- package/dest/avm/avm_execution_environment.d.ts.map +0 -1
- package/dest/avm/avm_execution_environment.js +0 -28
- package/dest/avm/avm_gas.d.ts.map +0 -1
- package/dest/avm/avm_gas.js +0 -170
- package/dest/avm/avm_machine_state.d.ts.map +0 -1
- package/dest/avm/avm_machine_state.js +0 -112
- package/dest/avm/avm_memory_types.d.ts.map +0 -1
- package/dest/avm/avm_memory_types.js +0 -327
- package/dest/avm/avm_simulator.d.ts.map +0 -1
- package/dest/avm/avm_simulator.js +0 -193
- package/dest/avm/avm_tree.d.ts +0 -282
- package/dest/avm/avm_tree.d.ts.map +0 -1
- package/dest/avm/avm_tree.js +0 -684
- package/dest/avm/bytecode_utils.d.ts.map +0 -1
- package/dest/avm/bytecode_utils.js +0 -15
- package/dest/avm/errors.d.ts.map +0 -1
- package/dest/avm/errors.js +0 -196
- package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
- package/dest/avm/fixtures/avm_simulation_tester.js +0 -73
- package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
- package/dest/avm/fixtures/base_avm_simulation_tester.js +0 -76
- package/dest/avm/fixtures/index.d.ts.map +0 -1
- package/dest/avm/fixtures/index.js +0 -134
- package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
- package/dest/avm/fixtures/simple_contract_data_source.js +0 -75
- package/dest/avm/index.d.ts.map +0 -1
- package/dest/avm/index.js +0 -4
- package/dest/avm/journal/index.d.ts.map +0 -1
- package/dest/avm/journal/index.js +0 -2
- package/dest/avm/journal/journal.d.ts.map +0 -1
- package/dest/avm/journal/journal.js +0 -499
- package/dest/avm/journal/nullifiers.d.ts.map +0 -1
- package/dest/avm/journal/nullifiers.js +0 -99
- package/dest/avm/journal/public_storage.d.ts.map +0 -1
- package/dest/avm/journal/public_storage.js +0 -159
- package/dest/avm/opcodes/accrued_substate.d.ts.map +0 -1
- package/dest/avm/opcodes/accrued_substate.js +0 -215
- package/dest/avm/opcodes/addressing_mode.d.ts.map +0 -1
- package/dest/avm/opcodes/addressing_mode.js +0 -81
- package/dest/avm/opcodes/arithmetic.d.ts.map +0 -1
- package/dest/avm/opcodes/arithmetic.js +0 -70
- package/dest/avm/opcodes/bitwise.d.ts.map +0 -1
- package/dest/avm/opcodes/bitwise.js +0 -90
- package/dest/avm/opcodes/comparators.d.ts.map +0 -1
- package/dest/avm/opcodes/comparators.js +0 -40
- package/dest/avm/opcodes/contract.d.ts.map +0 -1
- package/dest/avm/opcodes/contract.js +0 -63
- package/dest/avm/opcodes/control_flow.d.ts.map +0 -1
- package/dest/avm/opcodes/control_flow.js +0 -97
- package/dest/avm/opcodes/conversion.d.ts.map +0 -1
- package/dest/avm/opcodes/conversion.js +0 -64
- package/dest/avm/opcodes/ec_add.d.ts.map +0 -1
- package/dest/avm/opcodes/ec_add.js +0 -82
- package/dest/avm/opcodes/environment_getters.d.ts.map +0 -1
- package/dest/avm/opcodes/environment_getters.js +0 -78
- package/dest/avm/opcodes/external_calls.d.ts.map +0 -1
- package/dest/avm/opcodes/external_calls.js +0 -169
- package/dest/avm/opcodes/hashing.d.ts.map +0 -1
- package/dest/avm/opcodes/hashing.js +0 -103
- package/dest/avm/opcodes/index.d.ts.map +0 -1
- package/dest/avm/opcodes/index.js +0 -16
- package/dest/avm/opcodes/instruction.d.ts.map +0 -1
- package/dest/avm/opcodes/instruction.js +0 -100
- package/dest/avm/opcodes/instruction_impl.d.ts.map +0 -1
- package/dest/avm/opcodes/instruction_impl.js +0 -33
- package/dest/avm/opcodes/memory.d.ts.map +0 -1
- package/dest/avm/opcodes/memory.js +0 -226
- package/dest/avm/opcodes/misc.d.ts.map +0 -1
- package/dest/avm/opcodes/misc.js +0 -45
- package/dest/avm/opcodes/multi_scalar_mul.d.ts +0 -16
- package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +0 -1
- package/dest/avm/opcodes/multi_scalar_mul.js +0 -112
- package/dest/avm/opcodes/storage.d.ts.map +0 -1
- package/dest/avm/opcodes/storage.js +0 -61
- package/dest/avm/serialization/buffer_cursor.d.ts.map +0 -1
- package/dest/avm/serialization/buffer_cursor.js +0 -99
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +0 -1
- package/dest/avm/serialization/bytecode_serialization.js +0 -132
- package/dest/avm/serialization/instruction_serialization.d.ts.map +0 -1
- package/dest/avm/serialization/instruction_serialization.js +0 -187
- package/dest/avm/test_utils.d.ts.map +0 -1
- package/dest/avm/test_utils.js +0 -52
- package/dest/client/client_execution_context.d.ts.map +0 -1
- package/dest/client/client_execution_context.js +0 -392
- package/dest/client/db_oracle.d.ts.map +0 -1
- package/dest/client/db_oracle.js +0 -17
- package/dest/client/execution_note_cache.d.ts.map +0 -1
- package/dest/client/execution_note_cache.js +0 -181
- package/dest/client/index.d.ts +0 -16
- package/dest/client/index.d.ts.map +0 -1
- package/dest/client/index.js +0 -15
- package/dest/client/pick_notes.d.ts.map +0 -1
- package/dest/client/pick_notes.js +0 -54
- package/dest/client/private_execution.d.ts +0 -19
- package/dest/client/private_execution.d.ts.map +0 -1
- package/dest/client/private_execution.js +0 -72
- package/dest/client/simulator.d.ts +0 -60
- package/dest/client/simulator.d.ts.map +0 -1
- package/dest/client/simulator.js +0 -136
- package/dest/client/unconstrained_execution.d.ts.map +0 -1
- package/dest/client/unconstrained_execution.js +0 -30
- package/dest/client/view_data_oracle.d.ts.map +0 -1
- package/dest/client/view_data_oracle.js +0 -268
- package/dest/common/hashed_values_cache.d.ts.map +0 -1
- package/dest/common/hashed_values_cache.js +0 -50
- package/dest/common/simulation_provider.d.ts.map +0 -1
- package/dest/common/simulation_provider.js +0 -27
- package/dest/common.d.ts +0 -2
- package/dest/common.d.ts.map +0 -1
- package/dest/common.js +0 -2
- package/dest/providers/acvm_native.d.ts.map +0 -1
- package/dest/providers/acvm_native.js +0 -125
- package/dest/providers/acvm_wasm.d.ts.map +0 -1
- package/dest/providers/acvm_wasm.js +0 -54
- package/dest/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
- package/dest/providers/factory.d.ts.map +0 -1
- package/dest/providers/factory.js +0 -27
- package/dest/providers/index.d.ts +0 -5
- package/dest/providers/index.d.ts.map +0 -1
- package/dest/providers/index.js +0 -5
- package/dest/public/db_interfaces.d.ts.map +0 -1
- package/dest/public/db_interfaces.js +0 -2
- package/dest/public/fee_payment.d.ts +0 -11
- package/dest/public/fee_payment.d.ts.map +0 -1
- package/dest/public/fee_payment.js +0 -21
- package/dest/public/public_processor.d.ts.map +0 -1
- package/dest/public/public_processor.js +0 -352
- package/dest/public/public_processor_metrics.d.ts.map +0 -1
- package/dest/public/public_processor_metrics.js +0 -106
- package/dest/public/public_tx_context.d.ts.map +0 -1
- package/dest/public/public_tx_context.js +0 -341
- package/dest/public/public_tx_simulator.d.ts.map +0 -1
- package/dest/public/public_tx_simulator.js +0 -333
- package/dest/stats/index.d.ts.map +0 -1
- package/dest/stats/index.js +0 -2
- package/dest/stats/stats.d.ts.map +0 -1
- package/dest/stats/stats.js +0 -11
- package/src/avm/avm_tree.ts +0 -887
- package/src/avm/opcodes/multi_scalar_mul.ts +0 -121
- package/src/avm/serialization/bytecode_serialization.ts +0 -212
- package/src/client/index.ts +0 -15
- package/src/common.ts +0 -1
- package/src/providers/index.ts +0 -4
- package/src/public/fee_payment.ts +0 -23
- /package/dest/{stats → common/stats}/index.d.ts +0 -0
- /package/{src/stats/index.ts → dest/common/stats/index.js} +0 -0
- /package/dest/{acvm → private/acvm}/index.d.ts +0 -0
- /package/dest/{avm → public/avm}/avm_gas.d.ts +0 -0
- /package/dest/{avm → public/avm}/bytecode_utils.d.ts +0 -0
- /package/dest/{avm → public/avm}/journal/index.d.ts +0 -0
- /package/{src/avm/journal/index.ts → dest/public/avm/journal/index.js} +0 -0
- /package/dest/{avm → public/avm}/opcodes/accrued_substate.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/addressing_mode.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/arithmetic.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/bitwise.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/comparators.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/contract.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/control_flow.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/environment_getters.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/external_calls.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/index.d.ts +0 -0
- /package/{src/avm/opcodes/index.ts → dest/public/avm/opcodes/index.js} +0 -0
- /package/dest/{avm → public/avm}/opcodes/instruction_impl.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/memory.d.ts +0 -0
- /package/dest/{avm → public/avm}/opcodes/storage.d.ts +0 -0
- /package/dest/{avm → public/avm}/serialization/buffer_cursor.d.ts +0 -0
- /package/src/{acvm → private/acvm}/index.ts +0 -0
- /package/src/{avm → public/avm}/bytecode_utils.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/.eslintrc.cjs +0 -0
- /package/src/{avm → public/avm}/opcodes/accrued_substate.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/addressing_mode.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/arithmetic.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/bitwise.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/comparators.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/environment_getters.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/instruction_impl.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/memory.ts +0 -0
- /package/src/{avm → public/avm}/opcodes/storage.ts +0 -0
- /package/src/{avm → public/avm}/serialization/buffer_cursor.ts +0 -0
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
import { CANONICAL_AUTH_REGISTRY_ADDRESS, DEPLOYER_CONTRACT_ADDRESS, FEE_JUICE_ADDRESS, MULTI_CALL_ENTRYPOINT_ADDRESS, REGISTERER_CONTRACT_ADDRESS, ROUTER_ADDRESS } from '@aztec/constants';
|
|
2
|
+
import { poseidon2Hash } from '@aztec/foundation/crypto';
|
|
3
|
+
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
+
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
5
|
+
import { createLogger } from '@aztec/foundation/log';
|
|
6
|
+
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
7
|
+
import { AvmPublicDataReadTreeHint, PublicDataWrite } from '@aztec/stdlib/avm';
|
|
8
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
9
|
+
import { SerializableContractInstance } from '@aztec/stdlib/contract';
|
|
10
|
+
import { computeNoteHashNonce, computePublicDataTreeLeafSlot, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/stdlib/hash';
|
|
11
|
+
import { SharedMutableValues, SharedMutableValuesWithHash } from '@aztec/stdlib/shared-mutable';
|
|
12
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
13
|
+
import { strict as assert } from 'assert';
|
|
14
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
15
|
+
import { getPublicFunctionDebugName } from '../../../common/debug_fn_name.js';
|
|
16
|
+
import { NullifierCollisionError, NullifierManager } from './nullifiers.js';
|
|
17
|
+
import { PublicStorage } from './public_storage.js';
|
|
18
|
+
/**
|
|
19
|
+
* A class to manage persistable AVM state for contract calls.
|
|
20
|
+
* Maintains a cache of the current world state,
|
|
21
|
+
* a trace of all side effects.
|
|
22
|
+
*
|
|
23
|
+
* The simulator should make any world state / tree queries through this object.
|
|
24
|
+
*
|
|
25
|
+
* Manages merging of successful/reverted child state into current state.
|
|
26
|
+
*/ export class AvmPersistableStateManager {
|
|
27
|
+
worldStateDB;
|
|
28
|
+
trace;
|
|
29
|
+
publicStorage;
|
|
30
|
+
nullifiers;
|
|
31
|
+
doMerkleOperations;
|
|
32
|
+
db;
|
|
33
|
+
firstNullifier;
|
|
34
|
+
log;
|
|
35
|
+
/** Make sure a forked state is never merged twice. */ alreadyMergedIntoParent;
|
|
36
|
+
constructor(/** Reference to node storage */ worldStateDB, /** Side effect trace */ // TODO(5818): make private once no longer accessed in executor
|
|
37
|
+
trace, /** Public storage, including cached writes */ publicStorage = new PublicStorage(worldStateDB), /** Nullifier set, including cached/recently-emitted nullifiers */ nullifiers = new NullifierManager(worldStateDB), doMerkleOperations = false, /** DB interface for merkle tree operations */ db, firstNullifier){
|
|
38
|
+
this.worldStateDB = worldStateDB;
|
|
39
|
+
this.trace = trace;
|
|
40
|
+
this.publicStorage = publicStorage;
|
|
41
|
+
this.nullifiers = nullifiers;
|
|
42
|
+
this.doMerkleOperations = doMerkleOperations;
|
|
43
|
+
this.db = db;
|
|
44
|
+
this.firstNullifier = firstNullifier;
|
|
45
|
+
this.log = createLogger('simulator:avm:state_manager');
|
|
46
|
+
this.alreadyMergedIntoParent = false;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Create a new state manager
|
|
50
|
+
*/ static create(worldStateDB, trace, doMerkleOperations = false, firstNullifier) {
|
|
51
|
+
// TODO(dbanks12): temporary until we establish a better world state interface
|
|
52
|
+
const db = worldStateDB.getMerkleInterface();
|
|
53
|
+
return new AvmPersistableStateManager(worldStateDB, trace, /*publicStorage=*/ new PublicStorage(worldStateDB), /*nullifiers=*/ new NullifierManager(worldStateDB), /*doMerkleOperations=*/ doMerkleOperations, db, firstNullifier);
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Create a new state manager forked from this one
|
|
57
|
+
*/ async fork() {
|
|
58
|
+
await this.worldStateDB.createCheckpoint();
|
|
59
|
+
return new AvmPersistableStateManager(this.worldStateDB, this.trace.fork(), this.publicStorage.fork(), this.nullifiers.fork(), this.doMerkleOperations, this.db, this.firstNullifier);
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Accept forked world state modifications & traced side effects / hints
|
|
63
|
+
*/ async merge(forkedState) {
|
|
64
|
+
await this._merge(forkedState, /*reverted=*/ false);
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Reject forked world state modifications & traced side effects, keep traced hints
|
|
68
|
+
*/ async reject(forkedState) {
|
|
69
|
+
await this._merge(forkedState, /*reverted=*/ true);
|
|
70
|
+
}
|
|
71
|
+
async _merge(forkedState, reverted) {
|
|
72
|
+
// sanity check to avoid merging the same forked trace twice
|
|
73
|
+
assert(!forkedState.alreadyMergedIntoParent, 'Cannot merge forked state that has already been merged into its parent!');
|
|
74
|
+
forkedState.alreadyMergedIntoParent = true;
|
|
75
|
+
this.publicStorage.acceptAndMerge(forkedState.publicStorage);
|
|
76
|
+
this.nullifiers.acceptAndMerge(forkedState.nullifiers);
|
|
77
|
+
this.trace.merge(forkedState.trace, reverted);
|
|
78
|
+
if (reverted) {
|
|
79
|
+
await this.worldStateDB.revertCheckpoint();
|
|
80
|
+
if (this.doMerkleOperations) {
|
|
81
|
+
this.log.trace(`Rolled back nullifier tree to root ${new Fr((await this.db.getTreeInfo(MerkleTreeId.NULLIFIER_TREE)).root)}`);
|
|
82
|
+
}
|
|
83
|
+
} else {
|
|
84
|
+
this.log.trace('Merging forked state into parent...');
|
|
85
|
+
await this.worldStateDB.commitCheckpoint();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Write to public storage, journal/trace the write.
|
|
90
|
+
*
|
|
91
|
+
* @param contractAddress - the address of the contract whose storage is being written to
|
|
92
|
+
* @param slot - the slot in the contract's storage being written to
|
|
93
|
+
* @param value - the value being written to the slot
|
|
94
|
+
*/ async writeStorage(contractAddress, slot, value, protocolWrite = false) {
|
|
95
|
+
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
96
|
+
this.log.trace(`Storage write (address=${contractAddress}, slot=${slot}): value=${value}, leafSlot=${leafSlot}`);
|
|
97
|
+
if (this.doMerkleOperations) {
|
|
98
|
+
// write to native merkle trees
|
|
99
|
+
const publicDataWrite = new PublicDataWrite(leafSlot, value);
|
|
100
|
+
const result = await this.db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [
|
|
101
|
+
publicDataWrite.toBuffer()
|
|
102
|
+
]);
|
|
103
|
+
assert(result !== undefined, 'Public data tree insertion error. You might want to disable doMerkleOperations.');
|
|
104
|
+
this.log.trace(`Inserted public data tree leaf at leafSlot ${leafSlot}, value: ${value}`);
|
|
105
|
+
// low leaf hint
|
|
106
|
+
const lowLeafPreimage = result.lowLeavesWitnessData[0].leafPreimage;
|
|
107
|
+
const lowLeafIndex = result.lowLeavesWitnessData[0].index;
|
|
108
|
+
const lowLeafPath = result.lowLeavesWitnessData[0].siblingPath.toFields();
|
|
109
|
+
// new leaf insertion
|
|
110
|
+
const newLeafPreimage = cloneDeep(lowLeafPreimage);
|
|
111
|
+
let insertionPath;
|
|
112
|
+
if (result.insertionWitnessData.length === 0) {
|
|
113
|
+
assert(newLeafPreimage.value.equals(value), `Value mismatch when performing public data write (got value: ${value}, value in tree: ${newLeafPreimage.value})`);
|
|
114
|
+
} else {
|
|
115
|
+
// The new leaf preimage should have the new value and slot
|
|
116
|
+
newLeafPreimage.slot = leafSlot;
|
|
117
|
+
newLeafPreimage.value = value;
|
|
118
|
+
// TODO: is this necessary?! Why doesn't sequentialInsert return the newLeafPreimage via
|
|
119
|
+
// result.insertionWitnessData[0].leafPreimage?
|
|
120
|
+
this.log.trace(`newLeafPreimage.slot: ${newLeafPreimage.slot}, newLeafPreimage.value: ${newLeafPreimage.value}, insertionIndex: ${result.insertionWitnessData[0].index}`);
|
|
121
|
+
insertionPath = result.insertionWitnessData[0].siblingPath.toFields();
|
|
122
|
+
}
|
|
123
|
+
await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite, lowLeafPreimage, new Fr(lowLeafIndex), lowLeafPath, newLeafPreimage, insertionPath);
|
|
124
|
+
} else {
|
|
125
|
+
// Cache storage writes for later reference/reads
|
|
126
|
+
this.publicStorage.write(contractAddress, slot, value);
|
|
127
|
+
await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Read from public storage, trace the read.
|
|
132
|
+
*
|
|
133
|
+
* @param contractAddress - the address of the contract whose storage is being read from
|
|
134
|
+
* @param slot - the slot in the contract's storage being read from
|
|
135
|
+
* @returns the latest value written to slot, or 0 if never written to before
|
|
136
|
+
*/ async readStorage(contractAddress, slot) {
|
|
137
|
+
if (this.doMerkleOperations) {
|
|
138
|
+
const { value, leafPreimage, leafIndex, leafPath } = await this.getPublicDataMembership(contractAddress, slot);
|
|
139
|
+
this.trace.tracePublicStorageRead(contractAddress, slot, value, leafPreimage, leafIndex, leafPath);
|
|
140
|
+
return value;
|
|
141
|
+
} else {
|
|
142
|
+
const read = await this.publicStorage.read(contractAddress, slot);
|
|
143
|
+
this.log.trace(`Storage read results (address=${contractAddress}, slot=${slot}): value=${read.value}, cached=${read.cached}`);
|
|
144
|
+
this.trace.tracePublicStorageRead(contractAddress, slot, read.value);
|
|
145
|
+
return read.value;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
async getPublicDataMembership(contractAddress, slot) {
|
|
149
|
+
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
150
|
+
const treeId = MerkleTreeId.PUBLIC_DATA_TREE;
|
|
151
|
+
// Get leaf if present, low leaf if absent
|
|
152
|
+
// If leaf is present, hint/trace it. Otherwise, hint/trace the low leaf.
|
|
153
|
+
const { preimage, leafOrLowLeafIndex, alreadyPresent } = await this.getLeafOrLowLeafInfo(treeId, leafSlot.toBigInt());
|
|
154
|
+
// The index and preimage here is either the low leaf or the leaf itself (depending on the value of update flag)
|
|
155
|
+
// 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
|
|
156
|
+
const leafPath = await this.db.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafOrLowLeafIndex);
|
|
157
|
+
const leafPreimage = preimage;
|
|
158
|
+
const value = alreadyPresent ? leafPreimage.value : Fr.zero(); // default value of 0
|
|
159
|
+
if (!alreadyPresent) {
|
|
160
|
+
this.log.trace(`Slot has never been written before!`);
|
|
161
|
+
// Sanity check that the leaf slot is skipped by low leaf when it doesn't exist
|
|
162
|
+
assert(leafPreimage.slot.toBigInt() < leafSlot.toBigInt() && (leafPreimage.nextIndex === 0n || leafPreimage.nextSlot.toBigInt() > leafSlot.toBigInt()), 'Public data tree low leaf should skip the target leaf slot when the target leaf does not exist or is the max value.');
|
|
163
|
+
}
|
|
164
|
+
this.log.trace(`Storage read results (address=${contractAddress}, slot=${slot}, leafSlot=${leafSlot}): value=${value}, previouslyWritten=${alreadyPresent}`);
|
|
165
|
+
return {
|
|
166
|
+
value,
|
|
167
|
+
leafPreimage,
|
|
168
|
+
leafIndex: new Fr(leafOrLowLeafIndex),
|
|
169
|
+
leafPath: leafPath.toFields()
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Read from public storage, don't trace the read.
|
|
174
|
+
*
|
|
175
|
+
* @param contractAddress - the address of the contract whose storage is being read from
|
|
176
|
+
* @param slot - the slot in the contract's storage being read from
|
|
177
|
+
* @returns the latest value written to slot, or 0 if never written to before
|
|
178
|
+
*/ async peekStorage(contractAddress, slot) {
|
|
179
|
+
const { value, cached } = await this.publicStorage.read(contractAddress, slot);
|
|
180
|
+
this.log.trace(`Storage peek (address=${contractAddress}, slot=${slot}): value=${value}, cached=${cached}`);
|
|
181
|
+
return Promise.resolve(value);
|
|
182
|
+
}
|
|
183
|
+
// TODO(4886): We currently don't silo note hashes.
|
|
184
|
+
/**
|
|
185
|
+
* Check if a note hash exists at the given leaf index, trace the check.
|
|
186
|
+
*
|
|
187
|
+
* @param contractAddress - the address of the contract whose storage is being read from
|
|
188
|
+
* @param noteHash - the unsiloed note hash being checked
|
|
189
|
+
* @param leafIndex - the leaf index being checked
|
|
190
|
+
* @returns true if the note hash exists at the given leaf index, false otherwise
|
|
191
|
+
*/ async checkNoteHashExists(contractAddress, noteHash, leafIndex) {
|
|
192
|
+
const gotLeafValue = await this.worldStateDB.getCommitmentValue(leafIndex.toBigInt()) ?? Fr.ZERO;
|
|
193
|
+
const exists = gotLeafValue.equals(noteHash);
|
|
194
|
+
this.log.trace(`noteHashes(${contractAddress})@${noteHash} ?? leafIndex: ${leafIndex} | gotLeafValue: ${gotLeafValue}, exists: ${exists}.`);
|
|
195
|
+
if (this.doMerkleOperations) {
|
|
196
|
+
const path = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
|
|
197
|
+
this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists, path.toFields());
|
|
198
|
+
} else {
|
|
199
|
+
this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists);
|
|
200
|
+
}
|
|
201
|
+
return Promise.resolve(exists);
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Write a raw note hash, silo it and make it unique, then trace the write.
|
|
205
|
+
* @param noteHash - the unsiloed note hash to write
|
|
206
|
+
*/ async writeNoteHash(contractAddress, noteHash) {
|
|
207
|
+
this.log.trace(`noteHashes(${contractAddress}) += ${noteHash}.`);
|
|
208
|
+
const siloedNoteHash = await siloNoteHash(contractAddress, noteHash);
|
|
209
|
+
await this.writeSiloedNoteHash(siloedNoteHash);
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Write a note hash, make it unique, trace the write.
|
|
213
|
+
* @param siloedNoteHash - the non unique note hash to write
|
|
214
|
+
*/ async writeSiloedNoteHash(siloedNoteHash) {
|
|
215
|
+
const nonce = await computeNoteHashNonce(this.firstNullifier, this.trace.getNoteHashCount());
|
|
216
|
+
const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
|
|
217
|
+
await this.writeUniqueNoteHash(uniqueNoteHash);
|
|
218
|
+
}
|
|
219
|
+
/**
|
|
220
|
+
* Write a note hash, trace the write.
|
|
221
|
+
* @param uniqueNoteHash - the siloed unique hash to write
|
|
222
|
+
*/ async writeUniqueNoteHash(uniqueNoteHash) {
|
|
223
|
+
this.log.trace(`noteHashes += @${uniqueNoteHash}.`);
|
|
224
|
+
if (this.doMerkleOperations) {
|
|
225
|
+
// Should write a helper for this
|
|
226
|
+
const treeInfo = await this.db.getTreeInfo(MerkleTreeId.NOTE_HASH_TREE);
|
|
227
|
+
const leafIndex = new Fr(treeInfo.size);
|
|
228
|
+
await this.db.appendLeaves(MerkleTreeId.NOTE_HASH_TREE, [
|
|
229
|
+
uniqueNoteHash
|
|
230
|
+
]);
|
|
231
|
+
const insertionPath = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
|
|
232
|
+
this.trace.traceNewNoteHash(uniqueNoteHash, leafIndex, insertionPath.toFields());
|
|
233
|
+
} else {
|
|
234
|
+
this.trace.traceNewNoteHash(uniqueNoteHash);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Check if a nullifier exists, trace the check.
|
|
239
|
+
* @param contractAddress - address of the contract that the nullifier is associated with
|
|
240
|
+
* @param nullifier - the unsiloed nullifier to check
|
|
241
|
+
* @returns exists - whether the nullifier exists in the nullifier set
|
|
242
|
+
*/ async checkNullifierExists(contractAddress, nullifier) {
|
|
243
|
+
this.log.trace(`Checking existence of nullifier (address=${contractAddress}, nullifier=${nullifier})`);
|
|
244
|
+
const siloedNullifier = await siloNullifier(contractAddress, nullifier);
|
|
245
|
+
if (this.doMerkleOperations) {
|
|
246
|
+
const { exists, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath } = await this.getNullifierMembership(siloedNullifier);
|
|
247
|
+
this.trace.traceNullifierCheck(siloedNullifier, exists, leafOrLowLeafPreimage, new Fr(leafOrLowLeafIndex), leafOrLowLeafPath);
|
|
248
|
+
return Promise.resolve(exists);
|
|
249
|
+
} else {
|
|
250
|
+
const { exists, cacheHit } = await this.nullifiers.checkExists(siloedNullifier);
|
|
251
|
+
this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${exists}), cacheHit=${cacheHit}`);
|
|
252
|
+
this.trace.traceNullifierCheck(siloedNullifier, exists);
|
|
253
|
+
return Promise.resolve(exists);
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* Helper to get membership information for a siloed nullifier when checking its existence.
|
|
258
|
+
* Optionally trace the nullifier check.
|
|
259
|
+
*
|
|
260
|
+
* @param siloedNullifier - the siloed nullifier to get membership information for
|
|
261
|
+
* @returns
|
|
262
|
+
* - exists - whether the nullifier exists in the nullifier set
|
|
263
|
+
* - leafOrLowLeafPreimage - the preimage of the nullifier leaf or its low-leaf if it doesn't exist
|
|
264
|
+
* - leafOrLowLeafIndex - the leaf index of the nullifier leaf or its low-leaf if it doesn't exist
|
|
265
|
+
* - leafOrLowLeafPath - the sibling path of the nullifier leaf or its low-leaf if it doesn't exist
|
|
266
|
+
*/ async getNullifierMembership(siloedNullifier) {
|
|
267
|
+
// Get leaf if present, low leaf if absent
|
|
268
|
+
// If leaf is present, hint/trace it. Otherwise, hint/trace the low leaf.
|
|
269
|
+
const treeId = MerkleTreeId.NULLIFIER_TREE;
|
|
270
|
+
const { preimage: leafPreimage, leafOrLowLeafIndex, alreadyPresent } = await this.getLeafOrLowLeafInfo(treeId, siloedNullifier.toBigInt());
|
|
271
|
+
this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${alreadyPresent})`);
|
|
272
|
+
const leafPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex);
|
|
273
|
+
if (alreadyPresent) {
|
|
274
|
+
this.log.trace(`Siloed nullifier ${siloedNullifier} exists at leafIndex=${leafOrLowLeafIndex}`);
|
|
275
|
+
} else {
|
|
276
|
+
// Sanity check that the leaf value is skipped by low leaf when it doesn't exist
|
|
277
|
+
assert(leafPreimage.nullifier.toBigInt() < siloedNullifier.toBigInt() && (leafPreimage.nextIndex === 0n || leafPreimage.nextNullifier.toBigInt() > siloedNullifier.toBigInt()), 'Nullifier tree low leaf should skip the target leaf nullifier when the target leaf does not exist.');
|
|
278
|
+
}
|
|
279
|
+
return {
|
|
280
|
+
exists: alreadyPresent,
|
|
281
|
+
leafOrLowLeafPreimage: leafPreimage,
|
|
282
|
+
leafOrLowLeafIndex,
|
|
283
|
+
leafOrLowLeafPath: leafPath.toFields()
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
/**
|
|
287
|
+
* Write a nullifier to the nullifier set, trace the write.
|
|
288
|
+
* @param contractAddress - address of the contract that the nullifier is associated with
|
|
289
|
+
* @param nullifier - the unsiloed nullifier to write
|
|
290
|
+
*/ async writeNullifier(contractAddress, nullifier) {
|
|
291
|
+
this.log.trace(`Inserting new nullifier (address=${nullifier}, nullifier=${contractAddress})`);
|
|
292
|
+
const siloedNullifier = await siloNullifier(contractAddress, nullifier);
|
|
293
|
+
await this.writeSiloedNullifier(siloedNullifier);
|
|
294
|
+
}
|
|
295
|
+
/**
|
|
296
|
+
* Write a nullifier to the nullifier set, trace the write.
|
|
297
|
+
* @param siloedNullifier - the siloed nullifier to write
|
|
298
|
+
*/ async writeSiloedNullifier(siloedNullifier) {
|
|
299
|
+
this.log.trace(`Inserting siloed nullifier=${siloedNullifier}`);
|
|
300
|
+
if (this.doMerkleOperations) {
|
|
301
|
+
const treeId = MerkleTreeId.NULLIFIER_TREE;
|
|
302
|
+
const { preimage: leafPreimage, leafOrLowLeafIndex, alreadyPresent } = await this.getLeafOrLowLeafInfo(treeId, siloedNullifier.toBigInt());
|
|
303
|
+
if (alreadyPresent) {
|
|
304
|
+
this.log.verbose(`Siloed nullifier ${siloedNullifier} already present in tree at index ${leafOrLowLeafIndex}!`);
|
|
305
|
+
// If the nullifier is already present, we should not insert it again
|
|
306
|
+
// instead we provide the direct membership path
|
|
307
|
+
const membershipPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex);
|
|
308
|
+
// This just becomes a nullifier read hint
|
|
309
|
+
this.trace.traceNullifierCheck(siloedNullifier, /*exists=*/ alreadyPresent, leafPreimage, new Fr(leafOrLowLeafIndex), membershipPath.toFields());
|
|
310
|
+
throw new NullifierCollisionError(`Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`);
|
|
311
|
+
} else {
|
|
312
|
+
const appendResult = await this.db.sequentialInsert(treeId, [
|
|
313
|
+
siloedNullifier.toBuffer()
|
|
314
|
+
]);
|
|
315
|
+
const lowLeafWitnessData = appendResult.lowLeavesWitnessData[0];
|
|
316
|
+
const lowLeafPreimage = lowLeafWitnessData.leafPreimage;
|
|
317
|
+
const lowLeafIndex = lowLeafWitnessData.index;
|
|
318
|
+
const lowLeafPath = lowLeafWitnessData.siblingPath.toFields();
|
|
319
|
+
const insertionPath = appendResult.insertionWitnessData[0].siblingPath.toFields();
|
|
320
|
+
this.trace.traceNewNullifier(siloedNullifier, lowLeafPreimage, new Fr(lowLeafIndex), lowLeafPath, insertionPath);
|
|
321
|
+
}
|
|
322
|
+
} else {
|
|
323
|
+
// Cache pending nullifiers for later access
|
|
324
|
+
await this.nullifiers.append(siloedNullifier);
|
|
325
|
+
this.trace.traceNewNullifier(siloedNullifier);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
async writeSiloedNullifiersFromPrivate(siloedNullifiers) {
|
|
329
|
+
for (const siloedNullifier of siloedNullifiers.filter((n)=>!n.isEmpty())){
|
|
330
|
+
await this.writeSiloedNullifier(siloedNullifier);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Check if an L1 to L2 message exists, trace the check.
|
|
335
|
+
* @param msgHash - the message hash to check existence of
|
|
336
|
+
* @param msgLeafIndex - the message leaf index to use in the check
|
|
337
|
+
* @returns exists - whether the message exists in the L1 to L2 Messages tree
|
|
338
|
+
*/ async checkL1ToL2MessageExists(contractAddress, msgHash, msgLeafIndex) {
|
|
339
|
+
const valueAtIndex = await this.worldStateDB.getL1ToL2LeafValue(msgLeafIndex.toBigInt()) ?? Fr.ZERO;
|
|
340
|
+
const exists = valueAtIndex.equals(msgHash);
|
|
341
|
+
this.log.trace(`l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`);
|
|
342
|
+
if (this.doMerkleOperations) {
|
|
343
|
+
const path = await this.db.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, msgLeafIndex.toBigInt());
|
|
344
|
+
this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists, path.toFields());
|
|
345
|
+
} else {
|
|
346
|
+
this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists);
|
|
347
|
+
}
|
|
348
|
+
return Promise.resolve(exists);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Write an L2 to L1 message.
|
|
352
|
+
* @param contractAddress - L2 contract address that created this message
|
|
353
|
+
* @param recipient - L1 contract address to send the message to.
|
|
354
|
+
* @param content - Message content.
|
|
355
|
+
*/ writeL2ToL1Message(contractAddress, recipient, content) {
|
|
356
|
+
this.log.trace(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`);
|
|
357
|
+
this.trace.traceNewL2ToL1Message(contractAddress, recipient, content);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Write a public log
|
|
361
|
+
* @param contractAddress - address of the contract that emitted the log
|
|
362
|
+
* @param log - log contents
|
|
363
|
+
*/ writePublicLog(contractAddress, log) {
|
|
364
|
+
this.log.trace(`PublicLog(${contractAddress}) += event with ${log.length} fields.`);
|
|
365
|
+
this.trace.tracePublicLog(contractAddress, log);
|
|
366
|
+
}
|
|
367
|
+
/**
|
|
368
|
+
* Get a contract instance.
|
|
369
|
+
* @param contractAddress - address of the contract instance to retrieve.
|
|
370
|
+
* @returns the contract instance or undefined if it does not exist.
|
|
371
|
+
*/ async getContractInstance(contractAddress) {
|
|
372
|
+
this.log.trace(`Getting contract instance for address ${contractAddress}`);
|
|
373
|
+
const instanceWithAddress = await this.worldStateDB.getContractInstance(contractAddress);
|
|
374
|
+
const exists = instanceWithAddress !== undefined;
|
|
375
|
+
const instance = exists ? new SerializableContractInstance(instanceWithAddress) : undefined;
|
|
376
|
+
if (!exists) {
|
|
377
|
+
this.log.debug(`Contract instance NOT FOUND (address=${contractAddress})`);
|
|
378
|
+
this.trace.traceGetContractInstance(contractAddress, exists);
|
|
379
|
+
return undefined;
|
|
380
|
+
}
|
|
381
|
+
this.log.trace(`Got contract instance (address=${contractAddress}): instance=${jsonStringify(instance)}`);
|
|
382
|
+
// Canonical addresses do not trigger nullifier & public storage checks
|
|
383
|
+
if (contractAddressIsCanonical(contractAddress)) {
|
|
384
|
+
this.trace.traceGetContractInstance(contractAddress, exists, instance);
|
|
385
|
+
return instance;
|
|
386
|
+
}
|
|
387
|
+
// This will decide internally whether to check the nullifier tree or not depending on doMerkleOperations.
|
|
388
|
+
const nullifierExistsInTree = await this.checkNullifierExists(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), contractAddress.toField());
|
|
389
|
+
assert(exists == nullifierExistsInTree, 'WorldStateDB contains contract instance, but nullifier tree does not contain contract address (or vice versa).... This is a bug!');
|
|
390
|
+
if (this.doMerkleOperations) {
|
|
391
|
+
// TODO(fcarreiro): this should be done via a public read.
|
|
392
|
+
const { updateMembership, updatePreimage } = await this.getContractUpdateHints(contractAddress);
|
|
393
|
+
this.trace.traceGetContractInstance(contractAddress, exists, instance, updateMembership, updatePreimage);
|
|
394
|
+
} else {
|
|
395
|
+
this.trace.traceGetContractInstance(contractAddress, exists, instance);
|
|
396
|
+
}
|
|
397
|
+
return instance;
|
|
398
|
+
}
|
|
399
|
+
/**
|
|
400
|
+
* Get a contract class.
|
|
401
|
+
* @param classId - class id to retrieve.
|
|
402
|
+
* @returns the contract class or undefined if it does not exist.
|
|
403
|
+
*/ async getContractClass(classId) {
|
|
404
|
+
this.log.trace(`Getting contract class for id ${classId}`);
|
|
405
|
+
const klass = await this.worldStateDB.getContractClass(classId);
|
|
406
|
+
const exists = klass !== undefined;
|
|
407
|
+
let extendedClass = undefined;
|
|
408
|
+
// Note: We currently do not generate info to check the nullifier tree, because
|
|
409
|
+
// this is not needed for our use cases.
|
|
410
|
+
if (exists) {
|
|
411
|
+
this.log.trace(`Got contract class (id=${classId})`);
|
|
412
|
+
// Extend class information with public bytecode commitment.
|
|
413
|
+
const bytecodeCommitment = await this.worldStateDB.getBytecodeCommitment(classId);
|
|
414
|
+
assert(bytecodeCommitment, `Bytecode commitment was not found in DB for contract class (${classId}). This should not happen!`);
|
|
415
|
+
extendedClass = {
|
|
416
|
+
...klass,
|
|
417
|
+
publicBytecodeCommitment: bytecodeCommitment
|
|
418
|
+
};
|
|
419
|
+
} else {
|
|
420
|
+
this.log.debug(`Contract instance NOT FOUND (id=${classId})`);
|
|
421
|
+
}
|
|
422
|
+
this.trace.traceGetContractClass(classId, exists, extendedClass);
|
|
423
|
+
return extendedClass;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* Get a contract's bytecode from the contracts DB, also trace the contract class and instance indirectly.
|
|
427
|
+
*/ async getBytecode(contractAddress) {
|
|
428
|
+
this.log.debug(`Getting bytecode for contract address ${contractAddress}`);
|
|
429
|
+
const contractInstance = await this.getContractInstance(contractAddress);
|
|
430
|
+
if (!contractInstance) {
|
|
431
|
+
return undefined;
|
|
432
|
+
}
|
|
433
|
+
const contractClass = await this.getContractClass(contractInstance.currentContractClassId);
|
|
434
|
+
assert(contractClass, `Contract class not found in DB, but a contract instance was found with this class ID (${contractInstance.currentContractClassId}). This should not happen!`);
|
|
435
|
+
// NOTE: If the contract instance is not found, we assume it has not been deployed.
|
|
436
|
+
// It doesnt matter what the values of the contract instance are in this case, as long as we tag it with exists=false.
|
|
437
|
+
// This will hint to the avm circuit to just perform the non-membership check on the address and disregard the bytecode hash
|
|
438
|
+
return contractClass.packedBytecode;
|
|
439
|
+
}
|
|
440
|
+
async getContractUpdateHints(contractAddress) {
|
|
441
|
+
const { sharedMutableSlot, sharedMutableHashSlot } = await SharedMutableValuesWithHash.getContractUpdateSlots(contractAddress);
|
|
442
|
+
const { value: hash, leafPreimage, leafIndex, leafPath } = await this.getPublicDataMembership(ProtocolContractAddress.ContractInstanceDeployer, sharedMutableHashSlot);
|
|
443
|
+
const updateMembership = new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, leafPath);
|
|
444
|
+
const readStorage = async (storageSlot)=>(await this.publicStorage.read(ProtocolContractAddress.ContractInstanceDeployer, storageSlot)).value;
|
|
445
|
+
const sharedMutableValues = await SharedMutableValues.readFromTree(sharedMutableSlot, readStorage);
|
|
446
|
+
const updatePreimage = sharedMutableValues.toFields();
|
|
447
|
+
if (!hash.isZero()) {
|
|
448
|
+
const hashed = await poseidon2Hash(updatePreimage);
|
|
449
|
+
if (!hashed.equals(hash)) {
|
|
450
|
+
throw new Error(`Update hint hash mismatch: ${hash} != ${hashed}`);
|
|
451
|
+
}
|
|
452
|
+
this.log.trace(`Non empty update hint found for contract ${contractAddress}`);
|
|
453
|
+
} else {
|
|
454
|
+
if (updatePreimage.some((f)=>!f.isZero())) {
|
|
455
|
+
throw new Error(`Update hint hash is zero, but update preimage is not: ${updatePreimage}`);
|
|
456
|
+
}
|
|
457
|
+
this.log.trace(`No update hint found for contract ${contractAddress}`);
|
|
458
|
+
}
|
|
459
|
+
return {
|
|
460
|
+
updateMembership,
|
|
461
|
+
updatePreimage
|
|
462
|
+
};
|
|
463
|
+
}
|
|
464
|
+
traceEnqueuedCall(publicCallRequest, calldata, reverted) {
|
|
465
|
+
this.trace.traceEnqueuedCall(publicCallRequest, calldata, reverted);
|
|
466
|
+
}
|
|
467
|
+
async getPublicFunctionDebugName(avmEnvironment) {
|
|
468
|
+
return await getPublicFunctionDebugName(this.worldStateDB, avmEnvironment.address, avmEnvironment.calldata);
|
|
469
|
+
}
|
|
470
|
+
async getLeafOrLowLeafInfo(treeId, key) {
|
|
471
|
+
// "key" is siloed slot (leafSlot) or siloed nullifier
|
|
472
|
+
const leafOrLowLeafInfo = await this.db.getPreviousValueIndex(treeId, key);
|
|
473
|
+
assert(leafOrLowLeafInfo !== undefined, `${MerkleTreeId[treeId]} low leaf index should always be found (even if target leaf does not exist)`);
|
|
474
|
+
const { index: leafOrLowLeafIndex, alreadyPresent } = leafOrLowLeafInfo;
|
|
475
|
+
const leafPreimage = await this.db.getLeafPreimage(treeId, leafOrLowLeafIndex);
|
|
476
|
+
assert(leafPreimage !== undefined, `${MerkleTreeId[treeId]} low leaf preimage should never be undefined (even if target leaf does not exist)`);
|
|
477
|
+
return {
|
|
478
|
+
preimage: leafPreimage,
|
|
479
|
+
leafOrLowLeafIndex,
|
|
480
|
+
alreadyPresent
|
|
481
|
+
};
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
function contractAddressIsCanonical(contractAddress) {
|
|
485
|
+
return contractAddress.equals(AztecAddress.fromNumber(CANONICAL_AUTH_REGISTRY_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(REGISTERER_CONTRACT_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(MULTI_CALL_ENTRYPOINT_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(FEE_JUICE_ADDRESS)) || contractAddress.equals(AztecAddress.fromNumber(ROUTER_ADDRESS));
|
|
486
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
import type {
|
|
1
|
+
import type { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import type { WorldStateDB } from '../../public_db_sources.js';
|
|
3
3
|
/**
|
|
4
4
|
* A class to manage new nullifier staging and existence checks during a contract call's AVM simulation.
|
|
5
5
|
* Maintains a siloed nullifier cache, and ensures that existence checks fall back to the correct source.
|
|
@@ -14,7 +14,7 @@ export declare class NullifierManager {
|
|
|
14
14
|
private readonly parent?;
|
|
15
15
|
constructor(
|
|
16
16
|
/** Reference to node storage. Checked on parent cache-miss. */
|
|
17
|
-
hostNullifiers:
|
|
17
|
+
hostNullifiers: WorldStateDB,
|
|
18
18
|
/** Cache of siloed nullifiers. */
|
|
19
19
|
cache?: Set<bigint>,
|
|
20
20
|
/** Parent nullifier manager to fall back on */
|
|
@@ -39,10 +39,12 @@ export declare class NullifierManager {
|
|
|
39
39
|
*
|
|
40
40
|
* @param siloedNullifier - the nullifier to check for
|
|
41
41
|
* @returns exists: whether the nullifier exists at all,
|
|
42
|
-
*
|
|
43
|
-
* leafIndex: the nullifier's leaf index if it exists and is not pending (comes from host state).
|
|
42
|
+
* cacheHit: whether the nullifier was found in a cache,
|
|
44
43
|
*/
|
|
45
|
-
checkExists(siloedNullifier: Fr): Promise<
|
|
44
|
+
checkExists(siloedNullifier: Fr): Promise<{
|
|
45
|
+
exists: boolean;
|
|
46
|
+
cacheHit: boolean;
|
|
47
|
+
}>;
|
|
46
48
|
/**
|
|
47
49
|
* Stage a new nullifier (append it to the cache).
|
|
48
50
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nullifiers.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/journal/nullifiers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE/D;;;;GAIG;AACH,qBAAa,gBAAgB;IAEzB,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,kCAAkC;IAClC,OAAO,CAAC,KAAK;IACb,+CAA+C;IAC/C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;;IALxB,+DAA+D;IAC9C,cAAc,EAAE,YAAY;IAC7C,kCAAkC;IAC1B,KAAK,GAAE,GAAG,CAAC,MAAM,CAAa;IACtC,+CAA+C;IAC9B,MAAM,CAAC,8BAAkB;IAG5C;;OAEG;IACI,IAAI;IAIX;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAW/B;;;;;;;;;;OAUG;IACU,WAAW,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,OAAO,CAAA;KAAE,CAAC;IAmB9F;;;;OAIG;IACU,MAAM,CAAC,eAAe,EAAE,EAAE;IAQvC;;;;OAIG;IACI,cAAc,CAAC,kBAAkB,EAAE,gBAAgB;CAU3D;AAED,qBAAa,uBAAwB,SAAQ,KAAK;gBACpC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE;CAI5C"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A class to manage new nullifier staging and existence checks during a contract call's AVM simulation.
|
|
3
|
+
* Maintains a siloed nullifier cache, and ensures that existence checks fall back to the correct source.
|
|
4
|
+
* When a contract call completes, its cached nullifier set can be merged into its parent's.
|
|
5
|
+
*/ export class NullifierManager {
|
|
6
|
+
hostNullifiers;
|
|
7
|
+
cache;
|
|
8
|
+
parent;
|
|
9
|
+
constructor(/** Reference to node storage. Checked on parent cache-miss. */ hostNullifiers, /** Cache of siloed nullifiers. */ cache = new Set(), /** Parent nullifier manager to fall back on */ parent){
|
|
10
|
+
this.hostNullifiers = hostNullifiers;
|
|
11
|
+
this.cache = cache;
|
|
12
|
+
this.parent = parent;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Create a new nullifiers manager forked from this one
|
|
16
|
+
*/ fork() {
|
|
17
|
+
return new NullifierManager(this.hostNullifiers, new Set(), this);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Get a nullifier's existence in this' cache or parent's (recursively).
|
|
21
|
+
* DOES NOT CHECK HOST STORAGE!
|
|
22
|
+
* @param siloedNullifier - the nullifier to check for
|
|
23
|
+
* @returns exists: whether the nullifier exists in cache here or in parent's
|
|
24
|
+
*/ checkExistsHereOrParent(siloedNullifier) {
|
|
25
|
+
// First check this cache
|
|
26
|
+
let existsAsPending = this.cache.has(siloedNullifier.toBigInt());
|
|
27
|
+
// Then try parent's nullifier cache
|
|
28
|
+
if (!existsAsPending && this.parent) {
|
|
29
|
+
// Note: this will recurse to grandparent/etc until a cache-hit is encountered.
|
|
30
|
+
existsAsPending = this.parent.checkExistsHereOrParent(siloedNullifier);
|
|
31
|
+
}
|
|
32
|
+
return existsAsPending;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Get a nullifier's existence status.
|
|
36
|
+
* 1. Check cache.
|
|
37
|
+
* 2. Check parent cache.
|
|
38
|
+
* 3. Fall back to the host state.
|
|
39
|
+
* 4. Not found! Nullifier does not exist.
|
|
40
|
+
*
|
|
41
|
+
* @param siloedNullifier - the nullifier to check for
|
|
42
|
+
* @returns exists: whether the nullifier exists at all,
|
|
43
|
+
* cacheHit: whether the nullifier was found in a cache,
|
|
44
|
+
*/ async checkExists(siloedNullifier) {
|
|
45
|
+
// Check this cache and parent's (recursively)
|
|
46
|
+
const cacheHit = this.checkExistsHereOrParent(siloedNullifier);
|
|
47
|
+
let existsInTree = false;
|
|
48
|
+
if (!cacheHit) {
|
|
49
|
+
// Finally try the host's Aztec state (a trip to the database)
|
|
50
|
+
//const leafOrLowLeafIndex = await this.hostNullifiers.db.getPreviousValueIndex(MerkleTreeId.NULLIFIER_TREE, siloedNullifier.toBigInt());
|
|
51
|
+
//assert(
|
|
52
|
+
// leafOrLowLeafIndex !== undefined,
|
|
53
|
+
// `${MerkleTreeId[MerkleTreeId.NULLIFIER_TREE]} low leaf index should always be found (even if target leaf does not exist)`,
|
|
54
|
+
//);
|
|
55
|
+
//existsInTree = leafOrLowLeafIndex.alreadyPresent;
|
|
56
|
+
const leafIndex = await this.hostNullifiers.getNullifierIndex(siloedNullifier);
|
|
57
|
+
existsInTree = leafIndex !== undefined;
|
|
58
|
+
}
|
|
59
|
+
const exists = cacheHit || existsInTree;
|
|
60
|
+
return Promise.resolve({
|
|
61
|
+
exists,
|
|
62
|
+
cacheHit
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Stage a new nullifier (append it to the cache).
|
|
67
|
+
*
|
|
68
|
+
* @param siloedNullifier - the nullifier to stage
|
|
69
|
+
*/ async append(siloedNullifier) {
|
|
70
|
+
const { exists } = await this.checkExists(siloedNullifier);
|
|
71
|
+
if (exists) {
|
|
72
|
+
throw new NullifierCollisionError(`Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`);
|
|
73
|
+
}
|
|
74
|
+
this.cache.add(siloedNullifier.toBigInt());
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Merges another nullifier cache into this one.
|
|
78
|
+
*
|
|
79
|
+
* @param incomingNullifiers - the incoming cached nullifiers to merge into this instance's
|
|
80
|
+
*/ acceptAndMerge(incomingNullifiers) {
|
|
81
|
+
for (const incomingNullifier of incomingNullifiers.cache){
|
|
82
|
+
if (this.cache.has(incomingNullifier)) {
|
|
83
|
+
throw new NullifierCollisionError(`Failed to merge in fork's cached nullifiers. Siloed nullifier ${incomingNullifier} already exists in parent cache.`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this.cache = new Set([
|
|
87
|
+
...this.cache,
|
|
88
|
+
...incomingNullifiers.cache
|
|
89
|
+
]);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
export class NullifierCollisionError extends Error {
|
|
93
|
+
constructor(message, ...rest){
|
|
94
|
+
super(message, ...rest);
|
|
95
|
+
this.name = 'NullifierCollisionError';
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { type AztecAddress } from '@aztec/circuits.js';
|
|
2
1
|
import { Fr } from '@aztec/foundation/fields';
|
|
3
|
-
import type {
|
|
2
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
|
+
import type { PublicStateDB } from '../../../common/db_interfaces.js';
|
|
4
4
|
type PublicStorageReadResult = {
|
|
5
5
|
value: Fr;
|
|
6
6
|
cached: boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public_storage.d.ts","sourceRoot":"","sources":["../../../../src/public/avm/journal/public_storage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kCAAkC,CAAC;AAEtE,KAAK,uBAAuB,GAAG;IAC7B,KAAK,EAAE,EAAE,CAAC;IACV,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAEF;;;;GAIG;AACH,qBAAa,aAAa;IAKtB,+DAA+D;IAC/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,qDAAqD;IACrD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;IAP1B,6BAA6B;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAqB;;IAGzC,+DAA+D;IAC9C,iBAAiB,EAAE,aAAa;IACjD,qDAAqD;IACpC,MAAM,CAAC,2BAAe;IAKzC;;OAEG;IACI,IAAI;IAIX;;;;;;;OAOG;IACI,gBAAgB,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,SAAS;IAWhF;;;;;;;;;;OAUG;IACU,IAAI,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAmB5F;;;;;;OAMG;IACI,KAAK,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE;IAI/D;;;;OAIG;IACI,cAAc,CAAC,qBAAqB,EAAE,aAAa;CAG3D"}
|