@aztec/pxe 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774
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/config/package_info.js +1 -1
- 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 +58 -23
- 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.d.ts +4 -3
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +126 -65
- package/dest/private_kernel/hints/test_utils.d.ts +122 -0
- package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
- package/dest/private_kernel/hints/test_utils.js +202 -0
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +6 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +165 -64
- 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/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +94 -35
- 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 +158 -111
- package/src/private_kernel/hints/test_utils.ts +318 -0
- package/src/private_kernel/private_kernel_execution_prover.ts +253 -88
- 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
|
|
|
@@ -4,8 +4,6 @@ import {
|
|
|
4
4
|
AVM_SENDL2TOL1MSG_BASE_L2_GAS,
|
|
5
5
|
DA_GAS_PER_FIELD,
|
|
6
6
|
FIXED_AVM_STARTUP_L2_GAS,
|
|
7
|
-
FIXED_DA_GAS,
|
|
8
|
-
FIXED_L2_GAS,
|
|
9
7
|
L2_GAS_PER_CONTRACT_CLASS_LOG,
|
|
10
8
|
L2_GAS_PER_L2_TO_L1_MSG,
|
|
11
9
|
L2_GAS_PER_NOTE_HASH,
|
|
@@ -19,6 +17,10 @@ import {
|
|
|
19
17
|
MAX_NULLIFIERS_PER_TX,
|
|
20
18
|
MAX_NULLIFIER_READ_REQUESTS_PER_TX,
|
|
21
19
|
MAX_PRIVATE_LOGS_PER_TX,
|
|
20
|
+
MAX_TX_LIFETIME,
|
|
21
|
+
PRIVATE_TX_L2_GAS_OVERHEAD,
|
|
22
|
+
PUBLIC_TX_L2_GAS_OVERHEAD,
|
|
23
|
+
TX_DA_GAS_OVERHEAD,
|
|
22
24
|
} from '@aztec/constants';
|
|
23
25
|
import { arrayNonEmptyLength, padArrayEnd } from '@aztec/foundation/collection';
|
|
24
26
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
@@ -40,7 +42,7 @@ import type { FunctionCall } from '@aztec/stdlib/abi';
|
|
|
40
42
|
import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
|
|
41
43
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
42
44
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
43
|
-
import type { BlockParameter } from '@aztec/stdlib/block';
|
|
45
|
+
import type { BlockParameter, L2TipsProvider } from '@aztec/stdlib/block';
|
|
44
46
|
import { Gas } from '@aztec/stdlib/gas';
|
|
45
47
|
import {
|
|
46
48
|
computeNoteHashNonce,
|
|
@@ -74,10 +76,12 @@ import {
|
|
|
74
76
|
import { PrivateLog } from '@aztec/stdlib/logs';
|
|
75
77
|
import { ScopedL2ToL1Message } from '@aztec/stdlib/messaging';
|
|
76
78
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
79
|
+
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
77
80
|
import {
|
|
78
81
|
BlockHeader,
|
|
79
82
|
CallContext,
|
|
80
83
|
HashedValues,
|
|
84
|
+
type OffchainEffect,
|
|
81
85
|
PrivateExecutionResult,
|
|
82
86
|
TxConstantData,
|
|
83
87
|
TxExecutionRequest,
|
|
@@ -86,9 +90,11 @@ import {
|
|
|
86
90
|
getFinalMinRevertibleSideEffectCounter,
|
|
87
91
|
} from '@aztec/stdlib/tx';
|
|
88
92
|
|
|
89
|
-
import type { AccessScopes } from '../access_scopes.js';
|
|
90
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';
|
|
91
96
|
import type { AddressStore } from '../storage/address_store/address_store.js';
|
|
97
|
+
import { CapsuleService } from '../storage/capsule_store/capsule_service.js';
|
|
92
98
|
import type { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
|
|
93
99
|
import type { ContractStore } from '../storage/contract_store/contract_store.js';
|
|
94
100
|
import type { NoteStore } from '../storage/note_store/note_store.js';
|
|
@@ -118,7 +124,7 @@ export type ContractSimulatorRunOpts = {
|
|
|
118
124
|
/** The address used as a tagging sender when emitting private logs. */
|
|
119
125
|
senderForTags?: AztecAddress;
|
|
120
126
|
/** The accounts whose notes we can access in this call. */
|
|
121
|
-
scopes:
|
|
127
|
+
scopes: AztecAddress[];
|
|
122
128
|
/** The job ID for staged writes. */
|
|
123
129
|
jobId: string;
|
|
124
130
|
};
|
|
@@ -130,6 +136,7 @@ export type ContractFunctionSimulatorArgs = {
|
|
|
130
136
|
keyStore: KeyStore;
|
|
131
137
|
addressStore: AddressStore;
|
|
132
138
|
aztecNode: AztecNode;
|
|
139
|
+
l2TipsStore: L2TipsProvider;
|
|
133
140
|
senderTaggingStore: SenderTaggingStore;
|
|
134
141
|
recipientTaggingStore: RecipientTaggingStore;
|
|
135
142
|
senderAddressBookStore: SenderAddressBookStore;
|
|
@@ -137,6 +144,8 @@ export type ContractFunctionSimulatorArgs = {
|
|
|
137
144
|
privateEventStore: PrivateEventStore;
|
|
138
145
|
simulator: CircuitSimulator;
|
|
139
146
|
contractSyncService: ContractSyncService;
|
|
147
|
+
messageContextService: MessageContextService;
|
|
148
|
+
hooks?: ExecutionHooks;
|
|
140
149
|
};
|
|
141
150
|
|
|
142
151
|
/**
|
|
@@ -149,6 +158,7 @@ export class ContractFunctionSimulator {
|
|
|
149
158
|
private readonly keyStore: KeyStore;
|
|
150
159
|
private readonly addressStore: AddressStore;
|
|
151
160
|
private readonly aztecNode: AztecNode;
|
|
161
|
+
private readonly l2TipsStore: L2TipsProvider;
|
|
152
162
|
private readonly senderTaggingStore: SenderTaggingStore;
|
|
153
163
|
private readonly recipientTaggingStore: RecipientTaggingStore;
|
|
154
164
|
private readonly senderAddressBookStore: SenderAddressBookStore;
|
|
@@ -156,6 +166,8 @@ export class ContractFunctionSimulator {
|
|
|
156
166
|
private readonly privateEventStore: PrivateEventStore;
|
|
157
167
|
private readonly simulator: CircuitSimulator;
|
|
158
168
|
private readonly contractSyncService: ContractSyncService;
|
|
169
|
+
private readonly messageContextService: MessageContextService;
|
|
170
|
+
private readonly hooks: ExecutionHooks | undefined;
|
|
159
171
|
|
|
160
172
|
constructor(args: ContractFunctionSimulatorArgs) {
|
|
161
173
|
this.contractStore = args.contractStore;
|
|
@@ -163,6 +175,7 @@ export class ContractFunctionSimulator {
|
|
|
163
175
|
this.keyStore = args.keyStore;
|
|
164
176
|
this.addressStore = args.addressStore;
|
|
165
177
|
this.aztecNode = args.aztecNode;
|
|
178
|
+
this.l2TipsStore = args.l2TipsStore;
|
|
166
179
|
this.senderTaggingStore = args.senderTaggingStore;
|
|
167
180
|
this.recipientTaggingStore = args.recipientTaggingStore;
|
|
168
181
|
this.senderAddressBookStore = args.senderAddressBookStore;
|
|
@@ -170,6 +183,8 @@ export class ContractFunctionSimulator {
|
|
|
170
183
|
this.privateEventStore = args.privateEventStore;
|
|
171
184
|
this.simulator = args.simulator;
|
|
172
185
|
this.contractSyncService = args.contractSyncService;
|
|
186
|
+
this.messageContextService = args.messageContextService;
|
|
187
|
+
this.hooks = args.hooks;
|
|
173
188
|
this.log = createLogger('simulator');
|
|
174
189
|
}
|
|
175
190
|
|
|
@@ -198,7 +213,7 @@ export class ContractFunctionSimulator {
|
|
|
198
213
|
}
|
|
199
214
|
|
|
200
215
|
if (request.origin !== contractAddress) {
|
|
201
|
-
|
|
216
|
+
throw new Error(
|
|
202
217
|
`Request origin does not match contract address in simulation. Request origin: ${request.origin}, contract address: ${contractAddress}`,
|
|
203
218
|
);
|
|
204
219
|
}
|
|
@@ -238,8 +253,9 @@ export class ContractFunctionSimulator {
|
|
|
238
253
|
senderTaggingStore: this.senderTaggingStore,
|
|
239
254
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
240
255
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
241
|
-
|
|
256
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
242
257
|
privateEventStore: this.privateEventStore,
|
|
258
|
+
messageContextService: this.messageContextService,
|
|
243
259
|
contractSyncService: this.contractSyncService,
|
|
244
260
|
jobId,
|
|
245
261
|
totalPublicCalldataCount: 0,
|
|
@@ -247,6 +263,8 @@ export class ContractFunctionSimulator {
|
|
|
247
263
|
scopes,
|
|
248
264
|
senderForTags,
|
|
249
265
|
simulator: this.simulator,
|
|
266
|
+
l2TipsStore: this.l2TipsStore,
|
|
267
|
+
hooks: this.hooks,
|
|
250
268
|
});
|
|
251
269
|
|
|
252
270
|
const setupTime = simulatorSetupTimer.ms();
|
|
@@ -276,7 +294,7 @@ export class ContractFunctionSimulator {
|
|
|
276
294
|
);
|
|
277
295
|
const publicFunctionsCalldata = await Promise.all(
|
|
278
296
|
publicCallRequests.map(async r => {
|
|
279
|
-
const calldata = await privateExecutionOracle.
|
|
297
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
280
298
|
return new HashedValues(calldata, r.calldataHash);
|
|
281
299
|
}),
|
|
282
300
|
);
|
|
@@ -297,7 +315,6 @@ export class ContractFunctionSimulator {
|
|
|
297
315
|
}
|
|
298
316
|
}
|
|
299
317
|
|
|
300
|
-
// docs:start:execute_utility_function
|
|
301
318
|
/**
|
|
302
319
|
* Runs a utility function.
|
|
303
320
|
* @param call - The function call to execute.
|
|
@@ -311,15 +328,19 @@ export class ContractFunctionSimulator {
|
|
|
311
328
|
call: FunctionCall,
|
|
312
329
|
authwits: AuthWitness[],
|
|
313
330
|
anchorBlockHeader: BlockHeader,
|
|
314
|
-
scopes:
|
|
331
|
+
scopes: AztecAddress[],
|
|
315
332
|
jobId: string,
|
|
316
|
-
): Promise<Fr[]> {
|
|
333
|
+
): Promise<{ result: Fr[]; offchainEffects: OffchainEffect[] }> {
|
|
317
334
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
318
335
|
|
|
319
336
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
320
337
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
321
338
|
}
|
|
322
339
|
|
|
340
|
+
const utilityExecutor = async (syncCall: FunctionCall, execScopes: AztecAddress[]) => {
|
|
341
|
+
await this.runUtility(syncCall, [], anchorBlockHeader, execScopes, jobId);
|
|
342
|
+
};
|
|
343
|
+
|
|
323
344
|
const oracle = new UtilityExecutionOracle({
|
|
324
345
|
contractAddress: call.to,
|
|
325
346
|
authWitnesses: authwits,
|
|
@@ -332,10 +353,16 @@ export class ContractFunctionSimulator {
|
|
|
332
353
|
aztecNode: this.aztecNode,
|
|
333
354
|
recipientTaggingStore: this.recipientTaggingStore,
|
|
334
355
|
senderAddressBookStore: this.senderAddressBookStore,
|
|
335
|
-
|
|
356
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
336
357
|
privateEventStore: this.privateEventStore,
|
|
358
|
+
messageContextService: this.messageContextService,
|
|
359
|
+
contractSyncService: this.contractSyncService,
|
|
360
|
+
l2TipsStore: this.l2TipsStore,
|
|
337
361
|
jobId,
|
|
338
362
|
scopes,
|
|
363
|
+
simulator: this.simulator,
|
|
364
|
+
hooks: this.hooks,
|
|
365
|
+
utilityExecutor,
|
|
339
366
|
});
|
|
340
367
|
|
|
341
368
|
try {
|
|
@@ -361,12 +388,14 @@ export class ContractFunctionSimulator {
|
|
|
361
388
|
});
|
|
362
389
|
|
|
363
390
|
this.log.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
364
|
-
return
|
|
391
|
+
return {
|
|
392
|
+
result: witnessMapToFields(acirExecutionResult.returnWitness),
|
|
393
|
+
offchainEffects: oracle.getOffchainEffects(),
|
|
394
|
+
};
|
|
365
395
|
} catch (err) {
|
|
366
396
|
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during private execution'));
|
|
367
397
|
}
|
|
368
398
|
}
|
|
369
|
-
// docs:end:execute_utility_function
|
|
370
399
|
|
|
371
400
|
/**
|
|
372
401
|
* Returns the execution statistics collected during the simulator run.
|
|
@@ -431,14 +460,34 @@ export async function generateSimulatedProvingResult(
|
|
|
431
460
|
|
|
432
461
|
let publicTeardownCallRequest;
|
|
433
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
|
+
|
|
434
470
|
const executions = [privateExecutionResult.entrypoint];
|
|
435
471
|
|
|
436
472
|
while (executions.length !== 0) {
|
|
437
473
|
const execution = executions.shift()!;
|
|
438
474
|
executions.unshift(...execution!.nestedExecutionResults);
|
|
439
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
|
+
|
|
440
482
|
const { contractAddress } = execution.publicInputs.callContext;
|
|
441
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
|
+
|
|
442
491
|
scopedNoteHashes.push(
|
|
443
492
|
...execution.publicInputs.noteHashes
|
|
444
493
|
.getActiveItems()
|
|
@@ -653,9 +702,14 @@ export async function generateSimulatedProvingResult(
|
|
|
653
702
|
|
|
654
703
|
const publicInputs = new PrivateKernelTailCircuitPublicInputs(
|
|
655
704
|
constantData,
|
|
656
|
-
/*gasUsed=*/ gasUsed.add(
|
|
657
|
-
|
|
658
|
-
|
|
705
|
+
/*gasUsed=*/ gasUsed.add(
|
|
706
|
+
Gas.from({
|
|
707
|
+
l2Gas: isPrivateOnlyTx ? PRIVATE_TX_L2_GAS_OVERHEAD : PUBLIC_TX_L2_GAS_OVERHEAD,
|
|
708
|
+
daGas: TX_DA_GAS_OVERHEAD,
|
|
709
|
+
}),
|
|
710
|
+
),
|
|
711
|
+
/*feePayer=*/ feePayer,
|
|
712
|
+
/*expirationTimestamp=*/ expirationTimestamp,
|
|
659
713
|
hasPublicCalls ? inputsForPublic : undefined,
|
|
660
714
|
!hasPublicCalls ? inputsForRollup : undefined,
|
|
661
715
|
);
|
|
@@ -683,6 +737,7 @@ function squashTransientSideEffects(
|
|
|
683
737
|
scopedNullifiersCLA,
|
|
684
738
|
/*futureNoteHashReads=*/ [],
|
|
685
739
|
/*futureNullifierReads=*/ [],
|
|
740
|
+
/*futureLogs=*/ [],
|
|
686
741
|
noteHashNullifierCounterMap,
|
|
687
742
|
minRevertibleSideEffectCounter,
|
|
688
743
|
);
|
|
@@ -709,7 +764,7 @@ function squashTransientSideEffects(
|
|
|
709
764
|
* at the tx's anchor block, mimicking the behavior of the kernels
|
|
710
765
|
*/
|
|
711
766
|
async function verifyReadRequests(
|
|
712
|
-
node: Pick<AztecNode, '
|
|
767
|
+
node: Pick<AztecNode, 'findLeavesIndexes'>,
|
|
713
768
|
anchorBlockHash: BlockParameter,
|
|
714
769
|
noteHashReadRequests: ScopedReadRequest[],
|
|
715
770
|
nullifierReadRequests: ScopedReadRequest[],
|
|
@@ -725,16 +780,8 @@ async function verifyReadRequests(
|
|
|
725
780
|
nullifierReadRequests.length,
|
|
726
781
|
);
|
|
727
782
|
|
|
728
|
-
const noteHashResetActions = getNoteHashReadRequestResetActions(
|
|
729
|
-
|
|
730
|
-
scopedNoteHashesCLA,
|
|
731
|
-
/*futureNoteHashes=*/ [],
|
|
732
|
-
);
|
|
733
|
-
const nullifierResetActions = getNullifierReadRequestResetActions(
|
|
734
|
-
nullifierReadRequestsCLA,
|
|
735
|
-
scopedNullifiersCLA,
|
|
736
|
-
/*futureNullifiers=*/ [],
|
|
737
|
-
);
|
|
783
|
+
const noteHashResetActions = getNoteHashReadRequestResetActions(noteHashReadRequestsCLA, scopedNoteHashesCLA);
|
|
784
|
+
const nullifierResetActions = getNullifierReadRequestResetActions(nullifierReadRequestsCLA, scopedNullifiersCLA);
|
|
738
785
|
|
|
739
786
|
const settledNoteHashReads: { index: number; value: Fr }[] = [];
|
|
740
787
|
for (let i = 0; i < noteHashResetActions.actions.length; i++) {
|
|
@@ -750,13 +797,25 @@ async function verifyReadRequests(
|
|
|
750
797
|
}
|
|
751
798
|
}
|
|
752
799
|
|
|
753
|
-
const [
|
|
754
|
-
|
|
755
|
-
|
|
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
|
+
: [],
|
|
756
815
|
]);
|
|
757
816
|
|
|
758
817
|
for (let i = 0; i < settledNoteHashReads.length; i++) {
|
|
759
|
-
if (!
|
|
818
|
+
if (!noteHashResults[i]) {
|
|
760
819
|
throw new Error(
|
|
761
820
|
`Note hash read request at index ${settledNoteHashReads[i].index} is reading an unknown note hash: ${settledNoteHashReads[i].value}`,
|
|
762
821
|
);
|
|
@@ -764,7 +823,7 @@ async function verifyReadRequests(
|
|
|
764
823
|
}
|
|
765
824
|
|
|
766
825
|
for (let i = 0; i < settledNullifierReads.length; i++) {
|
|
767
|
-
if (!
|
|
826
|
+
if (!nullifierResults[i]) {
|
|
768
827
|
throw new Error(
|
|
769
828
|
`Nullifier read request at index ${settledNullifierReads[i].index} is reading an unknown nullifier: ${settledNullifierReads[i].value}`,
|
|
770
829
|
);
|
|
@@ -810,9 +869,9 @@ function meterGasUsed(data: PrivateToRollupAccumulatedData | PrivateToPublicAccu
|
|
|
810
869
|
meteredL2Gas += numPrivatelogs * L2_GAS_PER_PRIVATE_LOG;
|
|
811
870
|
|
|
812
871
|
const numContractClassLogs = arrayNonEmptyLength(data.contractClassLogsHashes, log => log.isEmpty());
|
|
813
|
-
// Every contract class log emits its
|
|
872
|
+
// Every contract class log emits its contract address as an additional field
|
|
814
873
|
meteredDAFields += data.contractClassLogsHashes.reduce(
|
|
815
|
-
(acc, log) => (!log.isEmpty() ? acc + log.logHash.length +
|
|
874
|
+
(acc, log) => (!log.isEmpty() ? acc + log.logHash.length + 1 : acc),
|
|
816
875
|
0,
|
|
817
876
|
);
|
|
818
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
|
+
}
|