@aztec/pxe 0.0.1-commit.86469d5 → 0.0.1-commit.8655d4a
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.d.ts +12 -2
- package/dest/bin/check_oracle_version.d.ts.map +1 -1
- package/dest/bin/check_oracle_version.js +31 -25
- 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/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 +62 -0
- package/dest/block_synchronizer/block_synchronizer.d.ts +9 -3
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +37 -11
- package/dest/config/index.d.ts +8 -2
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +13 -15
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +66 -29
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +216 -75
- 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_tagging_index_cache.d.ts +7 -11
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -15
- package/dest/contract_function_simulator/index.d.ts +4 -1
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +3 -0
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +48 -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 +45 -0
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -6
- 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 +8 -9
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +13 -3
- 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 +35 -4
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
- 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 -4
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -7
- 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 -10
- package/dest/contract_function_simulator/noir-structs/option.d.ts +61 -0
- package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/option.js +62 -0
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +67 -51
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- 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.d.ts +74 -45
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +471 -275
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +147 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/oracle_registry.js +1199 -0
- package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +68 -93
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +150 -108
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +138 -73
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +433 -154
- 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/proxied_contract_data_source.d.ts +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +35 -64
- package/dest/contract_logging.d.ts +27 -0
- package/dest/contract_logging.d.ts.map +1 -0
- package/dest/contract_logging.js +38 -0
- package/dest/contract_sync/contract_sync_service.d.ts +42 -0
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -0
- package/dest/contract_sync/contract_sync_service.js +135 -0
- package/dest/contract_sync/helpers.d.ts +27 -0
- package/dest/contract_sync/helpers.d.ts.map +1 -0
- package/dest/contract_sync/{index.js → helpers.js} +16 -24
- package/dest/debug/pxe_debug_utils.d.ts +14 -15
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +16 -21
- package/dest/entrypoints/client/bundle/index.d.ts +3 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +2 -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 -5
- package/dest/entrypoints/client/lazy/index.d.ts +3 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +2 -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 -5
- package/dest/entrypoints/pxe_creation_options.d.ts +9 -1
- 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 +5 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +4 -2
- 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 +21 -5
- package/dest/events/event_service.d.ts +15 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +44 -11
- 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 +42 -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 +4 -0
- package/dest/hooks/index.d.ts.map +1 -0
- package/dest/hooks/index.js +1 -0
- package/dest/logs/log_service.d.ts +9 -8
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +126 -81
- package/dest/messages/message_context_service.d.ts +17 -0
- package/dest/messages/message_context_service.d.ts.map +1 -0
- package/dest/messages/message_context_service.js +38 -0
- package/dest/notes/note_service.d.ts +27 -5
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +83 -58
- package/dest/notes_filter.d.ts +24 -0
- package/dest/notes_filter.d.ts.map +1 -0
- package/dest/notes_filter.js +4 -0
- 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/compute_tx_expiration_timestamp.d.ts +4 -0
- package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
- package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
- package/dest/private_kernel/hints/index.d.ts +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
- 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 +130 -69
- package/dest/private_kernel/hints/test_utils.d.ts +122 -0
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
- package/dest/private_kernel/hints/test_utils.js +202 -0
- 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 +166 -65
- package/dest/private_kernel/private_kernel_oracle.d.ts +15 -11
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +31 -25
- package/dest/pxe.d.ts +120 -24
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +231 -134
- package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
- 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 +591 -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 +21 -0
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
- package/dest/storage/capsule_store/capsule_service.js +50 -0
- package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +36 -28
- package/dest/storage/capsule_store/index.d.ts +2 -1
- package/dest/storage/capsule_store/index.d.ts.map +1 -1
- package/dest/storage/capsule_store/index.js +1 -0
- package/dest/storage/contract_store/contract_store.d.ts +42 -15
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +146 -87
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +3 -3
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +6 -4
- package/dest/storage/open_pxe_stores.d.ts +33 -0
- package/dest/storage/open_pxe_stores.d.ts.map +1 -0
- package/dest/storage/open_pxe_stores.js +27 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +3 -0
- package/dest/storage/private_event_store/stored_private_event.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 +29 -28
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
- package/dest/tagging/get_all_logs_by_tags.d.ts +34 -10
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
- package/dest/tagging/get_all_logs_by_tags.js +45 -32
- package/dest/tagging/index.d.ts +6 -5
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +4 -3
- 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 +56 -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 +163 -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/recipient_sync/utils/find_highest_indexes.js +2 -2
- 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 +4 -9
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +30 -14
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +13 -7
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +41 -10
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -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 +37 -25
- package/package.json +29 -17
- package/src/bin/check_oracle_version.ts +41 -31
- package/src/bin/index.ts +1 -0
- package/src/block_synchronizer/block_stream_source.ts +81 -0
- package/src/block_synchronizer/block_synchronizer.ts +39 -11
- package/src/config/index.ts +15 -9
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +391 -136
- package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -18
- package/src/contract_function_simulator/index.ts +3 -0
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +55 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +10 -9
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +36 -3
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +5 -10
- package/src/contract_function_simulator/noir-structs/option.ts +69 -0
- package/src/contract_function_simulator/oracle/interfaces.ts +85 -72
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +3 -3
- package/src/contract_function_simulator/oracle/oracle.ts +563 -482
- package/src/contract_function_simulator/oracle/oracle_registry.ts +904 -0
- package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +184 -205
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +623 -229
- package/src/contract_function_simulator/pick_notes.ts +22 -3
- package/src/contract_function_simulator/proxied_contract_data_source.ts +41 -64
- package/src/contract_logging.ts +52 -0
- package/src/contract_sync/contract_sync_service.ts +189 -0
- package/src/contract_sync/{index.ts → helpers.ts} +17 -50
- package/src/debug/pxe_debug_utils.ts +47 -25
- package/src/entrypoints/client/bundle/index.ts +2 -0
- package/src/entrypoints/client/bundle/utils.ts +19 -6
- package/src/entrypoints/client/lazy/index.ts +2 -0
- package/src/entrypoints/client/lazy/utils.ts +19 -6
- package/src/entrypoints/pxe_creation_options.ts +14 -0
- package/src/entrypoints/server/index.ts +4 -2
- package/src/entrypoints/server/utils.ts +22 -13
- package/src/events/event_service.ts +69 -21
- 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 +48 -0
- package/src/hooks/index.ts +7 -0
- package/src/logs/log_service.ts +157 -145
- package/src/messages/message_context_service.ts +45 -0
- package/src/notes/note_service.ts +120 -85
- package/src/notes_filter.ts +24 -0
- package/src/oracle_version.ts +20 -10
- package/src/private_kernel/batch_planner.ts +169 -0
- package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
- package/src/private_kernel/hints/index.ts +1 -1
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +165 -118
- package/src/private_kernel/hints/test_utils.ts +318 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +254 -89
- package/src/private_kernel/private_kernel_oracle.ts +42 -32
- package/src/pxe.ts +413 -184
- package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
- 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__/KeyStore.json +52 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +46 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +36 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/PrivateEventStore.json +44 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +18 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +16 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +22 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +97 -0
- package/src/storage/backwards_compatibility_tests/kv_store_snapshot.ts +122 -0
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +712 -0
- package/src/storage/backwards_compatibility_tests/store_spy.ts +73 -0
- package/src/storage/capsule_store/capsule_service.ts +90 -0
- package/src/storage/capsule_store/capsule_store.ts +44 -26
- package/src/storage/capsule_store/index.ts +1 -0
- package/src/storage/contract_store/contract_store.ts +182 -104
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +9 -5
- package/src/storage/open_pxe_stores.ts +49 -0
- package/src/storage/private_event_store/private_event_store.ts +4 -0
- package/src/storage/private_event_store/stored_private_event.ts +1 -1
- package/src/storage/tagging_store/recipient_tagging_store.ts +5 -5
- package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
- package/src/tagging/get_all_logs_by_tags.ts +87 -35
- package/src/tagging/index.ts +5 -4
- package/src/tagging/persist_sender_tagging_index_ranges.ts +57 -0
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +240 -0
- package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +4 -4
- package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +52 -17
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +44 -14
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +27 -27
- package/dest/contract_sync/index.d.ts +0 -24
- package/dest/contract_sync/index.d.ts.map +0 -1
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
- package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +0 -15
- 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 -15
- 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 -32
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +0 -143
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +0 -49
package/src/pxe.ts
CHANGED
|
@@ -6,7 +6,6 @@ import { SerialQueue } from '@aztec/foundation/queue';
|
|
|
6
6
|
import { Timer } from '@aztec/foundation/timer';
|
|
7
7
|
import { KeyStore } from '@aztec/key-store';
|
|
8
8
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
9
|
-
import { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
10
9
|
import { type ProtocolContractsProvider, protocolContractNames } from '@aztec/protocol-contracts';
|
|
11
10
|
import type { CircuitSimulator } from '@aztec/simulator/client';
|
|
12
11
|
import {
|
|
@@ -18,6 +17,7 @@ import {
|
|
|
18
17
|
} from '@aztec/stdlib/abi';
|
|
19
18
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
20
19
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
20
|
+
import { GENESIS_BLOCK_HEADER_HASH, type L2TipsProvider } from '@aztec/stdlib/block';
|
|
21
21
|
import {
|
|
22
22
|
CompleteAddress,
|
|
23
23
|
type ContractInstanceWithAddress,
|
|
@@ -33,6 +33,7 @@ import type {
|
|
|
33
33
|
PrivateKernelTailCircuitPublicInputs,
|
|
34
34
|
} from '@aztec/stdlib/kernel';
|
|
35
35
|
import {
|
|
36
|
+
BlockHeader,
|
|
36
37
|
type ContractOverrides,
|
|
37
38
|
type InTx,
|
|
38
39
|
PrivateExecutionResult,
|
|
@@ -46,7 +47,7 @@ import {
|
|
|
46
47
|
TxProfileResult,
|
|
47
48
|
TxProvingResult,
|
|
48
49
|
TxSimulationResult,
|
|
49
|
-
|
|
50
|
+
UtilityExecutionResult,
|
|
50
51
|
} from '@aztec/stdlib/tx';
|
|
51
52
|
|
|
52
53
|
import { inspect } from 'util';
|
|
@@ -59,11 +60,15 @@ import {
|
|
|
59
60
|
generateSimulatedProvingResult,
|
|
60
61
|
} from './contract_function_simulator/contract_function_simulator.js';
|
|
61
62
|
import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
|
|
62
|
-
import {
|
|
63
|
+
import { displayDebugLogs } from './contract_logging.js';
|
|
64
|
+
import { ContractSyncService } from './contract_sync/contract_sync_service.js';
|
|
65
|
+
import { readCurrentClassId } from './contract_sync/helpers.js';
|
|
63
66
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
64
67
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
65
68
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
69
|
+
import type { ExecutionHooks } from './hooks/index.js';
|
|
66
70
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
71
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
67
72
|
import {
|
|
68
73
|
PrivateKernelExecutionProver,
|
|
69
74
|
type PrivateKernelExecutionProverConfig,
|
|
@@ -74,16 +79,105 @@ import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_stor
|
|
|
74
79
|
import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
|
|
75
80
|
import { ContractStore } from './storage/contract_store/contract_store.js';
|
|
76
81
|
import { NoteStore } from './storage/note_store/note_store.js';
|
|
82
|
+
import { openPxeStores } from './storage/open_pxe_stores.js';
|
|
77
83
|
import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
|
|
78
84
|
import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
|
|
79
85
|
import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
|
|
80
86
|
import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
|
|
87
|
+
import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
|
|
81
88
|
|
|
82
89
|
export type PackedPrivateEvent = InTx & {
|
|
83
90
|
packedEvent: Fr[];
|
|
84
91
|
eventSelector: EventSelector;
|
|
85
92
|
};
|
|
86
93
|
|
|
94
|
+
/** Options for PXE.proveTx. */
|
|
95
|
+
export type ProveTxOpts = {
|
|
96
|
+
/** Addresses whose private state and keys are accessible during private execution. */
|
|
97
|
+
scopes: AztecAddress[];
|
|
98
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
99
|
+
senderForTags?: AztecAddress;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
/** Options for PXE.profileTx. */
|
|
103
|
+
export type ProfileTxOpts = {
|
|
104
|
+
/** The profiling mode to use. */
|
|
105
|
+
profileMode: 'full' | 'execution-steps' | 'gates';
|
|
106
|
+
/** If true, proof generation is skipped during profiling. Defaults to true. */
|
|
107
|
+
skipProofGeneration?: boolean;
|
|
108
|
+
/** Addresses whose private state and keys are accessible during private execution. */
|
|
109
|
+
scopes: AztecAddress[];
|
|
110
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
111
|
+
senderForTags?: AztecAddress;
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
/** Options for PXE.simulateTx. */
|
|
115
|
+
export type SimulateTxOpts = {
|
|
116
|
+
/** Whether to simulate the public part of the transaction. */
|
|
117
|
+
simulatePublic: boolean;
|
|
118
|
+
/** If false, this function throws if the transaction is unable to be included in a block at the current state. */
|
|
119
|
+
skipTxValidation?: boolean;
|
|
120
|
+
/** If false, fees are enforced. */
|
|
121
|
+
skipFeeEnforcement?: boolean;
|
|
122
|
+
/** If true, kernel logic is emulated in TS for simulation */
|
|
123
|
+
skipKernels?: boolean;
|
|
124
|
+
/**
|
|
125
|
+
* Pre-simulation overrides applied to the ephemeral fork and contract DB. Bundles publicStorage
|
|
126
|
+
* writes (no skipKernels required) and per-address (instance, artifact?) overrides used by both
|
|
127
|
+
* AVM-side public dispatch and PXE-side ACIR private dispatch (requires skipKernels: true).
|
|
128
|
+
*/
|
|
129
|
+
overrides?: SimulationOverrides;
|
|
130
|
+
/** Addresses whose private state and keys are accessible during private execution */
|
|
131
|
+
scopes: AztecAddress[];
|
|
132
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
133
|
+
senderForTags?: AztecAddress;
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
/** Options for PXE.executeUtility. */
|
|
137
|
+
export type ExecuteUtilityOpts = {
|
|
138
|
+
/** The authentication witnesses required for the function call. */
|
|
139
|
+
authwits?: AuthWitness[];
|
|
140
|
+
/** The accounts whose notes we can access in this call */
|
|
141
|
+
scopes: AztecAddress[];
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Supplies the set of "nice to have" contracts that every PXE preloads regardless of which wallet
|
|
146
|
+
* drives it. Today this is just the standard multi-call entrypoint: the SDK's self-paid account
|
|
147
|
+
* deploy flow ({@link DeployAccountMethod} with `from = NO_FROM`) routes its payload through it, so a
|
|
148
|
+
* PXE that did not register it would fail contract sync with an opaque "no contract instance" error.
|
|
149
|
+
*
|
|
150
|
+
* Returning a list keeps this extensible: a wallet may supply its own provider that preloads
|
|
151
|
+
* additional contracts. Injected the same way as {@link ProtocolContractsProvider} so the PXE never
|
|
152
|
+
* statically imports the bundled artifacts, keeping the bundle/lazy split intact.
|
|
153
|
+
*/
|
|
154
|
+
export type PreloadedContractsProvider = {
|
|
155
|
+
/** Returns the contract instances and artifacts the PXE should preload on startup. */
|
|
156
|
+
getPreloadedContracts: () => Promise<Array<{ instance: ContractInstanceWithAddress; artifact: ContractArtifact }>>;
|
|
157
|
+
};
|
|
158
|
+
|
|
159
|
+
/** Args for PXE.create. */
|
|
160
|
+
export type PXECreateArgs = {
|
|
161
|
+
/** The Aztec node to connect to. */
|
|
162
|
+
node: AztecNode;
|
|
163
|
+
/** The key-value store for persisting PXE state. */
|
|
164
|
+
store: AztecAsyncKVStore;
|
|
165
|
+
/** The prover for generating private kernel proofs. */
|
|
166
|
+
proofCreator: PrivateKernelProver;
|
|
167
|
+
/** The circuit simulator for executing ACIR circuits. */
|
|
168
|
+
simulator: CircuitSimulator;
|
|
169
|
+
/** Provider for protocol contract artifacts and instances. */
|
|
170
|
+
protocolContractsProvider: ProtocolContractsProvider;
|
|
171
|
+
/** Provider for the "nice to have" contracts the PXE preloads. */
|
|
172
|
+
preloadedContractsProvider: PreloadedContractsProvider;
|
|
173
|
+
/** PXE configuration options. */
|
|
174
|
+
config: PXEConfig;
|
|
175
|
+
/** Optional logger instance or string suffix for the logger name. */
|
|
176
|
+
loggerOrSuffix?: string | Logger;
|
|
177
|
+
/** Optional hooks to observe and influence contract execution. */
|
|
178
|
+
hooks?: ExecutionHooks;
|
|
179
|
+
};
|
|
180
|
+
|
|
87
181
|
/**
|
|
88
182
|
* Private eXecution Environment (PXE) is a library used by wallets to simulate private phase of transactions and to
|
|
89
183
|
* manage private state of users.
|
|
@@ -91,6 +185,7 @@ export type PackedPrivateEvent = InTx & {
|
|
|
91
185
|
export class PXE {
|
|
92
186
|
private constructor(
|
|
93
187
|
private node: AztecNode,
|
|
188
|
+
private db: AztecAsyncKVStore,
|
|
94
189
|
private blockStateSynchronizer: BlockSynchronizer,
|
|
95
190
|
private keyStore: KeyStore,
|
|
96
191
|
private contractStore: ContractStore,
|
|
@@ -102,14 +197,20 @@ export class PXE {
|
|
|
102
197
|
private recipientTaggingStore: RecipientTaggingStore,
|
|
103
198
|
private addressStore: AddressStore,
|
|
104
199
|
private privateEventStore: PrivateEventStore,
|
|
200
|
+
private contractSyncService: ContractSyncService,
|
|
201
|
+
private messageContextService: MessageContextService,
|
|
202
|
+
private l2TipsStore: L2TipsProvider,
|
|
105
203
|
private simulator: CircuitSimulator,
|
|
106
204
|
private proverEnabled: boolean,
|
|
205
|
+
private autoSync: boolean,
|
|
107
206
|
private proofCreator: PrivateKernelProver,
|
|
108
207
|
private protocolContractsProvider: ProtocolContractsProvider,
|
|
208
|
+
private preloadedContractsProvider: PreloadedContractsProvider,
|
|
109
209
|
private log: Logger,
|
|
110
210
|
private jobQueue: SerialQueue,
|
|
111
211
|
private jobCoordinator: JobCoordinator,
|
|
112
212
|
public debug: PXEDebugUtils,
|
|
213
|
+
private hooks: ExecutionHooks | undefined,
|
|
113
214
|
) {}
|
|
114
215
|
|
|
115
216
|
/**
|
|
@@ -119,15 +220,17 @@ export class PXE {
|
|
|
119
220
|
*
|
|
120
221
|
* @returns A promise that resolves PXE is ready to be used.
|
|
121
222
|
*/
|
|
122
|
-
public static async create(
|
|
123
|
-
node
|
|
124
|
-
store
|
|
125
|
-
proofCreator
|
|
126
|
-
simulator
|
|
127
|
-
protocolContractsProvider
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
223
|
+
public static async create({
|
|
224
|
+
node,
|
|
225
|
+
store,
|
|
226
|
+
proofCreator,
|
|
227
|
+
simulator,
|
|
228
|
+
protocolContractsProvider,
|
|
229
|
+
preloadedContractsProvider,
|
|
230
|
+
config,
|
|
231
|
+
loggerOrSuffix,
|
|
232
|
+
hooks,
|
|
233
|
+
}: PXECreateArgs) {
|
|
131
234
|
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
132
235
|
const bindings: LoggerBindings | undefined =
|
|
133
236
|
loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
|
|
@@ -137,25 +240,46 @@ export class PXE {
|
|
|
137
240
|
? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
|
|
138
241
|
: loggerOrSuffix;
|
|
139
242
|
|
|
140
|
-
const
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
const
|
|
149
|
-
|
|
150
|
-
const
|
|
151
|
-
const
|
|
243
|
+
const info = await node.getNodeInfo();
|
|
244
|
+
|
|
245
|
+
// Source the genesis block hash from the node so PXE's L2BlockStream agrees with the node's
|
|
246
|
+
// archiver on the dynamic initial header hash. Without this the tip store would fall back to
|
|
247
|
+
// the static `GENESIS_BLOCK_HEADER_HASH` constant, which only matches deployments with the
|
|
248
|
+
// default empty genesis (timestamp 0, no prefilled public data) and diverges otherwise — the
|
|
249
|
+
// sync at block 0 would then get stuck in `areBlockHashesEqualAt` and abort. If the node does
|
|
250
|
+
// not return a genesis block (older node or test fixture) we fall back to the static constant.
|
|
251
|
+
const initialBlockHash = (await node.getBlock(BlockNumber.ZERO))?.hash ?? GENESIS_BLOCK_HEADER_HASH;
|
|
252
|
+
|
|
253
|
+
const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
|
|
254
|
+
const {
|
|
255
|
+
addressStore,
|
|
256
|
+
privateEventStore,
|
|
257
|
+
contractStore,
|
|
258
|
+
noteStore,
|
|
259
|
+
anchorBlockStore,
|
|
260
|
+
senderTaggingStore,
|
|
261
|
+
senderAddressBookStore,
|
|
262
|
+
recipientTaggingStore,
|
|
263
|
+
capsuleStore,
|
|
264
|
+
keyStore,
|
|
265
|
+
l2TipsStore,
|
|
266
|
+
} = openPxeStores(store, initialBlockHash);
|
|
267
|
+
const contractSyncService = new ContractSyncService(
|
|
268
|
+
node,
|
|
269
|
+
contractStore,
|
|
270
|
+
noteStore,
|
|
271
|
+
createLogger('pxe:contract_sync', bindings),
|
|
272
|
+
);
|
|
273
|
+
const messageContextService = new MessageContextService(node);
|
|
274
|
+
|
|
152
275
|
const synchronizer = new BlockSynchronizer(
|
|
153
276
|
node,
|
|
154
277
|
store,
|
|
155
278
|
anchorBlockStore,
|
|
156
279
|
noteStore,
|
|
157
280
|
privateEventStore,
|
|
158
|
-
|
|
281
|
+
l2TipsStore,
|
|
282
|
+
contractSyncService,
|
|
159
283
|
config,
|
|
160
284
|
bindings,
|
|
161
285
|
);
|
|
@@ -167,14 +291,16 @@ export class PXE {
|
|
|
167
291
|
recipientTaggingStore,
|
|
168
292
|
privateEventStore,
|
|
169
293
|
noteStore,
|
|
294
|
+
contractSyncService,
|
|
170
295
|
]);
|
|
171
296
|
|
|
172
|
-
const debugUtils = new PXEDebugUtils(
|
|
297
|
+
const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
|
|
173
298
|
|
|
174
299
|
const jobQueue = new SerialQueue();
|
|
175
300
|
|
|
176
301
|
const pxe = new PXE(
|
|
177
302
|
node,
|
|
303
|
+
store,
|
|
178
304
|
synchronizer,
|
|
179
305
|
keyStore,
|
|
180
306
|
contractStore,
|
|
@@ -186,22 +312,31 @@ export class PXE {
|
|
|
186
312
|
recipientTaggingStore,
|
|
187
313
|
addressStore,
|
|
188
314
|
privateEventStore,
|
|
315
|
+
contractSyncService,
|
|
316
|
+
messageContextService,
|
|
317
|
+
l2TipsStore,
|
|
189
318
|
simulator,
|
|
190
319
|
proverEnabled,
|
|
320
|
+
config.autoSync,
|
|
191
321
|
proofCreator,
|
|
192
322
|
protocolContractsProvider,
|
|
323
|
+
preloadedContractsProvider,
|
|
193
324
|
log,
|
|
194
325
|
jobQueue,
|
|
195
326
|
jobCoordinator,
|
|
196
327
|
debugUtils,
|
|
328
|
+
hooks,
|
|
197
329
|
);
|
|
198
330
|
|
|
199
|
-
debugUtils.
|
|
331
|
+
debugUtils.setPXEHelpers(
|
|
332
|
+
pxe.#putInJobQueue.bind(pxe),
|
|
333
|
+
pxe.#getSimulatorForTx.bind(pxe),
|
|
334
|
+
pxe.#executeUtility.bind(pxe),
|
|
335
|
+
);
|
|
200
336
|
|
|
201
337
|
pxe.jobQueue.start();
|
|
202
338
|
|
|
203
|
-
await pxe.#registerProtocolContracts();
|
|
204
|
-
const info = await node.getNodeInfo();
|
|
339
|
+
await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
|
|
205
340
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
206
341
|
return pxe;
|
|
207
342
|
}
|
|
@@ -211,19 +346,23 @@ export class PXE {
|
|
|
211
346
|
#getSimulatorForTx(overrides?: { contracts?: ContractOverrides }) {
|
|
212
347
|
const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
|
|
213
348
|
|
|
214
|
-
return new ContractFunctionSimulator(
|
|
215
|
-
proxyContractStore,
|
|
216
|
-
this.noteStore,
|
|
217
|
-
this.keyStore,
|
|
218
|
-
this.addressStore,
|
|
219
|
-
BenchmarkedNodeFactory.create(this.node),
|
|
220
|
-
this.
|
|
221
|
-
this.
|
|
222
|
-
this.
|
|
223
|
-
this.
|
|
224
|
-
this.
|
|
225
|
-
this.
|
|
226
|
-
|
|
349
|
+
return new ContractFunctionSimulator({
|
|
350
|
+
contractStore: proxyContractStore,
|
|
351
|
+
noteStore: this.noteStore,
|
|
352
|
+
keyStore: this.keyStore,
|
|
353
|
+
addressStore: this.addressStore,
|
|
354
|
+
aztecNode: BenchmarkedNodeFactory.create(this.node),
|
|
355
|
+
l2TipsStore: this.l2TipsStore,
|
|
356
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
357
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
358
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
359
|
+
capsuleStore: this.capsuleStore,
|
|
360
|
+
privateEventStore: this.privateEventStore,
|
|
361
|
+
simulator: this.simulator,
|
|
362
|
+
contractSyncService: this.contractSyncService,
|
|
363
|
+
messageContextService: this.messageContextService,
|
|
364
|
+
hooks: this.hooks,
|
|
365
|
+
});
|
|
227
366
|
}
|
|
228
367
|
|
|
229
368
|
#contextualizeError(err: Error, ...context: string[]): Error {
|
|
@@ -273,53 +412,66 @@ export class PXE {
|
|
|
273
412
|
}
|
|
274
413
|
|
|
275
414
|
async #registerProtocolContracts() {
|
|
276
|
-
const registered
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
415
|
+
const registered = Object.fromEntries(
|
|
416
|
+
await Promise.all(
|
|
417
|
+
protocolContractNames.map(async name => {
|
|
418
|
+
const { address, instance, artifact } =
|
|
419
|
+
await this.protocolContractsProvider.getProtocolContractArtifact(name);
|
|
420
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
421
|
+
await this.contractStore.addContractInstance(instance);
|
|
422
|
+
return [name, address.toString()] as const;
|
|
423
|
+
}),
|
|
424
|
+
),
|
|
425
|
+
);
|
|
284
426
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
285
427
|
}
|
|
286
428
|
|
|
429
|
+
async #registerPreloadedContracts() {
|
|
430
|
+
const contracts = await this.preloadedContractsProvider.getPreloadedContracts();
|
|
431
|
+
await Promise.all(contracts.map(({ instance, artifact }) => this.registerContract({ instance, artifact })));
|
|
432
|
+
this.log.verbose(`Registered preloaded contracts in pxe`, {
|
|
433
|
+
contracts: contracts.map(({ instance }) => instance.address.toString()),
|
|
434
|
+
});
|
|
435
|
+
}
|
|
436
|
+
|
|
287
437
|
// Executes the entrypoint private function, as well as all nested private
|
|
288
438
|
// functions that might arise.
|
|
289
|
-
async #executePrivate(
|
|
290
|
-
contractFunctionSimulator
|
|
291
|
-
txRequest
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
439
|
+
async #executePrivate({
|
|
440
|
+
contractFunctionSimulator,
|
|
441
|
+
txRequest,
|
|
442
|
+
anchorBlockHeader,
|
|
443
|
+
scopes,
|
|
444
|
+
jobId,
|
|
445
|
+
senderForTags,
|
|
446
|
+
}: {
|
|
447
|
+
contractFunctionSimulator: ContractFunctionSimulator;
|
|
448
|
+
txRequest: TxExecutionRequest;
|
|
449
|
+
anchorBlockHeader: BlockHeader;
|
|
450
|
+
scopes: AztecAddress[];
|
|
451
|
+
jobId: string;
|
|
452
|
+
senderForTags?: AztecAddress;
|
|
453
|
+
}): Promise<PrivateExecutionResult> {
|
|
295
454
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
296
455
|
|
|
297
456
|
try {
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
await ensureContractSynced(
|
|
457
|
+
await this.contractSyncService.ensureContractSynced(
|
|
301
458
|
contractAddress,
|
|
302
459
|
functionSelector,
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
this.contractStore,
|
|
306
|
-
this.noteStore,
|
|
460
|
+
(privateSyncCall, execScopes) =>
|
|
461
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
307
462
|
anchorBlockHeader,
|
|
308
463
|
jobId,
|
|
464
|
+
scopes,
|
|
309
465
|
);
|
|
310
466
|
|
|
311
|
-
const result = await contractFunctionSimulator.run(
|
|
312
|
-
txRequest,
|
|
467
|
+
const result = await contractFunctionSimulator.run(txRequest, {
|
|
313
468
|
contractAddress,
|
|
314
|
-
functionSelector,
|
|
315
|
-
undefined,
|
|
469
|
+
selector: functionSelector,
|
|
316
470
|
anchorBlockHeader,
|
|
317
|
-
// The sender for tags is set by contracts, typically by an account
|
|
318
|
-
// contract entrypoint
|
|
319
|
-
undefined, // senderForTags
|
|
320
471
|
scopes,
|
|
321
472
|
jobId,
|
|
322
|
-
|
|
473
|
+
senderForTags,
|
|
474
|
+
});
|
|
323
475
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
324
476
|
return result;
|
|
325
477
|
} catch (err) {
|
|
@@ -331,25 +483,32 @@ export class PXE {
|
|
|
331
483
|
}
|
|
332
484
|
|
|
333
485
|
/**
|
|
334
|
-
*
|
|
486
|
+
* Execute a utility function call on the given contract.
|
|
335
487
|
* @param contractFunctionSimulator - The simulator to use for the function call.
|
|
336
488
|
* @param call - The function call to execute.
|
|
337
489
|
* @param authWitnesses - Authentication witnesses required for the function call.
|
|
338
490
|
* @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
|
|
339
491
|
* accounts if not specified.
|
|
340
492
|
* @param jobId - The job ID for staged writes.
|
|
341
|
-
* @returns The
|
|
493
|
+
* @returns The execution result containing the outputs of the utility function.
|
|
342
494
|
*/
|
|
343
|
-
async #
|
|
495
|
+
async #executeUtility(
|
|
344
496
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
345
497
|
call: FunctionCall,
|
|
346
498
|
authWitnesses: AuthWitness[] | undefined,
|
|
347
|
-
scopes: AztecAddress[]
|
|
499
|
+
scopes: AztecAddress[],
|
|
348
500
|
jobId: string,
|
|
349
501
|
) {
|
|
350
502
|
try {
|
|
351
503
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
352
|
-
|
|
504
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
|
|
505
|
+
call,
|
|
506
|
+
authWitnesses ?? [],
|
|
507
|
+
anchorBlockHeader,
|
|
508
|
+
scopes,
|
|
509
|
+
jobId,
|
|
510
|
+
);
|
|
511
|
+
return { result, offchainEffects };
|
|
353
512
|
} catch (err) {
|
|
354
513
|
if (err instanceof SimulationError) {
|
|
355
514
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -364,11 +523,11 @@ export class PXE {
|
|
|
364
523
|
* It can also be used for estimating gas in the future.
|
|
365
524
|
* @param tx - The transaction to be simulated.
|
|
366
525
|
*/
|
|
367
|
-
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
|
|
526
|
+
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
|
|
368
527
|
// Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
|
|
369
528
|
// Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
|
|
370
529
|
try {
|
|
371
|
-
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
|
|
530
|
+
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
|
|
372
531
|
if (result.revertReason) {
|
|
373
532
|
throw result.revertReason;
|
|
374
533
|
}
|
|
@@ -400,11 +559,10 @@ export class PXE {
|
|
|
400
559
|
txExecutionRequest: TxExecutionRequest,
|
|
401
560
|
proofCreator: PrivateKernelProver,
|
|
402
561
|
privateExecutionResult: PrivateExecutionResult,
|
|
562
|
+
anchorBlockHeader: BlockHeader,
|
|
403
563
|
config: PrivateKernelExecutionProverConfig,
|
|
404
564
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
405
|
-
const
|
|
406
|
-
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
407
|
-
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
565
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
408
566
|
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
409
567
|
kernelOracle,
|
|
410
568
|
proofCreator,
|
|
@@ -415,8 +573,43 @@ export class PXE {
|
|
|
415
573
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
416
574
|
}
|
|
417
575
|
|
|
576
|
+
/**
|
|
577
|
+
* Syncs with the node only when `autoSync` is enabled.
|
|
578
|
+
* When `autoSync` is disabled, callers (typically a wallet) are
|
|
579
|
+
* responsible for invoking `pxe.sync()` at the right granularity.
|
|
580
|
+
*/
|
|
581
|
+
async #maybeSync(): Promise<void> {
|
|
582
|
+
if (this.autoSync) {
|
|
583
|
+
await this.blockStateSynchronizer.sync();
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
|
|
418
587
|
// Public API
|
|
419
588
|
|
|
589
|
+
/**
|
|
590
|
+
* Triggers a sync of PXE state with the node, regardless of the `autoSync` config flag. Use this to
|
|
591
|
+
* batch syncs across composite flows when `autoSync` is disabled (e.g. one sync per simulate+send
|
|
592
|
+
* instead of one per inner PXE call). Serialized through the job queue.
|
|
593
|
+
*/
|
|
594
|
+
public sync(): Promise<void> {
|
|
595
|
+
return this.#putInJobQueue(() => this.blockStateSynchronizer.sync());
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
/**
|
|
599
|
+
* Returns the block header up to which the PXE has synced.
|
|
600
|
+
* @returns The synced block header
|
|
601
|
+
*/
|
|
602
|
+
public getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
603
|
+
return this.#putInJobQueue(() => {
|
|
604
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
|
|
608
|
+
/**
|
|
609
|
+
* Returns the contract instance for a given address, if it's registered in the PXE.
|
|
610
|
+
* @param address - The contract address.
|
|
611
|
+
* @returns The contract instance if found, undefined otherwise.
|
|
612
|
+
*/
|
|
420
613
|
public getContractInstance(address: AztecAddress): Promise<ContractInstanceWithAddress | undefined> {
|
|
421
614
|
return this.contractStore.getContractInstance(address);
|
|
422
615
|
}
|
|
@@ -443,7 +636,7 @@ export class PXE {
|
|
|
443
636
|
public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
|
|
444
637
|
const accounts = await this.keyStore.getAccounts();
|
|
445
638
|
const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
|
|
446
|
-
if (accounts.
|
|
639
|
+
if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
|
|
447
640
|
this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
|
|
448
641
|
return accountCompleteAddress;
|
|
449
642
|
} else {
|
|
@@ -466,8 +659,14 @@ export class PXE {
|
|
|
466
659
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
467
660
|
*/
|
|
468
661
|
public async registerSender(sender: AztecAddress): Promise<AztecAddress> {
|
|
662
|
+
if (!(await sender.isValid())) {
|
|
663
|
+
throw new Error(
|
|
664
|
+
`Address ${sender} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`,
|
|
665
|
+
);
|
|
666
|
+
}
|
|
667
|
+
|
|
469
668
|
const accounts = await this.keyStore.getAccounts();
|
|
470
|
-
if (accounts.
|
|
669
|
+
if (accounts.some(a => a.equals(sender))) {
|
|
471
670
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
472
671
|
return sender;
|
|
473
672
|
}
|
|
@@ -476,6 +675,9 @@ export class PXE {
|
|
|
476
675
|
|
|
477
676
|
if (wasAdded) {
|
|
478
677
|
this.log.info(`Added sender:\n ${sender.toString()}`);
|
|
678
|
+
// Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
|
|
679
|
+
// all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
|
|
680
|
+
await this.#putInJobQueue(() => Promise.resolve(this.contractSyncService.wipe()));
|
|
479
681
|
} else {
|
|
480
682
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
481
683
|
}
|
|
@@ -525,8 +727,7 @@ export class PXE {
|
|
|
525
727
|
* @param artifact - The build artifact for the contract class.
|
|
526
728
|
*/
|
|
527
729
|
public async registerContractClass(artifact: ContractArtifact): Promise<void> {
|
|
528
|
-
const
|
|
529
|
-
await this.contractStore.addContractArtifact(contractClassId, artifact);
|
|
730
|
+
const contractClassId = await this.contractStore.addContractArtifact(artifact);
|
|
530
731
|
this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
|
|
531
732
|
}
|
|
532
733
|
|
|
@@ -545,22 +746,24 @@ export class PXE {
|
|
|
545
746
|
if (artifact) {
|
|
546
747
|
// If the user provides an artifact, validate it against the expected class id and register it
|
|
547
748
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
548
|
-
|
|
549
|
-
if (!contractClassId.equals(instance.currentContractClassId)) {
|
|
749
|
+
if (!contractClass.id.equals(instance.currentContractClassId)) {
|
|
550
750
|
throw new Error(
|
|
551
|
-
`Artifact does not match expected class id (computed ${
|
|
751
|
+
`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`,
|
|
552
752
|
);
|
|
553
753
|
}
|
|
554
754
|
const computedAddress = await computeContractAddressFromInstance(instance);
|
|
555
755
|
if (!computedAddress.equals(instance.address)) {
|
|
556
756
|
throw new Error('Added a contract in which the address does not match the contract instance.');
|
|
557
757
|
}
|
|
558
|
-
|
|
758
|
+
|
|
759
|
+
await this.contractStore.addContractArtifact(artifact, contractClass);
|
|
559
760
|
|
|
560
761
|
const publicFunctionSignatures = artifact.functions
|
|
561
762
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
562
763
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
563
|
-
|
|
764
|
+
if (publicFunctionSignatures.length > 0) {
|
|
765
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
766
|
+
}
|
|
564
767
|
} else {
|
|
565
768
|
// Otherwise, make sure there is an artifact already registered for that class id
|
|
566
769
|
artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
|
|
@@ -595,7 +798,7 @@ export class PXE {
|
|
|
595
798
|
throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
|
|
596
799
|
}
|
|
597
800
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
598
|
-
await this
|
|
801
|
+
await this.#maybeSync();
|
|
599
802
|
|
|
600
803
|
const header = await this.anchorBlockStore.getBlockHeader();
|
|
601
804
|
|
|
@@ -604,15 +807,18 @@ export class PXE {
|
|
|
604
807
|
throw new Error('Could not update contract to a class different from the current one.');
|
|
605
808
|
}
|
|
606
809
|
|
|
607
|
-
await this.contractStore.addContractArtifact(contractClass.id, artifact);
|
|
608
|
-
|
|
609
810
|
const publicFunctionSignatures = artifact.functions
|
|
610
811
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
611
812
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
612
|
-
|
|
813
|
+
if (publicFunctionSignatures.length > 0) {
|
|
814
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
815
|
+
}
|
|
613
816
|
|
|
614
817
|
currentInstance.currentContractClassId = contractClass.id;
|
|
615
|
-
await
|
|
818
|
+
await Promise.all([
|
|
819
|
+
this.contractStore.addContractArtifact(artifact, contractClass),
|
|
820
|
+
this.contractStore.addContractInstance(currentInstance),
|
|
821
|
+
]);
|
|
616
822
|
this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
|
|
617
823
|
});
|
|
618
824
|
}
|
|
@@ -630,11 +836,12 @@ export class PXE {
|
|
|
630
836
|
* (where validators prove the public portion).
|
|
631
837
|
*
|
|
632
838
|
* @param txRequest - An authenticated tx request ready for proving
|
|
839
|
+
* @param scopes - Addresses whose private state and keys are accessible during private execution.
|
|
633
840
|
* @returns A result containing the proof and public inputs of the tail circuit.
|
|
634
841
|
* @throws If contract code not found, or public simulation reverts.
|
|
635
842
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
636
843
|
*/
|
|
637
|
-
public proveTx(txRequest: TxExecutionRequest): Promise<TxProvingResult> {
|
|
844
|
+
public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
|
|
638
845
|
let privateExecutionResult: PrivateExecutionResult;
|
|
639
846
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
640
847
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -642,17 +849,25 @@ export class PXE {
|
|
|
642
849
|
const totalTimer = new Timer();
|
|
643
850
|
try {
|
|
644
851
|
const syncTimer = new Timer();
|
|
645
|
-
await this
|
|
852
|
+
await this.#maybeSync();
|
|
853
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
646
854
|
const syncTime = syncTimer.ms();
|
|
647
855
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
648
|
-
privateExecutionResult = await this.#executePrivate(
|
|
856
|
+
privateExecutionResult = await this.#executePrivate({
|
|
857
|
+
contractFunctionSimulator,
|
|
858
|
+
txRequest,
|
|
859
|
+
anchorBlockHeader,
|
|
860
|
+
scopes,
|
|
861
|
+
jobId,
|
|
862
|
+
senderForTags,
|
|
863
|
+
});
|
|
649
864
|
|
|
650
865
|
const {
|
|
651
866
|
publicInputs,
|
|
652
867
|
chonkProof,
|
|
653
868
|
executionSteps,
|
|
654
869
|
timings: { proving } = {},
|
|
655
|
-
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
870
|
+
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
656
871
|
simulate: false,
|
|
657
872
|
skipFeeEnforcement: false,
|
|
658
873
|
profileMode: 'none',
|
|
@@ -682,23 +897,20 @@ export class PXE {
|
|
|
682
897
|
nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
|
|
683
898
|
});
|
|
684
899
|
|
|
685
|
-
//
|
|
686
|
-
//
|
|
687
|
-
//
|
|
688
|
-
//
|
|
689
|
-
//
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
} else {
|
|
700
|
-
this.log.debug(`No pre-tags used in the tx`);
|
|
701
|
-
}
|
|
900
|
+
// We keep track of which tagging indices we've used in this tx so that we don't repeat them in future txs
|
|
901
|
+
// (which would link them) without having to rely on this tx being mined (and us seeing the indices being used
|
|
902
|
+
// onchain).
|
|
903
|
+
// Note that this must happen _after_ proving as it requires the proof's public inputs, from which the kernels
|
|
904
|
+
// may have removed some logs due to note-nullifier squashing - this may lead to range of tagging indices we've
|
|
905
|
+
// actually used to being reduced.
|
|
906
|
+
await persistSenderTaggingIndexRangesForTx(
|
|
907
|
+
this.senderTaggingStore,
|
|
908
|
+
privateExecutionResult.entrypoint.taggingIndexRanges,
|
|
909
|
+
publicInputs,
|
|
910
|
+
() => txProvingResult.getTxHash(),
|
|
911
|
+
jobId,
|
|
912
|
+
this.log,
|
|
913
|
+
);
|
|
702
914
|
|
|
703
915
|
return txProvingResult;
|
|
704
916
|
} catch (err: any) {
|
|
@@ -709,17 +921,13 @@ export class PXE {
|
|
|
709
921
|
|
|
710
922
|
/**
|
|
711
923
|
* Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
|
|
712
|
-
*
|
|
713
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
714
|
-
* @param msgSender - (Optional) The message sender to use for the simulation.
|
|
715
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
924
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
716
925
|
* @returns A trace of the program execution with gate counts.
|
|
717
926
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
718
927
|
*/
|
|
719
928
|
public profileTx(
|
|
720
929
|
txRequest: TxExecutionRequest,
|
|
721
|
-
profileMode
|
|
722
|
-
skipProofGeneration: boolean = true,
|
|
930
|
+
{ profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
|
|
723
931
|
): Promise<TxProfileResult> {
|
|
724
932
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
725
933
|
return this.#putInJobQueue(async jobId => {
|
|
@@ -738,21 +946,25 @@ export class PXE {
|
|
|
738
946
|
txInfo,
|
|
739
947
|
);
|
|
740
948
|
const syncTimer = new Timer();
|
|
741
|
-
await this
|
|
949
|
+
await this.#maybeSync();
|
|
950
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
742
951
|
const syncTime = syncTimer.ms();
|
|
743
952
|
|
|
744
953
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
745
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
954
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
746
955
|
contractFunctionSimulator,
|
|
747
956
|
txRequest,
|
|
748
|
-
|
|
957
|
+
anchorBlockHeader,
|
|
958
|
+
scopes,
|
|
749
959
|
jobId,
|
|
750
|
-
|
|
960
|
+
senderForTags,
|
|
961
|
+
});
|
|
751
962
|
|
|
752
963
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
753
964
|
txRequest,
|
|
754
965
|
this.proofCreator,
|
|
755
966
|
privateExecutionResult,
|
|
967
|
+
anchorBlockHeader,
|
|
756
968
|
{
|
|
757
969
|
simulate: skipProofGeneration,
|
|
758
970
|
skipFeeEnforcement: false,
|
|
@@ -804,12 +1016,7 @@ export class PXE {
|
|
|
804
1016
|
* In that case, the transaction returned is only potentially ready to be sent to the network for execution.
|
|
805
1017
|
*
|
|
806
1018
|
*
|
|
807
|
-
* @param txRequest - An authenticated tx request ready for simulation
|
|
808
|
-
* @param simulatePublic - Whether to simulate the public part of the transaction.
|
|
809
|
-
* @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
|
|
810
|
-
* @param skipFeeEnforcement - (Optional) If false, fees are enforced.
|
|
811
|
-
* @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
|
|
812
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
1019
|
+
* @param txRequest - An authenticated tx request ready for simulation.
|
|
813
1020
|
* @returns A simulated transaction result object that includes public and private return values.
|
|
814
1021
|
* @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
|
|
815
1022
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
@@ -818,11 +1025,15 @@ export class PXE {
|
|
|
818
1025
|
*/
|
|
819
1026
|
public simulateTx(
|
|
820
1027
|
txRequest: TxExecutionRequest,
|
|
821
|
-
|
|
822
|
-
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
|
|
1028
|
+
{
|
|
1029
|
+
simulatePublic,
|
|
1030
|
+
skipTxValidation = false,
|
|
1031
|
+
skipFeeEnforcement = false,
|
|
1032
|
+
skipKernels = true,
|
|
1033
|
+
overrides,
|
|
1034
|
+
scopes,
|
|
1035
|
+
senderForTags,
|
|
1036
|
+
}: SimulateTxOpts,
|
|
826
1037
|
): Promise<TxSimulationResult> {
|
|
827
1038
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
828
1039
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -843,17 +1054,26 @@ export class PXE {
|
|
|
843
1054
|
txInfo,
|
|
844
1055
|
);
|
|
845
1056
|
const syncTimer = new Timer();
|
|
846
|
-
await this
|
|
1057
|
+
await this.#maybeSync();
|
|
1058
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
847
1059
|
const syncTime = syncTimer.ms();
|
|
848
1060
|
|
|
1061
|
+
if (overrides?.contracts && Object.keys(overrides.contracts).length > 0 && !skipKernels) {
|
|
1062
|
+
throw new Error(
|
|
1063
|
+
'Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.',
|
|
1064
|
+
);
|
|
1065
|
+
}
|
|
849
1066
|
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
850
|
-
// Temporary: in case there are overrides, we have to skip the kernels or validations
|
|
851
|
-
// will fail. Consider handing control to the user/wallet on whether they want to run them
|
|
852
|
-
// or not.
|
|
853
|
-
const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
|
|
854
1067
|
|
|
855
1068
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
856
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1069
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1070
|
+
contractFunctionSimulator,
|
|
1071
|
+
txRequest,
|
|
1072
|
+
anchorBlockHeader,
|
|
1073
|
+
scopes,
|
|
1074
|
+
jobId,
|
|
1075
|
+
senderForTags,
|
|
1076
|
+
});
|
|
857
1077
|
|
|
858
1078
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
859
1079
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
@@ -861,15 +1081,22 @@ export class PXE {
|
|
|
861
1081
|
if (skipKernels) {
|
|
862
1082
|
({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
|
|
863
1083
|
privateExecutionResult,
|
|
864
|
-
this.contractStore,
|
|
1084
|
+
(addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
|
|
1085
|
+
this.node,
|
|
865
1086
|
));
|
|
866
1087
|
} else {
|
|
867
1088
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
868
|
-
({ publicInputs, executionSteps } = await this.#prove(
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
1089
|
+
({ publicInputs, executionSteps } = await this.#prove(
|
|
1090
|
+
txRequest,
|
|
1091
|
+
this.proofCreator,
|
|
1092
|
+
privateExecutionResult,
|
|
1093
|
+
anchorBlockHeader,
|
|
1094
|
+
{
|
|
1095
|
+
simulate: true,
|
|
1096
|
+
skipFeeEnforcement,
|
|
1097
|
+
profileMode: 'none',
|
|
1098
|
+
},
|
|
1099
|
+
));
|
|
873
1100
|
}
|
|
874
1101
|
|
|
875
1102
|
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
@@ -878,8 +1105,11 @@ export class PXE {
|
|
|
878
1105
|
let publicOutput: PublicSimulationOutput | undefined;
|
|
879
1106
|
if (simulatePublic && publicInputs.forPublic) {
|
|
880
1107
|
const publicSimulationTimer = new Timer();
|
|
881
|
-
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
1108
|
+
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
|
|
882
1109
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
1110
|
+
if (publicOutput?.debugLogs?.length) {
|
|
1111
|
+
await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
|
|
1112
|
+
}
|
|
883
1113
|
}
|
|
884
1114
|
|
|
885
1115
|
let validationTime: number | undefined;
|
|
@@ -888,7 +1118,8 @@ export class PXE {
|
|
|
888
1118
|
const validationResult = await this.node.isValidTx(simulatedTx, { isSimulation: true, skipFeeEnforcement });
|
|
889
1119
|
validationTime = validationTimer.ms();
|
|
890
1120
|
if (validationResult.result === 'invalid') {
|
|
891
|
-
|
|
1121
|
+
const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
|
|
1122
|
+
throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
|
|
892
1123
|
}
|
|
893
1124
|
}
|
|
894
1125
|
|
|
@@ -939,51 +1170,44 @@ export class PXE {
|
|
|
939
1170
|
inspect(txRequest),
|
|
940
1171
|
`simulatePublic=${simulatePublic}`,
|
|
941
1172
|
`skipTxValidation=${skipTxValidation}`,
|
|
942
|
-
`scopes=${scopes
|
|
1173
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
943
1174
|
);
|
|
944
1175
|
}
|
|
945
1176
|
});
|
|
946
1177
|
}
|
|
947
1178
|
|
|
948
1179
|
/**
|
|
949
|
-
*
|
|
950
|
-
*
|
|
1180
|
+
* Executes a contract utility function.
|
|
951
1181
|
* @param call - The function call containing the function details, arguments, and target contract address.
|
|
952
|
-
* @param authwits - (Optional) The authentication witnesses required for the function call.
|
|
953
|
-
* @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
|
|
954
|
-
* default to all.
|
|
955
|
-
* @returns The result of the utility function call, structured based on the function ABI.
|
|
956
1182
|
*/
|
|
957
|
-
public
|
|
1183
|
+
public executeUtility(
|
|
958
1184
|
call: FunctionCall,
|
|
959
|
-
authwits
|
|
960
|
-
|
|
961
|
-
|
|
962
|
-
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
1185
|
+
{ authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
|
|
1186
|
+
): Promise<UtilityExecutionResult> {
|
|
1187
|
+
// We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
|
|
963
1188
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
964
|
-
// delete the same read value, or reading values that another
|
|
1189
|
+
// delete the same read value, or reading values that another execution is currently modifying).
|
|
965
1190
|
return this.#putInJobQueue(async jobId => {
|
|
966
1191
|
try {
|
|
967
1192
|
const totalTimer = new Timer();
|
|
968
1193
|
const syncTimer = new Timer();
|
|
969
|
-
await this
|
|
1194
|
+
await this.#maybeSync();
|
|
970
1195
|
const syncTime = syncTimer.ms();
|
|
971
1196
|
const functionTimer = new Timer();
|
|
972
1197
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
973
1198
|
|
|
974
1199
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
975
|
-
await ensureContractSynced(
|
|
1200
|
+
await this.contractSyncService.ensureContractSynced(
|
|
976
1201
|
call.to,
|
|
977
1202
|
call.selector,
|
|
978
|
-
|
|
979
|
-
|
|
980
|
-
this.contractStore,
|
|
981
|
-
this.noteStore,
|
|
1203
|
+
(privateSyncCall, execScopes) =>
|
|
1204
|
+
this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
982
1205
|
anchorBlockHeader,
|
|
983
1206
|
jobId,
|
|
1207
|
+
scopes,
|
|
984
1208
|
);
|
|
985
1209
|
|
|
986
|
-
const executionResult = await this.#
|
|
1210
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
987
1211
|
contractFunctionSimulator,
|
|
988
1212
|
call,
|
|
989
1213
|
authwits ?? [],
|
|
@@ -1004,14 +1228,19 @@ export class PXE {
|
|
|
1004
1228
|
};
|
|
1005
1229
|
|
|
1006
1230
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
1007
|
-
return {
|
|
1231
|
+
return {
|
|
1232
|
+
result: executionResult,
|
|
1233
|
+
offchainEffects,
|
|
1234
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1235
|
+
stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
|
|
1236
|
+
};
|
|
1008
1237
|
} catch (err: any) {
|
|
1009
1238
|
const { to, name, args } = call;
|
|
1010
1239
|
const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
|
|
1011
1240
|
throw this.#contextualizeError(
|
|
1012
1241
|
err,
|
|
1013
|
-
`
|
|
1014
|
-
`scopes=${scopes
|
|
1242
|
+
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1243
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1015
1244
|
);
|
|
1016
1245
|
}
|
|
1017
1246
|
});
|
|
@@ -1037,23 +1266,21 @@ export class PXE {
|
|
|
1037
1266
|
let anchorBlockNumber: BlockNumber;
|
|
1038
1267
|
|
|
1039
1268
|
await this.#putInJobQueue(async jobId => {
|
|
1040
|
-
await this
|
|
1269
|
+
await this.#maybeSync();
|
|
1041
1270
|
|
|
1042
1271
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1043
1272
|
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
1044
1273
|
|
|
1045
1274
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
1046
1275
|
|
|
1047
|
-
await ensureContractSynced(
|
|
1276
|
+
await this.contractSyncService.ensureContractSynced(
|
|
1048
1277
|
filter.contractAddress,
|
|
1049
1278
|
null,
|
|
1050
|
-
async privateSyncCall =>
|
|
1051
|
-
await this.#
|
|
1052
|
-
this.node,
|
|
1053
|
-
this.contractStore,
|
|
1054
|
-
this.noteStore,
|
|
1279
|
+
async (privateSyncCall, execScopes) =>
|
|
1280
|
+
await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId),
|
|
1055
1281
|
anchorBlockHeader,
|
|
1056
1282
|
jobId,
|
|
1283
|
+
filter.scopes,
|
|
1057
1284
|
);
|
|
1058
1285
|
});
|
|
1059
1286
|
|
|
@@ -1068,9 +1295,11 @@ export class PXE {
|
|
|
1068
1295
|
}
|
|
1069
1296
|
|
|
1070
1297
|
/**
|
|
1071
|
-
* Stops the PXE's job queue.
|
|
1298
|
+
* Stops the PXE's job queue and closes the backing store.
|
|
1072
1299
|
*/
|
|
1073
|
-
public stop(): Promise<void> {
|
|
1074
|
-
|
|
1300
|
+
public async stop(): Promise<void> {
|
|
1301
|
+
await this.jobQueue.end();
|
|
1302
|
+
await this.blockStateSynchronizer.stop();
|
|
1303
|
+
await this.db.close();
|
|
1075
1304
|
}
|
|
1076
1305
|
}
|