@aztec/pxe 0.0.1-commit.72dcdcda8 → 0.0.1-commit.7689c7f
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 +6 -2
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +30 -10
- 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/contract_function_simulator/contract_function_simulator.d.ts +16 -5
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +53 -18
- 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 -287
- 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 +44 -70
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +94 -97
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +112 -67
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +395 -141
- 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 +9 -4
- package/dest/contract_logging.d.ts.map +1 -1
- package/dest/contract_logging.js +21 -6
- package/dest/contract_sync/contract_sync_service.d.ts +7 -8
- package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
- package/dest/contract_sync/contract_sync_service.js +87 -49
- package/dest/contract_sync/helpers.d.ts +2 -4
- package/dest/contract_sync/helpers.d.ts.map +1 -1
- package/dest/contract_sync/helpers.js +12 -14
- package/dest/debug/pxe_debug_utils.d.ts +3 -8
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +0 -6
- package/dest/entrypoints/client/bundle/index.d.ts +1 -2
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +0 -1
- 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 +13 -5
- package/dest/entrypoints/client/lazy/index.d.ts +1 -2
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +0 -1
- 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 +13 -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 +3 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +2 -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 +13 -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 -9
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +122 -72
- 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 -6
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +80 -56
- package/dest/notes_filter.d.ts +2 -3
- package/dest/notes_filter.d.ts.map +1 -1
- 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.js +1 -1
- 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 +2 -3
- 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 +152 -59
- package/dest/private_kernel/private_kernel_oracle.d.ts +10 -10
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +24 -22
- package/dest/pxe.d.ts +59 -10
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +154 -93
- 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 +1 -1
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +9 -26
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +1 -1
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +2 -2
- 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 +36 -37
- 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/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 -5
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +29 -10
- 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 -4
- 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 +26 -13
- package/package.json +20 -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 +33 -11
- package/src/config/index.ts +15 -9
- package/src/contract_function_simulator/contract_function_simulator.ts +82 -22
- 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 +558 -484
- 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 +119 -132
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +543 -221
- 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 +18 -5
- package/src/contract_sync/contract_sync_service.ts +120 -83
- package/src/contract_sync/helpers.ts +13 -25
- package/src/debug/pxe_debug_utils.ts +3 -11
- package/src/entrypoints/client/bundle/index.ts +0 -1
- package/src/entrypoints/client/bundle/utils.ts +10 -5
- package/src/entrypoints/client/lazy/index.ts +0 -1
- package/src/entrypoints/client/lazy/utils.ts +10 -5
- package/src/entrypoints/pxe_creation_options.ts +14 -0
- package/src/entrypoints/server/index.ts +2 -2
- package/src/entrypoints/server/utils.ts +15 -6
- 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 +153 -134
- package/src/messages/message_context_service.ts +45 -0
- package/src/notes/note_service.ts +119 -85
- package/src/notes_filter.ts +1 -3
- 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 +1 -1
- package/src/private_kernel/hints/test_utils.ts +2 -9
- package/src/private_kernel/private_kernel_execution_prover.ts +240 -82
- package/src/private_kernel/private_kernel_oracle.ts +35 -25
- package/src/pxe.ts +262 -98
- 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 +14 -35
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +2 -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 -9
- package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
- package/src/tagging/get_all_logs_by_tags.ts +78 -50
- 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 +2 -2
- package/src/tagging/reconcile_tagging_index_ranges.ts +102 -0
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +52 -12
- 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 +23 -14
- package/dest/access_scopes.d.ts +0 -9
- package/dest/access_scopes.d.ts.map +0 -1
- package/dest/access_scopes.js +0 -6
- 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/src/access_scopes.ts +0 -9
- 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/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,
|
|
@@ -52,7 +52,6 @@ import {
|
|
|
52
52
|
|
|
53
53
|
import { inspect } from 'util';
|
|
54
54
|
|
|
55
|
-
import type { AccessScopes } from './access_scopes.js';
|
|
56
55
|
import { BlockSynchronizer } from './block_synchronizer/index.js';
|
|
57
56
|
import type { PXEConfig } from './config/index.js';
|
|
58
57
|
import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
|
|
@@ -67,7 +66,9 @@ import { readCurrentClassId } from './contract_sync/helpers.js';
|
|
|
67
66
|
import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
|
|
68
67
|
import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
|
|
69
68
|
import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
|
|
69
|
+
import type { ExecutionHooks } from './hooks/index.js';
|
|
70
70
|
import { JobCoordinator } from './job_coordinator/job_coordinator.js';
|
|
71
|
+
import { MessageContextService } from './messages/message_context_service.js';
|
|
71
72
|
import {
|
|
72
73
|
PrivateKernelExecutionProver,
|
|
73
74
|
type PrivateKernelExecutionProverConfig,
|
|
@@ -78,16 +79,26 @@ import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_stor
|
|
|
78
79
|
import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
|
|
79
80
|
import { ContractStore } from './storage/contract_store/contract_store.js';
|
|
80
81
|
import { NoteStore } from './storage/note_store/note_store.js';
|
|
82
|
+
import { openPxeStores } from './storage/open_pxe_stores.js';
|
|
81
83
|
import { PrivateEventStore } from './storage/private_event_store/private_event_store.js';
|
|
82
84
|
import { RecipientTaggingStore } from './storage/tagging_store/recipient_tagging_store.js';
|
|
83
85
|
import { SenderAddressBookStore } from './storage/tagging_store/sender_address_book_store.js';
|
|
84
86
|
import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store.js';
|
|
87
|
+
import { persistSenderTaggingIndexRangesForTx } from './tagging/index.js';
|
|
85
88
|
|
|
86
89
|
export type PackedPrivateEvent = InTx & {
|
|
87
90
|
packedEvent: Fr[];
|
|
88
91
|
eventSelector: EventSelector;
|
|
89
92
|
};
|
|
90
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
|
+
|
|
91
102
|
/** Options for PXE.profileTx. */
|
|
92
103
|
export type ProfileTxOpts = {
|
|
93
104
|
/** The profiling mode to use. */
|
|
@@ -95,7 +106,9 @@ export type ProfileTxOpts = {
|
|
|
95
106
|
/** If true, proof generation is skipped during profiling. Defaults to true. */
|
|
96
107
|
skipProofGeneration?: boolean;
|
|
97
108
|
/** Addresses whose private state and keys are accessible during private execution. */
|
|
98
|
-
scopes:
|
|
109
|
+
scopes: AztecAddress[];
|
|
110
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
111
|
+
senderForTags?: AztecAddress;
|
|
99
112
|
};
|
|
100
113
|
|
|
101
114
|
/** Options for PXE.simulateTx. */
|
|
@@ -106,10 +119,18 @@ export type SimulateTxOpts = {
|
|
|
106
119
|
skipTxValidation?: boolean;
|
|
107
120
|
/** If false, fees are enforced. */
|
|
108
121
|
skipFeeEnforcement?: boolean;
|
|
109
|
-
/**
|
|
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
|
+
*/
|
|
110
129
|
overrides?: SimulationOverrides;
|
|
111
130
|
/** Addresses whose private state and keys are accessible during private execution */
|
|
112
|
-
scopes:
|
|
131
|
+
scopes: AztecAddress[];
|
|
132
|
+
/** Sender address used to derive discovery tags for private messages (notes, events, logs) this tx emits. */
|
|
133
|
+
senderForTags?: AztecAddress;
|
|
113
134
|
};
|
|
114
135
|
|
|
115
136
|
/** Options for PXE.executeUtility. */
|
|
@@ -117,7 +138,22 @@ export type ExecuteUtilityOpts = {
|
|
|
117
138
|
/** The authentication witnesses required for the function call. */
|
|
118
139
|
authwits?: AuthWitness[];
|
|
119
140
|
/** The accounts whose notes we can access in this call */
|
|
120
|
-
scopes:
|
|
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 }>>;
|
|
121
157
|
};
|
|
122
158
|
|
|
123
159
|
/** Args for PXE.create. */
|
|
@@ -132,10 +168,14 @@ export type PXECreateArgs = {
|
|
|
132
168
|
simulator: CircuitSimulator;
|
|
133
169
|
/** Provider for protocol contract artifacts and instances. */
|
|
134
170
|
protocolContractsProvider: ProtocolContractsProvider;
|
|
171
|
+
/** Provider for the "nice to have" contracts the PXE preloads. */
|
|
172
|
+
preloadedContractsProvider: PreloadedContractsProvider;
|
|
135
173
|
/** PXE configuration options. */
|
|
136
174
|
config: PXEConfig;
|
|
137
175
|
/** Optional logger instance or string suffix for the logger name. */
|
|
138
176
|
loggerOrSuffix?: string | Logger;
|
|
177
|
+
/** Optional hooks to observe and influence contract execution. */
|
|
178
|
+
hooks?: ExecutionHooks;
|
|
139
179
|
};
|
|
140
180
|
|
|
141
181
|
/**
|
|
@@ -158,14 +198,19 @@ export class PXE {
|
|
|
158
198
|
private addressStore: AddressStore,
|
|
159
199
|
private privateEventStore: PrivateEventStore,
|
|
160
200
|
private contractSyncService: ContractSyncService,
|
|
201
|
+
private messageContextService: MessageContextService,
|
|
202
|
+
private l2TipsStore: L2TipsProvider,
|
|
161
203
|
private simulator: CircuitSimulator,
|
|
162
204
|
private proverEnabled: boolean,
|
|
205
|
+
private autoSync: boolean,
|
|
163
206
|
private proofCreator: PrivateKernelProver,
|
|
164
207
|
private protocolContractsProvider: ProtocolContractsProvider,
|
|
208
|
+
private preloadedContractsProvider: PreloadedContractsProvider,
|
|
165
209
|
private log: Logger,
|
|
166
210
|
private jobQueue: SerialQueue,
|
|
167
211
|
private jobCoordinator: JobCoordinator,
|
|
168
212
|
public debug: PXEDebugUtils,
|
|
213
|
+
private hooks: ExecutionHooks | undefined,
|
|
169
214
|
) {}
|
|
170
215
|
|
|
171
216
|
/**
|
|
@@ -181,8 +226,10 @@ export class PXE {
|
|
|
181
226
|
proofCreator,
|
|
182
227
|
simulator,
|
|
183
228
|
protocolContractsProvider,
|
|
229
|
+
preloadedContractsProvider,
|
|
184
230
|
config,
|
|
185
231
|
loggerOrSuffix,
|
|
232
|
+
hooks,
|
|
186
233
|
}: PXECreateArgs) {
|
|
187
234
|
// Extract bindings from the logger, or use empty bindings if a string suffix is provided.
|
|
188
235
|
const bindings: LoggerBindings | undefined =
|
|
@@ -195,31 +242,43 @@ export class PXE {
|
|
|
195
242
|
|
|
196
243
|
const info = await node.getNodeInfo();
|
|
197
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
|
+
|
|
198
253
|
const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
|
|
199
|
-
const
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
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);
|
|
210
267
|
const contractSyncService = new ContractSyncService(
|
|
211
268
|
node,
|
|
212
269
|
contractStore,
|
|
213
270
|
noteStore,
|
|
214
271
|
createLogger('pxe:contract_sync', bindings),
|
|
215
272
|
);
|
|
273
|
+
const messageContextService = new MessageContextService(node);
|
|
274
|
+
|
|
216
275
|
const synchronizer = new BlockSynchronizer(
|
|
217
276
|
node,
|
|
218
277
|
store,
|
|
219
278
|
anchorBlockStore,
|
|
220
279
|
noteStore,
|
|
221
280
|
privateEventStore,
|
|
222
|
-
|
|
281
|
+
l2TipsStore,
|
|
223
282
|
contractSyncService,
|
|
224
283
|
config,
|
|
225
284
|
bindings,
|
|
@@ -254,14 +313,19 @@ export class PXE {
|
|
|
254
313
|
addressStore,
|
|
255
314
|
privateEventStore,
|
|
256
315
|
contractSyncService,
|
|
316
|
+
messageContextService,
|
|
317
|
+
l2TipsStore,
|
|
257
318
|
simulator,
|
|
258
319
|
proverEnabled,
|
|
320
|
+
config.autoSync,
|
|
259
321
|
proofCreator,
|
|
260
322
|
protocolContractsProvider,
|
|
323
|
+
preloadedContractsProvider,
|
|
261
324
|
log,
|
|
262
325
|
jobQueue,
|
|
263
326
|
jobCoordinator,
|
|
264
327
|
debugUtils,
|
|
328
|
+
hooks,
|
|
265
329
|
);
|
|
266
330
|
|
|
267
331
|
debugUtils.setPXEHelpers(
|
|
@@ -272,7 +336,7 @@ export class PXE {
|
|
|
272
336
|
|
|
273
337
|
pxe.jobQueue.start();
|
|
274
338
|
|
|
275
|
-
await pxe.#registerProtocolContracts();
|
|
339
|
+
await Promise.all([pxe.#registerProtocolContracts(), pxe.#registerPreloadedContracts()]);
|
|
276
340
|
log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
|
|
277
341
|
return pxe;
|
|
278
342
|
}
|
|
@@ -288,6 +352,7 @@ export class PXE {
|
|
|
288
352
|
keyStore: this.keyStore,
|
|
289
353
|
addressStore: this.addressStore,
|
|
290
354
|
aztecNode: BenchmarkedNodeFactory.create(this.node),
|
|
355
|
+
l2TipsStore: this.l2TipsStore,
|
|
291
356
|
senderTaggingStore: this.senderTaggingStore,
|
|
292
357
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
293
358
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
@@ -295,6 +360,8 @@ export class PXE {
|
|
|
295
360
|
privateEventStore: this.privateEventStore,
|
|
296
361
|
simulator: this.simulator,
|
|
297
362
|
contractSyncService: this.contractSyncService,
|
|
363
|
+
messageContextService: this.messageContextService,
|
|
364
|
+
hooks: this.hooks,
|
|
298
365
|
});
|
|
299
366
|
}
|
|
300
367
|
|
|
@@ -345,29 +412,48 @@ export class PXE {
|
|
|
345
412
|
}
|
|
346
413
|
|
|
347
414
|
async #registerProtocolContracts() {
|
|
348
|
-
const registered
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
+
);
|
|
355
426
|
this.log.verbose(`Registered protocol contracts in pxe`, registered);
|
|
356
427
|
}
|
|
357
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
|
+
|
|
358
437
|
// Executes the entrypoint private function, as well as all nested private
|
|
359
438
|
// functions that might arise.
|
|
360
|
-
async #executePrivate(
|
|
361
|
-
contractFunctionSimulator
|
|
362
|
-
txRequest
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
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> {
|
|
366
454
|
const { origin: contractAddress, functionSelector } = txRequest;
|
|
367
455
|
|
|
368
456
|
try {
|
|
369
|
-
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
370
|
-
|
|
371
457
|
await this.contractSyncService.ensureContractSynced(
|
|
372
458
|
contractAddress,
|
|
373
459
|
functionSelector,
|
|
@@ -384,6 +470,7 @@ export class PXE {
|
|
|
384
470
|
anchorBlockHeader,
|
|
385
471
|
scopes,
|
|
386
472
|
jobId,
|
|
473
|
+
senderForTags,
|
|
387
474
|
});
|
|
388
475
|
this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
|
|
389
476
|
return result;
|
|
@@ -409,12 +496,19 @@ export class PXE {
|
|
|
409
496
|
contractFunctionSimulator: ContractFunctionSimulator,
|
|
410
497
|
call: FunctionCall,
|
|
411
498
|
authWitnesses: AuthWitness[] | undefined,
|
|
412
|
-
scopes:
|
|
499
|
+
scopes: AztecAddress[],
|
|
413
500
|
jobId: string,
|
|
414
501
|
) {
|
|
415
502
|
try {
|
|
416
503
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
417
|
-
|
|
504
|
+
const { result, offchainEffects } = await contractFunctionSimulator.runUtility(
|
|
505
|
+
call,
|
|
506
|
+
authWitnesses ?? [],
|
|
507
|
+
anchorBlockHeader,
|
|
508
|
+
scopes,
|
|
509
|
+
jobId,
|
|
510
|
+
);
|
|
511
|
+
return { result, offchainEffects };
|
|
418
512
|
} catch (err) {
|
|
419
513
|
if (err instanceof SimulationError) {
|
|
420
514
|
await enrichSimulationError(err, this.contractStore, this.log);
|
|
@@ -429,11 +523,11 @@ export class PXE {
|
|
|
429
523
|
* It can also be used for estimating gas in the future.
|
|
430
524
|
* @param tx - The transaction to be simulated.
|
|
431
525
|
*/
|
|
432
|
-
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean) {
|
|
526
|
+
async #simulatePublicCalls(tx: Tx, skipFeeEnforcement: boolean, overrides?: SimulationOverrides) {
|
|
433
527
|
// Simulating public calls can throw if the TX fails in a phase that doesn't allow reverts (setup)
|
|
434
528
|
// Or return as reverted if it fails in a phase that allows reverts (app logic, teardown)
|
|
435
529
|
try {
|
|
436
|
-
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement);
|
|
530
|
+
const result = await this.node.simulatePublicCalls(tx, skipFeeEnforcement, overrides);
|
|
437
531
|
if (result.revertReason) {
|
|
438
532
|
throw result.revertReason;
|
|
439
533
|
}
|
|
@@ -465,11 +559,10 @@ export class PXE {
|
|
|
465
559
|
txExecutionRequest: TxExecutionRequest,
|
|
466
560
|
proofCreator: PrivateKernelProver,
|
|
467
561
|
privateExecutionResult: PrivateExecutionResult,
|
|
562
|
+
anchorBlockHeader: BlockHeader,
|
|
468
563
|
config: PrivateKernelExecutionProverConfig,
|
|
469
564
|
): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
|
|
470
|
-
const
|
|
471
|
-
const anchorBlockHash = await anchorBlockHeader.hash();
|
|
472
|
-
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
|
|
565
|
+
const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
|
|
473
566
|
const kernelTraceProver = new PrivateKernelExecutionProver(
|
|
474
567
|
kernelOracle,
|
|
475
568
|
proofCreator,
|
|
@@ -480,14 +573,36 @@ export class PXE {
|
|
|
480
573
|
return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
|
|
481
574
|
}
|
|
482
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
|
+
|
|
483
587
|
// Public API
|
|
484
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
|
+
|
|
485
598
|
/**
|
|
486
599
|
* Returns the block header up to which the PXE has synced.
|
|
487
600
|
* @returns The synced block header
|
|
488
601
|
*/
|
|
489
602
|
public getSyncedBlockHeader(): Promise<BlockHeader> {
|
|
490
|
-
return this
|
|
603
|
+
return this.#putInJobQueue(() => {
|
|
604
|
+
return this.anchorBlockStore.getBlockHeader();
|
|
605
|
+
});
|
|
491
606
|
}
|
|
492
607
|
|
|
493
608
|
/**
|
|
@@ -521,7 +636,7 @@ export class PXE {
|
|
|
521
636
|
public async registerAccount(secretKey: Fr, partialAddress: PartialAddress): Promise<CompleteAddress> {
|
|
522
637
|
const accounts = await this.keyStore.getAccounts();
|
|
523
638
|
const accountCompleteAddress = await this.keyStore.addAccount(secretKey, partialAddress);
|
|
524
|
-
if (accounts.
|
|
639
|
+
if (accounts.some(a => a.equals(accountCompleteAddress.address))) {
|
|
525
640
|
this.log.info(`Account:\n "${accountCompleteAddress.address.toString()}"\n already registered.`);
|
|
526
641
|
return accountCompleteAddress;
|
|
527
642
|
} else {
|
|
@@ -544,8 +659,14 @@ export class PXE {
|
|
|
544
659
|
* TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
|
|
545
660
|
*/
|
|
546
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
|
+
|
|
547
668
|
const accounts = await this.keyStore.getAccounts();
|
|
548
|
-
if (accounts.
|
|
669
|
+
if (accounts.some(a => a.equals(sender))) {
|
|
549
670
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
550
671
|
return sender;
|
|
551
672
|
}
|
|
@@ -554,6 +675,9 @@ export class PXE {
|
|
|
554
675
|
|
|
555
676
|
if (wasAdded) {
|
|
556
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()));
|
|
557
681
|
} else {
|
|
558
682
|
this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
|
|
559
683
|
}
|
|
@@ -637,7 +761,9 @@ export class PXE {
|
|
|
637
761
|
const publicFunctionSignatures = artifact.functions
|
|
638
762
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
639
763
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
640
|
-
|
|
764
|
+
if (publicFunctionSignatures.length > 0) {
|
|
765
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
766
|
+
}
|
|
641
767
|
} else {
|
|
642
768
|
// Otherwise, make sure there is an artifact already registered for that class id
|
|
643
769
|
artifact = await this.contractStore.getContractArtifact(instance.currentContractClassId);
|
|
@@ -672,7 +798,7 @@ export class PXE {
|
|
|
672
798
|
throw new Error(`Instance not found when updating a contract. Contract address: ${contractAddress}.`);
|
|
673
799
|
}
|
|
674
800
|
const contractClass = await getContractClassFromArtifact(artifact);
|
|
675
|
-
await this
|
|
801
|
+
await this.#maybeSync();
|
|
676
802
|
|
|
677
803
|
const header = await this.anchorBlockStore.getBlockHeader();
|
|
678
804
|
|
|
@@ -684,7 +810,9 @@ export class PXE {
|
|
|
684
810
|
const publicFunctionSignatures = artifact.functions
|
|
685
811
|
.filter(fn => fn.functionType === FunctionType.PUBLIC)
|
|
686
812
|
.map(fn => decodeFunctionSignature(fn.name, fn.parameters));
|
|
687
|
-
|
|
813
|
+
if (publicFunctionSignatures.length > 0) {
|
|
814
|
+
await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
|
|
815
|
+
}
|
|
688
816
|
|
|
689
817
|
currentInstance.currentContractClassId = contractClass.id;
|
|
690
818
|
await Promise.all([
|
|
@@ -713,7 +841,7 @@ export class PXE {
|
|
|
713
841
|
* @throws If contract code not found, or public simulation reverts.
|
|
714
842
|
* Also throws if simulatePublic is true and public simulation reverts.
|
|
715
843
|
*/
|
|
716
|
-
public proveTx(txRequest: TxExecutionRequest, scopes:
|
|
844
|
+
public proveTx(txRequest: TxExecutionRequest, { scopes, senderForTags }: ProveTxOpts): Promise<TxProvingResult> {
|
|
717
845
|
let privateExecutionResult: PrivateExecutionResult;
|
|
718
846
|
// We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
|
|
719
847
|
// computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
|
|
@@ -721,17 +849,25 @@ export class PXE {
|
|
|
721
849
|
const totalTimer = new Timer();
|
|
722
850
|
try {
|
|
723
851
|
const syncTimer = new Timer();
|
|
724
|
-
await this
|
|
852
|
+
await this.#maybeSync();
|
|
853
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
725
854
|
const syncTime = syncTimer.ms();
|
|
726
855
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
727
|
-
privateExecutionResult = await this.#executePrivate(
|
|
856
|
+
privateExecutionResult = await this.#executePrivate({
|
|
857
|
+
contractFunctionSimulator,
|
|
858
|
+
txRequest,
|
|
859
|
+
anchorBlockHeader,
|
|
860
|
+
scopes,
|
|
861
|
+
jobId,
|
|
862
|
+
senderForTags,
|
|
863
|
+
});
|
|
728
864
|
|
|
729
865
|
const {
|
|
730
866
|
publicInputs,
|
|
731
867
|
chonkProof,
|
|
732
868
|
executionSteps,
|
|
733
869
|
timings: { proving } = {},
|
|
734
|
-
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
|
|
870
|
+
} = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
|
|
735
871
|
simulate: false,
|
|
736
872
|
skipFeeEnforcement: false,
|
|
737
873
|
profileMode: 'none',
|
|
@@ -761,23 +897,20 @@ export class PXE {
|
|
|
761
897
|
nodeRPCCalls: contractFunctionSimulator?.getStats().nodeRPCCalls,
|
|
762
898
|
});
|
|
763
899
|
|
|
764
|
-
//
|
|
765
|
-
//
|
|
766
|
-
//
|
|
767
|
-
//
|
|
768
|
-
//
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
773
|
-
|
|
774
|
-
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
} else {
|
|
779
|
-
this.log.debug(`No pre-tags used in the tx`);
|
|
780
|
-
}
|
|
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
|
+
);
|
|
781
914
|
|
|
782
915
|
return txProvingResult;
|
|
783
916
|
} catch (err: any) {
|
|
@@ -794,7 +927,7 @@ export class PXE {
|
|
|
794
927
|
*/
|
|
795
928
|
public profileTx(
|
|
796
929
|
txRequest: TxExecutionRequest,
|
|
797
|
-
{ profileMode, skipProofGeneration = true, scopes }: ProfileTxOpts,
|
|
930
|
+
{ profileMode, skipProofGeneration = true, scopes, senderForTags }: ProfileTxOpts,
|
|
798
931
|
): Promise<TxProfileResult> {
|
|
799
932
|
// We disable concurrent profiles for consistency with simulateTx.
|
|
800
933
|
return this.#putInJobQueue(async jobId => {
|
|
@@ -813,16 +946,25 @@ export class PXE {
|
|
|
813
946
|
txInfo,
|
|
814
947
|
);
|
|
815
948
|
const syncTimer = new Timer();
|
|
816
|
-
await this
|
|
949
|
+
await this.#maybeSync();
|
|
950
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
817
951
|
const syncTime = syncTimer.ms();
|
|
818
952
|
|
|
819
953
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
820
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
954
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
955
|
+
contractFunctionSimulator,
|
|
956
|
+
txRequest,
|
|
957
|
+
anchorBlockHeader,
|
|
958
|
+
scopes,
|
|
959
|
+
jobId,
|
|
960
|
+
senderForTags,
|
|
961
|
+
});
|
|
821
962
|
|
|
822
963
|
const { executionSteps, timings: { proving } = {} } = await this.#prove(
|
|
823
964
|
txRequest,
|
|
824
965
|
this.proofCreator,
|
|
825
966
|
privateExecutionResult,
|
|
967
|
+
anchorBlockHeader,
|
|
826
968
|
{
|
|
827
969
|
simulate: skipProofGeneration,
|
|
828
970
|
skipFeeEnforcement: false,
|
|
@@ -883,7 +1025,15 @@ export class PXE {
|
|
|
883
1025
|
*/
|
|
884
1026
|
public simulateTx(
|
|
885
1027
|
txRequest: TxExecutionRequest,
|
|
886
|
-
{
|
|
1028
|
+
{
|
|
1029
|
+
simulatePublic,
|
|
1030
|
+
skipTxValidation = false,
|
|
1031
|
+
skipFeeEnforcement = false,
|
|
1032
|
+
skipKernels = true,
|
|
1033
|
+
overrides,
|
|
1034
|
+
scopes,
|
|
1035
|
+
senderForTags,
|
|
1036
|
+
}: SimulateTxOpts,
|
|
887
1037
|
): Promise<TxSimulationResult> {
|
|
888
1038
|
// We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
|
|
889
1039
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -904,24 +1054,26 @@ export class PXE {
|
|
|
904
1054
|
txInfo,
|
|
905
1055
|
);
|
|
906
1056
|
const syncTimer = new Timer();
|
|
907
|
-
await this
|
|
1057
|
+
await this.#maybeSync();
|
|
1058
|
+
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
908
1059
|
const syncTime = syncTimer.ms();
|
|
909
1060
|
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
|
|
915
|
-
const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
|
|
916
|
-
const skipKernels = hasOverriddenContracts;
|
|
917
|
-
|
|
918
|
-
// Set overridden contracts on the sync service so it knows to skip syncing them
|
|
919
|
-
if (hasOverriddenContracts) {
|
|
920
|
-
this.contractSyncService.setOverriddenContracts(jobId, overriddenContracts);
|
|
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
|
+
);
|
|
921
1065
|
}
|
|
1066
|
+
const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
|
|
922
1067
|
|
|
923
1068
|
// Execution of private functions only; no proving, and no kernel logic.
|
|
924
|
-
const privateExecutionResult = await this.#executePrivate(
|
|
1069
|
+
const privateExecutionResult = await this.#executePrivate({
|
|
1070
|
+
contractFunctionSimulator,
|
|
1071
|
+
txRequest,
|
|
1072
|
+
anchorBlockHeader,
|
|
1073
|
+
scopes,
|
|
1074
|
+
jobId,
|
|
1075
|
+
senderForTags,
|
|
1076
|
+
});
|
|
925
1077
|
|
|
926
1078
|
let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
|
|
927
1079
|
let executionSteps: PrivateExecutionStep[] = [];
|
|
@@ -934,11 +1086,17 @@ export class PXE {
|
|
|
934
1086
|
));
|
|
935
1087
|
} else {
|
|
936
1088
|
// Kernel logic, plus proving of all private functions and kernels.
|
|
937
|
-
({ publicInputs, executionSteps } = await this.#prove(
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
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
|
+
));
|
|
942
1100
|
}
|
|
943
1101
|
|
|
944
1102
|
const privateSimulationResult = new PrivateSimulationResult(privateExecutionResult, publicInputs);
|
|
@@ -947,7 +1105,7 @@ export class PXE {
|
|
|
947
1105
|
let publicOutput: PublicSimulationOutput | undefined;
|
|
948
1106
|
if (simulatePublic && publicInputs.forPublic) {
|
|
949
1107
|
const publicSimulationTimer = new Timer();
|
|
950
|
-
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
|
|
1108
|
+
publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement, overrides);
|
|
951
1109
|
publicSimulationTime = publicSimulationTimer.ms();
|
|
952
1110
|
if (publicOutput?.debugLogs?.length) {
|
|
953
1111
|
await displayDebugLogs(publicOutput.debugLogs, addr => this.contractStore.getDebugContractName(addr));
|
|
@@ -1012,7 +1170,7 @@ export class PXE {
|
|
|
1012
1170
|
inspect(txRequest),
|
|
1013
1171
|
`simulatePublic=${simulatePublic}`,
|
|
1014
1172
|
`skipTxValidation=${skipTxValidation}`,
|
|
1015
|
-
`scopes=${scopes
|
|
1173
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1016
1174
|
);
|
|
1017
1175
|
}
|
|
1018
1176
|
});
|
|
@@ -1024,7 +1182,7 @@ export class PXE {
|
|
|
1024
1182
|
*/
|
|
1025
1183
|
public executeUtility(
|
|
1026
1184
|
call: FunctionCall,
|
|
1027
|
-
{ authwits, scopes }: ExecuteUtilityOpts = { scopes:
|
|
1185
|
+
{ authwits, scopes }: ExecuteUtilityOpts = { scopes: [] },
|
|
1028
1186
|
): Promise<UtilityExecutionResult> {
|
|
1029
1187
|
// We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
|
|
1030
1188
|
// to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
|
|
@@ -1033,7 +1191,7 @@ export class PXE {
|
|
|
1033
1191
|
try {
|
|
1034
1192
|
const totalTimer = new Timer();
|
|
1035
1193
|
const syncTimer = new Timer();
|
|
1036
|
-
await this
|
|
1194
|
+
await this.#maybeSync();
|
|
1037
1195
|
const syncTime = syncTimer.ms();
|
|
1038
1196
|
const functionTimer = new Timer();
|
|
1039
1197
|
const contractFunctionSimulator = this.#getSimulatorForTx();
|
|
@@ -1049,7 +1207,7 @@ export class PXE {
|
|
|
1049
1207
|
scopes,
|
|
1050
1208
|
);
|
|
1051
1209
|
|
|
1052
|
-
const executionResult = await this.#executeUtility(
|
|
1210
|
+
const { result: executionResult, offchainEffects } = await this.#executeUtility(
|
|
1053
1211
|
contractFunctionSimulator,
|
|
1054
1212
|
call,
|
|
1055
1213
|
authwits ?? [],
|
|
@@ -1070,14 +1228,19 @@ export class PXE {
|
|
|
1070
1228
|
};
|
|
1071
1229
|
|
|
1072
1230
|
const simulationStats = contractFunctionSimulator.getStats();
|
|
1073
|
-
return {
|
|
1231
|
+
return {
|
|
1232
|
+
result: executionResult,
|
|
1233
|
+
offchainEffects,
|
|
1234
|
+
anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
|
|
1235
|
+
stats: { timings, nodeRPCCalls: simulationStats.nodeRPCCalls },
|
|
1236
|
+
};
|
|
1074
1237
|
} catch (err: any) {
|
|
1075
1238
|
const { to, name, args } = call;
|
|
1076
1239
|
const stringifiedArgs = args.map(arg => arg.toString()).join(', ');
|
|
1077
1240
|
throw this.#contextualizeError(
|
|
1078
1241
|
err,
|
|
1079
1242
|
`executeUtility ${to}:${name}(${stringifiedArgs})`,
|
|
1080
|
-
`scopes=${scopes
|
|
1243
|
+
`scopes=${scopes.map(s => s.toString()).join(', ')}`,
|
|
1081
1244
|
);
|
|
1082
1245
|
}
|
|
1083
1246
|
});
|
|
@@ -1103,7 +1266,7 @@ export class PXE {
|
|
|
1103
1266
|
let anchorBlockNumber: BlockNumber;
|
|
1104
1267
|
|
|
1105
1268
|
await this.#putInJobQueue(async jobId => {
|
|
1106
|
-
await this
|
|
1269
|
+
await this.#maybeSync();
|
|
1107
1270
|
|
|
1108
1271
|
const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
|
|
1109
1272
|
anchorBlockNumber = anchorBlockHeader.getBlockNumber();
|
|
@@ -1136,6 +1299,7 @@ export class PXE {
|
|
|
1136
1299
|
*/
|
|
1137
1300
|
public async stop(): Promise<void> {
|
|
1138
1301
|
await this.jobQueue.end();
|
|
1302
|
+
await this.blockStateSynchronizer.stop();
|
|
1139
1303
|
await this.db.close();
|
|
1140
1304
|
}
|
|
1141
1305
|
}
|