@aztec/pxe 0.0.1-commit.96dac018d → 0.0.1-commit.993d240
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 +96 -99
- 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 +61 -11
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +162 -97
- 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 -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 +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 +120 -130
- 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 -129
- 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 +270 -102
- 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 -5
- 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 -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/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 -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/access_scopes.ts +0 -9
- 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
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
|
|
3
|
+
import { SerialQueue } from '@aztec/foundation/queue';
|
|
3
4
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
4
5
|
import type { L2TipsKVStore } from '@aztec/kv-store/stores';
|
|
5
6
|
import { BlockHash, L2BlockStream, type L2BlockStreamEvent, type L2BlockStreamEventHandler } from '@aztec/stdlib/block';
|
|
@@ -11,6 +12,7 @@ import type { ContractSyncService } from '../contract_sync/contract_sync_service
|
|
|
11
12
|
import type { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
|
|
12
13
|
import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
13
14
|
import type { PrivateEventStore } from '../storage/private_event_store/private_event_store.js';
|
|
15
|
+
import { blockStreamSourceFromAztecNode } from './block_stream_source.js';
|
|
14
16
|
|
|
15
17
|
/**
|
|
16
18
|
* The BlockSynchronizer class orchestrates synchronization between PXE and Aztec node, maintaining an up-to-date
|
|
@@ -20,6 +22,7 @@ import type { PrivateEventStore } from '../storage/private_event_store/private_e
|
|
|
20
22
|
export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
21
23
|
private log: Logger;
|
|
22
24
|
private isSyncing: Promise<void> | undefined;
|
|
25
|
+
private readonly eventQueue = new SerialQueue();
|
|
23
26
|
protected readonly blockStream: L2BlockStream;
|
|
24
27
|
|
|
25
28
|
constructor(
|
|
@@ -35,11 +38,12 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
35
38
|
) {
|
|
36
39
|
this.log = createLogger('pxe:block_synchronizer', bindings);
|
|
37
40
|
this.blockStream = this.createBlockStream(config);
|
|
41
|
+
this.eventQueue.start();
|
|
38
42
|
}
|
|
39
43
|
|
|
40
44
|
protected createBlockStream(config: Partial<BlockSynchronizerConfig>): L2BlockStream {
|
|
41
45
|
return new L2BlockStream(
|
|
42
|
-
this.node,
|
|
46
|
+
blockStreamSourceFromAztecNode(this.node),
|
|
43
47
|
this.l2TipsStore,
|
|
44
48
|
this,
|
|
45
49
|
createLogger('pxe:block_stream', this.log.getBindings()),
|
|
@@ -52,8 +56,12 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
52
56
|
);
|
|
53
57
|
}
|
|
54
58
|
|
|
55
|
-
/** Handle events emitted by the block stream. */
|
|
56
|
-
public
|
|
59
|
+
/** Handle events emitted by the block stream. Serialized to prevent concurrent mutations to anchor state. */
|
|
60
|
+
public handleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
|
|
61
|
+
return this.eventQueue.put(() => this.doHandleBlockStreamEvent(event));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private async doHandleBlockStreamEvent(event: L2BlockStreamEvent): Promise<void> {
|
|
57
65
|
await this.l2TipsStore.handleBlockStreamEvent(event);
|
|
58
66
|
|
|
59
67
|
switch (event.type) {
|
|
@@ -74,18 +82,22 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
74
82
|
}
|
|
75
83
|
case 'chain-proven': {
|
|
76
84
|
if (this.config.syncChainTip === 'proven') {
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
await this.updateAnchorBlockHeader(
|
|
85
|
+
const block = await this.node.getBlock(BlockNumber(event.block.number));
|
|
86
|
+
if (block) {
|
|
87
|
+
await this.updateAnchorBlockHeader(block.header);
|
|
88
|
+
} else {
|
|
89
|
+
this.log.warn(`Block header not found for proven block ${event.block.number}, skipping anchor update`);
|
|
80
90
|
}
|
|
81
91
|
}
|
|
82
92
|
break;
|
|
83
93
|
}
|
|
84
94
|
case 'chain-finalized': {
|
|
85
95
|
if (this.config.syncChainTip === 'finalized') {
|
|
86
|
-
const
|
|
87
|
-
if (
|
|
88
|
-
await this.updateAnchorBlockHeader(
|
|
96
|
+
const block = await this.node.getBlock(BlockNumber(event.block.number));
|
|
97
|
+
if (block) {
|
|
98
|
+
await this.updateAnchorBlockHeader(block.header);
|
|
99
|
+
} else {
|
|
100
|
+
this.log.warn(`Block header not found for finalized block ${event.block.number}, skipping anchor update`);
|
|
89
101
|
}
|
|
90
102
|
}
|
|
91
103
|
break;
|
|
@@ -106,7 +118,8 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
106
118
|
// Note that the following is not necessarily the anchor block that will be used in the transaction - if
|
|
107
119
|
// the chain has already moved past the reorg, we'll also see blocks-added events that will push the anchor
|
|
108
120
|
// forward.
|
|
109
|
-
const
|
|
121
|
+
const newAnchorBlock = await this.node.getBlock(BlockHash.fromString(event.block.hash));
|
|
122
|
+
const newAnchorBlockHeader = newAnchorBlock?.header;
|
|
110
123
|
|
|
111
124
|
if (!newAnchorBlockHeader) {
|
|
112
125
|
throw new Error(
|
|
@@ -152,6 +165,8 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
152
165
|
}
|
|
153
166
|
|
|
154
167
|
this.log.debug(`Syncing PXE with the node`);
|
|
168
|
+
// Capture the promise locally so we always await the exact promise we created, even if this.isSyncing is modified
|
|
169
|
+
// between assignment and await (e.g. due to future refactors introducing a yield point).
|
|
155
170
|
const isSyncing = this.doSync();
|
|
156
171
|
this.isSyncing = isSyncing;
|
|
157
172
|
try {
|
|
@@ -161,6 +176,13 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
161
176
|
}
|
|
162
177
|
}
|
|
163
178
|
|
|
179
|
+
/** Stops the block synchronizer, waiting for any in-progress sync and queued events to complete. */
|
|
180
|
+
public async stop() {
|
|
181
|
+
await this.isSyncing;
|
|
182
|
+
await this.blockStream.stop();
|
|
183
|
+
await this.eventQueue.end();
|
|
184
|
+
}
|
|
185
|
+
|
|
164
186
|
private async doSync() {
|
|
165
187
|
let currentHeader;
|
|
166
188
|
|
|
@@ -171,7 +193,7 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
171
193
|
}
|
|
172
194
|
if (!currentHeader) {
|
|
173
195
|
// REFACTOR: We should know the header of the genesis block without having to request it from the node.
|
|
174
|
-
await this.anchorBlockStore.setHeader((await this.node.
|
|
196
|
+
await this.anchorBlockStore.setHeader((await this.node.getBlockData(BlockNumber.ZERO))!.header);
|
|
175
197
|
}
|
|
176
198
|
await this.blockStream.sync();
|
|
177
199
|
}
|
package/src/config/index.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import {
|
|
2
2
|
type ConfigMappingsType,
|
|
3
3
|
booleanConfigHelper,
|
|
4
|
+
enumConfigHelper,
|
|
4
5
|
getConfigFromMappings,
|
|
5
6
|
numberConfigHelper,
|
|
6
7
|
parseBooleanEnv,
|
|
7
8
|
} from '@aztec/foundation/config';
|
|
8
|
-
import { type DataStoreConfig, dataConfigMappings } from '@aztec/kv-store/config';
|
|
9
9
|
import { type ChainConfig, chainConfigMappings } from '@aztec/stdlib/config';
|
|
10
|
+
import { type DataStoreConfig, dataConfigMappings } from '@aztec/stdlib/kv-store';
|
|
10
11
|
|
|
11
12
|
export { getPackageInfo } from './package_info.js';
|
|
12
13
|
|
|
@@ -26,6 +27,12 @@ export interface BlockSynchronizerConfig {
|
|
|
26
27
|
l2BlockBatchSize: number;
|
|
27
28
|
/** Which chain tip to sync to (proposed, checkpointed, proven, finalized) */
|
|
28
29
|
syncChainTip?: 'proposed' | 'checkpointed' | 'proven' | 'finalized';
|
|
30
|
+
/**
|
|
31
|
+
* Whether PXE should automatically sync with the node before each operation (simulate, prove, profile,
|
|
32
|
+
* execute utility, get private events, update contract). When disabled, callers (e.g. wallets) are
|
|
33
|
+
* responsible for calling `pxe.sync()` explicitly
|
|
34
|
+
*/
|
|
35
|
+
autoSync: boolean;
|
|
29
36
|
}
|
|
30
37
|
|
|
31
38
|
export type PXEConfig = KernelProverConfig & DataStoreConfig & ChainConfig & BlockSynchronizerConfig;
|
|
@@ -58,14 +65,13 @@ export const pxeConfigMappings: ConfigMappingsType<PXEConfig> = {
|
|
|
58
65
|
syncChainTip: {
|
|
59
66
|
env: 'PXE_SYNC_CHAIN_TIP',
|
|
60
67
|
description: 'Which chain tip to sync to (proposed, checkpointed, proven, finalized)',
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
},
|
|
68
|
+
...enumConfigHelper(['proposed', 'checkpointed', 'proven', 'finalized'], 'proposed'),
|
|
69
|
+
},
|
|
70
|
+
autoSync: {
|
|
71
|
+
env: 'PXE_AUTO_SYNC',
|
|
72
|
+
description:
|
|
73
|
+
'Whether PXE syncs with the node automatically before each operation. Disable to let the caller (e.g. a wallet) drive syncs explicitly via pxe.sync().',
|
|
74
|
+
...booleanConfigHelper(true),
|
|
69
75
|
},
|
|
70
76
|
};
|
|
71
77
|
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
MAX_NULLIFIERS_PER_TX,
|
|
18
18
|
MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
19
19
|
MAX_PRIVATE_LOGS_PER_TX,
|
|
20
|
+
MAX_TX_LIFETIME,
|
|
20
21
|
PRIVATE_TX_L2_GAS_OVERHEAD,
|
|
21
22
|
PUBLIC_TX_L2_GAS_OVERHEAD,
|
|
22
23
|
TX_DA_GAS_OVERHEAD,
|
|
@@ -41,7 +42,7 @@ import type { FunctionCall } from '@aztec/stdlib/abi';
|
|
|
41
42
|
import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
|
|
42
43
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
43
44
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
44
|
-
import type { BlockParameter } from '@aztec/stdlib/block';
|
|
45
|
+
import type { BlockParameter, L2TipsProvider } from '@aztec/stdlib/block';
|
|
45
46
|
import { Gas } from '@aztec/stdlib/gas';
|
|
46
47
|
import {
|
|
47
48
|
computeNoteHashNonce,
|
|
@@ -75,10 +76,12 @@ import {
|
|
|
75
76
|
import { PrivateLog } from '@aztec/stdlib/logs';
|
|
76
77
|
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
77
78
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
79
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
78
80
|
import {
|
|
79
81
|
BlockHeader,
|
|
80
82
|
CallContext,
|
|
81
83
|
HashedValues,
|
|
84
|
+
type OffchainEffect,
|
|
82
85
|
PrivateExecutionResult,
|
|
83
86
|
TxConstantData,
|
|
84
87
|
TxExecutionRequest,
|
|
@@ -87,9 +90,11 @@ import {
|
|
|
87
90
|
getFinalMinRevertibleSideEffectCounter,
|
|
88
91
|
} from '@aztec/stdlib/tx';
|
|
89
92
|
|
|
90
|
-
import type { AccessScopes } from '../access_scopes.js';
|
|
91
93
|
import type { ContractSyncService } from '../contract_sync/contract_sync_service.js';
|
|
94
|
+
import type { ExecutionHooks } from '../hooks/index.js';
|
|
95
|
+
import type { MessageContextService } from '../messages/message_context_service.js';
|
|
92
96
|
import type { AddressStore } from '../storage/address_store/address_store.js';
|
|
97
|
+
import { CapsuleService } from '../storage/capsule_store/capsule_service.js';
|
|
93
98
|
import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
|
|
94
99
|
import type { ContractStore } from '../storage/contract_store/contract_store.js';
|
|
95
100
|
import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
@@ -119,7 +124,7 @@ export type ContractSimulatorRunOpts = {
|
|
|
119
124
|
/** The address used as a tagging sender when emitting private logs. */
|
|
120
125
|
senderForTags?: AztecAddress;
|
|
121
126
|
/** The accounts whose notes we can access in this call. */
|
|
122
|
-
scopes:
|
|
127
|
+
scopes: AztecAddress[];
|
|
123
128
|
/** The job ID for staged writes. */
|
|
124
129
|
jobId: string;
|
|
125
130
|
};
|
|
@@ -131,6 +136,7 @@ export type ContractFunctionSimulatorArgs = {
|
|
|
131
136
|
keyStore: KeyStore;
|
|
132
137
|
addressStore: AddressStore;
|
|
133
138
|
aztecNode: AztecNode;
|
|
139
|
+
l2TipsStore: L2TipsProvider;
|
|
134
140
|
senderTaggingStore: SenderTaggingStore;
|
|
135
141
|
recipientTaggingStore: RecipientTaggingStore;
|
|
136
142
|
senderAddressBookStore: SenderAddressBookStore;
|
|
@@ -138,6 +144,8 @@ export type ContractFunctionSimulatorArgs = {
|
|
|
138
144
|
privateEventStore: PrivateEventStore;
|
|
139
145
|
simulator: CircuitSimulator;
|
|
140
146
|
contractSyncService: ContractSyncService;
|
|
147
|
+
messageContextService: MessageContextService;
|
|
148
|
+
hooks?: ExecutionHooks;
|
|
141
149
|
};
|
|
142
150
|
|
|
143
151
|
/**
|
|
@@ -150,6 +158,7 @@ export class ContractFunctionSimulator {
|
|
|
150
158
|
private readonly keyStore: KeyStore;
|
|
151
159
|
private readonly addressStore: AddressStore;
|
|
152
160
|
private readonly aztecNode: AztecNode;
|
|
161
|
+
private readonly l2TipsStore: L2TipsProvider;
|
|
153
162
|
private readonly senderTaggingStore: SenderTaggingStore;
|
|
154
163
|
private readonly recipientTaggingStore: RecipientTaggingStore;
|
|
155
164
|
private readonly senderAddressBookStore: SenderAddressBookStore;
|
|
@@ -157,6 +166,8 @@ export class ContractFunctionSimulator {
|
|
|
157
166
|
private readonly privateEventStore: PrivateEventStore;
|
|
158
167
|
private readonly simulator: CircuitSimulator;
|
|
159
168
|
private readonly contractSyncService: ContractSyncService;
|
|
169
|
+
private readonly messageContextService: MessageContextService;
|
|
170
|
+
private readonly hooks: ExecutionHooks | undefined;
|
|
160
171
|
|
|
161
172
|
constructor(args: ContractFunctionSimulatorArgs) {
|
|
162
173
|
this.contractStore = args.contractStore;
|
|
@@ -164,6 +175,7 @@ export class ContractFunctionSimulator {
|
|
|
164
175
|
this.keyStore = args.keyStore;
|
|
165
176
|
this.addressStore = args.addressStore;
|
|
166
177
|
this.aztecNode = args.aztecNode;
|
|
178
|
+
this.l2TipsStore = args.l2TipsStore;
|
|
167
179
|
this.senderTaggingStore = args.senderTaggingStore;
|
|
168
180
|
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
169
181
|
this.senderAddressBookStore = args.senderAddressBookStore;
|
|
@@ -171,6 +183,8 @@ export class ContractFunctionSimulator {
|
|
|
171
183
|
this.privateEventStore = args.privateEventStore;
|
|
172
184
|
this.simulator = args.simulator;
|
|
173
185
|
this.contractSyncService = args.contractSyncService;
|
|
186
|
+
this.messageContextService = args.messageContextService;
|
|
187
|
+
this.hooks = args.hooks;
|
|
174
188
|
this.log = createLogger('simulator');
|
|
175
189
|
}
|
|
176
190
|
|
|
@@ -199,7 +213,7 @@ export class ContractFunctionSimulator {
|
|
|
199
213
|
}
|
|
200
214
|
|
|
201
215
|
if (request.origin !== contractAddress) {
|
|
202
|
-
|
|
216
|
+
throw new Error(
|
|
203
217
|
`Request origin does not match contract address in simulation. Request origin: ${request.origin}, contract address: ${contractAddress}`,
|
|
204
218
|
);
|
|
205
219
|
}
|
|
@@ -239,8 +253,9 @@ export class ContractFunctionSimulator {
|
|
|
239
253
|
senderTaggingStore: this.senderTaggingStore,
|
|
240
254
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
241
255
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
242
|
-
|
|
256
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
243
257
|
privateEventStore: this.privateEventStore,
|
|
258
|
+
messageContextService: this.messageContextService,
|
|
244
259
|
contractSyncService: this.contractSyncService,
|
|
245
260
|
jobId,
|
|
246
261
|
totalPublicCalldataCount: 0,
|
|
@@ -248,6 +263,8 @@ export class ContractFunctionSimulator {
|
|
|
248
263
|
scopes,
|
|
249
264
|
senderForTags,
|
|
250
265
|
simulator: this.simulator,
|
|
266
|
+
l2TipsStore: this.l2TipsStore,
|
|
267
|
+
hooks: this.hooks,
|
|
251
268
|
});
|
|
252
269
|
|
|
253
270
|
const setupTime = simulatorSetupTimer.ms();
|
|
@@ -277,7 +294,7 @@ export class ContractFunctionSimulator {
|
|
|
277
294
|
);
|
|
278
295
|
const publicFunctionsCalldata = await Promise.all(
|
|
279
296
|
publicCallRequests.map(async r => {
|
|
280
|
-
const calldata = await privateExecutionOracle.
|
|
297
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
281
298
|
return new HashedValues(calldata, r.calldataHash);
|
|
282
299
|
}),
|
|
283
300
|
);
|
|
@@ -298,7 +315,6 @@ export class ContractFunctionSimulator {
|
|
|
298
315
|
}
|
|
299
316
|
}
|
|
300
317
|
|
|
301
|
-
// docs:start:execute_utility_function
|
|
302
318
|
/**
|
|
303
319
|
* Runs a utility function.
|
|
304
320
|
* @param call - The function call to execute.
|
|
@@ -312,15 +328,19 @@ export class ContractFunctionSimulator {
|
|
|
312
328
|
call: FunctionCall,
|
|
313
329
|
authwits: AuthWitness[],
|
|
314
330
|
anchorBlockHeader: BlockHeader,
|
|
315
|
-
scopes:
|
|
331
|
+
scopes: AztecAddress[],
|
|
316
332
|
jobId: string,
|
|
317
|
-
): Promise<Fr[]> {
|
|
333
|
+
): Promise<{ result: Fr[]; offchainEffects: OffchainEffect[] }> {
|
|
318
334
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
319
335
|
|
|
320
336
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
321
337
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
322
338
|
}
|
|
323
339
|
|
|
340
|
+
const utilityExecutor = async (syncCall: FunctionCall, execScopes: AztecAddress[]) => {
|
|
341
|
+
await this.runUtility(syncCall, [], anchorBlockHeader, execScopes, jobId);
|
|
342
|
+
};
|
|
343
|
+
|
|
324
344
|
const oracle = new UtilityExecutionOracle({
|
|
325
345
|
contractAddress: call.to,
|
|
326
346
|
authWitnesses: authwits,
|
|
@@ -333,10 +353,16 @@ export class ContractFunctionSimulator {
|
|
|
333
353
|
aztecNode: this.aztecNode,
|
|
334
354
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
335
355
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
336
|
-
|
|
356
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
337
357
|
privateEventStore: this.privateEventStore,
|
|
358
|
+
messageContextService: this.messageContextService,
|
|
359
|
+
contractSyncService: this.contractSyncService,
|
|
360
|
+
l2TipsStore: this.l2TipsStore,
|
|
338
361
|
jobId,
|
|
339
362
|
scopes,
|
|
363
|
+
simulator: this.simulator,
|
|
364
|
+
hooks: this.hooks,
|
|
365
|
+
utilityExecutor,
|
|
340
366
|
});
|
|
341
367
|
|
|
342
368
|
try {
|
|
@@ -362,12 +388,14 @@ export class ContractFunctionSimulator {
|
|
|
362
388
|
});
|
|
363
389
|
|
|
364
390
|
this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
365
|
-
return
|
|
391
|
+
return {
|
|
392
|
+
result: witnessMapToFields(acirExecutionResult.returnWitness),
|
|
393
|
+
offchainEffects: oracle.getOffchainEffects(),
|
|
394
|
+
};
|
|
366
395
|
} catch (err) {
|
|
367
396
|
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
368
397
|
}
|
|
369
398
|
}
|
|
370
|
-
// docs:end:execute_utility_function
|
|
371
399
|
|
|
372
400
|
/**
|
|
373
401
|
* Returns the execution statistics collected during the simulator run.
|
|
@@ -432,14 +460,34 @@ export async function generateSimulatedProvingResult(
|
|
|
432
460
|
|
|
433
461
|
let publicTeardownCallRequest;
|
|
434
462
|
|
|
463
|
+
// We set expiration timestamp to anchor_block_timestamp + MAX_TX_LIFETIME (24h) just like kernels do
|
|
464
|
+
let expirationTimestamp =
|
|
465
|
+
privateExecutionResult.entrypoint.publicInputs.anchorBlockHeader.globalVariables.timestamp +
|
|
466
|
+
BigInt(MAX_TX_LIFETIME);
|
|
467
|
+
|
|
468
|
+
let feePayer = AztecAddress.zero();
|
|
469
|
+
|
|
435
470
|
const executions = [privateExecutionResult.entrypoint];
|
|
436
471
|
|
|
437
472
|
while (executions.length !== 0) {
|
|
438
473
|
const execution = executions.shift()!;
|
|
439
474
|
executions.unshift(...execution!.nestedExecutionResults);
|
|
440
475
|
|
|
476
|
+
// Just like kernels we overwrite the default value if the call sets it.
|
|
477
|
+
const callExpirationTimestamp = execution.publicInputs.expirationTimestamp;
|
|
478
|
+
if (callExpirationTimestamp !== 0n && callExpirationTimestamp < expirationTimestamp) {
|
|
479
|
+
expirationTimestamp = callExpirationTimestamp;
|
|
480
|
+
}
|
|
481
|
+
|
|
441
482
|
const { contractAddress } = execution.publicInputs.callContext;
|
|
442
483
|
|
|
484
|
+
if (execution.publicInputs.isFeePayer) {
|
|
485
|
+
if (!feePayer.isZero()) {
|
|
486
|
+
throw new Error('Multiple fee payers found in private execution result');
|
|
487
|
+
}
|
|
488
|
+
feePayer = contractAddress;
|
|
489
|
+
}
|
|
490
|
+
|
|
443
491
|
scopedNoteHashes.push(
|
|
444
492
|
...execution.publicInputs.noteHashes
|
|
445
493
|
.getActiveItems()
|
|
@@ -660,8 +708,8 @@ export async function generateSimulatedProvingResult(
|
|
|
660
708
|
daGas: TX_DA_GAS_OVERHEAD,
|
|
661
709
|
}),
|
|
662
710
|
),
|
|
663
|
-
/*feePayer=*/
|
|
664
|
-
/*expirationTimestamp=*/
|
|
711
|
+
/*feePayer=*/ feePayer,
|
|
712
|
+
/*expirationTimestamp=*/ expirationTimestamp,
|
|
665
713
|
hasPublicCalls ? inputsForPublic : undefined,
|
|
666
714
|
!hasPublicCalls ? inputsForRollup : undefined,
|
|
667
715
|
);
|
|
@@ -716,7 +764,7 @@ function squashTransientSideEffects(
|
|
|
716
764
|
* at the tx's anchor block, mimicking the behavior of the kernels
|
|
717
765
|
*/
|
|
718
766
|
async function verifyReadRequests(
|
|
719
|
-
node: Pick<AztecNode, '
|
|
767
|
+
node: Pick<AztecNode, 'findLeavesIndexes'>,
|
|
720
768
|
anchorBlockHash: BlockParameter,
|
|
721
769
|
noteHashReadRequests: ScopedReadRequest[],
|
|
722
770
|
nullifierReadRequests: ScopedReadRequest[],
|
|
@@ -749,13 +797,25 @@ async function verifyReadRequests(
|
|
|
749
797
|
}
|
|
750
798
|
}
|
|
751
799
|
|
|
752
|
-
const [
|
|
753
|
-
|
|
754
|
-
|
|
800
|
+
const [noteHashResults, nullifierResults] = await Promise.all([
|
|
801
|
+
settledNoteHashReads.length > 0
|
|
802
|
+
? node.findLeavesIndexes(
|
|
803
|
+
anchorBlockHash,
|
|
804
|
+
MerkleTreeId.NOTE_HASH_TREE,
|
|
805
|
+
settledNoteHashReads.map(({ value }) => value),
|
|
806
|
+
)
|
|
807
|
+
: [],
|
|
808
|
+
settledNullifierReads.length > 0
|
|
809
|
+
? node.findLeavesIndexes(
|
|
810
|
+
anchorBlockHash,
|
|
811
|
+
MerkleTreeId.NULLIFIER_TREE,
|
|
812
|
+
settledNullifierReads.map(({ value }) => value),
|
|
813
|
+
)
|
|
814
|
+
: [],
|
|
755
815
|
]);
|
|
756
816
|
|
|
757
817
|
for (let i = 0; i < settledNoteHashReads.length; i++) {
|
|
758
|
-
if (!
|
|
818
|
+
if (!noteHashResults[i]) {
|
|
759
819
|
throw new Error(
|
|
760
820
|
`Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`,
|
|
761
821
|
);
|
|
@@ -763,7 +823,7 @@ async function verifyReadRequests(
|
|
|
763
823
|
}
|
|
764
824
|
|
|
765
825
|
for (let i = 0; i < settledNullifierReads.length; i++) {
|
|
766
|
-
if (!
|
|
826
|
+
if (!nullifierResults[i]) {
|
|
767
827
|
throw new Error(
|
|
768
828
|
`Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`,
|
|
769
829
|
);
|
|
@@ -809,9 +869,9 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
|
|
|
809
869
|
meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
|
|
810
870
|
|
|
811
871
|
const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, log => log.isEmpty());
|
|
812
|
-
// Every contract class log emits its
|
|
872
|
+
// Every contract class log emits its contract address as an additional field
|
|
813
873
|
meteredDAFields += data.contractClassLogsHashes.reduce(
|
|
814
|
-
(acc, log) => (!log.isEmpty() ? acc + log.logHash.length +
|
|
874
|
+
(acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 1 : acc),
|
|
815
875
|
0,
|
|
816
876
|
);
|
|
817
877
|
meteredL2Gas += numContractClassLogs * L2_GAS_PER_CONTRACT_CLASS_LOG;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
|
|
3
|
+
/** In-memory store for ephemeral arrays scoped to a single contract call frame. */
|
|
4
|
+
export class EphemeralArrayService {
|
|
5
|
+
/**
|
|
6
|
+
* Maps a slot to the elements of the array stored at that slot. Each element is a serialized representation of
|
|
7
|
+
* the original type.
|
|
8
|
+
*/
|
|
9
|
+
#arrays: Map<string, Fr[][]> = new Map();
|
|
10
|
+
|
|
11
|
+
/** Returns all elements in the array, or an empty array if uninitialized. */
|
|
12
|
+
readArrayAt(slot: Fr): Fr[][] {
|
|
13
|
+
return this.#arrays.get(slot.toString()) ?? [];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
#setArray(slot: Fr, array: Fr[][]): void {
|
|
17
|
+
this.#arrays.set(slot.toString(), array);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Returns the number of elements in the array at the given slot. */
|
|
21
|
+
len(slot: Fr): number {
|
|
22
|
+
return this.readArrayAt(slot).length;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Appends an element to the array and returns the new length. */
|
|
26
|
+
push(slot: Fr, elements: Fr[]): number {
|
|
27
|
+
const array = this.readArrayAt(slot);
|
|
28
|
+
array.push(elements);
|
|
29
|
+
this.#setArray(slot, array);
|
|
30
|
+
return array.length;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** Removes and returns the last element. Throws if empty. */
|
|
34
|
+
pop(slot: Fr): Fr[] {
|
|
35
|
+
const array = this.readArrayAt(slot);
|
|
36
|
+
if (array.length === 0) {
|
|
37
|
+
throw new Error(`Ephemeral array at slot ${slot} is empty`);
|
|
38
|
+
}
|
|
39
|
+
const element = array.pop()!;
|
|
40
|
+
this.#setArray(slot, array);
|
|
41
|
+
return element;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/** Returns the element at the given index. Throws if out of bounds. */
|
|
45
|
+
get(slot: Fr, index: number): Fr[] {
|
|
46
|
+
const array = this.readArrayAt(slot);
|
|
47
|
+
if (index < 0 || index >= array.length) {
|
|
48
|
+
throw new Error(
|
|
49
|
+
`Ephemeral array index ${index} out of bounds for array of length ${array.length} at slot ${slot}`,
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
return array[index];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Overwrites the element at the given index. Throws if out of bounds. */
|
|
56
|
+
set(slot: Fr, index: number, value: Fr[]): void {
|
|
57
|
+
const array = this.readArrayAt(slot);
|
|
58
|
+
if (index < 0 || index >= array.length) {
|
|
59
|
+
throw new Error(
|
|
60
|
+
`Ephemeral array index ${index} out of bounds for array of length ${array.length} at slot ${slot}`,
|
|
61
|
+
);
|
|
62
|
+
}
|
|
63
|
+
array[index] = value;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** Removes the element at the given index, shifting subsequent elements backward. Throws if out of bounds. */
|
|
67
|
+
remove(slot: Fr, index: number): void {
|
|
68
|
+
const array = this.readArrayAt(slot);
|
|
69
|
+
if (index < 0 || index >= array.length) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`Ephemeral array index ${index} out of bounds for array of length ${array.length} at slot ${slot}`,
|
|
72
|
+
);
|
|
73
|
+
}
|
|
74
|
+
array.splice(index, 1);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Removes all elements from the array. */
|
|
78
|
+
clear(slot: Fr): void {
|
|
79
|
+
this.#arrays.delete(slot.toString());
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/** Allocates a fresh, unused slot for a new ephemeral array. */
|
|
83
|
+
allocateSlot(): Fr {
|
|
84
|
+
let slot: Fr;
|
|
85
|
+
do {
|
|
86
|
+
slot = Fr.random();
|
|
87
|
+
} while (this.#arrays.has(slot.toString()));
|
|
88
|
+
return slot;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Creates a new ephemeral array pre-populated with the given elements and returns its slot. */
|
|
92
|
+
newArray(elements: Fr[][]): Fr {
|
|
93
|
+
const slot = this.allocateSlot();
|
|
94
|
+
this.#setArray(slot, elements);
|
|
95
|
+
return slot;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Copies `count` elements from the source array to the destination array (overwrites destination). */
|
|
99
|
+
copy(srcSlot: Fr, dstSlot: Fr, count: number): void {
|
|
100
|
+
const srcArray = this.readArrayAt(srcSlot);
|
|
101
|
+
if (count > srcArray.length) {
|
|
102
|
+
throw new Error(
|
|
103
|
+
`Cannot copy ${count} elements from ephemeral array of length ${srcArray.length} at slot ${srcSlot}`,
|
|
104
|
+
);
|
|
105
|
+
}
|
|
106
|
+
// Deep copy the elements to avoid aliasing
|
|
107
|
+
const copied = srcArray.slice(0, count).map(el => [...el]);
|
|
108
|
+
this.#setArray(dstSlot, copied);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
@@ -1,32 +1,33 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AppTaggingSecret, type TaggingIndexRange } from '@aztec/stdlib/logs';
|
|
2
2
|
|
|
3
|
-
/**
|
|
4
|
-
* A map that stores the tagging index for a given directional app tagging secret.
|
|
5
|
-
* Note: The directional app tagging secret is unique for a (sender, recipient, contract) tuple while the direction
|
|
6
|
-
* of sender -> recipient matters.
|
|
7
|
-
*/
|
|
3
|
+
/** A map that stores the tagging index range for a given app tagging secret. */
|
|
8
4
|
export class ExecutionTaggingIndexCache {
|
|
9
|
-
private taggingIndexMap: Map<string, number> = new Map();
|
|
5
|
+
private taggingIndexMap: Map<string, { lowestIndex: number; highestIndex: number }> = new Map();
|
|
10
6
|
|
|
11
|
-
public getLastUsedIndex(secret:
|
|
12
|
-
return this.taggingIndexMap.get(secret.toString());
|
|
7
|
+
public getLastUsedIndex(secret: AppTaggingSecret): number | undefined {
|
|
8
|
+
return this.taggingIndexMap.get(secret.toString())?.highestIndex;
|
|
13
9
|
}
|
|
14
10
|
|
|
15
|
-
public setLastUsedIndex(secret:
|
|
11
|
+
public setLastUsedIndex(secret: AppTaggingSecret, index: number) {
|
|
16
12
|
const currentValue = this.taggingIndexMap.get(secret.toString());
|
|
17
|
-
if (currentValue !== undefined && currentValue !== index - 1) {
|
|
18
|
-
throw new Error(`Invalid tagging index update. Current value: ${currentValue}, new value: ${index}`);
|
|
13
|
+
if (currentValue !== undefined && currentValue.highestIndex !== index - 1) {
|
|
14
|
+
throw new Error(`Invalid tagging index update. Current value: ${currentValue.highestIndex}, new value: ${index}`);
|
|
15
|
+
}
|
|
16
|
+
if (currentValue !== undefined) {
|
|
17
|
+
currentValue.highestIndex = index;
|
|
18
|
+
} else {
|
|
19
|
+
this.taggingIndexMap.set(secret.toString(), { lowestIndex: index, highestIndex: index });
|
|
19
20
|
}
|
|
20
|
-
this.taggingIndexMap.set(secret.toString(), index);
|
|
21
21
|
}
|
|
22
22
|
|
|
23
23
|
/**
|
|
24
|
-
* Returns the
|
|
24
|
+
* Returns the tagging index ranges that were used in this execution (and that need to be stored in the db).
|
|
25
25
|
*/
|
|
26
|
-
public
|
|
27
|
-
return Array.from(this.taggingIndexMap.entries()).map(([secret,
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
public getUsedTaggingIndexRanges(): TaggingIndexRange[] {
|
|
27
|
+
return Array.from(this.taggingIndexMap.entries()).map(([secret, { lowestIndex, highestIndex }]) => ({
|
|
28
|
+
extendedSecret: AppTaggingSecret.fromString(secret),
|
|
29
|
+
lowestIndex,
|
|
30
|
+
highestIndex,
|
|
30
31
|
}));
|
|
31
32
|
}
|
|
32
33
|
}
|
|
@@ -4,10 +4,13 @@ export { HashedValuesCache } from './hashed_values_cache.js';
|
|
|
4
4
|
export { pickNotes } from './pick_notes.js';
|
|
5
5
|
export type { NoteData, IMiscOracle, IUtilityExecutionOracle, IPrivateExecutionOracle } from './oracle/interfaces.js';
|
|
6
6
|
export { MessageLoadOracleInputs } from './oracle/message_load_oracle_inputs.js';
|
|
7
|
+
export { MessageContextService } from '../messages/message_context_service.js';
|
|
7
8
|
export { UtilityExecutionOracle } from './oracle/utility_execution_oracle.js';
|
|
8
9
|
export { PrivateExecutionOracle } from './oracle/private_execution_oracle.js';
|
|
9
10
|
export { Oracle } from './oracle/oracle.js';
|
|
10
11
|
export { executePrivateFunction, extractPrivateCircuitPublicInputs } from './oracle/private_execution.js';
|
|
11
12
|
export { generateSimulatedProvingResult } from './contract_function_simulator.js';
|
|
12
13
|
export { packAsHintedNote } from './oracle/note_packing_utils.js';
|
|
14
|
+
export { BoundedVec } from './noir-structs/bounded_vec.js';
|
|
15
|
+
export { Option } from './noir-structs/option.js';
|
|
13
16
|
export { UtilityContext } from './noir-structs/utility_context.js';
|