@aztec/pxe 0.0.1-commit.2f68f620 → 0.0.1-commit.3100065
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bin/check_oracle_version.js +10 -20
- package/dest/bin/index.d.ts +2 -2
- package/dest/bin/index.d.ts.map +1 -1
- package/dest/bin/index.js +1 -1
- package/dest/bin/oracle_version_helpers.d.ts +26 -1
- package/dest/bin/oracle_version_helpers.d.ts.map +1 -1
- package/dest/bin/oracle_version_helpers.js +162 -1
- package/dest/block_synchronizer/block_stream_source.d.ts +5 -5
- package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -1
- package/dest/block_synchronizer/block_stream_source.js +4 -29
- package/dest/block_synchronizer/block_synchronizer.d.ts +18 -14
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +54 -18
- package/dest/config/index.d.ts +2 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +1 -0
- package/dest/config/package_info.js +1 -1
- package/dest/contract/contract_class_service.d.ts +31 -0
- package/dest/contract/contract_class_service.d.ts.map +1 -0
- package/dest/contract/contract_class_service.js +68 -0
- package/dest/contract/contract_sync_service.d.ts +48 -0
- package/dest/contract/contract_sync_service.d.ts.map +1 -0
- package/dest/{contract_sync → contract}/contract_sync_service.js +26 -45
- package/dest/contract/helpers.d.ts +7 -0
- package/dest/contract/helpers.d.ts.map +1 -0
- package/dest/contract/helpers.js +20 -0
- package/dest/contract_function_simulator/anchored_contract_data.d.ts +36 -0
- package/dest/contract_function_simulator/anchored_contract_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/anchored_contract_data.js +54 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.d.ts +39 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.d.ts.map +1 -0
- package/dest/contract_function_simulator/aztec_node_read_cache.js +60 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +19 -18
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +64 -35
- package/dest/contract_function_simulator/execution_note_cache.d.ts +3 -9
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +8 -28
- package/dest/contract_function_simulator/index.d.ts +19 -10
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +7 -9
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts +8 -27
- package/dest/contract_function_simulator/noir-structs/bounded_vec.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/bounded_vec.js +8 -23
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts +9 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/contract_class_log_data.js +1 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts +7 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/embedded_curve_point.js +1 -0
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/fact.d.ts +16 -0
- package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/fact.js +6 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +27 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/fact_collection.js +31 -0
- package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +11 -12
- 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 +6 -49
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +10 -8
- 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 +1 -60
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +2 -2
- package/dest/contract_function_simulator/noir-structs/option.d.ts +9 -11
- package/dest/contract_function_simulator/noir-structs/option.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/option.js +18 -13
- package/dest/contract_function_simulator/noir-structs/origin_block.d.ts +11 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/origin_block.js +5 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts +11 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/pending_tagged_log.js +4 -0
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts +6 -9
- package/dest/contract_function_simulator/noir-structs/provided_secret.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/provided_secret.js +1 -24
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +28 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +50 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts +21 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/resolved_tx.js +50 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +14 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts.map +1 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.js +5 -0
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +6 -11
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +1 -20
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts +21 -0
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/acir_callback.js +115 -0
- package/dest/contract_function_simulator/oracle/index.d.ts +2 -13
- package/dest/contract_function_simulator/oracle/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/index.js +1 -1
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +2 -3
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts +39 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.d.ts.map +1 -0
- package/dest/contract_function_simulator/oracle/legacy_oracle_registry.js +107 -0
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -14
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.js +1 -24
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts +41 -30
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_registry.js +248 -27
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +123 -40
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +947 -264
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +2 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +21 -8
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +128 -17
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +73 -33
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +220 -104
- package/dest/contract_function_simulator/transient_array_service.d.ts +31 -0
- package/dest/contract_function_simulator/transient_array_service.d.ts.map +1 -0
- package/dest/contract_function_simulator/transient_array_service.js +62 -0
- package/dest/debug/pxe_debug_utils.d.ts +2 -2
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +8 -3
- package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +8 -3
- package/dest/entrypoints/pxe_creation_options.d.ts +9 -3
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +5 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +3 -2
- package/dest/entrypoints/server/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +8 -2
- package/dest/error_enriching.d.ts +5 -3
- package/dest/error_enriching.d.ts.map +1 -1
- package/dest/error_enriching.js +13 -11
- package/dest/hooks/execution_hooks.d.ts +31 -11
- package/dest/hooks/execution_hooks.d.ts.map +1 -1
- package/dest/hooks/execution_hooks.js +3 -3
- package/dest/hooks/index.d.ts +4 -3
- package/dest/hooks/index.d.ts.map +1 -1
- package/dest/hooks/index.js +1 -0
- package/dest/hooks/resolve_custom_request.d.ts +23 -0
- package/dest/hooks/resolve_custom_request.d.ts.map +1 -0
- package/dest/hooks/resolve_custom_request.js +3 -0
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts +50 -0
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -0
- package/dest/hooks/resolve_tagging_secret_strategy.js +3 -0
- package/dest/logs/log_service.d.ts +7 -6
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +79 -28
- package/dest/messages/tx_resolver_service.d.ts +17 -0
- package/dest/messages/tx_resolver_service.d.ts.map +1 -0
- package/dest/messages/{message_context_service.js → tx_resolver_service.js} +8 -8
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.js +5 -5
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +6 -2
- package/dest/private_kernel/hints/test_utils.js +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +17 -36
- package/dest/private_kernel/private_kernel_oracle.d.ts +4 -2
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +17 -5
- package/dest/pxe.d.ts +114 -48
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +222 -139
- package/dest/storage/allowed_scopes.d.ts +6 -0
- package/dest/storage/allowed_scopes.d.ts.map +1 -0
- package/dest/storage/allowed_scopes.js +7 -0
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -6
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +8 -6
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts +1 -1
- package/dest/storage/backwards_compatibility_tests/schema_tests.d.ts.map +1 -1
- package/dest/storage/backwards_compatibility_tests/schema_tests.js +129 -49
- package/dest/storage/capsule_store/capsule_service.d.ts +1 -1
- package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_service.js +6 -9
- package/dest/storage/contract_store/contract_store.d.ts +27 -24
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +64 -75
- package/dest/storage/fact_store/fact_service.d.ts +22 -0
- package/dest/storage/fact_store/fact_service.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_service.js +45 -0
- package/dest/storage/fact_store/fact_store.d.ts +95 -0
- package/dest/storage/fact_store/fact_store.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_store.js +408 -0
- package/dest/storage/fact_store/fact_store_keys.d.ts +34 -0
- package/dest/storage/fact_store/fact_store_keys.d.ts.map +1 -0
- package/dest/storage/fact_store/fact_store_keys.js +50 -0
- package/dest/storage/fact_store/index.d.ts +6 -0
- package/dest/storage/fact_store/index.d.ts.map +1 -0
- package/dest/storage/fact_store/index.js +4 -0
- package/dest/storage/fact_store/origin_state.d.ts +57 -0
- package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
- package/dest/storage/fact_store/origin_state.js +53 -0
- package/dest/storage/fact_store/stored_fact.d.ts +32 -0
- package/dest/storage/fact_store/stored_fact.d.ts.map +1 -0
- package/dest/storage/fact_store/stored_fact.js +64 -0
- package/dest/storage/index.d.ts +3 -2
- package/dest/storage/index.d.ts.map +1 -1
- package/dest/storage/index.js +2 -1
- package/dest/storage/metadata.d.ts +2 -2
- package/dest/storage/metadata.d.ts.map +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +42 -33
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +197 -168
- package/dest/storage/note_store/stored_note.d.ts +3 -8
- package/dest/storage/note_store/stored_note.d.ts.map +1 -1
- package/dest/storage/note_store/stored_note.js +4 -20
- package/dest/storage/open_pxe_stores.d.ts +5 -3
- package/dest/storage/open_pxe_stores.d.ts.map +1 -1
- package/dest/storage/open_pxe_stores.js +5 -3
- package/dest/storage/private_event_store/private_event_store.d.ts +13 -16
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +40 -43
- package/dest/storage/tagging_store/index.d.ts +2 -2
- package/dest/storage/tagging_store/index.d.ts.map +1 -1
- package/dest/storage/tagging_store/index.js +1 -1
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts +51 -0
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -0
- package/dest/storage/tagging_store/tagging_secret_sources_store.js +105 -0
- package/dest/tagging/constants.d.ts +2 -2
- package/dest/tagging/constants.d.ts.map +1 -1
- package/dest/tagging/constants.js +18 -9
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +21 -8
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.js +56 -16
- package/package.json +17 -17
- package/src/bin/check_oracle_version.ts +10 -19
- package/src/bin/index.ts +5 -1
- package/src/bin/oracle_version_helpers.ts +190 -0
- package/src/block_synchronizer/block_stream_source.ts +6 -45
- package/src/block_synchronizer/block_synchronizer.ts +70 -29
- package/src/config/index.ts +1 -0
- package/src/config/package_info.ts +1 -1
- package/src/contract/contract_class_service.ts +83 -0
- package/src/{contract_sync → contract}/contract_sync_service.ts +37 -50
- package/src/contract/helpers.ts +35 -0
- package/src/contract_function_simulator/anchored_contract_data.ts +74 -0
- package/src/contract_function_simulator/aztec_node_read_cache.ts +89 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +97 -45
- package/src/contract_function_simulator/execution_note_cache.ts +7 -28
- package/src/contract_function_simulator/index.ts +26 -11
- package/src/contract_function_simulator/noir-structs/bounded_vec.ts +12 -24
- package/src/contract_function_simulator/noir-structs/contract_class_log_data.ts +9 -0
- package/src/contract_function_simulator/noir-structs/embedded_curve_point.ts +4 -0
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/fact.ts +13 -0
- package/src/contract_function_simulator/noir-structs/fact_collection.ts +64 -0
- package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +20 -46
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +13 -60
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +2 -2
- package/src/contract_function_simulator/noir-structs/option.ts +17 -11
- package/src/contract_function_simulator/noir-structs/origin_block.ts +8 -0
- package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
- package/src/contract_function_simulator/noir-structs/provided_secret.ts +4 -26
- package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +66 -0
- package/src/contract_function_simulator/noir-structs/resolved_tx.ts +53 -0
- package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +15 -0
- package/src/contract_function_simulator/noir-structs/utility_context.ts +5 -17
- package/src/contract_function_simulator/oracle/acir_callback.ts +154 -0
- package/src/contract_function_simulator/oracle/index.ts +1 -15
- package/src/contract_function_simulator/oracle/interfaces.ts +1 -2
- package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
- package/src/contract_function_simulator/oracle/message_load_oracle_inputs.ts +6 -21
- package/src/contract_function_simulator/oracle/oracle_registry.ts +162 -41
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +659 -248
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +156 -24
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +357 -131
- package/src/contract_function_simulator/transient_array_service.ts +91 -0
- package/src/debug/pxe_debug_utils.ts +1 -1
- package/src/entrypoints/client/bundle/utils.ts +10 -3
- package/src/entrypoints/client/lazy/utils.ts +10 -3
- package/src/entrypoints/pxe_creation_options.ts +8 -2
- package/src/entrypoints/server/index.ts +5 -2
- package/src/entrypoints/server/utils.ts +10 -2
- package/src/error_enriching.ts +27 -11
- package/src/hooks/execution_hooks.ts +32 -12
- package/src/hooks/index.ts +8 -2
- package/src/hooks/resolve_custom_request.ts +24 -0
- package/src/hooks/resolve_tagging_secret_strategy.ts +60 -0
- package/src/logs/log_service.ts +91 -37
- package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
- package/src/oracle_version.ts +5 -5
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -1
- package/src/private_kernel/hints/test_utils.ts +1 -1
- package/src/private_kernel/private_kernel_execution_prover.ts +22 -52
- package/src/private_kernel/private_kernel_oracle.ts +23 -4
- package/src/pxe.ts +325 -159
- package/src/storage/allowed_scopes.ts +14 -0
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -6
- package/src/storage/backwards_compatibility_tests/__snapshots__/AddressStore.json +6 -6
- package/src/storage/backwards_compatibility_tests/__snapshots__/ContractStore.json +1 -1
- package/src/storage/backwards_compatibility_tests/__snapshots__/FactStore.json +40 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/KeyStore.json +12 -12
- package/src/storage/backwards_compatibility_tests/__snapshots__/L2TipsKVStore.json +9 -15
- package/src/storage/backwards_compatibility_tests/__snapshots__/NoteStore.json +24 -4
- package/src/storage/backwards_compatibility_tests/__snapshots__/RecipientTaggingStore.json +11 -3
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderTaggingStore.json +12 -4
- package/src/storage/backwards_compatibility_tests/__snapshots__/TaggingSecretSourcesStore.json +30 -0
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +29 -9
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +141 -50
- package/src/storage/capsule_store/capsule_service.ts +8 -13
- package/src/storage/contract_store/contract_store.ts +86 -93
- package/src/storage/fact_store/fact_service.ts +69 -0
- package/src/storage/fact_store/fact_store.ts +487 -0
- package/src/storage/fact_store/fact_store_keys.ts +75 -0
- package/src/storage/fact_store/index.ts +14 -0
- package/src/storage/fact_store/origin_state.ts +75 -0
- package/src/storage/fact_store/stored_fact.ts +80 -0
- package/src/storage/index.ts +2 -1
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +226 -187
- package/src/storage/note_store/stored_note.ts +5 -27
- package/src/storage/open_pxe_stores.ts +6 -3
- package/src/storage/private_event_store/private_event_store.ts +49 -55
- package/src/storage/tagging_store/index.ts +1 -1
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
- package/src/tagging/constants.ts +19 -9
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +77 -16
- package/dest/contract_function_simulator/oracle/oracle.d.ts +0 -89
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +0 -1
- package/dest/contract_function_simulator/oracle/oracle.js +0 -552
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +0 -6
- package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_contract_data_source.js +0 -51
- package/dest/contract_sync/contract_sync_service.d.ts +0 -42
- package/dest/contract_sync/contract_sync_service.d.ts.map +0 -1
- package/dest/contract_sync/helpers.d.ts +0 -27
- package/dest/contract_sync/helpers.d.ts.map +0 -1
- package/dest/contract_sync/helpers.js +0 -53
- package/dest/messages/message_context_service.d.ts +0 -17
- package/dest/messages/message_context_service.d.ts.map +0 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +0 -14
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +0 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +0 -36
- package/src/contract_function_simulator/oracle/oracle.ts +0 -711
- package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
- package/src/contract_sync/helpers.ts +0 -86
- package/src/storage/backwards_compatibility_tests/__snapshots__/SenderAddressBookStore.json +0 -16
- package/src/storage/tagging_store/sender_address_book_store.ts +0 -48
|
@@ -1,48 +1,26 @@
|
|
|
1
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
1
|
import { BufferReader, serializeToBuffer } from '@aztec/foundation/serialize';
|
|
3
2
|
import { NoteDao } from '@aztec/stdlib/note';
|
|
4
3
|
|
|
4
|
+
/** A note as stored by the PXE: the note DAO plus the scopes that observed it. Append-only — never mutated. */
|
|
5
5
|
export class StoredNote {
|
|
6
6
|
constructor(
|
|
7
7
|
readonly noteDao: NoteDao,
|
|
8
8
|
readonly scopes: Set<string>,
|
|
9
|
-
private _nullifiedAt: BlockNumber | undefined = undefined,
|
|
10
9
|
) {}
|
|
11
10
|
|
|
12
|
-
static fromBuffer(buffer: Buffer) {
|
|
11
|
+
static fromBuffer(buffer: Buffer): StoredNote {
|
|
13
12
|
const reader = BufferReader.asReader(buffer);
|
|
14
|
-
|
|
15
13
|
const noteDao = NoteDao.fromBuffer(reader);
|
|
16
14
|
const scopes = reader.readVector({ fromBuffer: (r: BufferReader) => r.readString() });
|
|
17
|
-
|
|
18
|
-
const nullifiedAtRaw = reader.readNumber();
|
|
19
|
-
const nullifiedAt = nullifiedAtRaw === 0 ? undefined : (nullifiedAtRaw as BlockNumber);
|
|
20
|
-
|
|
21
|
-
return new StoredNote(noteDao, new Set(scopes), nullifiedAt);
|
|
15
|
+
return new StoredNote(noteDao, new Set(scopes));
|
|
22
16
|
}
|
|
23
17
|
|
|
24
18
|
toBuffer(): Buffer {
|
|
25
19
|
const scopesArray = [...this.scopes];
|
|
26
|
-
return serializeToBuffer(this.noteDao, scopesArray.length, ...scopesArray
|
|
20
|
+
return serializeToBuffer(this.noteDao, scopesArray.length, ...scopesArray);
|
|
27
21
|
}
|
|
28
22
|
|
|
29
|
-
addScope(scope: string) {
|
|
23
|
+
addScope(scope: string): void {
|
|
30
24
|
this.scopes.add(scope);
|
|
31
25
|
}
|
|
32
|
-
|
|
33
|
-
markAsNullified(blockNumber: BlockNumber) {
|
|
34
|
-
this._nullifiedAt = blockNumber;
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
markAsActive() {
|
|
38
|
-
this._nullifiedAt = undefined;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
isNullified() {
|
|
42
|
-
return this._nullifiedAt !== undefined;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
get nullifiedAt() {
|
|
46
|
-
return this._nullifiedAt;
|
|
47
|
-
}
|
|
48
26
|
}
|
|
@@ -7,9 +7,10 @@ import { AddressStore } from './address_store/address_store.js';
|
|
|
7
7
|
import { AnchorBlockStore } from './anchor_block_store/anchor_block_store.js';
|
|
8
8
|
import { CapsuleStore } from './capsule_store/capsule_store.js';
|
|
9
9
|
import { ContractStore } from './contract_store/contract_store.js';
|
|
10
|
+
import { FactStore } from './fact_store/fact_store.js';
|
|
10
11
|
import { NoteStore } from './note_store/note_store.js';
|
|
11
12
|
import { PrivateEventStore } from './private_event_store/private_event_store.js';
|
|
12
|
-
import { RecipientTaggingStore,
|
|
13
|
+
import { RecipientTaggingStore, SenderTaggingStore, TaggingSecretSourcesStore } from './tagging_store/index.js';
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* The set of sub-stores opened against a single `AztecAsyncKVStore` to back PXE state.
|
|
@@ -21,11 +22,12 @@ export type PxeStores = {
|
|
|
21
22
|
noteStore: NoteStore;
|
|
22
23
|
anchorBlockStore: AnchorBlockStore;
|
|
23
24
|
senderTaggingStore: SenderTaggingStore;
|
|
24
|
-
|
|
25
|
+
taggingSecretSourcesStore: TaggingSecretSourcesStore;
|
|
25
26
|
recipientTaggingStore: RecipientTaggingStore;
|
|
26
27
|
capsuleStore: CapsuleStore;
|
|
27
28
|
keyStore: KeyStore;
|
|
28
29
|
l2TipsStore: L2TipsKVStore;
|
|
30
|
+
factStore: FactStore;
|
|
29
31
|
};
|
|
30
32
|
|
|
31
33
|
/**
|
|
@@ -40,10 +42,11 @@ export function openPxeStores(store: AztecAsyncKVStore, initialBlockHash: BlockH
|
|
|
40
42
|
noteStore: new NoteStore(store),
|
|
41
43
|
anchorBlockStore: new AnchorBlockStore(store),
|
|
42
44
|
senderTaggingStore: new SenderTaggingStore(store),
|
|
43
|
-
|
|
45
|
+
taggingSecretSourcesStore: new TaggingSecretSourcesStore(store),
|
|
44
46
|
recipientTaggingStore: new RecipientTaggingStore(store),
|
|
45
47
|
capsuleStore: new CapsuleStore(store),
|
|
46
48
|
keyStore: new KeyStore(store),
|
|
47
49
|
l2TipsStore: new L2TipsKVStore(store, 'pxe', initialBlockHash),
|
|
50
|
+
factStore: new FactStore(store),
|
|
48
51
|
};
|
|
49
52
|
}
|
|
@@ -28,25 +28,35 @@ type PrivateEventMetadata = InTx & {
|
|
|
28
28
|
eventIndexInTx: number;
|
|
29
29
|
};
|
|
30
30
|
|
|
31
|
+
/// Alias types for kv map readability
|
|
32
|
+
type EventId = string; // the siloedEventCommitment, stringified
|
|
33
|
+
type JobId = string;
|
|
34
|
+
type ContractAndSelectorKey = string;
|
|
35
|
+
type BlockNum = number;
|
|
36
|
+
type StoredEventBuffer = Buffer;
|
|
37
|
+
|
|
31
38
|
/**
|
|
32
39
|
* Stores decrypted private event logs.
|
|
40
|
+
*
|
|
41
|
+
* Append-only: events are never deleted during normal operation. Reorgs are handled by delete-on-prune, which removes
|
|
42
|
+
* every event originating on a reorg'd block.
|
|
33
43
|
*/
|
|
34
44
|
export class PrivateEventStore implements StagedStore {
|
|
35
45
|
readonly storeName: string = 'private_event';
|
|
36
46
|
|
|
37
47
|
#store: AztecAsyncKVStore;
|
|
38
48
|
/** Actual private event log entries, keyed by siloedEventCommitment */
|
|
39
|
-
#events: AztecAsyncMap<
|
|
49
|
+
#events: AztecAsyncMap<EventId, StoredEventBuffer>;
|
|
40
50
|
/** Multi-map from contractAddress_eventSelector to siloedEventCommitment for efficient lookup */
|
|
41
|
-
#eventsByContractAndEventSelector: AztecAsyncMultiMap<
|
|
42
|
-
/** Multi-map from block number to siloedEventCommitment for
|
|
43
|
-
#eventsByBlockNumber: AztecAsyncMultiMap<
|
|
51
|
+
#eventsByContractAndEventSelector: AztecAsyncMultiMap<ContractAndSelectorKey, EventId>;
|
|
52
|
+
/** Multi-map from block number to siloedEventCommitment, for delete-on-prune. */
|
|
53
|
+
#eventsByBlockNumber: AztecAsyncMultiMap<BlockNum, EventId>;
|
|
44
54
|
|
|
45
55
|
/** jobId => eventId (event siloed nullifier) => StoredPrivateEvent */
|
|
46
|
-
#eventsForJob: Map<
|
|
56
|
+
#eventsForJob: Map<JobId, Map<EventId, StoredPrivateEvent>>;
|
|
47
57
|
|
|
48
58
|
/** Per-job locks to prevent concurrent writes from affecting each other. */
|
|
49
|
-
#jobLocks: Map<
|
|
59
|
+
#jobLocks: Map<JobId, Semaphore>;
|
|
50
60
|
|
|
51
61
|
logger = createLogger('private_event_store');
|
|
52
62
|
|
|
@@ -216,65 +226,49 @@ export class PrivateEventStore implements StagedStore {
|
|
|
216
226
|
});
|
|
217
227
|
}
|
|
218
228
|
|
|
229
|
+
/** Returns the ids (siloed event commitments) of all events emitted at the given block number. Used by delete-on-prune. */
|
|
230
|
+
public async eventIdsAtBlock(blockNumber: number): Promise<string[]> {
|
|
231
|
+
const eventIds: string[] = [];
|
|
232
|
+
for await (const eventId of this.#eventsByBlockNumber.getValuesAsync(blockNumber)) {
|
|
233
|
+
eventIds.push(eventId);
|
|
234
|
+
}
|
|
235
|
+
return eventIds;
|
|
236
|
+
}
|
|
237
|
+
|
|
219
238
|
/**
|
|
220
|
-
* Rolls back
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
* We don't need staged writes for a rollback since it's handled in the context of a blockchain rewind.
|
|
239
|
+
* Rolls the store back to `toBlock`: deletes every event anchored to a block strictly above it, as if nothing past
|
|
240
|
+
* that block height ever happened. Used by the reorg (`chain-pruned`) path to truncate the orphaned tail. Scanning
|
|
241
|
+
* from `toBlock + 1` upward covers everything above the rollback target without needing to know the chain tip.
|
|
224
242
|
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
* So if anything fails in the process of rolling back any store, all DB changes occurring during rollbacks will be
|
|
229
|
-
* lost and the anchor block will not be updated; which means this code will eventually need to run again
|
|
230
|
-
* (i.e.: PXE will detect it's basing it work on an invalid block hash, then which re-triggers rewind).
|
|
231
|
-
*
|
|
232
|
-
* For further details, refer to `BlockSynchronizer#handleBlockStreamEvent`.
|
|
233
|
-
*
|
|
234
|
-
* IMPORTANT: This method must be called within a transaction to ensure atomicity.
|
|
243
|
+
* Must be called inside a transaction owned by the caller (it issues no `transactionAsync` of its own, the reorg
|
|
244
|
+
* path wraps it together with the anchor update, and IndexedDB has no nested transactions). Throws if any job has
|
|
245
|
+
* uncommitted staged writes, since rolling back mid-job could later re-introduce events anchored to deleted blocks.
|
|
235
246
|
*/
|
|
236
|
-
public async rollback(
|
|
247
|
+
public async rollback(toBlock: number): Promise<void> {
|
|
237
248
|
if (this.#eventsForJob.size > 0) {
|
|
238
249
|
throw new Error('PXE private event store rollback is not allowed while jobs are running');
|
|
239
250
|
}
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
const
|
|
243
|
-
|
|
244
|
-
for (let block = blockNumber + 1; block <= synchedBlockNumber; block++) {
|
|
245
|
-
const blockEvents: { eventId: string; eventReadPromise: Promise<Buffer | undefined> }[] = [];
|
|
246
|
-
for await (const eventId of this.#eventsByBlockNumber.getValuesAsync(block)) {
|
|
247
|
-
// Start read immediately during iteration to keep IndexedDB transaction alive
|
|
248
|
-
blockEvents.push({ eventId, eventReadPromise: this.#events.getAsync(eventId) });
|
|
249
|
-
}
|
|
250
|
-
if (blockEvents.length > 0) {
|
|
251
|
-
eventsByBlock.set(block, blockEvents);
|
|
252
|
-
}
|
|
251
|
+
// Snapshot before mutating so we never delete from the multimap we are iterating.
|
|
252
|
+
const orphaned: { block: number; eventId: string }[] = [];
|
|
253
|
+
for await (const [block, eventId] of this.#eventsByBlockNumber.entriesAsync({ start: toBlock + 1 })) {
|
|
254
|
+
orphaned.push({ block, eventId });
|
|
253
255
|
}
|
|
254
|
-
|
|
255
|
-
// Second pass: await reads and perform deletes
|
|
256
256
|
let removedCount = 0;
|
|
257
|
-
for (const
|
|
258
|
-
await this.#
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
const buffer = await eventReadPromise;
|
|
262
|
-
if (!buffer) {
|
|
263
|
-
throw new Error(`Event not found for eventId ${eventId}`);
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
const entry = StoredPrivateEvent.fromBuffer(buffer);
|
|
267
|
-
await this.#events.delete(eventId);
|
|
268
|
-
await this.#eventsByContractAndEventSelector.deleteValue(
|
|
269
|
-
this.#keyFor(entry.contractAddress, entry.eventSelector),
|
|
270
|
-
eventId,
|
|
271
|
-
);
|
|
272
|
-
|
|
273
|
-
removedCount++;
|
|
257
|
+
for (const { block, eventId } of orphaned) {
|
|
258
|
+
const buf = await this.#events.getAsync(eventId);
|
|
259
|
+
if (!buf) {
|
|
260
|
+
throw new Error(`Event not found for eventId ${eventId}`);
|
|
274
261
|
}
|
|
262
|
+
const stored = StoredPrivateEvent.fromBuffer(buf);
|
|
263
|
+
await this.#events.delete(eventId);
|
|
264
|
+
await this.#eventsByContractAndEventSelector.deleteValue(
|
|
265
|
+
this.#keyFor(stored.contractAddress, stored.eventSelector),
|
|
266
|
+
eventId,
|
|
267
|
+
);
|
|
268
|
+
await this.#eventsByBlockNumber.deleteValue(block, eventId);
|
|
269
|
+
removedCount++;
|
|
275
270
|
}
|
|
276
|
-
|
|
277
|
-
this.logger.verbose(`Rolled back ${removedCount} private events after block ${blockNumber}`);
|
|
271
|
+
this.logger.verbose('rolled back private events', { removedCount, toBlock });
|
|
278
272
|
}
|
|
279
273
|
|
|
280
274
|
/**
|
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
export { SenderTaggingStore } from './sender_tagging_store.js';
|
|
2
|
-
export {
|
|
2
|
+
export { TaggingSecretSourcesStore } from './tagging_secret_sources_store.js';
|
|
3
3
|
export { RecipientTaggingStore } from './recipient_tagging_store.js';
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
2
|
+
import { toArray } from '@aztec/foundation/iterable';
|
|
3
|
+
import type { AztecAsyncKVStore, AztecAsyncMap, AztecAsyncMultiMap } from '@aztec/kv-store';
|
|
4
|
+
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* The kinds of shared secret an entry can hold.
|
|
8
|
+
*/
|
|
9
|
+
export type SharedSecretKind = 'arbitrary-secret' | 'handshake';
|
|
10
|
+
|
|
11
|
+
/** A shared secret registered for a recipient, with the kind that determines which tag streams it backs. */
|
|
12
|
+
export type SharedSecret = { kind: SharedSecretKind; secret: Point };
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Stores the sources from which directional app tagging secrets are derived during recipient log synchronization.
|
|
16
|
+
*
|
|
17
|
+
* Two kinds of source are held:
|
|
18
|
+
* - Sender addresses: combined with a recipient to derive a shared tagging secret via ECDH. These are global (not
|
|
19
|
+
* scoped to a recipient) because the per-recipient binding comes from re-mixing the recipient's keys during
|
|
20
|
+
* derivation, so each account only ever derives secrets meant for it.
|
|
21
|
+
* - Pre-shared tagging secrets: shared secret points registered directly, bypassing ECDH. These are scoped to a
|
|
22
|
+
* specific recipient, since the derivation of the directional app tagging secret does not require any secret
|
|
23
|
+
* recipient data: given the original secret anyone can derive a recipient's app-siloed directional tagging secret,
|
|
24
|
+
* and so these must not be reused across recipients to preserve privacy. Each carries the {@link SharedSecretKind}
|
|
25
|
+
* it was registered through, which determines the tag streams it is scanned under.
|
|
26
|
+
*/
|
|
27
|
+
export class TaggingSecretSourcesStore {
|
|
28
|
+
#store: AztecAsyncKVStore;
|
|
29
|
+
#senders: AztecAsyncMap<string, true>;
|
|
30
|
+
#sharedSecretsByRecipient: AztecAsyncMultiMap<string, StoredSharedSecret>;
|
|
31
|
+
|
|
32
|
+
constructor(store: AztecAsyncKVStore) {
|
|
33
|
+
this.#store = store;
|
|
34
|
+
|
|
35
|
+
this.#senders = this.#store.openMap('senders');
|
|
36
|
+
this.#sharedSecretsByRecipient = this.#store.openMultiMap('recipient_shared_secrets');
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
addSender(address: AztecAddress): Promise<boolean> {
|
|
40
|
+
return this.#store.transactionAsync(async () => {
|
|
41
|
+
if (await this.#senders.hasAsync(address.toString())) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
await this.#senders.set(address.toString(), true);
|
|
46
|
+
|
|
47
|
+
return true;
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
getSenders(): Promise<AztecAddress[]> {
|
|
52
|
+
return this.#store.transactionAsync(async () => {
|
|
53
|
+
return (await toArray(this.#senders.keysAsync())).map(AztecAddress.fromStringUnsafe);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
removeSender(address: AztecAddress): Promise<boolean> {
|
|
58
|
+
return this.#store.transactionAsync(async () => {
|
|
59
|
+
if (!(await this.#senders.hasAsync(address.toString()))) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
await this.#senders.delete(address.toString());
|
|
64
|
+
|
|
65
|
+
return true;
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Registers a pre-shared tagging secret scoped to a recipient.
|
|
71
|
+
* @returns true if the secret was newly added, false if it was already registered for that recipient.
|
|
72
|
+
*/
|
|
73
|
+
addSharedSecret(recipient: AztecAddress, kind: SharedSecretKind, secret: Point): Promise<boolean> {
|
|
74
|
+
return this.#store.transactionAsync(async () => {
|
|
75
|
+
const secretStr = secret.toString();
|
|
76
|
+
// MultiMap.set silently ignores an identical (key, value), so we scan to report whether this is a new secret.
|
|
77
|
+
for await (const existing of this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString())) {
|
|
78
|
+
if (existing.secret === secretStr) {
|
|
79
|
+
if (existing.kind !== kind) {
|
|
80
|
+
throw new Error(
|
|
81
|
+
`Secret already registered for recipient with kind '${existing.kind}', cannot re-register it as '${kind}'.`,
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
return false;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
await this.#sharedSecretsByRecipient.set(recipient.toString(), { kind, secret: secretStr });
|
|
89
|
+
|
|
90
|
+
return true;
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** Returns the pre-shared tagging secrets registered for a given recipient. */
|
|
95
|
+
getSharedSecretsForRecipient(recipient: AztecAddress): Promise<SharedSecret[]> {
|
|
96
|
+
return this.#store.transactionAsync(async () => {
|
|
97
|
+
return (await toArray(this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString()))).map(
|
|
98
|
+
deserializeSharedSecret,
|
|
99
|
+
);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** Returns every registered pre-shared tagging secret, each paired with the recipient it is scoped to. */
|
|
104
|
+
getAllSharedSecrets(): Promise<{ recipient: AztecAddress; kind: SharedSecretKind; secret: Point }[]> {
|
|
105
|
+
return this.#store.transactionAsync(async () => {
|
|
106
|
+
const entries = await toArray(this.#sharedSecretsByRecipient.entriesAsync());
|
|
107
|
+
return entries.map(([recipient, entry]) => ({
|
|
108
|
+
recipient: AztecAddress.fromStringUnsafe(recipient),
|
|
109
|
+
...deserializeSharedSecret(entry),
|
|
110
|
+
}));
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* Removes a pre-shared tagging secret scoped to a recipient. Both the secret and its kind must match.
|
|
116
|
+
* @returns true if the secret was registered and removed, false if it was not registered for that recipient.
|
|
117
|
+
*/
|
|
118
|
+
removeSharedSecret(recipient: AztecAddress, kind: SharedSecretKind, secret: Point): Promise<boolean> {
|
|
119
|
+
return this.#store.transactionAsync(async () => {
|
|
120
|
+
const secretStr = secret.toString();
|
|
121
|
+
for await (const existing of this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString())) {
|
|
122
|
+
if (existing.kind === kind && existing.secret === secretStr) {
|
|
123
|
+
await this.#sharedSecretsByRecipient.deleteValue(recipient.toString(), existing);
|
|
124
|
+
return true;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
return false;
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/** The wire form a shared secret entry is persisted as. */
|
|
134
|
+
type StoredSharedSecret = { kind: SharedSecretKind; secret: string };
|
|
135
|
+
|
|
136
|
+
function deserializeSharedSecret(entry: StoredSharedSecret): SharedSecret {
|
|
137
|
+
return { kind: entry.kind, secret: Point.fromString(entry.secret) };
|
|
138
|
+
}
|
package/src/tagging/constants.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// This
|
|
4
|
-
//
|
|
5
|
-
// and the note is nullified in the same tx.
|
|
1
|
+
import { MAX_PRIVATE_LOGS_PER_TX } from '@aztec/constants';
|
|
2
|
+
|
|
3
|
+
// This window bounds how far a sender's next tag index for a directional app tagging secret can run ahead of that
|
|
4
|
+
// secret's highest finalized index before `PXE::proveTx` throws.
|
|
6
5
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
|
|
6
|
+
// MAX_PRIVATE_LOGS_PER_TX is a floor for ordinary transaction patterns: the private kernel accumulates every
|
|
7
|
+
// surviving private log into a single tx-wide array of exactly this size, so a fresh secret's very first
|
|
8
|
+
// ordinary tx can consume that many indexes before anything is finalized.
|
|
9
|
+
//
|
|
10
|
+
// The +20 on top is headroom for multiple pending ordinary txs to the same counterparty stacking up
|
|
11
|
+
// before the first one is observed as mined. Only a run of near-MAX_PRIVATE_LOGS_PER_TX txs back-to-back would
|
|
12
|
+
// exhaust this; ordinary transfers use far fewer logs per tx, so the same margin covers many more of those. Keep the
|
|
13
|
+
// margin additive rather than another multiple of the floor. A larger window also makes recipient-side sync more
|
|
14
|
+
// expensive, since discovery has to probe ahead of the last finalized index for every active secret.
|
|
15
|
+
//
|
|
16
|
+
// TODO(F-783): MAX_PRIVATE_LOGS_PER_TX is not a hard ceiling in general — a tx that creates and nullifies (squashes)
|
|
17
|
+
// many notes/logs to the same secret can drive that secret's raw tag index arbitrarily higher, since indexes are
|
|
18
|
+
// reserved at log emission time, before squashing is decided, and the kernel's reset/squash loop is not bounded by
|
|
19
|
+
// MAX_PRIVATE_LOGS_PER_TX. No fixed window value closes that gap.
|
|
20
|
+
export const UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN = MAX_PRIVATE_LOGS_PER_TX + 20;
|
|
@@ -3,7 +3,7 @@ import { isDefined } from '@aztec/foundation/types';
|
|
|
3
3
|
import type { BlockHash } from '@aztec/stdlib/block';
|
|
4
4
|
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
5
5
|
import type { AppTaggingSecret, LogResult } from '@aztec/stdlib/logs';
|
|
6
|
-
import { SiloedTag } from '@aztec/stdlib/logs';
|
|
6
|
+
import { AppTaggingSecretKind, SiloedTag } from '@aztec/stdlib/logs';
|
|
7
7
|
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
8
8
|
|
|
9
9
|
import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
|
|
@@ -13,11 +13,12 @@ import { findHighestIndexes } from './utils/find_highest_indexes.js';
|
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Fetches and syncs tagged private logs for multiple sender-recipient pairs, batching tag queries across all secrets
|
|
16
|
-
* into shared RPC calls.
|
|
16
|
+
* into shared RPC calls. Handles both constrained and unconstrained secrets, which differ in their scan strategy
|
|
17
|
+
* but share the same batching infrastructure.
|
|
17
18
|
*
|
|
18
|
-
* #
|
|
19
|
+
* # Unconstrained secrets
|
|
19
20
|
*
|
|
20
|
-
* For each secret we sync logs that correspond to the tagging index range
|
|
21
|
+
* For each unconstrained secret we sync logs that correspond to the tagging index range
|
|
21
22
|
* (highestAgedIndex, highestFinalizedIndex + WINDOW_LEN]
|
|
22
23
|
*
|
|
23
24
|
* highestAgedIndex is the highest index that was used in a tx that is included in a block at least
|
|
@@ -54,11 +55,23 @@ import { findHighestIndexes } from './utils/find_highest_indexes.js';
|
|
|
54
55
|
* the highest finalized index. If that index was already used, they will throw an error. For this reason we
|
|
55
56
|
* don't have to look further than `highestFinalizedIndex + WINDOW_LEN`.
|
|
56
57
|
*
|
|
57
|
-
*
|
|
58
|
+
* # Constrained secrets
|
|
58
59
|
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
60
|
+
* Constrained delivery enforces a contiguous index sequence (each send proves the predecessor's nullifier,
|
|
61
|
+
* chaining back to the handshake), so there is only one sender and indexes are sequential. This means:
|
|
62
|
+
* - The lower bound is `highestFinalizedIndex + 1`. The `highestAgedIndex` mechanism is unnecessary because
|
|
63
|
+
* the nullifier chain prevents out-of-order index usage: no device can fill in a lower index after a higher
|
|
64
|
+
* one is already on-chain.
|
|
65
|
+
* - The scan stops at the first gap in the index sequence. If all indexes in the batch have logs, the window
|
|
66
|
+
* advances. If a gap is found, the sequence has ended and no further logs exist.
|
|
67
|
+
* - The upper bound is the same as unconstrained: `highestFinalizedIndex + WINDOW_LEN`.
|
|
68
|
+
*
|
|
69
|
+
* # Batching across secrets
|
|
70
|
+
*
|
|
71
|
+
* Instead of running one RPC call per secret, we merge tags from all pending secrets (both constrained and
|
|
72
|
+
* unconstrained) into a single flat array, make one batched `getAllPrivateLogsByTags` call (which internally
|
|
73
|
+
* chunks at MAX_RPC_LEN), then split results back per secret using tracked offsets. Only secrets whose window
|
|
74
|
+
* advanced are kept for the next iteration.
|
|
62
75
|
*/
|
|
63
76
|
export async function syncTaggedPrivateLogs(
|
|
64
77
|
secrets: AppTaggingSecret[],
|
|
@@ -96,7 +109,12 @@ export async function syncTaggedPrivateLogs(
|
|
|
96
109
|
|
|
97
110
|
// Persist new indexes. If the finalized index moved forward, the window advances
|
|
98
111
|
// and we need another round for this secret.
|
|
99
|
-
|
|
112
|
+
const processForKind =
|
|
113
|
+
pendingSecret.secret.kind === AppTaggingSecretKind.CONSTRAINED
|
|
114
|
+
? processConstrainedResults
|
|
115
|
+
: processUnconstrainedResults;
|
|
116
|
+
|
|
117
|
+
return await processForKind(
|
|
100
118
|
pendingSecret,
|
|
101
119
|
logsFoundWithSecret,
|
|
102
120
|
taggingStore,
|
|
@@ -121,12 +139,14 @@ function getIndexRangesForSecrets(
|
|
|
121
139
|
): Promise<PendingSecret[]> {
|
|
122
140
|
return Promise.all(
|
|
123
141
|
secrets.map(async secret => {
|
|
124
|
-
const
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
142
|
+
const currentHighestFinalizedIndex = await taggingStore.getHighestFinalizedIndex(secret, jobId);
|
|
143
|
+
|
|
144
|
+
const highestIndexBeforeStart =
|
|
145
|
+
secret.kind === AppTaggingSecretKind.CONSTRAINED
|
|
146
|
+
? currentHighestFinalizedIndex
|
|
147
|
+
: await taggingStore.getHighestAgedIndex(secret, jobId);
|
|
148
|
+
const start = highestIndexBeforeStart === undefined ? 0 : highestIndexBeforeStart + 1;
|
|
128
149
|
|
|
129
|
-
const start = currentHighestAgedIndex === undefined ? 0 : currentHighestAgedIndex + 1;
|
|
130
150
|
const end = (currentHighestFinalizedIndex ?? 0) + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN + 1;
|
|
131
151
|
|
|
132
152
|
return { secret, start, end };
|
|
@@ -183,10 +203,51 @@ async function fetchLogsForSecrets(
|
|
|
183
203
|
}
|
|
184
204
|
|
|
185
205
|
/**
|
|
186
|
-
* Processes
|
|
206
|
+
* Processes fetched logs for a constrained secret. Constrained delivery guarantees contiguous index sequences,
|
|
207
|
+
* so we scan from the start of the queried range and stop at the first missing index. Only `highestFinalizedIndex`
|
|
208
|
+
* is tracked (no aged index).
|
|
209
|
+
*/
|
|
210
|
+
async function processConstrainedResults(
|
|
211
|
+
pending: PendingSecret,
|
|
212
|
+
logsWithIndexes: LogWithIndex[],
|
|
213
|
+
taggingStore: RecipientTaggingStore,
|
|
214
|
+
currentTimestamp: bigint,
|
|
215
|
+
finalizedBlockNumber: BlockNumber,
|
|
216
|
+
jobId: string,
|
|
217
|
+
): Promise<PendingSecret | undefined> {
|
|
218
|
+
// Find where the contiguous run of indexes ends. Constrained delivery guarantees there are no logs after the
|
|
219
|
+
// first gap, so all logs in the batch are within this prefix.
|
|
220
|
+
const indexesWithLogs = new Set(logsWithIndexes.map(l => l.taggingIndex));
|
|
221
|
+
let firstMissingIndex = pending.start;
|
|
222
|
+
while (firstMissingIndex < pending.end && indexesWithLogs.has(firstMissingIndex)) {
|
|
223
|
+
firstMissingIndex++;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
// Finalize any logs before the gap. The nullifier for a constrained-delivery log is emitted in the same
|
|
227
|
+
// transaction, guaranteeing the log cannot disappear once included, so we persist the highest finalized
|
|
228
|
+
// index even when a gap stops the scan. This lets the next sync round skip already-finalized indexes.
|
|
229
|
+
const { highestFinalizedIndex } = findHighestIndexes(logsWithIndexes, currentTimestamp, finalizedBlockNumber);
|
|
230
|
+
|
|
231
|
+
if (highestFinalizedIndex !== undefined) {
|
|
232
|
+
await taggingStore.updateHighestFinalizedIndex(pending.secret, highestFinalizedIndex, jobId);
|
|
233
|
+
|
|
234
|
+
if (firstMissingIndex >= pending.end) {
|
|
235
|
+
return {
|
|
236
|
+
secret: pending.secret,
|
|
237
|
+
start: pending.end,
|
|
238
|
+
end: highestFinalizedIndex + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN + 1,
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
return undefined;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
* Processes a single unconstrained secret's fetched logs: updates stored indexes and returns a new PendingSecret
|
|
187
248
|
* if the window needs to advance, or undefined if this secret is done.
|
|
188
249
|
*/
|
|
189
|
-
async function
|
|
250
|
+
async function processUnconstrainedResults(
|
|
190
251
|
pending: PendingSecret,
|
|
191
252
|
logsWithIndexes: LogWithIndex[],
|
|
192
253
|
taggingStore: RecipientTaggingStore,
|