@aztec/pxe 0.0.1-commit.42ee6df9b → 0.0.1-commit.431c48d
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/dest/bin/check_oracle_version.js +41 -112
- package/dest/bin/index.d.ts +2 -0
- package/dest/bin/index.d.ts.map +1 -0
- package/dest/bin/index.js +1 -0
- package/dest/bin/oracle_version_helpers.d.ts +34 -0
- package/dest/bin/oracle_version_helpers.d.ts.map +1 -0
- package/dest/bin/oracle_version_helpers.js +46 -0
- package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
- package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
- package/dest/block_synchronizer/block_stream_source.js +37 -0
- package/dest/block_synchronizer/block_synchronizer.d.ts +22 -16
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +65 -28
- package/dest/config/index.d.ts +22 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +18 -14
- package/dest/config/package_info.js +1 -1
- package/dest/contract/contract_call_graph.d.ts +52 -0
- package/dest/contract/contract_call_graph.d.ts.map +1 -0
- package/dest/contract/contract_call_graph.js +91 -0
- package/dest/contract/contract_class_service.d.ts +24 -0
- package/dest/contract/contract_class_service.d.ts.map +1 -0
- package/dest/contract/contract_class_service.js +36 -0
- package/dest/contract/contract_sync_service.d.ts +83 -0
- package/dest/contract/contract_sync_service.d.ts.map +1 -0
- package/dest/contract/contract_sync_service.js +213 -0
- package/dest/contract/helpers.d.ts +7 -0
- package/dest/contract/helpers.d.ts.map +1 -0
- package/dest/contract/helpers.js +20 -0
- package/dest/contract/skip_sync_contracts.d.ts +11 -0
- package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
- package/dest/contract/skip_sync_contracts.js +18 -0
- package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
- package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +25 -25
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +90 -65
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
- package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
- package/dest/contract_function_simulator/execution_note_cache.d.ts +4 -10
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +10 -29
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -9
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -7
- package/dest/contract_function_simulator/index.d.ts +26 -6
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +11 -4
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +29 -0
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/bounded_vec.js +30 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
- package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts +37 -0
- package/dest/contract_function_simulator/noir-structs/ephemeral_array.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/ephemeral_array.js +59 -0
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +5 -4
- package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
- package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +19 -10
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +12 -24
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +11 -9
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -61
- package/dest/contract_function_simulator/noir-structs/note_data.d.ts +27 -0
- package/dest/contract_function_simulator/noir-structs/note_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/note_data.js +3 -0
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -3
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +6 -5
- package/dest/contract_function_simulator/noir-structs/option.d.ts +59 -0
- package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/option.js +67 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +8 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +19 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.js +9 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
- package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
- package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/index.js +1 -1
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -103
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/interfaces.js +2 -2
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +2 -2
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +2 -2
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +139 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.js +1016 -0
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +274 -0
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1243 -0
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +47 -36
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +200 -65
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +152 -66
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +590 -173
- package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
- package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
- package/dest/contract_function_simulator/pick_notes.js +20 -3
- package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
- package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/transient_array_service.js +62 -0
- package/dest/debug/pxe_debug_utils.d.ts +2 -7
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +9 -7
- package/dest/entrypoints/client/bundle/index.d.ts +2 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +1 -0
- package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +21 -8
- package/dest/entrypoints/client/lazy/index.d.ts +2 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +1 -0
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +21 -8
- package/dest/entrypoints/client/store.d.ts +14 -0
- package/dest/entrypoints/client/store.d.ts.map +1 -0
- package/dest/entrypoints/client/store.js +42 -0
- package/dest/entrypoints/pxe_creation_options.d.ts +16 -2
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/pxe_creation_options.js +3 -1
- package/dest/entrypoints/server/index.d.ts +7 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +5 -2
- package/dest/entrypoints/server/store.d.ts +18 -0
- package/dest/entrypoints/server/store.d.ts.map +1 -0
- package/dest/entrypoints/server/store.js +28 -0
- package/dest/entrypoints/server/utils.d.ts +4 -3
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +22 -8
- package/dest/error_enriching.d.ts +5 -3
- package/dest/error_enriching.d.ts.map +1 -1
- package/dest/error_enriching.js +15 -12
- package/dest/events/event_service.d.ts +19 -4
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +37 -15
- package/dest/events/private_event_filter_validator.d.ts +3 -2
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +15 -0
- package/dest/hooks/authorize_utility_call.d.ts +41 -0
- package/dest/hooks/authorize_utility_call.d.ts.map +1 -0
- package/dest/hooks/authorize_utility_call.js +4 -0
- package/dest/hooks/execution_hooks.d.ts +62 -0
- package/dest/hooks/execution_hooks.d.ts.map +1 -0
- package/dest/hooks/execution_hooks.js +9 -0
- package/dest/hooks/index.d.ts +5 -0
- package/dest/hooks/index.d.ts.map +1 -0
- package/dest/hooks/index.js +2 -0
- package/dest/hooks/resolve_custom_request.d.ts +23 -0
- package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
- package/dest/hooks/resolve_custom_request.js +3 -0
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
- package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
- package/dest/job_coordinator/job_coordinator.d.ts +10 -1
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
- package/dest/job_coordinator/job_coordinator.js +19 -0
- package/dest/logs/log_service.d.ts +21 -10
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +173 -76
- package/dest/messages/tx_resolver_service.d.ts +28 -0
- package/dest/messages/tx_resolver_service.d.ts.map +1 -0
- package/dest/messages/tx_resolver_service.js +62 -0
- package/dest/node/benchmarked_node.d.ts +20 -0
- package/dest/node/benchmarked_node.d.ts.map +1 -0
- package/dest/node/benchmarked_node.js +94 -0
- package/dest/node/caching_aztec_node.d.ts +24 -0
- package/dest/node/caching_aztec_node.d.ts.map +1 -0
- package/dest/node/caching_aztec_node.js +268 -0
- package/dest/notes/note_service.d.ts +32 -4
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +82 -66
- package/dest/oracle_version.d.ts +4 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +20 -10
- package/dest/private_kernel/batch_planner.d.ts +47 -0
- package/dest/private_kernel/batch_planner.d.ts.map +1 -0
- package/dest/private_kernel/batch_planner.js +104 -0
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +10 -5
- package/dest/private_kernel/hints/test_utils.d.ts +1 -1
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -1
- package/dest/private_kernel/hints/test_utils.js +3 -4
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +160 -85
- package/dest/private_kernel/private_kernel_oracle.d.ts +12 -10
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +40 -26
- package/dest/pxe.d.ts +164 -51
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +388 -215
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +2 -1
- package/dest/storage/allowed_scopes.d.ts +6 -0
- package/dest/storage/allowed_scopes.d.ts.map +1 -0
- package/dest/storage/allowed_scopes.js +7 -0
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +9 -7
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts +42 -0
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/kv_store_snapshot.js +93 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +15 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/schema_tests.js +671 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.d.ts +19 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.d.ts.map +1 -0
- package/dest/storage/backwards_compatibility_tests/store_spy.js +63 -0
- package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_service.js +6 -9
- package/dest/storage/capsule_store/capsule_store.d.ts +1 -1
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +9 -6
- package/dest/storage/contract_store/contract_store.d.ts +27 -24
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +72 -99
- package/dest/storage/contract_store/private_functions_tree.d.ts +1 -1
- package/dest/storage/contract_store/private_functions_tree.d.ts.map +1 -1
- package/dest/storage/contract_store/private_functions_tree.js +2 -1
- package/dest/storage/fact_store/fact_service.d.ts +22 -0
- package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_service.js +45 -0
- package/dest/storage/fact_store/fact_store.d.ts +95 -0
- package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_store.js +411 -0
- package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
- package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_store_keys.js +50 -0
- package/dest/storage/fact_store/index.d.ts +6 -0
- package/dest/storage/fact_store/index.d.ts.map +1 -0
- package/dest/storage/fact_store/index.js +4 -0
- package/dest/storage/fact_store/origin_state.d.ts +59 -0
- package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
- package/dest/storage/fact_store/origin_state.js +60 -0
- package/dest/storage/fact_store/stored_fact.d.ts +32 -0
- package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
- package/dest/storage/fact_store/stored_fact.js +64 -0
- package/dest/storage/index.d.ts +3 -2
- package/dest/storage/index.d.ts.map +1 -1
- package/dest/storage/index.js +2 -1
- package/dest/storage/metadata.d.ts +2 -2
- package/dest/storage/metadata.d.ts.map +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +42 -33
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +200 -170
- package/dest/storage/note_store/stored_note.d.ts +3 -8
- package/dest/storage/note_store/stored_note.d.ts.map +1 -1
- package/dest/storage/note_store/stored_note.js +4 -20
- package/dest/storage/open_pxe_stores.d.ts +35 -0
- package/dest/storage/open_pxe_stores.d.ts.map +1 -0
- package/dest/storage/open_pxe_stores.js +29 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +48 -45
- package/dest/storage/private_event_store/stored_private_event.js +1 -1
- package/dest/storage/store_identity.d.ts +35 -0
- package/dest/storage/store_identity.d.ts.map +1 -0
- package/dest/storage/store_identity.js +44 -0
- package/dest/storage/tagging_store/index.d.ts +2 -2
- package/dest/storage/tagging_store/index.d.ts.map +1 -1
- package/dest/storage/tagging_store/index.js +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +44 -13
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +91 -36
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
- package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
- package/dest/tagging/constants.d.ts +11 -2
- package/dest/tagging/constants.d.ts.map +1 -1
- package/dest/tagging/constants.js +38 -10
- package/dest/tagging/get_all_logs_by_tags.d.ts +55 -10
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +55 -36
- package/dest/tagging/index.d.ts +7 -6
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +6 -5
- package/dest/tagging/persist_sender_tagging_index_ranges.d.ts +29 -0
- package/dest/tagging/persist_sender_tagging_index_ranges.d.ts.map +1 -0
- package/dest/tagging/persist_sender_tagging_index_ranges.js +42 -0
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +74 -0
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -0
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +235 -0
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts +3 -3
- package/dest/tagging/recipient_sync/utils/find_highest_indexes.d.ts.map +1 -1
- package/dest/tagging/reconcile_tagging_index_ranges.d.ts +36 -0
- package/dest/tagging/reconcile_tagging_index_ranges.d.ts.map +1 -0
- package/dest/tagging/reconcile_tagging_index_ranges.js +74 -0
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +8 -6
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +24 -27
- package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts +22 -0
- package/dest/tagging/sender_sync/utils/classify_pending_txs.d.ts.map +1 -0
- package/dest/tagging/sender_sync/utils/classify_pending_txs.js +62 -0
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +17 -7
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +39 -37
- package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts +29 -0
- package/dest/tagging/sender_sync/utils/resolve_pending_txs.d.ts.map +1 -0
- package/dest/tagging/sender_sync/utils/resolve_pending_txs.js +42 -0
- package/dest/tagging/sender_sync/utils/test_utils.d.ts +16 -0
- package/dest/tagging/sender_sync/utils/test_utils.d.ts.map +1 -0
- package/dest/tagging/sender_sync/utils/test_utils.js +24 -0
- package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
- package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
- package/dest/tagging/testing/tag_query_test_utils.js +10 -0
- package/package.json +20 -17
- package/src/bin/check_oracle_version.ts +46 -135
- package/src/bin/index.ts +1 -0
- package/src/bin/oracle_version_helpers.ts +54 -0
- package/src/block_synchronizer/block_stream_source.ts +42 -0
- package/src/block_synchronizer/block_synchronizer.ts +80 -40
- package/src/config/index.ts +40 -9
- package/src/config/package_info.ts +1 -1
- package/src/contract/contract_call_graph.ts +113 -0
- package/src/contract/contract_class_service.ts +45 -0
- package/src/contract/contract_sync_service.ts +342 -0
- package/src/contract/helpers.ts +35 -0
- package/src/contract/skip_sync_contracts.ts +23 -0
- package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +142 -78
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- package/src/contract_function_simulator/execution_note_cache.ts +10 -30
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -9
- package/src/contract_function_simulator/index.ts +89 -5
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +43 -0
- package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
- package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
- package/src/contract_function_simulator/noir-structs/ephemeral_array.ts +66 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -4
- package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
- package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +27 -20
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +14 -61
- package/src/contract_function_simulator/noir-structs/note_data.ts +27 -0
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +6 -5
- package/src/contract_function_simulator/noir-structs/option.ts +75 -0
- package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
- package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
- package/src/contract_function_simulator/noir-structs/provided_secret.ts +5 -0
- package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
- package/src/contract_function_simulator/noir-structs/resolved_tx.ts +19 -0
- package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -0
- package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
- package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
- package/src/contract_function_simulator/oracle/index.ts +1 -15
- package/src/contract_function_simulator/oracle/interfaces.ts +11 -185
- package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
- package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
- package/src/contract_function_simulator/oracle/oracle_registry.ts +710 -0
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +1052 -0
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +249 -92
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +846 -325
- package/src/contract_function_simulator/pick_notes.ts +22 -3
- package/src/contract_function_simulator/transient_array_service.ts +91 -0
- package/src/debug/pxe_debug_utils.ts +8 -15
- package/src/entrypoints/client/bundle/index.ts +1 -0
- package/src/entrypoints/client/bundle/utils.ts +26 -8
- package/src/entrypoints/client/lazy/index.ts +1 -0
- package/src/entrypoints/client/lazy/utils.ts +26 -8
- package/src/entrypoints/client/store.ts +54 -0
- package/src/entrypoints/pxe_creation_options.ts +21 -1
- package/src/entrypoints/server/index.ts +7 -2
- package/src/entrypoints/server/store.ts +47 -0
- package/src/entrypoints/server/utils.ts +39 -14
- package/src/error_enriching.ts +30 -13
- package/src/events/event_service.ts +70 -24
- package/src/events/private_event_filter_validator.ts +21 -1
- package/src/hooks/authorize_utility_call.ts +44 -0
- package/src/hooks/execution_hooks.ts +68 -0
- package/src/hooks/index.ts +13 -0
- package/src/hooks/resolve_custom_request.ts +24 -0
- package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
- package/src/job_coordinator/job_coordinator.ts +30 -0
- package/src/logs/log_service.ts +212 -146
- package/src/messages/tx_resolver_service.ts +81 -0
- package/src/node/benchmarked_node.ts +140 -0
- package/src/node/caching_aztec_node.ts +407 -0
- package/src/notes/note_service.ts +123 -92
- package/src/oracle_version.ts +20 -10
- package/src/private_kernel/batch_planner.ts +169 -0
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +15 -4
- package/src/private_kernel/hints/test_utils.ts +3 -10
- package/src/private_kernel/private_kernel_execution_prover.ts +246 -117
- package/src/private_kernel/private_kernel_oracle.ts +58 -29
- package/src/pxe.ts +576 -256
- package/src/storage/address_store/address_store.ts +2 -1
- package/src/storage/allowed_scopes.ts +14 -0
- package/src/storage/anchor_block_store/anchor_block_store.ts +9 -7
- package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +22 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/AnchorBlockStore.json +3 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/CapsuleStore.json +16 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +28 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +52 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +40 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +56 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +26 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +30 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +117 -0
- package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +803 -0
- package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
- package/src/storage/capsule_store/capsule_service.ts +8 -13
- package/src/storage/capsule_store/capsule_store.ts +16 -6
- package/src/storage/contract_store/contract_store.ts +98 -125
- package/src/storage/contract_store/private_functions_tree.ts +2 -1
- package/src/storage/fact_store/fact_service.ts +69 -0
- package/src/storage/fact_store/fact_store.ts +488 -0
- package/src/storage/fact_store/fact_store_keys.ts +75 -0
- package/src/storage/fact_store/index.ts +15 -0
- package/src/storage/fact_store/origin_state.ts +84 -0
- package/src/storage/fact_store/stored_fact.ts +80 -0
- package/src/storage/index.ts +2 -1
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +231 -189
- package/src/storage/note_store/stored_note.ts +5 -27
- package/src/storage/open_pxe_stores.ts +52 -0
- package/src/storage/private_event_store/private_event_store.ts +55 -56
- package/src/storage/private_event_store/stored_private_event.ts +1 -1
- package/src/storage/store_identity.ts +72 -0
- package/src/storage/tagging_store/index.ts +1 -1
- package/src/storage/tagging_store/recipient_tagging_store.ts +5 -9
- package/src/storage/tagging_store/sender_tagging_store.ts +123 -50
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
- package/src/tagging/constants.ts +42 -10
- package/src/tagging/get_all_logs_by_tags.ts +115 -50
- package/src/tagging/index.ts +11 -5
- package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +356 -0
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
- package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +30 -38
- package/src/tagging/sender_sync/utils/classify_pending_txs.ts +92 -0
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +50 -44
- package/src/tagging/sender_sync/utils/resolve_pending_txs.ts +65 -0
- package/src/tagging/sender_sync/utils/test_utils.ts +46 -0
- package/src/tagging/testing/tag_query_test_utils.ts +11 -0
- package/dest/contract_function_simulator/benchmarked_node.d.ts +0 -9
- package/dest/contract_function_simulator/benchmarked_node.d.ts.map +0 -1
- package/dest/contract_function_simulator/benchmarked_node.js +0 -77
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +0 -9
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +0 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +0 -38
- package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -80
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
- package/dest/contract_function_simulator/oracle/oracle.js +0 -458
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -80
- package/dest/contract_sync/contract_sync_service.d.ts +0 -44
- package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
- package/dest/contract_sync/contract_sync_service.js +0 -104
- package/dest/contract_sync/helpers.d.ts +0 -28
- package/dest/contract_sync/helpers.d.ts.map +0 -1
- package/dest/contract_sync/helpers.js +0 -60
- package/dest/messages/message_context_service.d.ts +0 -17
- package/dest/messages/message_context_service.d.ts.map +0 -1
- package/dest/messages/message_context_service.js +0 -36
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -14
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +0 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +0 -99
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +0 -14
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +0 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +0 -33
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +0 -12
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +0 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +0 -39
- package/src/contract_function_simulator/benchmarked_node.ts +0 -103
- package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +0 -98
- package/src/contract_function_simulator/oracle/oracle.ts +0 -721
- package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -83
- package/src/contract_sync/contract_sync_service.ts +0 -170
- package/src/contract_sync/helpers.ts +0 -98
- package/src/messages/message_context_service.ts +0 -44
- package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -140
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -44
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +0 -51
package/src/pxe.ts
CHANGED
|
@@ -1,37 +1,44 @@
|
|
|
1
1
|
import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
|
+
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
4
5
|
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
6
|
+
import { allToCompletion } from '@aztec/foundation/promise';
|
|
5
7
|
import { SerialQueue } from '@aztec/foundation/queue';
|
|
6
8
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
9
|
import { KeyStore } from '@aztec/key-store';
|
|
10
|
+
import type { AccountPrivacyKeys, AccountPrivacySecretKeys } from '@aztec/key-store';
|
|
8
11
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
9
|
-
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
10
12
|
import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
|
|
11
13
|
import type { CircuitSimulator } from '@aztec/simulator/client';
|
|
12
14
|
import {
|
|
13
15
|
type ContractArtifact,
|
|
14
16
|
EventSelector,
|
|
15
17
|
FunctionCall,
|
|
18
|
+
type FunctionSelector,
|
|
16
19
|
FunctionType,
|
|
17
20
|
decodeFunctionSignature,
|
|
18
21
|
} from '@aztec/stdlib/abi';
|
|
19
22
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
20
23
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
24
|
+
import { GENESIS_BLOCK_HEADER_HASH, type L2TipsProvider } from '@aztec/stdlib/block';
|
|
21
25
|
import {
|
|
22
26
|
CompleteAddress,
|
|
27
|
+
type ContractInstancePreimage,
|
|
28
|
+
type ContractInstancePreimageWithAddress,
|
|
23
29
|
type ContractInstanceWithAddress,
|
|
24
30
|
type PartialAddress,
|
|
25
31
|
computeContractAddressFromInstance,
|
|
26
|
-
getContractClassFromArtifact,
|
|
27
32
|
} from '@aztec/stdlib/contract';
|
|
28
33
|
import { SimulationError } from '@aztec/stdlib/errors';
|
|
29
|
-
import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
|
|
34
|
+
import type { AztecNode, AztecNodeDebug, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
|
|
30
35
|
import type {
|
|
31
36
|
PrivateExecutionStep,
|
|
32
37
|
PrivateKernelExecutionProofOutput,
|
|
33
38
|
PrivateKernelTailCircuitPublicInputs,
|
|
34
39
|
} from '@aztec/stdlib/kernel';
|
|
40
|
+
import { computeAddressSecret } from '@aztec/stdlib/keys';
|
|
41
|
+
import { deriveEcdhSharedSecretPoint, protectFromForgery } from '@aztec/stdlib/logs';
|
|
35
42
|
import {
|
|
36
43
|
BlockHeader,
|
|
37
44
|
type ContractOverrides,
|
|
@@ -54,20 +61,20 @@ import { inspect } from 'util';
|
|
|
54
61
|
|
|
55
62
|
import { BlockSynchronizer } from './block_synchronizer/index.js';
|
|
56
63
|
import type { PXEConfig } from './config/index.js';
|
|
57
|
-
import {
|
|
64
|
+
import { ContractClassService } from './contract/contract_class_service.js';
|
|
65
|
+
import { ContractSyncService } from './contract/contract_sync_service.js';
|
|
58
66
|
import {
|
|
59
67
|
ContractFunctionSimulator,
|
|
60
68
|
generateSimulatedProvingResult,
|
|
61
69
|
} from './contract_function_simulator/contract_function_simulator.js';
|
|
62
|
-
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
63
70
|
import { displayDebugLogs } from './contract_logging.js';
|
|
64
|
-
import { ContractSyncService } from './contract_sync/contract_sync_service.js';
|
|
65
|
-
import { readCurrentClassId } from './contract_sync/helpers.js';
|
|
66
71
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
67
72
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
68
73
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
74
|
+
import type { ExecutionHooks } from './hooks/index.js';
|
|
69
75
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
70
|
-
import {
|
|
76
|
+
import { TxResolverService } from './messages/tx_resolver_service.js';
|
|
77
|
+
import { type CachingAztecNode, withCache } from './node/caching_aztec_node.js';
|
|
71
78
|
import {
|
|
72
79
|
PrivateKernelExecutionProver,
|
|
73
80
|
type PrivateKernelExecutionProverConfig,
|
|
@@ -77,17 +84,31 @@ import { AddressStore } from './storage/address_store/address_store.js';
|
|
|
77
84
|
import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
|
|
78
85
|
import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
|
|
79
86
|
import { ContractStore } from './storage/contract_store/contract_store.js';
|
|
87
|
+
import { FactStore } from './storage/fact_store/index.js';
|
|
80
88
|
import { NoteStore } from './storage/note_store/note_store.js';
|
|
89
|
+
import { openPxeStores } from './storage/open_pxe_stores.js';
|
|
81
90
|
import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
|
|
82
91
|
import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
|
|
83
|
-
import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
|
|
84
92
|
import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
|
|
93
|
+
import {
|
|
94
|
+
type SharedSecretKind,
|
|
95
|
+
TaggingSecretSourcesStore,
|
|
96
|
+
} from './storage/tagging_store/tagging_secret_sources_store.js';
|
|
97
|
+
import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
|
|
85
98
|
|
|
86
99
|
export type PackedPrivateEvent = InTx & {
|
|
87
100
|
packedEvent: Fr[];
|
|
88
101
|
eventSelector: EventSelector;
|
|
89
102
|
};
|
|
90
103
|
|
|
104
|
+
/** Options for PXE.proveTx. */
|
|
105
|
+
export type ProveTxOpts = {
|
|
106
|
+
/** Addresses whose private state and keys are accessible during private execution. */
|
|
107
|
+
scopes: AztecAddress[];
|
|
108
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
109
|
+
senderForTags?: AztecAddress;
|
|
110
|
+
};
|
|
111
|
+
|
|
91
112
|
/** Options for PXE.profileTx. */
|
|
92
113
|
export type ProfileTxOpts = {
|
|
93
114
|
/** The profiling mode to use. */
|
|
@@ -96,6 +117,8 @@ export type ProfileTxOpts = {
|
|
|
96
117
|
skipProofGeneration?: boolean;
|
|
97
118
|
/** Addresses whose private state and keys are accessible during private execution. */
|
|
98
119
|
scopes: AztecAddress[];
|
|
120
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
121
|
+
senderForTags?: AztecAddress;
|
|
99
122
|
};
|
|
100
123
|
|
|
101
124
|
/** Options for PXE.simulateTx. */
|
|
@@ -108,10 +131,16 @@ export type SimulateTxOpts = {
|
|
|
108
131
|
skipFeeEnforcement?: boolean;
|
|
109
132
|
/** If true, kernel logic is emulated in TS for simulation */
|
|
110
133
|
skipKernels?: boolean;
|
|
111
|
-
/**
|
|
134
|
+
/**
|
|
135
|
+
* Pre-simulation overrides applied to the ephemeral fork and contract DB. Bundles publicStorage
|
|
136
|
+
* writes (no skipKernels required) and per-address (instance, artifact?) overrides used by both
|
|
137
|
+
* AVM-side public dispatch and PXE-side ACIR private dispatch (requires skipKernels: true).
|
|
138
|
+
*/
|
|
112
139
|
overrides?: SimulationOverrides;
|
|
113
140
|
/** Addresses whose private state and keys are accessible during private execution */
|
|
114
141
|
scopes: AztecAddress[];
|
|
142
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
143
|
+
senderForTags?: AztecAddress;
|
|
115
144
|
};
|
|
116
145
|
|
|
117
146
|
/** Options for PXE.executeUtility. */
|
|
@@ -122,10 +151,30 @@ export type ExecuteUtilityOpts = {
|
|
|
122
151
|
scopes: AztecAddress[];
|
|
123
152
|
};
|
|
124
153
|
|
|
154
|
+
/**
|
|
155
|
+
* Supplies the set of "nice to have" contracts that every PXE preloads regardless of which wallet
|
|
156
|
+
* drives it. Today this is just the standard multi-call entrypoint: the SDK's self-paid account
|
|
157
|
+
* deploy flow ({@link DeployAccountMethod} with `from = NO_FROM`) routes its payload through it, so a
|
|
158
|
+
* PXE that did not register it would fail contract sync with an opaque "no contract instance" error.
|
|
159
|
+
*
|
|
160
|
+
* Returning a list keeps this extensible: a wallet may supply its own provider that preloads
|
|
161
|
+
* additional contracts. Injected the same way as {@link ProtocolContractsProvider} so the PXE never
|
|
162
|
+
* statically imports the bundled artifacts, keeping the bundle/lazy split intact.
|
|
163
|
+
*/
|
|
164
|
+
export type PreloadedContractsProvider = {
|
|
165
|
+
/** Returns the contract instances and artifacts the PXE should preload on startup. */
|
|
166
|
+
getPreloadedContracts: () => Promise<Array<{ instance: ContractInstanceWithAddress; artifact: ContractArtifact }>>;
|
|
167
|
+
};
|
|
168
|
+
|
|
125
169
|
/** Args for PXE.create. */
|
|
126
170
|
export type PXECreateArgs = {
|
|
127
171
|
/** The Aztec node to connect to. */
|
|
128
172
|
node: AztecNode;
|
|
173
|
+
/**
|
|
174
|
+
* Optional debug API client. When provided, public function signatures are registered with the node so that
|
|
175
|
+
* node-side public-execution stack traces can be named. Skipped when the node does not expose the debug API.
|
|
176
|
+
*/
|
|
177
|
+
nodeDebug?: AztecNodeDebug;
|
|
129
178
|
/** The key-value store for persisting PXE state. */
|
|
130
179
|
store: AztecAsyncKVStore;
|
|
131
180
|
/** The prover for generating private kernel proofs. */
|
|
@@ -134,41 +183,84 @@ export type PXECreateArgs = {
|
|
|
134
183
|
simulator: CircuitSimulator;
|
|
135
184
|
/** Provider for protocol contract artifacts and instances. */
|
|
136
185
|
protocolContractsProvider: ProtocolContractsProvider;
|
|
186
|
+
/**
|
|
187
|
+
* Contracts to preload on startup. Injected by the entrypoint with the bundle-or-lazy flavor that
|
|
188
|
+
* matches the runtime (bundle for node/eager browser, lazy for code-split browser), so the PXE
|
|
189
|
+
* never statically imports a standard-contract artifact and the bundle/lazy split stays intact.
|
|
190
|
+
*/
|
|
191
|
+
preloadedContractsProvider: PreloadedContractsProvider;
|
|
137
192
|
/** PXE configuration options. */
|
|
138
193
|
config: PXEConfig;
|
|
139
194
|
/** Optional logger instance or string suffix for the logger name. */
|
|
140
195
|
loggerOrSuffix?: string | Logger;
|
|
196
|
+
/** Optional hooks to observe and influence contract execution. */
|
|
197
|
+
hooks?: ExecutionHooks;
|
|
141
198
|
};
|
|
142
199
|
|
|
200
|
+
/** A source from which PXE derives the tagging secrets it scans for to discover incoming private logs. */
|
|
201
|
+
export type TaggingSecretSource =
|
|
202
|
+
/**
|
|
203
|
+
* Derives a shared secret via ECDH from an external `sender` address against every account registered in this PXE
|
|
204
|
+
* (present and future), so registering one sender applies it to all of them. The address is not secret, so unlike
|
|
205
|
+
* `arbitrary-secret` it can be reused freely across recipients.
|
|
206
|
+
*/
|
|
207
|
+
| { kind: 'address-derived'; sender: AztecAddress }
|
|
208
|
+
/**
|
|
209
|
+
* A shared secret point provided directly, scoped to a single recipient. It bypasses ECDH, so it must not be
|
|
210
|
+
* reused across recipients (each would then be able to find the others' tags).
|
|
211
|
+
*/
|
|
212
|
+
| { kind: 'arbitrary-secret'; recipient: AztecAddress; secret: Point }
|
|
213
|
+
/**
|
|
214
|
+
* A handshake known by the x-coordinate of its ephemeral public key (the value a recipient learns while authorizing
|
|
215
|
+
* an interactive handshake, which emits no discoverable announcement). The ephemeral key's y-coordinate is always
|
|
216
|
+
* positive by protocol construction, so the x-coordinate alone identifies it.
|
|
217
|
+
*/
|
|
218
|
+
| { kind: 'handshake'; recipient: AztecAddress; ephPk: Fr };
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* The registered form of a {@link TaggingSecretSource}.
|
|
222
|
+
*/
|
|
223
|
+
export type RegisteredTaggingSecretSource =
|
|
224
|
+
| Exclude<TaggingSecretSource, { kind: 'handshake' }>
|
|
225
|
+
/** A handshake's resolved shared secret, derived at registration from the handshake's ephemeral key. */
|
|
226
|
+
| { kind: 'handshake'; recipient: AztecAddress; secret: Point };
|
|
227
|
+
|
|
143
228
|
/**
|
|
144
229
|
* Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
|
|
145
230
|
* manage private state of users.
|
|
146
231
|
*/
|
|
147
232
|
export class PXE {
|
|
148
233
|
private constructor(
|
|
149
|
-
private node:
|
|
234
|
+
private node: CachingAztecNode,
|
|
235
|
+
private nodeDebug: AztecNodeDebug | undefined,
|
|
150
236
|
private db: AztecAsyncKVStore,
|
|
151
237
|
private blockStateSynchronizer: BlockSynchronizer,
|
|
152
238
|
private keyStore: KeyStore,
|
|
153
239
|
private contractStore: ContractStore,
|
|
154
240
|
private noteStore: NoteStore,
|
|
155
241
|
private capsuleStore: CapsuleStore,
|
|
242
|
+
private factStore: FactStore,
|
|
156
243
|
private anchorBlockStore: AnchorBlockStore,
|
|
157
244
|
private senderTaggingStore: SenderTaggingStore,
|
|
158
|
-
private
|
|
245
|
+
private taggingSecretSourcesStore: TaggingSecretSourcesStore,
|
|
159
246
|
private recipientTaggingStore: RecipientTaggingStore,
|
|
160
247
|
private addressStore: AddressStore,
|
|
161
248
|
private privateEventStore: PrivateEventStore,
|
|
162
249
|
private contractSyncService: ContractSyncService,
|
|
163
|
-
private
|
|
250
|
+
private contractClassService: ContractClassService,
|
|
251
|
+
private txResolver: TxResolverService,
|
|
252
|
+
private l2TipsStore: L2TipsProvider,
|
|
164
253
|
private simulator: CircuitSimulator,
|
|
165
254
|
private proverEnabled: boolean,
|
|
255
|
+
private autoSync: boolean,
|
|
166
256
|
private proofCreator: PrivateKernelProver,
|
|
167
257
|
private protocolContractsProvider: ProtocolContractsProvider,
|
|
258
|
+
private preloadedContractsProvider: PreloadedContractsProvider,
|
|
168
259
|
private log: Logger,
|
|
169
260
|
private jobQueue: SerialQueue,
|
|
170
261
|
private jobCoordinator: JobCoordinator,
|
|
171
262
|
public debug: PXEDebugUtils,
|
|
263
|
+
private hooks: ExecutionHooks | undefined,
|
|
172
264
|
) {}
|
|
173
265
|
|
|
174
266
|
/**
|
|
@@ -180,12 +272,15 @@ export class PXE {
|
|
|
180
272
|
*/
|
|
181
273
|
public static async create({
|
|
182
274
|
node,
|
|
275
|
+
nodeDebug,
|
|
183
276
|
store,
|
|
184
277
|
proofCreator,
|
|
185
278
|
simulator,
|
|
186
279
|
protocolContractsProvider,
|
|
280
|
+
preloadedContractsProvider,
|
|
187
281
|
config,
|
|
188
282
|
loggerOrSuffix,
|
|
283
|
+
hooks,
|
|
189
284
|
}: PXECreateArgs) {
|
|
190
285
|
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
191
286
|
const bindings: LoggerBindings | undefined =
|
|
@@ -198,33 +293,52 @@ export class PXE {
|
|
|
198
293
|
|
|
199
294
|
const info = await node.getNodeInfo();
|
|
200
295
|
|
|
296
|
+
// Source the genesis block hash from the node so PXE's L2BlockStream agrees with the node's
|
|
297
|
+
// archiver on the dynamic initial header hash. Without this the tip store would fall back to
|
|
298
|
+
// the static `GENESIS_BLOCK_HEADER_HASH` constant, which only matches deployments with the
|
|
299
|
+
// default empty genesis (timestamp 0, no prefilled public data) and diverges otherwise — the
|
|
300
|
+
// sync at block 0 would then get stuck in `areBlockHashesEqualAt` and abort. If the node does
|
|
301
|
+
// not return a genesis block (older node or test fixture) we fall back to the static constant.
|
|
302
|
+
const initialBlockHash = (await node.getBlock(BlockNumber.ZERO))?.hash ?? GENESIS_BLOCK_HEADER_HASH;
|
|
303
|
+
|
|
201
304
|
const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
|
|
202
|
-
const
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
305
|
+
const {
|
|
306
|
+
addressStore,
|
|
307
|
+
privateEventStore,
|
|
308
|
+
contractStore,
|
|
309
|
+
noteStore,
|
|
310
|
+
anchorBlockStore,
|
|
311
|
+
senderTaggingStore,
|
|
312
|
+
taggingSecretSourcesStore,
|
|
313
|
+
recipientTaggingStore,
|
|
314
|
+
capsuleStore,
|
|
315
|
+
keyStore,
|
|
316
|
+
l2TipsStore,
|
|
317
|
+
factStore,
|
|
318
|
+
} = openPxeStores(store, initialBlockHash);
|
|
319
|
+
// Every PXE consumer reads through this one wrapper, so a read cached by one is served to the rest. Only
|
|
320
|
+
// immutable, hash-pinned reads are cached (the rule lives on `withCache`), which makes it safe regardless of
|
|
321
|
+
// the consumer's anchor block; the block synchronizer wipes it on anchor updates to bound memory.
|
|
322
|
+
const readCachedNode = withCache(node);
|
|
323
|
+
const contractClassService = new ContractClassService(readCachedNode, contractStore);
|
|
213
324
|
const contractSyncService = new ContractSyncService(
|
|
214
|
-
|
|
325
|
+
readCachedNode,
|
|
215
326
|
contractStore,
|
|
327
|
+
contractClassService,
|
|
216
328
|
noteStore,
|
|
217
329
|
createLogger('pxe:contract_sync', bindings),
|
|
330
|
+
config,
|
|
218
331
|
);
|
|
219
|
-
const
|
|
332
|
+
const txResolver = new TxResolverService(readCachedNode);
|
|
220
333
|
|
|
221
334
|
const synchronizer = new BlockSynchronizer(
|
|
222
|
-
|
|
335
|
+
readCachedNode,
|
|
223
336
|
store,
|
|
224
337
|
anchorBlockStore,
|
|
225
338
|
noteStore,
|
|
226
339
|
privateEventStore,
|
|
227
|
-
|
|
340
|
+
factStore,
|
|
341
|
+
l2TipsStore,
|
|
228
342
|
contractSyncService,
|
|
229
343
|
config,
|
|
230
344
|
bindings,
|
|
@@ -237,6 +351,7 @@ export class PXE {
|
|
|
237
351
|
recipientTaggingStore,
|
|
238
352
|
privateEventStore,
|
|
239
353
|
noteStore,
|
|
354
|
+
factStore,
|
|
240
355
|
contractSyncService,
|
|
241
356
|
]);
|
|
242
357
|
|
|
@@ -245,29 +360,36 @@ export class PXE {
|
|
|
245
360
|
const jobQueue = new SerialQueue();
|
|
246
361
|
|
|
247
362
|
const pxe = new PXE(
|
|
248
|
-
|
|
363
|
+
readCachedNode,
|
|
364
|
+
nodeDebug,
|
|
249
365
|
store,
|
|
250
366
|
synchronizer,
|
|
251
367
|
keyStore,
|
|
252
368
|
contractStore,
|
|
253
369
|
noteStore,
|
|
254
370
|
capsuleStore,
|
|
371
|
+
factStore,
|
|
255
372
|
anchorBlockStore,
|
|
256
373
|
senderTaggingStore,
|
|
257
|
-
|
|
374
|
+
taggingSecretSourcesStore,
|
|
258
375
|
recipientTaggingStore,
|
|
259
376
|
addressStore,
|
|
260
377
|
privateEventStore,
|
|
261
378
|
contractSyncService,
|
|
262
|
-
|
|
379
|
+
contractClassService,
|
|
380
|
+
txResolver,
|
|
381
|
+
l2TipsStore,
|
|
263
382
|
simulator,
|
|
264
383
|
proverEnabled,
|
|
384
|
+
config.autoSync,
|
|
265
385
|
proofCreator,
|
|
266
386
|
protocolContractsProvider,
|
|
387
|
+
preloadedContractsProvider,
|
|
267
388
|
log,
|
|
268
389
|
jobQueue,
|
|
269
390
|
jobCoordinator,
|
|
270
391
|
debugUtils,
|
|
392
|
+
hooks,
|
|
271
393
|
);
|
|
272
394
|
|
|
273
395
|
debugUtils.setPXEHelpers(
|
|
@@ -278,7 +400,7 @@ export class PXE {
|
|
|
278
400
|
|
|
279
401
|
pxe.jobQueue.start();
|
|
280
402
|
|
|
281
|
-
await pxe.#registerProtocolContracts();
|
|
403
|
+
await allToCompletion([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
|
|
282
404
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
283
405
|
return pxe;
|
|
284
406
|
}
|
|
@@ -286,25 +408,52 @@ export class PXE {
|
|
|
286
408
|
// Internal methods
|
|
287
409
|
|
|
288
410
|
#getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
|
|
289
|
-
const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
|
|
290
|
-
|
|
291
411
|
return new ContractFunctionSimulator({
|
|
292
|
-
contractStore:
|
|
412
|
+
contractStore: this.contractStore,
|
|
413
|
+
contractClassService: this.contractClassService,
|
|
414
|
+
overrides: overrides?.contracts,
|
|
293
415
|
noteStore: this.noteStore,
|
|
294
416
|
keyStore: this.keyStore,
|
|
295
417
|
addressStore: this.addressStore,
|
|
296
|
-
aztecNode:
|
|
418
|
+
aztecNode: this.node,
|
|
419
|
+
l2TipsStore: this.l2TipsStore,
|
|
297
420
|
senderTaggingStore: this.senderTaggingStore,
|
|
298
421
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
299
|
-
|
|
422
|
+
taggingSecretSourcesStore: this.taggingSecretSourcesStore,
|
|
300
423
|
capsuleStore: this.capsuleStore,
|
|
424
|
+
factStore: this.factStore,
|
|
301
425
|
privateEventStore: this.privateEventStore,
|
|
302
426
|
simulator: this.simulator,
|
|
303
427
|
contractSyncService: this.contractSyncService,
|
|
304
|
-
|
|
428
|
+
txResolver: this.txResolver,
|
|
429
|
+
hooks: this.hooks,
|
|
305
430
|
});
|
|
306
431
|
}
|
|
307
432
|
|
|
433
|
+
/** Best-effort debug function name for the class `address` runs at `anchorBlockHeader`. Used for log display only. */
|
|
434
|
+
async #getDebugFunctionName(
|
|
435
|
+
address: AztecAddress,
|
|
436
|
+
selector: FunctionSelector,
|
|
437
|
+
anchorBlockHeader: BlockHeader,
|
|
438
|
+
): Promise<string> {
|
|
439
|
+
try {
|
|
440
|
+
const classId = await this.contractClassService.getCurrentClassId(address, anchorBlockHeader);
|
|
441
|
+
return classId ? await this.contractStore.getDebugFunctionName(classId, selector) : `${address}:${selector}`;
|
|
442
|
+
} catch {
|
|
443
|
+
return `${address}:${selector}`;
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
/** Best-effort debug contract name for the class `address` runs at `anchorBlockHeader`. Used for log display only. */
|
|
448
|
+
async #getDebugContractName(address: AztecAddress, anchorBlockHeader: BlockHeader): Promise<string | undefined> {
|
|
449
|
+
try {
|
|
450
|
+
const classId = await this.contractClassService.getCurrentClassId(address, anchorBlockHeader);
|
|
451
|
+
return classId ? await this.contractStore.getDebugContractName(classId) : undefined;
|
|
452
|
+
} catch {
|
|
453
|
+
return undefined;
|
|
454
|
+
}
|
|
455
|
+
}
|
|
456
|
+
|
|
308
457
|
#contextualizeError(err: Error, ...context: string[]): Error {
|
|
309
458
|
let contextStr = '';
|
|
310
459
|
if (context.length > 0) {
|
|
@@ -352,51 +501,77 @@ export class PXE {
|
|
|
352
501
|
}
|
|
353
502
|
|
|
354
503
|
async #registerProtocolContracts() {
|
|
355
|
-
const registered
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
504
|
+
const registered = Object.fromEntries(
|
|
505
|
+
await allToCompletion(
|
|
506
|
+
protocolContractNames.map(async name => {
|
|
507
|
+
const { address, instance, artifact } =
|
|
508
|
+
await this.protocolContractsProvider.getProtocolContractArtifact(name);
|
|
509
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
510
|
+
await this.contractStore.addContractInstance(instance);
|
|
511
|
+
return [name, address.toString()] as const;
|
|
512
|
+
}),
|
|
513
|
+
),
|
|
514
|
+
);
|
|
362
515
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
363
516
|
}
|
|
364
517
|
|
|
518
|
+
async #registerPreloadedContracts() {
|
|
519
|
+
const contracts = await this.preloadedContractsProvider.getPreloadedContracts();
|
|
520
|
+
await allToCompletion(
|
|
521
|
+
contracts.map(async ({ instance, artifact }) => {
|
|
522
|
+
if (artifact) {
|
|
523
|
+
await this.registerContractClass(artifact);
|
|
524
|
+
}
|
|
525
|
+
await this.registerContract(instance);
|
|
526
|
+
}),
|
|
527
|
+
);
|
|
528
|
+
this.log.verbose(`Registered preloaded contracts in pxe`, {
|
|
529
|
+
contracts: contracts.map(({ instance }) => instance.address.toString()),
|
|
530
|
+
});
|
|
531
|
+
}
|
|
532
|
+
|
|
365
533
|
// Executes the entrypoint private function, as well as all nested private
|
|
366
534
|
// functions that might arise.
|
|
367
|
-
async #executePrivate(
|
|
368
|
-
contractFunctionSimulator
|
|
369
|
-
txRequest
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
535
|
+
async #executePrivate({
|
|
536
|
+
contractFunctionSimulator,
|
|
537
|
+
txRequest,
|
|
538
|
+
anchorBlockHeader,
|
|
539
|
+
scopes,
|
|
540
|
+
jobId,
|
|
541
|
+
senderForTags,
|
|
542
|
+
}: {
|
|
543
|
+
contractFunctionSimulator: ContractFunctionSimulator;
|
|
544
|
+
txRequest: TxExecutionRequest;
|
|
545
|
+
anchorBlockHeader: BlockHeader;
|
|
546
|
+
scopes: AztecAddress[];
|
|
547
|
+
jobId: string;
|
|
548
|
+
senderForTags?: AztecAddress;
|
|
549
|
+
}): Promise<PrivateExecutionResult> {
|
|
373
550
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
374
551
|
|
|
375
552
|
try {
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
functionSelector,
|
|
381
|
-
(privateSyncCall, execScopes) =>
|
|
553
|
+
await this.contractSyncService.ensureContractSynced({
|
|
554
|
+
contract: contractAddress,
|
|
555
|
+
functionToInvokeAfterSync: functionSelector,
|
|
556
|
+
utilityExecutor: (privateSyncCall, execScopes) =>
|
|
382
557
|
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
383
558
|
anchorBlockHeader,
|
|
384
559
|
jobId,
|
|
385
560
|
scopes,
|
|
386
|
-
|
|
561
|
+
triggeredBy: undefined,
|
|
562
|
+
});
|
|
387
563
|
|
|
388
564
|
const result = await contractFunctionSimulator.run(txRequest, {
|
|
389
|
-
contractAddress,
|
|
390
|
-
selector: functionSelector,
|
|
391
565
|
anchorBlockHeader,
|
|
392
566
|
scopes,
|
|
393
567
|
jobId,
|
|
568
|
+
senderForTags,
|
|
394
569
|
});
|
|
395
570
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
396
571
|
return result;
|
|
397
572
|
} catch (err) {
|
|
398
573
|
if (err instanceof SimulationError) {
|
|
399
|
-
await enrichSimulationError(err, this.contractStore, this.log);
|
|
574
|
+
await enrichSimulationError(err, this.contractStore, this.contractClassService, anchorBlockHeader, this.log);
|
|
400
575
|
}
|
|
401
576
|
throw err;
|
|
402
577
|
}
|
|
@@ -431,7 +606,8 @@ export class PXE {
|
|
|
431
606
|
return { result, offchainEffects };
|
|
432
607
|
} catch (err) {
|
|
433
608
|
if (err instanceof SimulationError) {
|
|
434
|
-
|
|
609
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
610
|
+
await enrichSimulationError(err, this.contractStore, this.contractClassService, anchorBlockHeader, this.log);
|
|
435
611
|
}
|
|
436
612
|
throw err;
|
|
437
613
|
}
|
|
@@ -443,11 +619,11 @@ export class PXE {
|
|
|
443
619
|
* It can also be used for estimating gas in the future.
|
|
444
620
|
* @param tx - The transaction to be simulated.
|
|
445
621
|
*/
|
|
446
|
-
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
|
|
622
|
+
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
|
|
447
623
|
// Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
|
|
448
624
|
// Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
|
|
449
625
|
try {
|
|
450
|
-
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
|
|
626
|
+
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
|
|
451
627
|
if (result.revertReason) {
|
|
452
628
|
throw result.revertReason;
|
|
453
629
|
}
|
|
@@ -455,7 +631,14 @@ export class PXE {
|
|
|
455
631
|
} catch (err) {
|
|
456
632
|
if (err instanceof SimulationError) {
|
|
457
633
|
try {
|
|
458
|
-
|
|
634
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
635
|
+
await enrichPublicSimulationError(
|
|
636
|
+
err,
|
|
637
|
+
this.contractStore,
|
|
638
|
+
this.contractClassService,
|
|
639
|
+
anchorBlockHeader,
|
|
640
|
+
this.log,
|
|
641
|
+
);
|
|
459
642
|
} catch (enrichErr) {
|
|
460
643
|
this.log.error(`Failed to enrich public simulation error: ${enrichErr}`);
|
|
461
644
|
}
|
|
@@ -479,11 +662,16 @@ export class PXE {
|
|
|
479
662
|
txExecutionRequest: TxExecutionRequest,
|
|
480
663
|
proofCreator: PrivateKernelProver,
|
|
481
664
|
privateExecutionResult: PrivateExecutionResult,
|
|
665
|
+
anchorBlockHeader: BlockHeader,
|
|
482
666
|
config: PrivateKernelExecutionProverConfig,
|
|
483
667
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
484
|
-
const
|
|
485
|
-
|
|
486
|
-
|
|
668
|
+
const kernelOracle = new PrivateKernelOracle(
|
|
669
|
+
this.contractStore,
|
|
670
|
+
this.contractClassService,
|
|
671
|
+
this.keyStore,
|
|
672
|
+
this.node,
|
|
673
|
+
anchorBlockHeader,
|
|
674
|
+
);
|
|
487
675
|
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
488
676
|
kernelOracle,
|
|
489
677
|
proofCreator,
|
|
@@ -494,8 +682,28 @@ export class PXE {
|
|
|
494
682
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
495
683
|
}
|
|
496
684
|
|
|
685
|
+
/**
|
|
686
|
+
* Syncs with the node only when `autoSync` is enabled.
|
|
687
|
+
* When `autoSync` is disabled, callers (typically a wallet) are
|
|
688
|
+
* responsible for invoking `pxe.sync()` at the right granularity.
|
|
689
|
+
*/
|
|
690
|
+
async #maybeSync(): Promise<void> {
|
|
691
|
+
if (this.autoSync) {
|
|
692
|
+
await this.blockStateSynchronizer.sync();
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
|
|
497
696
|
// Public API
|
|
498
697
|
|
|
698
|
+
/**
|
|
699
|
+
* Triggers a sync of PXE state with the node, regardless of the `autoSync` config flag. Use this to
|
|
700
|
+
* batch syncs across composite flows when `autoSync` is disabled (e.g. one sync per simulate+send
|
|
701
|
+
* instead of one per inner PXE call). Serialized through the job queue.
|
|
702
|
+
*/
|
|
703
|
+
public sync(): Promise<void> {
|
|
704
|
+
return this.#putInJobQueue(() => this.blockStateSynchronizer.sync());
|
|
705
|
+
}
|
|
706
|
+
|
|
499
707
|
/**
|
|
500
708
|
* Returns the block header up to which the PXE has synced.
|
|
501
709
|
* @returns The synced block header
|
|
@@ -507,11 +715,11 @@ export class PXE {
|
|
|
507
715
|
}
|
|
508
716
|
|
|
509
717
|
/**
|
|
510
|
-
* Returns the contract instance
|
|
718
|
+
* Returns the address preimage of the contract instance at a given address, if it's registered in the PXE.
|
|
511
719
|
* @param address - The contract address.
|
|
512
|
-
* @returns The contract instance if found, undefined otherwise.
|
|
720
|
+
* @returns The contract instance address preimage if found, undefined otherwise.
|
|
513
721
|
*/
|
|
514
|
-
public getContractInstance(address: AztecAddress): Promise<
|
|
722
|
+
public getContractInstance(address: AztecAddress): Promise<ContractInstancePreimageWithAddress | undefined> {
|
|
515
723
|
return this.contractStore.getContractInstance(address);
|
|
516
724
|
}
|
|
517
725
|
|
|
@@ -525,19 +733,23 @@ export class PXE {
|
|
|
525
733
|
}
|
|
526
734
|
|
|
527
735
|
/**
|
|
528
|
-
* Registers a user account in PXE
|
|
529
|
-
*
|
|
530
|
-
* the
|
|
531
|
-
*
|
|
736
|
+
* Registers a user account in PXE.
|
|
737
|
+
*
|
|
738
|
+
* PXE holds the account's four privacy secret keys but only the *public* message-signing and fallback keys: their
|
|
739
|
+
* secret keys are withheld, since PXE is not trusted to hold them.
|
|
740
|
+
*
|
|
741
|
+
* Does nothing if the account is already registered.
|
|
742
|
+
*
|
|
743
|
+
* The four privacy secret keys can be retrieved later with {@link getAccountSecretKeys}.
|
|
532
744
|
*
|
|
533
|
-
* @param
|
|
745
|
+
* @param keys - The account's privacy keys: four secret keys plus the message-signing and fallback public keys.
|
|
534
746
|
* @param partialAddress - The partial address of the account contract corresponding to the account being registered.
|
|
535
747
|
* @returns The complete address of the account.
|
|
536
748
|
*/
|
|
537
|
-
public async registerAccount(
|
|
749
|
+
public async registerAccount(keys: AccountPrivacyKeys, partialAddress: PartialAddress): Promise<CompleteAddress> {
|
|
538
750
|
const accounts = await this.keyStore.getAccounts();
|
|
539
|
-
const accountCompleteAddress = await this.keyStore.addAccount(
|
|
540
|
-
if (accounts.
|
|
751
|
+
const accountCompleteAddress = await this.keyStore.addAccount(keys, partialAddress);
|
|
752
|
+
if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
|
|
541
753
|
this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
|
|
542
754
|
return accountCompleteAddress;
|
|
543
755
|
} else {
|
|
@@ -550,56 +762,189 @@ export class PXE {
|
|
|
550
762
|
}
|
|
551
763
|
|
|
552
764
|
/**
|
|
553
|
-
*
|
|
765
|
+
* Retrieves the four privacy secret keys PXE holds for a registered account (nullifier-hiding, incoming-viewing,
|
|
766
|
+
* outgoing-viewing, tagging).
|
|
554
767
|
*
|
|
555
|
-
*
|
|
556
|
-
*
|
|
768
|
+
* These do NOT grant control over an account's assets, e.g. they are insufficient to impersonate the account or to
|
|
769
|
+
* spend notes, but they _do_ guard the account's privacy. Parties that have knowledge of these keys can decrypt all
|
|
770
|
+
* messages sent to the account, discover all of their on-chain activity, including notes, events, etc.
|
|
557
771
|
*
|
|
558
|
-
*
|
|
559
|
-
*
|
|
560
|
-
*
|
|
772
|
+
* Security is paramount when handling these keys, which should itself be a very rare occurrence. Other than exporting
|
|
773
|
+
* and then importing an account into a separate PXE/wallet, there is typically no need for a wallet to ever access
|
|
774
|
+
* these keys. Applications should NEVER be given access to them.
|
|
775
|
+
*
|
|
776
|
+
* @throws If the account is not registered.
|
|
561
777
|
*/
|
|
562
|
-
public
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
566
|
-
return sender;
|
|
567
|
-
}
|
|
778
|
+
public getAccountSecretKeys(account: AztecAddress): Promise<AccountPrivacySecretKeys> {
|
|
779
|
+
return this.keyStore.getAccountSecretKeys(account);
|
|
780
|
+
}
|
|
568
781
|
|
|
569
|
-
|
|
782
|
+
/**
|
|
783
|
+
* Registers a source from which this PXE derives the tagging secrets it scans for to discover incoming private logs.
|
|
784
|
+
* See {@link TaggingSecretSource} for the meaning of each variant. Does nothing if the source is already registered.
|
|
785
|
+
*
|
|
786
|
+
* After a new source is added we clear the cache tracking which contracts have finished syncing, so every contract
|
|
787
|
+
* re-syncs against the new source's logs (whose notes/events could belong to any contract). Already-discovered
|
|
788
|
+
* notes/events are not discarded.
|
|
789
|
+
*/
|
|
790
|
+
public async registerTaggingSecretSource(source: TaggingSecretSource): Promise<void> {
|
|
791
|
+
let wasAdded: boolean;
|
|
792
|
+
|
|
793
|
+
switch (source.kind) {
|
|
794
|
+
case 'address-derived':
|
|
795
|
+
wasAdded = await this.#registerSender(source.sender);
|
|
796
|
+
break;
|
|
797
|
+
case 'arbitrary-secret':
|
|
798
|
+
wasAdded = await this.#registerSharedSecret(source.recipient, 'arbitrary-secret', source.secret);
|
|
799
|
+
break;
|
|
800
|
+
case 'handshake':
|
|
801
|
+
wasAdded = await this.#registerSharedSecret(
|
|
802
|
+
source.recipient,
|
|
803
|
+
'handshake',
|
|
804
|
+
await this.#deriveHandshakeSecret(source.recipient, source.ephPk),
|
|
805
|
+
);
|
|
806
|
+
break;
|
|
807
|
+
default: {
|
|
808
|
+
const _: never = source;
|
|
809
|
+
throw new Error('Unhandled tagging secret source kind');
|
|
810
|
+
}
|
|
811
|
+
}
|
|
570
812
|
|
|
571
813
|
if (wasAdded) {
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
// all contracts must re-sync to discover them.
|
|
575
|
-
this.contractSyncService.wipe();
|
|
576
|
-
} else {
|
|
577
|
-
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
814
|
+
// Queued to avoid wiping while a job is in flight.
|
|
815
|
+
await this.#putInJobQueue(() => Promise.resolve(this.contractSyncService.wipe()));
|
|
578
816
|
}
|
|
817
|
+
}
|
|
579
818
|
|
|
580
|
-
|
|
819
|
+
/**
|
|
820
|
+
* Removes a previously registered tagging secret source, identified by its registered form (see
|
|
821
|
+
* {@link getTaggingSecretSources}). Does nothing if it was not registered.
|
|
822
|
+
*/
|
|
823
|
+
public async removeTaggingSecretSource(source: RegisteredTaggingSecretSource): Promise<void> {
|
|
824
|
+
switch (source.kind) {
|
|
825
|
+
case 'address-derived': {
|
|
826
|
+
const { sender } = source;
|
|
827
|
+
const wasRemoved = await this.taggingSecretSourcesStore.removeSender(sender);
|
|
828
|
+
this.log.info(
|
|
829
|
+
wasRemoved
|
|
830
|
+
? `Removed sender:\n ${sender.toString()}`
|
|
831
|
+
: `Sender:\n "${sender.toString()}"\n not registered in PXE.`,
|
|
832
|
+
);
|
|
833
|
+
break;
|
|
834
|
+
}
|
|
835
|
+
case 'arbitrary-secret':
|
|
836
|
+
case 'handshake': {
|
|
837
|
+
const { kind, recipient, secret } = source;
|
|
838
|
+
const wasRemoved = await this.taggingSecretSourcesStore.removeSharedSecret(recipient, kind, secret);
|
|
839
|
+
this.log.info(
|
|
840
|
+
wasRemoved
|
|
841
|
+
? `Removed ${kind} shared secret for recipient:\n ${recipient.toString()}`
|
|
842
|
+
: `No ${kind} shared secret registered for recipient:\n ${recipient.toString()}`,
|
|
843
|
+
);
|
|
844
|
+
break;
|
|
845
|
+
}
|
|
846
|
+
default: {
|
|
847
|
+
const _: never = source;
|
|
848
|
+
throw new Error('Unhandled tagging secret source kind');
|
|
849
|
+
}
|
|
850
|
+
}
|
|
581
851
|
}
|
|
582
852
|
|
|
583
853
|
/**
|
|
584
|
-
* Retrieves
|
|
585
|
-
*
|
|
854
|
+
* Retrieves the tagging secret sources registered in this PXE, in their registered form. Without a filter it
|
|
855
|
+
* returns every source; pass `{ kind }` to narrow to a single variant. See {@link RegisteredTaggingSecretSource}.
|
|
586
856
|
*/
|
|
587
|
-
public
|
|
588
|
-
|
|
857
|
+
public getTaggingSecretSources<K extends RegisteredTaggingSecretSource['kind']>(filter: {
|
|
858
|
+
kind: K;
|
|
859
|
+
}): Promise<Extract<RegisteredTaggingSecretSource, { kind: K }>[]>;
|
|
860
|
+
public getTaggingSecretSources(): Promise<RegisteredTaggingSecretSource[]>;
|
|
861
|
+
public async getTaggingSecretSources(filter?: {
|
|
862
|
+
kind?: RegisteredTaggingSecretSource['kind'];
|
|
863
|
+
}): Promise<RegisteredTaggingSecretSource[]> {
|
|
864
|
+
const [senders, secrets] = await allToCompletion([
|
|
865
|
+
this.taggingSecretSourcesStore.getSenders(),
|
|
866
|
+
this.taggingSecretSourcesStore.getAllSharedSecrets(),
|
|
867
|
+
]);
|
|
868
|
+
|
|
869
|
+
const sources: RegisteredTaggingSecretSource[] = [
|
|
870
|
+
...senders.map((sender): RegisteredTaggingSecretSource => ({ kind: 'address-derived', sender })),
|
|
871
|
+
...secrets.map(({ recipient, kind, secret }): RegisteredTaggingSecretSource => ({ kind, recipient, secret })),
|
|
872
|
+
];
|
|
873
|
+
|
|
874
|
+
return filter?.kind ? sources.filter(source => source.kind === filter.kind) : sources;
|
|
875
|
+
}
|
|
876
|
+
|
|
877
|
+
/** Registers a sender, skipping addresses that belong to a local account. Returns whether it was newly added. */
|
|
878
|
+
async #registerSender(address: AztecAddress): Promise<boolean> {
|
|
879
|
+
if (!(await address.isValid())) {
|
|
880
|
+
throw new Error(
|
|
881
|
+
`Address ${address} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`,
|
|
882
|
+
);
|
|
883
|
+
}
|
|
884
|
+
|
|
885
|
+
const accounts = await this.keyStore.getAccounts();
|
|
886
|
+
if (accounts.some(a => a.equals(address))) {
|
|
887
|
+
this.log.info(`Sender:\n "${address.toString()}"\n already registered.`);
|
|
888
|
+
return false;
|
|
889
|
+
}
|
|
890
|
+
|
|
891
|
+
const wasAdded = await this.taggingSecretSourcesStore.addSender(address);
|
|
892
|
+
this.log.info(
|
|
893
|
+
wasAdded ? `Added sender:\n ${address.toString()}` : `Sender:\n "${address.toString()}"\n already registered.`,
|
|
894
|
+
);
|
|
895
|
+
return wasAdded;
|
|
589
896
|
}
|
|
590
897
|
|
|
591
898
|
/**
|
|
592
|
-
*
|
|
593
|
-
*
|
|
899
|
+
* Derives the shared secret of a handshake from its ephemeral public key: the raw ECDH secret
|
|
900
|
+
* `S = addressSecret(recipient) * ephPk` with the forgery protection applied,
|
|
901
|
+
* matching the protected secret the registry stores and the derivation the recipient-side scan uses for
|
|
902
|
+
* handshakes discovered onchain. The ephemeral key is reconstructed from its x-coordinate with a positive y,
|
|
903
|
+
* matching how the protocol generates it.
|
|
904
|
+
*
|
|
905
|
+
* @throws If `ephPk` is not the x-coordinate of a Grumpkin curve point, or if `recipient` is not an account of
|
|
906
|
+
* this PXE, since the derivation needs its keys.
|
|
594
907
|
*/
|
|
595
|
-
|
|
596
|
-
|
|
908
|
+
async #deriveHandshakeSecret(recipient: AztecAddress, ephPk: Fr): Promise<Point> {
|
|
909
|
+
let ephPkPoint: Point;
|
|
910
|
+
try {
|
|
911
|
+
ephPkPoint = await Point.fromXAndSign(ephPk, true);
|
|
912
|
+
} catch {
|
|
913
|
+
throw new Error(`Ephemeral public key x-coordinate ${ephPk} does not correspond to a Grumpkin curve point.`);
|
|
914
|
+
}
|
|
597
915
|
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
916
|
+
const completeAddress = await this.addressStore.getCompleteAddress(recipient);
|
|
917
|
+
if (!completeAddress || !(await this.keyStore.hasAccount(recipient))) {
|
|
918
|
+
throw new Error(
|
|
919
|
+
`Recipient ${recipient} is not an account of this PXE. A handshake's shared secret can only be derived for an account whose keys are held.`,
|
|
920
|
+
);
|
|
602
921
|
}
|
|
922
|
+
|
|
923
|
+
const ivskM = await this.keyStore.getMasterIncomingViewingSecretKey(recipient);
|
|
924
|
+
const addressSecret = await computeAddressSecret(await completeAddress.getPreaddress(), ivskM);
|
|
925
|
+
const rawSecret = await deriveEcdhSharedSecretPoint(addressSecret, ephPkPoint);
|
|
926
|
+
return protectFromForgery(rawSecret, ephPkPoint, await recipient.toAddressPoint());
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
/** Registers a resolved shared secret scoped to a recipient. Returns whether it was newly added. */
|
|
930
|
+
async #registerSharedSecret(recipient: AztecAddress, kind: SharedSecretKind, secret: Point): Promise<boolean> {
|
|
931
|
+
if (!(await recipient.isValid())) {
|
|
932
|
+
throw new Error(
|
|
933
|
+
`Recipient ${recipient} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register a shared secret for it.`,
|
|
934
|
+
);
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
if (secret.isZero() || !secret.isOnCurve()) {
|
|
938
|
+
throw new Error(`Shared secret ${secret} is not a valid non-zero point on the Grumpkin curve.`);
|
|
939
|
+
}
|
|
940
|
+
|
|
941
|
+
const wasAdded = await this.taggingSecretSourcesStore.addSharedSecret(recipient, kind, secret);
|
|
942
|
+
this.log.info(
|
|
943
|
+
wasAdded
|
|
944
|
+
? `Added ${kind} shared secret for recipient:\n ${recipient.toString()}`
|
|
945
|
+
: `${kind} shared secret already registered for recipient:\n ${recipient.toString()}`,
|
|
946
|
+
);
|
|
947
|
+
return wasAdded;
|
|
603
948
|
}
|
|
604
949
|
|
|
605
950
|
/**
|
|
@@ -623,94 +968,33 @@ export class PXE {
|
|
|
623
968
|
*/
|
|
624
969
|
public async registerContractClass(artifact: ContractArtifact): Promise<void> {
|
|
625
970
|
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
971
|
+
// Publishing the artifact's public function signatures to the node is part of "registering a class", so that
|
|
972
|
+
// node-side debugging works regardless of which entrypoint (registerContractClass or registerContract) was used.
|
|
973
|
+
const publicFunctionSignatures = artifact.functions
|
|
974
|
+
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
975
|
+
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
976
|
+
if (publicFunctionSignatures.length > 0) {
|
|
977
|
+
await this.nodeDebug?.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
978
|
+
}
|
|
626
979
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
627
980
|
}
|
|
628
981
|
|
|
629
982
|
/**
|
|
630
|
-
*
|
|
631
|
-
*
|
|
632
|
-
*
|
|
633
|
-
*
|
|
983
|
+
* Registers a deployed contract instance so its private state can be synced and its functions simulated. The
|
|
984
|
+
* artifact for the class the instance runs must be registered separately via {@link registerContractClass}, before
|
|
985
|
+
* or after this call; registration performs no validation, so a missing or mismatched artifact only surfaces when
|
|
986
|
+
* the contract is later simulated. This is automatically called by aztec.js when deploying a contract.
|
|
634
987
|
*
|
|
635
|
-
* @param
|
|
988
|
+
* @param instance - The address preimage of the contract instance to register. The address is derived from it.
|
|
989
|
+
* @returns The address of the registered instance.
|
|
636
990
|
*/
|
|
637
|
-
public
|
|
638
|
-
|
|
639
|
-
let { artifact } = contract;
|
|
640
|
-
|
|
641
|
-
if (artifact) {
|
|
642
|
-
// If the user provides an artifact, validate it against the expected class id and register it
|
|
643
|
-
const contractClass = await getContractClassFromArtifact(artifact);
|
|
644
|
-
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
645
|
-
throw new Error(
|
|
646
|
-
`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
|
|
647
|
-
);
|
|
648
|
-
}
|
|
649
|
-
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
650
|
-
if (!computedAddress.equals(instance.address)) {
|
|
651
|
-
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
652
|
-
}
|
|
653
|
-
|
|
654
|
-
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
655
|
-
|
|
656
|
-
const publicFunctionSignatures = artifact.functions
|
|
657
|
-
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
658
|
-
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
659
|
-
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
660
|
-
} else {
|
|
661
|
-
// Otherwise, make sure there is an artifact already registered for that class id
|
|
662
|
-
artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
|
|
663
|
-
if (!artifact) {
|
|
664
|
-
throw new Error(
|
|
665
|
-
`Artifact not found when registering an instance. Contract class: ${instance.currentContractClassId}.`,
|
|
666
|
-
);
|
|
667
|
-
}
|
|
668
|
-
}
|
|
669
|
-
|
|
670
|
-
await this.contractStore.addContractInstance(instance);
|
|
671
|
-
this.log.info(
|
|
672
|
-
`Added contract ${artifact.name} at ${instance.address.toString()} with class ${instance.currentContractClassId}`,
|
|
673
|
-
);
|
|
674
|
-
}
|
|
675
|
-
|
|
676
|
-
/**
|
|
677
|
-
* Updates a deployed contract in the PXE. This is used to update the contract artifact when
|
|
678
|
-
* an update has happened, so the new code can be used in the simulation of local transactions.
|
|
679
|
-
* This is called by aztec.js when instantiating a contract in a given address with a mismatching artifact.
|
|
680
|
-
* @param contractAddress - The address of the contract to update.
|
|
681
|
-
* @param artifact - The updated artifact for the contract.
|
|
682
|
-
* @throws If the artifact's contract class is not found in the PXE or if the contract class is different from
|
|
683
|
-
* the current one (current one from the point of view of the node to which the PXE is connected).
|
|
684
|
-
*/
|
|
685
|
-
public updateContract(contractAddress: AztecAddress, artifact: ContractArtifact): Promise<void> {
|
|
686
|
-
// We disable concurrently updating contracts to avoid concurrently syncing with the node, or changing a contract's
|
|
687
|
-
// class while we're simulating it.
|
|
991
|
+
public registerContract(instance: ContractInstancePreimage): Promise<AztecAddress> {
|
|
992
|
+
// Run inside the job queue so we can't race a concurrent simulation while writing the instance to the store.
|
|
688
993
|
return this.#putInJobQueue(async () => {
|
|
689
|
-
const
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
const contractClass = await getContractClassFromArtifact(artifact);
|
|
694
|
-
await this.blockStateSynchronizer.sync();
|
|
695
|
-
|
|
696
|
-
const header = await this.anchorBlockStore.getBlockHeader();
|
|
697
|
-
|
|
698
|
-
const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
|
|
699
|
-
if (!contractClass.id.equals(currentClassId)) {
|
|
700
|
-
throw new Error('Could not update contract to a class different from the current one.');
|
|
701
|
-
}
|
|
702
|
-
|
|
703
|
-
const publicFunctionSignatures = artifact.functions
|
|
704
|
-
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
705
|
-
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
706
|
-
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
707
|
-
|
|
708
|
-
currentInstance.currentContractClassId = contractClass.id;
|
|
709
|
-
await Promise.all([
|
|
710
|
-
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
711
|
-
this.contractStore.addContractInstance(currentInstance),
|
|
712
|
-
]);
|
|
713
|
-
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
994
|
+
const address = await computeContractAddressFromInstance(instance);
|
|
995
|
+
await this.contractStore.addContractInstance({ ...instance, address });
|
|
996
|
+
this.log.info(`Added contract at ${address}`, { address });
|
|
997
|
+
return address;
|
|
714
998
|
});
|
|
715
999
|
}
|
|
716
1000
|
|
|
@@ -732,25 +1016,34 @@ export class PXE {
|
|
|
732
1016
|
* @throws If contract code not found, or public simulation reverts.
|
|
733
1017
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
734
1018
|
*/
|
|
735
|
-
public proveTx(txRequest: TxExecutionRequest, scopes:
|
|
1019
|
+
public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
|
|
736
1020
|
let privateExecutionResult: PrivateExecutionResult;
|
|
737
1021
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
738
1022
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
739
1023
|
return this.#putInJobQueue(async jobId => {
|
|
740
1024
|
const totalTimer = new Timer();
|
|
1025
|
+
const recording = this.node.startRecording();
|
|
741
1026
|
try {
|
|
742
1027
|
const syncTimer = new Timer();
|
|
743
|
-
await this
|
|
1028
|
+
await this.#maybeSync();
|
|
1029
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
744
1030
|
const syncTime = syncTimer.ms();
|
|
745
1031
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
746
|
-
privateExecutionResult = await this.#executePrivate(
|
|
1032
|
+
privateExecutionResult = await this.#executePrivate({
|
|
1033
|
+
contractFunctionSimulator,
|
|
1034
|
+
txRequest,
|
|
1035
|
+
anchorBlockHeader,
|
|
1036
|
+
scopes,
|
|
1037
|
+
jobId,
|
|
1038
|
+
senderForTags,
|
|
1039
|
+
});
|
|
747
1040
|
|
|
748
1041
|
const {
|
|
749
1042
|
publicInputs,
|
|
750
1043
|
chonkProof,
|
|
751
1044
|
executionSteps,
|
|
752
1045
|
timings: { proving } = {},
|
|
753
|
-
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
1046
|
+
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
754
1047
|
simulate: false,
|
|
755
1048
|
skipFeeEnforcement: false,
|
|
756
1049
|
profileMode: 'none',
|
|
@@ -777,30 +1070,30 @@ export class PXE {
|
|
|
777
1070
|
|
|
778
1071
|
const txProvingResult = new TxProvingResult(privateExecutionResult, publicInputs, chonkProof!, {
|
|
779
1072
|
timings,
|
|
780
|
-
nodeRPCCalls:
|
|
1073
|
+
nodeRPCCalls: recording.stop(),
|
|
781
1074
|
});
|
|
782
1075
|
|
|
783
|
-
//
|
|
784
|
-
//
|
|
785
|
-
//
|
|
786
|
-
//
|
|
787
|
-
//
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
} else {
|
|
798
|
-
this.log.debug(`No tagging index ranges used in the tx`);
|
|
799
|
-
}
|
|
1076
|
+
// We keep track of which tagging indices we've used in this tx so that we don't repeat them in future txs
|
|
1077
|
+
// (which would link them) without having to rely on this tx being mined (and us seeing the indices being used
|
|
1078
|
+
// onchain).
|
|
1079
|
+
// Note that this must happen _after_ proving as it requires the proof's public inputs, from which the kernels
|
|
1080
|
+
// may have removed some logs due to note-nullifier squashing - this may lead to range of tagging indices we've
|
|
1081
|
+
// actually used to being reduced.
|
|
1082
|
+
await persistSenderTaggingIndexRangesForTx(
|
|
1083
|
+
this.senderTaggingStore,
|
|
1084
|
+
privateExecutionResult.entrypoint.taggingIndexRanges,
|
|
1085
|
+
publicInputs,
|
|
1086
|
+
() => txProvingResult.getTxHash(),
|
|
1087
|
+
jobId,
|
|
1088
|
+
this.log,
|
|
1089
|
+
);
|
|
800
1090
|
|
|
801
1091
|
return txProvingResult;
|
|
802
1092
|
} catch (err: any) {
|
|
803
1093
|
throw this.#contextualizeError(err, inspect(txRequest), inspect(privateExecutionResult));
|
|
1094
|
+
} finally {
|
|
1095
|
+
// Idempotent cleanup for the error and early-exit paths. The success path already stopped the recording.
|
|
1096
|
+
recording.stop();
|
|
804
1097
|
}
|
|
805
1098
|
});
|
|
806
1099
|
}
|
|
@@ -813,11 +1106,12 @@ export class PXE {
|
|
|
813
1106
|
*/
|
|
814
1107
|
public profileTx(
|
|
815
1108
|
txRequest: TxExecutionRequest,
|
|
816
|
-
{ profileMode, skipProofGeneration = true, scopes }: ProfileTxOpts,
|
|
1109
|
+
{ profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
|
|
817
1110
|
): Promise<TxProfileResult> {
|
|
818
1111
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
819
1112
|
return this.#putInJobQueue(async jobId => {
|
|
820
1113
|
const totalTimer = new Timer();
|
|
1114
|
+
const recording = this.node.startRecording();
|
|
821
1115
|
try {
|
|
822
1116
|
const txInfo = {
|
|
823
1117
|
origin: txRequest.origin,
|
|
@@ -832,16 +1126,25 @@ export class PXE {
|
|
|
832
1126
|
txInfo,
|
|
833
1127
|
);
|
|
834
1128
|
const syncTimer = new Timer();
|
|
835
|
-
await this
|
|
1129
|
+
await this.#maybeSync();
|
|
1130
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
836
1131
|
const syncTime = syncTimer.ms();
|
|
837
1132
|
|
|
838
1133
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
839
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1134
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1135
|
+
contractFunctionSimulator,
|
|
1136
|
+
txRequest,
|
|
1137
|
+
anchorBlockHeader,
|
|
1138
|
+
scopes,
|
|
1139
|
+
jobId,
|
|
1140
|
+
senderForTags,
|
|
1141
|
+
});
|
|
840
1142
|
|
|
841
1143
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
842
1144
|
txRequest,
|
|
843
1145
|
this.proofCreator,
|
|
844
1146
|
privateExecutionResult,
|
|
1147
|
+
anchorBlockHeader,
|
|
845
1148
|
{
|
|
846
1149
|
simulate: skipProofGeneration,
|
|
847
1150
|
skipFeeEnforcement: false,
|
|
@@ -874,10 +1177,12 @@ export class PXE {
|
|
|
874
1177
|
total - ((syncTime ?? 0) + (proving ?? 0) + perFunction.reduce((acc, { time }) => acc + time, 0)),
|
|
875
1178
|
};
|
|
876
1179
|
|
|
877
|
-
|
|
878
|
-
return new TxProfileResult(executionSteps, { timings, nodeRPCCalls: simulatorStats.nodeRPCCalls });
|
|
1180
|
+
return new TxProfileResult(executionSteps, { timings, nodeRPCCalls: recording.stop() });
|
|
879
1181
|
} catch (err: any) {
|
|
880
1182
|
throw this.#contextualizeError(err, inspect(txRequest), `profileMode=${profileMode}`);
|
|
1183
|
+
} finally {
|
|
1184
|
+
// Idempotent cleanup for the error and early-exit paths. The success path already stopped the recording.
|
|
1185
|
+
recording.stop();
|
|
881
1186
|
}
|
|
882
1187
|
});
|
|
883
1188
|
}
|
|
@@ -909,12 +1214,14 @@ export class PXE {
|
|
|
909
1214
|
skipKernels = true,
|
|
910
1215
|
overrides,
|
|
911
1216
|
scopes,
|
|
1217
|
+
senderForTags,
|
|
912
1218
|
}: SimulateTxOpts,
|
|
913
1219
|
): Promise<TxSimulationResult> {
|
|
914
1220
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
915
1221
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
916
1222
|
// delete the same read value, or reading values that another simulation is currently modifying).
|
|
917
1223
|
return this.#putInJobQueue(async jobId => {
|
|
1224
|
+
const recording = this.node.startRecording();
|
|
918
1225
|
try {
|
|
919
1226
|
const totalTimer = new Timer();
|
|
920
1227
|
const txInfo = {
|
|
@@ -930,27 +1237,26 @@ export class PXE {
|
|
|
930
1237
|
txInfo,
|
|
931
1238
|
);
|
|
932
1239
|
const syncTimer = new Timer();
|
|
933
|
-
await this
|
|
1240
|
+
await this.#maybeSync();
|
|
1241
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
934
1242
|
const syncTime = syncTimer.ms();
|
|
935
1243
|
|
|
936
|
-
|
|
937
|
-
const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
|
|
938
|
-
|
|
939
|
-
if (hasOverriddenContracts && !skipKernels) {
|
|
1244
|
+
if (overrides?.contracts && Object.keys(overrides.contracts).length > 0 && !skipKernels) {
|
|
940
1245
|
throw new Error(
|
|
941
1246
|
'Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.',
|
|
942
1247
|
);
|
|
943
1248
|
}
|
|
944
1249
|
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
945
1250
|
|
|
946
|
-
if (hasOverriddenContracts) {
|
|
947
|
-
// Overridden contracts don't have a sync function, so calling sync on them would fail.
|
|
948
|
-
// We exclude them so the sync service skips them entirely.
|
|
949
|
-
this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
|
|
950
|
-
}
|
|
951
|
-
|
|
952
1251
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
953
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1252
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1253
|
+
contractFunctionSimulator,
|
|
1254
|
+
txRequest,
|
|
1255
|
+
anchorBlockHeader,
|
|
1256
|
+
scopes,
|
|
1257
|
+
jobId,
|
|
1258
|
+
senderForTags,
|
|
1259
|
+
});
|
|
954
1260
|
|
|
955
1261
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
956
1262
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
@@ -958,16 +1264,22 @@ export class PXE {
|
|
|
958
1264
|
if (skipKernels) {
|
|
959
1265
|
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
|
|
960
1266
|
privateExecutionResult,
|
|
961
|
-
(addr, sel) => this
|
|
1267
|
+
(addr, sel) => this.#getDebugFunctionName(addr, sel, anchorBlockHeader),
|
|
962
1268
|
this.node,
|
|
963
1269
|
));
|
|
964
1270
|
} else {
|
|
965
1271
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
966
|
-
({ publicInputs, executionSteps } = await this.#prove(
|
|
967
|
-
|
|
968
|
-
|
|
969
|
-
|
|
970
|
-
|
|
1272
|
+
({ publicInputs, executionSteps } = await this.#prove(
|
|
1273
|
+
txRequest,
|
|
1274
|
+
this.proofCreator,
|
|
1275
|
+
privateExecutionResult,
|
|
1276
|
+
anchorBlockHeader,
|
|
1277
|
+
{
|
|
1278
|
+
simulate: true,
|
|
1279
|
+
skipFeeEnforcement,
|
|
1280
|
+
profileMode: 'none',
|
|
1281
|
+
},
|
|
1282
|
+
));
|
|
971
1283
|
}
|
|
972
1284
|
|
|
973
1285
|
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
@@ -976,10 +1288,10 @@ export class PXE {
|
|
|
976
1288
|
let publicOutput: PublicSimulationOutput | undefined;
|
|
977
1289
|
if (simulatePublic && publicInputs.forPublic) {
|
|
978
1290
|
const publicSimulationTimer = new Timer();
|
|
979
|
-
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
1291
|
+
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
|
|
980
1292
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
981
1293
|
if (publicOutput?.debugLogs?.length) {
|
|
982
|
-
await displayDebugLogs(publicOutput.debugLogs, addr => this
|
|
1294
|
+
await displayDebugLogs(publicOutput.debugLogs, addr => this.#getDebugContractName(addr, anchorBlockHeader));
|
|
983
1295
|
}
|
|
984
1296
|
}
|
|
985
1297
|
|
|
@@ -1030,10 +1342,9 @@ export class PXE {
|
|
|
1030
1342
|
: {}),
|
|
1031
1343
|
});
|
|
1032
1344
|
|
|
1033
|
-
const simulatorStats = contractFunctionSimulator.getStats();
|
|
1034
1345
|
return TxSimulationResult.fromPrivateSimulationResultAndPublicOutput(privateSimulationResult, publicOutput, {
|
|
1035
1346
|
timings,
|
|
1036
|
-
nodeRPCCalls:
|
|
1347
|
+
nodeRPCCalls: recording.stop(),
|
|
1037
1348
|
});
|
|
1038
1349
|
} catch (err: any) {
|
|
1039
1350
|
throw this.#contextualizeError(
|
|
@@ -1043,6 +1354,9 @@ export class PXE {
|
|
|
1043
1354
|
`skipTxValidation=${skipTxValidation}`,
|
|
1044
1355
|
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1045
1356
|
);
|
|
1357
|
+
} finally {
|
|
1358
|
+
// Idempotent cleanup for the error and early-exit paths. The success path already stopped the recording.
|
|
1359
|
+
recording.stop();
|
|
1046
1360
|
}
|
|
1047
1361
|
});
|
|
1048
1362
|
}
|
|
@@ -1059,24 +1373,26 @@ export class PXE {
|
|
|
1059
1373
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
1060
1374
|
// delete the same read value, or reading values that another execution is currently modifying).
|
|
1061
1375
|
return this.#putInJobQueue(async jobId => {
|
|
1376
|
+
const recording = this.node.startRecording();
|
|
1062
1377
|
try {
|
|
1063
1378
|
const totalTimer = new Timer();
|
|
1064
1379
|
const syncTimer = new Timer();
|
|
1065
|
-
await this
|
|
1380
|
+
await this.#maybeSync();
|
|
1066
1381
|
const syncTime = syncTimer.ms();
|
|
1067
1382
|
const functionTimer = new Timer();
|
|
1068
1383
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1069
1384
|
|
|
1070
1385
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1071
|
-
await this.contractSyncService.ensureContractSynced(
|
|
1072
|
-
call.to,
|
|
1073
|
-
call.selector,
|
|
1074
|
-
(privateSyncCall, execScopes) =>
|
|
1386
|
+
await this.contractSyncService.ensureContractSynced({
|
|
1387
|
+
contract: call.to,
|
|
1388
|
+
functionToInvokeAfterSync: call.selector,
|
|
1389
|
+
utilityExecutor: (privateSyncCall, execScopes) =>
|
|
1075
1390
|
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1076
1391
|
anchorBlockHeader,
|
|
1077
1392
|
jobId,
|
|
1078
1393
|
scopes,
|
|
1079
|
-
|
|
1394
|
+
triggeredBy: undefined,
|
|
1395
|
+
});
|
|
1080
1396
|
|
|
1081
1397
|
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
1082
1398
|
contractFunctionSimulator,
|
|
@@ -1098,12 +1414,11 @@ export class PXE {
|
|
|
1098
1414
|
unaccounted: totalTime - (syncTime + perFunction.reduce((acc, { time }) => acc + time, 0)),
|
|
1099
1415
|
};
|
|
1100
1416
|
|
|
1101
|
-
const simulationStats = contractFunctionSimulator.getStats();
|
|
1102
1417
|
return {
|
|
1103
1418
|
result: executionResult,
|
|
1104
1419
|
offchainEffects,
|
|
1105
1420
|
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1106
|
-
stats: { timings, nodeRPCCalls:
|
|
1421
|
+
stats: { timings, nodeRPCCalls: recording.stop() },
|
|
1107
1422
|
};
|
|
1108
1423
|
} catch (err: any) {
|
|
1109
1424
|
const { to, name, args } = call;
|
|
@@ -1113,6 +1428,9 @@ export class PXE {
|
|
|
1113
1428
|
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1114
1429
|
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1115
1430
|
);
|
|
1431
|
+
} finally {
|
|
1432
|
+
// Idempotent cleanup for the error and early-exit paths. The success path already stopped the recording.
|
|
1433
|
+
recording.stop();
|
|
1116
1434
|
}
|
|
1117
1435
|
});
|
|
1118
1436
|
}
|
|
@@ -1137,22 +1455,23 @@ export class PXE {
|
|
|
1137
1455
|
let anchorBlockNumber: BlockNumber;
|
|
1138
1456
|
|
|
1139
1457
|
await this.#putInJobQueue(async jobId => {
|
|
1140
|
-
await this
|
|
1458
|
+
await this.#maybeSync();
|
|
1141
1459
|
|
|
1142
1460
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1143
1461
|
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
1144
1462
|
|
|
1145
1463
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1146
1464
|
|
|
1147
|
-
await this.contractSyncService.ensureContractSynced(
|
|
1148
|
-
filter.contractAddress,
|
|
1149
|
-
null,
|
|
1150
|
-
async (privateSyncCall, execScopes) =>
|
|
1465
|
+
await this.contractSyncService.ensureContractSynced({
|
|
1466
|
+
contract: filter.contractAddress,
|
|
1467
|
+
functionToInvokeAfterSync: null,
|
|
1468
|
+
utilityExecutor: async (privateSyncCall, execScopes) =>
|
|
1151
1469
|
await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1152
1470
|
anchorBlockHeader,
|
|
1153
1471
|
jobId,
|
|
1154
|
-
filter.scopes,
|
|
1155
|
-
|
|
1472
|
+
scopes: filter.scopes,
|
|
1473
|
+
triggeredBy: undefined,
|
|
1474
|
+
});
|
|
1156
1475
|
});
|
|
1157
1476
|
|
|
1158
1477
|
// anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
|
|
@@ -1170,6 +1489,7 @@ export class PXE {
|
|
|
1170
1489
|
*/
|
|
1171
1490
|
public async stop(): Promise<void> {
|
|
1172
1491
|
await this.jobQueue.end();
|
|
1492
|
+
await this.blockStateSynchronizer.stop();
|
|
1173
1493
|
await this.db.close();
|
|
1174
1494
|
}
|
|
1175
1495
|
}
|