@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
|
@@ -1,38 +1,60 @@
|
|
|
1
|
-
import { MerkleTreeId } from '@aztec/circuit-types';
|
|
2
1
|
import {
|
|
3
|
-
AztecAddress,
|
|
4
2
|
CANONICAL_AUTH_REGISTRY_ADDRESS,
|
|
5
3
|
DEPLOYER_CONTRACT_ADDRESS,
|
|
6
4
|
FEE_JUICE_ADDRESS,
|
|
7
5
|
MULTI_CALL_ENTRYPOINT_ADDRESS,
|
|
8
|
-
NullifierLeafPreimage,
|
|
9
|
-
type PublicCallRequest,
|
|
10
|
-
type PublicDataTreeLeafPreimage,
|
|
11
6
|
REGISTERER_CONTRACT_ADDRESS,
|
|
12
7
|
ROUTER_ADDRESS,
|
|
13
|
-
|
|
14
|
-
} from '@aztec/
|
|
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';
|
|
15
19
|
import {
|
|
16
20
|
computeNoteHashNonce,
|
|
17
21
|
computePublicDataTreeLeafSlot,
|
|
18
22
|
computeUniqueNoteHash,
|
|
19
23
|
siloNoteHash,
|
|
20
24
|
siloNullifier,
|
|
21
|
-
} from '@aztec/
|
|
22
|
-
import {
|
|
23
|
-
import {
|
|
24
|
-
import {
|
|
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';
|
|
25
30
|
|
|
26
31
|
import { strict as assert } from 'assert';
|
|
32
|
+
import cloneDeep from 'lodash.clonedeep';
|
|
27
33
|
|
|
28
|
-
import { getPublicFunctionDebugName } from '
|
|
29
|
-
import {
|
|
30
|
-
import {
|
|
31
|
-
import {
|
|
32
|
-
import { AvmEphemeralForest } from '../avm_tree.js';
|
|
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';
|
|
33
38
|
import { NullifierCollisionError, NullifierManager } from './nullifiers.js';
|
|
34
39
|
import { PublicStorage } from './public_storage.js';
|
|
35
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
|
+
|
|
36
58
|
/**
|
|
37
59
|
* A class to manage persistable AVM state for contract calls.
|
|
38
60
|
* Maintains a cache of the current world state,
|
|
@@ -59,28 +81,30 @@ export class AvmPersistableStateManager {
|
|
|
59
81
|
/** Nullifier set, including cached/recently-emitted nullifiers */
|
|
60
82
|
private readonly nullifiers: NullifierManager = new NullifierManager(worldStateDB),
|
|
61
83
|
private readonly doMerkleOperations: boolean = false,
|
|
62
|
-
/**
|
|
63
|
-
public
|
|
84
|
+
/** DB interface for merkle tree operations */
|
|
85
|
+
public db: MerkleTreeWriteOperations,
|
|
64
86
|
public readonly firstNullifier: Fr,
|
|
65
87
|
) {}
|
|
66
88
|
|
|
67
89
|
/**
|
|
68
90
|
* Create a new state manager
|
|
69
91
|
*/
|
|
70
|
-
public static
|
|
92
|
+
public static create(
|
|
71
93
|
worldStateDB: WorldStateDB,
|
|
72
94
|
trace: PublicSideEffectTraceInterface,
|
|
73
95
|
doMerkleOperations: boolean = false,
|
|
74
96
|
firstNullifier: Fr,
|
|
75
|
-
):
|
|
76
|
-
|
|
97
|
+
): AvmPersistableStateManager {
|
|
98
|
+
// TODO(dbanks12): temporary until we establish a better world state interface
|
|
99
|
+
const db = worldStateDB.getMerkleInterface();
|
|
100
|
+
|
|
77
101
|
return new AvmPersistableStateManager(
|
|
78
102
|
worldStateDB,
|
|
79
103
|
trace,
|
|
80
104
|
/*publicStorage=*/ new PublicStorage(worldStateDB),
|
|
81
105
|
/*nullifiers=*/ new NullifierManager(worldStateDB),
|
|
82
106
|
/*doMerkleOperations=*/ doMerkleOperations,
|
|
83
|
-
|
|
107
|
+
db,
|
|
84
108
|
firstNullifier,
|
|
85
109
|
);
|
|
86
110
|
}
|
|
@@ -88,14 +112,15 @@ export class AvmPersistableStateManager {
|
|
|
88
112
|
/**
|
|
89
113
|
* Create a new state manager forked from this one
|
|
90
114
|
*/
|
|
91
|
-
public fork() {
|
|
115
|
+
public async fork() {
|
|
116
|
+
await this.worldStateDB.createCheckpoint();
|
|
92
117
|
return new AvmPersistableStateManager(
|
|
93
118
|
this.worldStateDB,
|
|
94
119
|
this.trace.fork(),
|
|
95
120
|
this.publicStorage.fork(),
|
|
96
121
|
this.nullifiers.fork(),
|
|
97
122
|
this.doMerkleOperations,
|
|
98
|
-
this.
|
|
123
|
+
this.db,
|
|
99
124
|
this.firstNullifier,
|
|
100
125
|
);
|
|
101
126
|
}
|
|
@@ -103,18 +128,18 @@ export class AvmPersistableStateManager {
|
|
|
103
128
|
/**
|
|
104
129
|
* Accept forked world state modifications & traced side effects / hints
|
|
105
130
|
*/
|
|
106
|
-
public merge(forkedState: AvmPersistableStateManager) {
|
|
107
|
-
this._merge(forkedState, /*reverted=*/ false);
|
|
131
|
+
public async merge(forkedState: AvmPersistableStateManager) {
|
|
132
|
+
await this._merge(forkedState, /*reverted=*/ false);
|
|
108
133
|
}
|
|
109
134
|
|
|
110
135
|
/**
|
|
111
136
|
* Reject forked world state modifications & traced side effects, keep traced hints
|
|
112
137
|
*/
|
|
113
|
-
public reject(forkedState: AvmPersistableStateManager) {
|
|
114
|
-
this._merge(forkedState, /*reverted=*/ true);
|
|
138
|
+
public async reject(forkedState: AvmPersistableStateManager) {
|
|
139
|
+
await this._merge(forkedState, /*reverted=*/ true);
|
|
115
140
|
}
|
|
116
141
|
|
|
117
|
-
private _merge(forkedState: AvmPersistableStateManager, reverted: boolean) {
|
|
142
|
+
private async _merge(forkedState: AvmPersistableStateManager, reverted: boolean) {
|
|
118
143
|
// sanity check to avoid merging the same forked trace twice
|
|
119
144
|
assert(
|
|
120
145
|
!forkedState.alreadyMergedIntoParent,
|
|
@@ -125,14 +150,15 @@ export class AvmPersistableStateManager {
|
|
|
125
150
|
this.nullifiers.acceptAndMerge(forkedState.nullifiers);
|
|
126
151
|
this.trace.merge(forkedState.trace, reverted);
|
|
127
152
|
if (reverted) {
|
|
153
|
+
await this.worldStateDB.revertCheckpoint();
|
|
128
154
|
if (this.doMerkleOperations) {
|
|
129
155
|
this.log.trace(
|
|
130
|
-
`Rolled back nullifier tree to root ${this.
|
|
156
|
+
`Rolled back nullifier tree to root ${new Fr((await this.db.getTreeInfo(MerkleTreeId.NULLIFIER_TREE)).root)}`,
|
|
131
157
|
);
|
|
132
158
|
}
|
|
133
159
|
} else {
|
|
134
160
|
this.log.trace('Merging forked state into parent...');
|
|
135
|
-
this.
|
|
161
|
+
await this.worldStateDB.commitCheckpoint();
|
|
136
162
|
}
|
|
137
163
|
}
|
|
138
164
|
|
|
@@ -144,30 +170,40 @@ export class AvmPersistableStateManager {
|
|
|
144
170
|
* @param value - the value being written to the slot
|
|
145
171
|
*/
|
|
146
172
|
public async writeStorage(contractAddress: AztecAddress, slot: Fr, value: Fr, protocolWrite = false): Promise<void> {
|
|
147
|
-
this.log.trace(`Storage write (address=${contractAddress}, slot=${slot}): value=${value}`);
|
|
148
173
|
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
149
|
-
this.log.trace(`leafSlot=${leafSlot}`);
|
|
150
|
-
// Cache storage writes for later reference/reads
|
|
151
|
-
this.publicStorage.write(contractAddress, slot, value);
|
|
174
|
+
this.log.trace(`Storage write (address=${contractAddress}, slot=${slot}): value=${value}, leafSlot=${leafSlot}`);
|
|
152
175
|
|
|
153
176
|
if (this.doMerkleOperations) {
|
|
154
|
-
|
|
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()]);
|
|
155
180
|
assert(result !== undefined, 'Public data tree insertion error. You might want to disable doMerkleOperations.');
|
|
156
181
|
this.log.trace(`Inserted public data tree leaf at leafSlot ${leafSlot}, value: ${value}`);
|
|
157
182
|
|
|
158
|
-
|
|
159
|
-
const lowLeafPreimage = result.
|
|
160
|
-
const lowLeafIndex =
|
|
161
|
-
const lowLeafPath =
|
|
162
|
-
|
|
163
|
-
const newLeafPreimage =
|
|
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);
|
|
164
189
|
let insertionPath: Fr[] | undefined;
|
|
165
|
-
|
|
166
|
-
|
|
190
|
+
|
|
191
|
+
if (result.insertionWitnessData.length === 0) {
|
|
167
192
|
assert(
|
|
168
193
|
newLeafPreimage.value.equals(value),
|
|
169
|
-
`Value mismatch when performing public data write (got value: ${value}, value in
|
|
194
|
+
`Value mismatch when performing public data write (got value: ${value}, value in tree: ${newLeafPreimage.value})`,
|
|
170
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();
|
|
171
207
|
}
|
|
172
208
|
|
|
173
209
|
await this.trace.tracePublicStorageWrite(
|
|
@@ -182,6 +218,8 @@ export class AvmPersistableStateManager {
|
|
|
182
218
|
insertionPath,
|
|
183
219
|
);
|
|
184
220
|
} else {
|
|
221
|
+
// Cache storage writes for later reference/reads
|
|
222
|
+
this.publicStorage.write(contractAddress, slot, value);
|
|
185
223
|
await this.trace.tracePublicStorageWrite(contractAddress, slot, value, protocolWrite);
|
|
186
224
|
}
|
|
187
225
|
}
|
|
@@ -194,51 +232,64 @@ export class AvmPersistableStateManager {
|
|
|
194
232
|
* @returns the latest value written to slot, or 0 if never written to before
|
|
195
233
|
*/
|
|
196
234
|
public async readStorage(contractAddress: AztecAddress, slot: Fr): Promise<Fr> {
|
|
197
|
-
const { value, cached } = await this.publicStorage.read(contractAddress, slot);
|
|
198
|
-
this.log.trace(`Storage read (address=${contractAddress}, slot=${slot}): value=${value}, cached=${cached}`);
|
|
199
|
-
const leafSlot = await computePublicDataTreeLeafSlot(contractAddress, slot);
|
|
200
|
-
this.log.trace(`leafSlot=${leafSlot}`);
|
|
201
|
-
|
|
202
235
|
if (this.doMerkleOperations) {
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
alreadyPresent,
|
|
209
|
-
} = await this.merkleTrees.getLeafOrLowLeafInfo(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
|
|
210
|
-
// The index and preimage here is either the low leaf or the leaf itself (depending on the value of update flag)
|
|
211
|
-
// 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
|
|
212
|
-
const leafPath = await this.merkleTrees.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, leafIndex);
|
|
213
|
-
const leafPreimage = preimage as PublicDataTreeLeafPreimage;
|
|
214
|
-
|
|
215
|
-
this.log.trace(`leafPreimage.slot: ${leafPreimage.slot}, leafPreimage.value: ${leafPreimage.value}`);
|
|
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);
|
|
216
241
|
this.log.trace(
|
|
217
|
-
`
|
|
242
|
+
`Storage read results (address=${contractAddress}, slot=${slot}): value=${read.value}, cached=${read.cached}`,
|
|
218
243
|
);
|
|
244
|
+
this.trace.tracePublicStorageRead(contractAddress, slot, read.value);
|
|
245
|
+
return read.value;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
219
248
|
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
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
|
+
);
|
|
239
281
|
}
|
|
240
282
|
|
|
241
|
-
|
|
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
|
+
};
|
|
242
293
|
}
|
|
243
294
|
|
|
244
295
|
/**
|
|
@@ -270,10 +321,8 @@ export class AvmPersistableStateManager {
|
|
|
270
321
|
`noteHashes(${contractAddress})@${noteHash} ?? leafIndex: ${leafIndex} | gotLeafValue: ${gotLeafValue}, exists: ${exists}.`,
|
|
271
322
|
);
|
|
272
323
|
if (this.doMerkleOperations) {
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
const path = await this.merkleTrees.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
|
|
276
|
-
this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists, path);
|
|
324
|
+
const path = await this.db.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex.toBigInt());
|
|
325
|
+
this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists, path.toFields());
|
|
277
326
|
} else {
|
|
278
327
|
this.trace.traceNoteHashCheck(contractAddress, gotLeafValue, leafIndex, exists);
|
|
279
328
|
}
|
|
@@ -285,6 +334,7 @@ export class AvmPersistableStateManager {
|
|
|
285
334
|
* @param noteHash - the unsiloed note hash to write
|
|
286
335
|
*/
|
|
287
336
|
public async writeNoteHash(contractAddress: AztecAddress, noteHash: Fr): Promise<void> {
|
|
337
|
+
this.log.trace(`noteHashes(${contractAddress}) += ${noteHash}.`);
|
|
288
338
|
const siloedNoteHash = await siloNoteHash(contractAddress, noteHash);
|
|
289
339
|
|
|
290
340
|
await this.writeSiloedNoteHash(siloedNoteHash);
|
|
@@ -292,29 +342,31 @@ export class AvmPersistableStateManager {
|
|
|
292
342
|
|
|
293
343
|
/**
|
|
294
344
|
* Write a note hash, make it unique, trace the write.
|
|
295
|
-
* @param
|
|
345
|
+
* @param siloedNoteHash - the non unique note hash to write
|
|
296
346
|
*/
|
|
297
|
-
public async writeSiloedNoteHash(
|
|
347
|
+
public async writeSiloedNoteHash(siloedNoteHash: Fr): Promise<void> {
|
|
298
348
|
const nonce = await computeNoteHashNonce(this.firstNullifier, this.trace.getNoteHashCount());
|
|
299
|
-
const uniqueNoteHash = await computeUniqueNoteHash(nonce,
|
|
349
|
+
const uniqueNoteHash = await computeUniqueNoteHash(nonce, siloedNoteHash);
|
|
300
350
|
|
|
301
351
|
await this.writeUniqueNoteHash(uniqueNoteHash);
|
|
302
352
|
}
|
|
303
353
|
|
|
304
354
|
/**
|
|
305
355
|
* Write a note hash, trace the write.
|
|
306
|
-
* @param
|
|
356
|
+
* @param uniqueNoteHash - the siloed unique hash to write
|
|
307
357
|
*/
|
|
308
|
-
public async writeUniqueNoteHash(
|
|
309
|
-
this.log.trace(`noteHashes += @${
|
|
358
|
+
public async writeUniqueNoteHash(uniqueNoteHash: Fr): Promise<void> {
|
|
359
|
+
this.log.trace(`noteHashes += @${uniqueNoteHash}.`);
|
|
310
360
|
|
|
311
361
|
if (this.doMerkleOperations) {
|
|
312
362
|
// Should write a helper for this
|
|
313
|
-
const
|
|
314
|
-
const
|
|
315
|
-
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());
|
|
316
368
|
} else {
|
|
317
|
-
this.trace.traceNewNoteHash(
|
|
369
|
+
this.trace.traceNewNoteHash(uniqueNoteHash);
|
|
318
370
|
}
|
|
319
371
|
}
|
|
320
372
|
|
|
@@ -327,22 +379,24 @@ export class AvmPersistableStateManager {
|
|
|
327
379
|
public async checkNullifierExists(contractAddress: AztecAddress, nullifier: Fr): Promise<boolean> {
|
|
328
380
|
this.log.trace(`Checking existence of nullifier (address=${contractAddress}, nullifier=${nullifier})`);
|
|
329
381
|
const siloedNullifier = await siloNullifier(contractAddress, nullifier);
|
|
330
|
-
const [exists, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath] = await this.getNullifierMembership(
|
|
331
|
-
siloedNullifier,
|
|
332
|
-
);
|
|
333
382
|
|
|
334
383
|
if (this.doMerkleOperations) {
|
|
384
|
+
const { exists, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath } =
|
|
385
|
+
await this.getNullifierMembership(siloedNullifier);
|
|
335
386
|
this.trace.traceNullifierCheck(
|
|
336
387
|
siloedNullifier,
|
|
337
388
|
exists,
|
|
338
389
|
leafOrLowLeafPreimage,
|
|
339
|
-
leafOrLowLeafIndex,
|
|
390
|
+
new Fr(leafOrLowLeafIndex!),
|
|
340
391
|
leafOrLowLeafPath,
|
|
341
392
|
);
|
|
393
|
+
return Promise.resolve(exists);
|
|
342
394
|
} else {
|
|
395
|
+
const { exists, cacheHit } = await this.nullifiers.checkExists(siloedNullifier);
|
|
396
|
+
this.log.trace(`Checked siloed nullifier ${siloedNullifier} (exists=${exists}), cacheHit=${cacheHit}`);
|
|
343
397
|
this.trace.traceNullifierCheck(siloedNullifier, exists);
|
|
398
|
+
return Promise.resolve(exists);
|
|
344
399
|
}
|
|
345
|
-
return Promise.resolve(exists);
|
|
346
400
|
}
|
|
347
401
|
|
|
348
402
|
/**
|
|
@@ -356,49 +410,35 @@ export class AvmPersistableStateManager {
|
|
|
356
410
|
* - leafOrLowLeafIndex - the leaf index of the nullifier leaf or its low-leaf if it doesn't exist
|
|
357
411
|
* - leafOrLowLeafPath - the sibling path of the nullifier leaf or its low-leaf if it doesn't exist
|
|
358
412
|
*/
|
|
359
|
-
private async getNullifierMembership(
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
if (
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
preimage,
|
|
377
|
-
index: leafIndex,
|
|
378
|
-
alreadyPresent,
|
|
379
|
-
} = await this.merkleTrees.getLeafOrLowLeafInfo(MerkleTreeId.NULLIFIER_TREE, siloedNullifier);
|
|
380
|
-
const leafPreimage = preimage as NullifierLeafPreimage;
|
|
381
|
-
const leafPath = await this.merkleTrees.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, leafIndex);
|
|
382
|
-
|
|
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
|
|
383
430
|
assert(
|
|
384
|
-
|
|
385
|
-
|
|
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.',
|
|
386
434
|
);
|
|
387
|
-
|
|
388
|
-
if (exists) {
|
|
389
|
-
this.log.trace(`Siloed nullifier ${siloedNullifier} exists at leafIndex=${leafIndex}`);
|
|
390
|
-
} else {
|
|
391
|
-
// Sanity check that the leaf value is skipped by low leaf when it doesn't exist
|
|
392
|
-
assert(
|
|
393
|
-
leafPreimage.nullifier.toBigInt() < siloedNullifier.toBigInt() &&
|
|
394
|
-
(leafPreimage.nextIndex === 0n || leafPreimage.nextNullifier.toBigInt() > siloedNullifier.toBigInt()),
|
|
395
|
-
'Nullifier tree low leaf should skip the target leaf nullifier when the target leaf does not exist.',
|
|
396
|
-
);
|
|
397
|
-
}
|
|
398
|
-
return [exists, leafPreimage, new Fr(leafIndex), leafPath];
|
|
399
|
-
} else {
|
|
400
|
-
return [exists, NullifierLeafPreimage.empty(), Fr.ZERO, []];
|
|
401
435
|
}
|
|
436
|
+
return {
|
|
437
|
+
exists: alreadyPresent,
|
|
438
|
+
leafOrLowLeafPreimage: leafPreimage,
|
|
439
|
+
leafOrLowLeafIndex,
|
|
440
|
+
leafOrLowLeafPath: leafPath.toFields(),
|
|
441
|
+
};
|
|
402
442
|
}
|
|
403
443
|
|
|
404
444
|
/**
|
|
@@ -420,48 +460,37 @@ export class AvmPersistableStateManager {
|
|
|
420
460
|
this.log.trace(`Inserting siloed nullifier=${siloedNullifier}`);
|
|
421
461
|
|
|
422
462
|
if (this.doMerkleOperations) {
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
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
|
+
|
|
430
470
|
if (alreadyPresent) {
|
|
431
|
-
this.log.verbose(`Siloed nullifier ${siloedNullifier} already present in tree at index ${
|
|
471
|
+
this.log.verbose(`Siloed nullifier ${siloedNullifier} already present in tree at index ${leafOrLowLeafIndex}!`);
|
|
432
472
|
// If the nullifier is already present, we should not insert it again
|
|
433
473
|
// instead we provide the direct membership path
|
|
434
|
-
const
|
|
474
|
+
const membershipPath = await this.db.getSiblingPath(treeId, leafOrLowLeafIndex);
|
|
435
475
|
// This just becomes a nullifier read hint
|
|
436
476
|
this.trace.traceNullifierCheck(
|
|
437
477
|
siloedNullifier,
|
|
438
478
|
/*exists=*/ alreadyPresent,
|
|
439
|
-
|
|
440
|
-
new Fr(
|
|
441
|
-
|
|
479
|
+
leafPreimage,
|
|
480
|
+
new Fr(leafOrLowLeafIndex),
|
|
481
|
+
membershipPath.toFields(),
|
|
442
482
|
);
|
|
443
483
|
throw new NullifierCollisionError(
|
|
444
484
|
`Siloed nullifier ${siloedNullifier} already exists in parent cache or host.`,
|
|
445
485
|
);
|
|
446
486
|
} else {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
);
|
|
455
|
-
const appendResult = await this.merkleTrees.appendNullifier(siloedNullifier);
|
|
456
|
-
this.log.trace(
|
|
457
|
-
`Nullifier tree root after insertion ${await this.merkleTrees.treeMap
|
|
458
|
-
.get(MerkleTreeId.NULLIFIER_TREE)!
|
|
459
|
-
.getRoot()}`,
|
|
460
|
-
);
|
|
461
|
-
const lowLeafPreimage = appendResult.lowWitness.preimage as NullifierLeafPreimage;
|
|
462
|
-
const lowLeafIndex = appendResult.lowWitness.index;
|
|
463
|
-
const lowLeafPath = appendResult.lowWitness.siblingPath;
|
|
464
|
-
const insertionPath = appendResult.insertionPath;
|
|
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
|
+
|
|
465
494
|
this.trace.traceNewNullifier(
|
|
466
495
|
siloedNullifier,
|
|
467
496
|
lowLeafPreimage,
|
|
@@ -501,13 +530,7 @@ export class AvmPersistableStateManager {
|
|
|
501
530
|
);
|
|
502
531
|
|
|
503
532
|
if (this.doMerkleOperations) {
|
|
504
|
-
|
|
505
|
-
// such that the VM can constrain the equality and decide on exists based on that.
|
|
506
|
-
// We should defintely add a helper here
|
|
507
|
-
const path = await this.merkleTrees.treeDb.getSiblingPath(
|
|
508
|
-
MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
|
|
509
|
-
msgLeafIndex.toBigInt(),
|
|
510
|
-
);
|
|
533
|
+
const path = await this.db.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, msgLeafIndex.toBigInt());
|
|
511
534
|
this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists, path.toFields());
|
|
512
535
|
} else {
|
|
513
536
|
this.trace.traceL1ToL2MessageCheck(contractAddress, valueAtIndex, msgLeafIndex, exists);
|
|
@@ -546,154 +569,135 @@ export class AvmPersistableStateManager {
|
|
|
546
569
|
const instanceWithAddress = await this.worldStateDB.getContractInstance(contractAddress);
|
|
547
570
|
const exists = instanceWithAddress !== undefined;
|
|
548
571
|
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
);
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
)
|
|
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);
|
|
567
603
|
}
|
|
568
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.
|
|
569
621
|
if (exists) {
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
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!`,
|
|
573
628
|
);
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
instance,
|
|
579
|
-
leafOrLowLeafPreimage,
|
|
580
|
-
leafOrLowLeafIndex,
|
|
581
|
-
leafOrLowLeafPath,
|
|
582
|
-
);
|
|
583
|
-
} else {
|
|
584
|
-
this.trace.traceGetContractInstance(contractAddress, exists, instance);
|
|
585
|
-
}
|
|
586
|
-
|
|
587
|
-
return Promise.resolve(instance);
|
|
629
|
+
extendedClass = {
|
|
630
|
+
...klass,
|
|
631
|
+
publicBytecodeCommitment: bytecodeCommitment,
|
|
632
|
+
};
|
|
588
633
|
} else {
|
|
589
|
-
this.log.debug(`Contract instance NOT FOUND (
|
|
590
|
-
if (this.doMerkleOperations) {
|
|
591
|
-
this.trace.traceGetContractInstance(
|
|
592
|
-
contractAddress,
|
|
593
|
-
exists,
|
|
594
|
-
/*instance=*/ undefined,
|
|
595
|
-
leafOrLowLeafPreimage,
|
|
596
|
-
leafOrLowLeafIndex,
|
|
597
|
-
leafOrLowLeafPath,
|
|
598
|
-
);
|
|
599
|
-
} else {
|
|
600
|
-
this.trace.traceGetContractInstance(contractAddress, exists);
|
|
601
|
-
}
|
|
602
|
-
return Promise.resolve(undefined);
|
|
634
|
+
this.log.debug(`Contract instance NOT FOUND (id=${classId})`);
|
|
603
635
|
}
|
|
636
|
+
|
|
637
|
+
this.trace.traceGetContractClass(classId, exists, extendedClass);
|
|
638
|
+
return extendedClass;
|
|
604
639
|
}
|
|
605
640
|
|
|
606
641
|
/**
|
|
607
|
-
* Get a contract's bytecode from the contracts DB, also trace the contract class and instance
|
|
642
|
+
* Get a contract's bytecode from the contracts DB, also trace the contract class and instance indirectly.
|
|
608
643
|
*/
|
|
609
644
|
public async getBytecode(contractAddress: AztecAddress): Promise<Buffer | undefined> {
|
|
610
645
|
this.log.debug(`Getting bytecode for contract address ${contractAddress}`);
|
|
611
|
-
const
|
|
612
|
-
const exists = instanceWithAddress !== undefined;
|
|
646
|
+
const contractInstance = await this.getContractInstance(contractAddress);
|
|
613
647
|
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
NullifierLeafPreimage.empty(),
|
|
617
|
-
Fr.ZERO,
|
|
618
|
-
new Array<Fr>(),
|
|
619
|
-
];
|
|
620
|
-
if (!contractAddressIsCanonical(contractAddress)) {
|
|
621
|
-
const contractAddressNullifier = await siloNullifier(
|
|
622
|
-
AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS),
|
|
623
|
-
contractAddress.toField(),
|
|
624
|
-
);
|
|
625
|
-
[existsInTree, leafOrLowLeafPreimage, leafOrLowLeafIndex, leafOrLowLeafPath] = await this.getNullifierMembership(
|
|
626
|
-
/*siloedNullifier=*/ contractAddressNullifier,
|
|
627
|
-
);
|
|
628
|
-
assert(
|
|
629
|
-
exists == existsInTree,
|
|
630
|
-
'WorldStateDB contains contract instance, but nullifier tree does not contain contract address (or vice versa).... This is a bug!',
|
|
631
|
-
);
|
|
648
|
+
if (!contractInstance) {
|
|
649
|
+
return undefined;
|
|
632
650
|
}
|
|
633
651
|
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
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
|
+
);
|
|
638
657
|
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
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
|
+
}
|
|
643
663
|
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
664
|
+
async getContractUpdateHints(contractAddress: AztecAddress) {
|
|
665
|
+
const { sharedMutableSlot, sharedMutableHashSlot } = await SharedMutableValuesWithHash.getContractUpdateSlots(
|
|
666
|
+
contractAddress,
|
|
667
|
+
);
|
|
648
668
|
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
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);
|
|
654
676
|
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
contractClass.packedBytecode,
|
|
660
|
-
instance,
|
|
661
|
-
contractClassPreimage,
|
|
662
|
-
leafOrLowLeafPreimage,
|
|
663
|
-
leafOrLowLeafIndex,
|
|
664
|
-
leafOrLowLeafPath,
|
|
665
|
-
);
|
|
666
|
-
} else {
|
|
667
|
-
this.trace.traceGetBytecode(
|
|
668
|
-
contractAddress,
|
|
669
|
-
exists,
|
|
670
|
-
contractClass.packedBytecode,
|
|
671
|
-
instance,
|
|
672
|
-
contractClassPreimage,
|
|
673
|
-
);
|
|
674
|
-
}
|
|
677
|
+
const readStorage = async (storageSlot: Fr) =>
|
|
678
|
+
(await this.publicStorage.read(ProtocolContractAddress.ContractInstanceDeployer, storageSlot)).value;
|
|
679
|
+
|
|
680
|
+
const sharedMutableValues = await SharedMutableValues.readFromTree(sharedMutableSlot, readStorage);
|
|
675
681
|
|
|
676
|
-
|
|
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}`);
|
|
677
690
|
} else {
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
// This will hint to the avm circuit to just perform the non-membership check on the address and disregard the bytecode hash
|
|
681
|
-
if (this.doMerkleOperations) {
|
|
682
|
-
this.trace.traceGetBytecode(
|
|
683
|
-
contractAddress,
|
|
684
|
-
exists,
|
|
685
|
-
/*instance=*/ undefined,
|
|
686
|
-
/*contractClass=*/ undefined,
|
|
687
|
-
/*bytecode=*/ undefined,
|
|
688
|
-
leafOrLowLeafPreimage,
|
|
689
|
-
leafOrLowLeafIndex,
|
|
690
|
-
leafOrLowLeafPath,
|
|
691
|
-
);
|
|
692
|
-
} else {
|
|
693
|
-
this.trace.traceGetBytecode(contractAddress, exists); // bytecode, instance, class undefined
|
|
691
|
+
if (updatePreimage.some(f => !f.isZero())) {
|
|
692
|
+
throw new Error(`Update hint hash is zero, but update preimage is not: ${updatePreimage}`);
|
|
694
693
|
}
|
|
695
|
-
|
|
694
|
+
this.log.trace(`No update hint found for contract ${contractAddress}`);
|
|
696
695
|
}
|
|
696
|
+
|
|
697
|
+
return {
|
|
698
|
+
updateMembership,
|
|
699
|
+
updatePreimage,
|
|
700
|
+
};
|
|
697
701
|
}
|
|
698
702
|
|
|
699
703
|
public traceEnqueuedCall(publicCallRequest: PublicCallRequest, calldata: Fr[], reverted: boolean) {
|
|
@@ -703,6 +707,27 @@ export class AvmPersistableStateManager {
|
|
|
703
707
|
public async getPublicFunctionDebugName(avmEnvironment: AvmExecutionEnvironment): Promise<string> {
|
|
704
708
|
return await getPublicFunctionDebugName(this.worldStateDB, avmEnvironment.address, avmEnvironment.calldata);
|
|
705
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
|
+
}
|
|
706
731
|
}
|
|
707
732
|
|
|
708
733
|
function contractAddressIsCanonical(contractAddress: AztecAddress): boolean {
|