@aztec/pxe 0.0.1-commit.b9865e97 → 0.0.1-commit.be03c316
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 +8 -23
- 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 +16 -8
- package/dest/bin/oracle_version_helpers.d.ts.map +1 -1
- package/dest/bin/oracle_version_helpers.js +22 -69
- 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/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/skip_sync_contracts.d.ts +11 -0
- package/dest/contract/skip_sync_contracts.d.ts.map +1 -0
- package/dest/contract/skip_sync_contracts.js +18 -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 +63 -32
- 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 +6 -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 +19 -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 +9 -0
- package/dest/contract_function_simulator/noir-structs/tx_effect_data.d.ts +15 -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 +43 -31
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_registry.js +259 -29
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +180 -45
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +1024 -341
- 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 +132 -22
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +77 -34
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +247 -106
- 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/index.d.ts +2 -1
- package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/index.js +1 -0
- 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 +17 -6
- package/dest/entrypoints/client/lazy/index.d.ts +2 -1
- package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/index.js +1 -0
- 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 +17 -6
- package/dest/entrypoints/client/store.d.ts +14 -0
- package/dest/entrypoints/client/store.d.ts.map +1 -0
- package/dest/entrypoints/client/store.js +42 -0
- 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 +6 -3
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +4 -2
- package/dest/entrypoints/server/store.d.ts +18 -0
- package/dest/entrypoints/server/store.d.ts.map +1 -0
- package/dest/entrypoints/server/store.js +28 -0
- 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 +16 -4
- 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 +8 -6
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +88 -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} +13 -8
- package/dest/notes/note_service.d.ts +1 -1
- package/dest/notes/note_service.js +1 -1
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.js +5 -5
- package/dest/private_kernel/batch_planner.d.ts +1 -1
- package/dest/private_kernel/batch_planner.d.ts.map +1 -1
- package/dest/private_kernel/batch_planner.js +1 -1
- 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 +61 -40
- 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 +225 -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 +59 -0
- package/dest/storage/fact_store/origin_state.d.ts.map +1 -0
- package/dest/storage/fact_store/origin_state.js +60 -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/store_identity.d.ts +35 -0
- package/dest/storage/store_identity.d.ts.map +1 -0
- package/dest/storage/store_identity.js +44 -0
- 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/sender_tagging_store.d.ts +19 -3
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +48 -11
- 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 +3 -2
- package/dest/tagging/constants.d.ts.map +1 -1
- package/dest/tagging/constants.js +28 -10
- package/dest/tagging/index.d.ts +2 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +1 -1
- package/dest/tagging/recipient_sync/sync_tagged_private_logs.d.ts +26 -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 +95 -20
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +1 -1
- 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 +6 -2
- package/dest/tagging/testing/tag_query_test_utils.d.ts +6 -0
- package/dest/tagging/testing/tag_query_test_utils.d.ts.map +1 -0
- package/dest/tagging/testing/tag_query_test_utils.js +10 -0
- package/package.json +17 -17
- package/src/bin/check_oracle_version.ts +8 -24
- package/src/bin/index.ts +1 -1
- package/src/bin/oracle_version_helpers.ts +23 -90
- 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/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/skip_sync_contracts.ts +23 -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 +96 -42
- package/src/contract_function_simulator/execution_note_cache.ts +7 -28
- package/src/contract_function_simulator/index.ts +48 -13
- 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 +19 -0
- package/src/contract_function_simulator/noir-structs/tx_effect_data.ts +16 -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 +172 -47
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +814 -315
- package/src/contract_function_simulator/oracle/private_execution.ts +2 -3
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +167 -30
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +399 -135
- 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/index.ts +1 -0
- package/src/entrypoints/client/bundle/utils.ts +24 -5
- package/src/entrypoints/client/lazy/index.ts +1 -0
- package/src/entrypoints/client/lazy/utils.ts +24 -5
- package/src/entrypoints/client/store.ts +54 -0
- package/src/entrypoints/pxe_creation_options.ts +8 -2
- package/src/entrypoints/server/index.ts +6 -2
- package/src/entrypoints/server/store.ts +47 -0
- package/src/entrypoints/server/utils.ts +31 -9
- 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 +100 -37
- package/src/messages/{message_context_service.ts → tx_resolver_service.ts} +16 -9
- package/src/notes/note_service.ts +1 -1
- package/src/oracle_version.ts +5 -5
- package/src/private_kernel/batch_planner.ts +0 -1
- 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 +112 -56
- package/src/private_kernel/private_kernel_oracle.ts +23 -4
- package/src/pxe.ts +328 -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 +15 -0
- package/src/storage/fact_store/origin_state.ts +84 -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/store_identity.ts +72 -0
- package/src/storage/tagging_store/index.ts +1 -1
- package/src/storage/tagging_store/sender_tagging_store.ts +62 -15
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +138 -0
- package/src/tagging/constants.ts +30 -10
- package/src/tagging/index.ts +1 -1
- package/src/tagging/recipient_sync/sync_tagged_private_logs.ts +148 -30
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +1 -1
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +6 -2
- package/src/tagging/testing/tag_query_test_utils.ts +11 -0
- 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
|
/**
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
3
|
+
import { DatabaseVersion } from '@aztec/stdlib/database-version/version';
|
|
4
|
+
|
|
5
|
+
/** The triple that determine which physical store a logical store name maps to. */
|
|
6
|
+
export type StoreIdentity = {
|
|
7
|
+
/** Chain ID of the L1 the rollup is deployed to. */
|
|
8
|
+
l1ChainId: number;
|
|
9
|
+
/** Address of the rollup contract the store's data pertains to. */
|
|
10
|
+
rollupAddress: EthAddress;
|
|
11
|
+
/** Schema version of the data held in the store. */
|
|
12
|
+
schemaVersion: number;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Composes the store-name discriminator for a store identity. Two identities map to the same physical store iff
|
|
17
|
+
* their slugs are equal, so the format must stay stable: `<l1ChainId>-<rollupAddress>-v<schemaVersion>` — changing
|
|
18
|
+
* it orphans every existing store.
|
|
19
|
+
*/
|
|
20
|
+
export function storeIdentitySlug({ l1ChainId, rollupAddress, schemaVersion }: StoreIdentity): string {
|
|
21
|
+
return `${l1ChainId}-${rollupAddress.toString()}-v${schemaVersion}`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** Composes the physical store name for a logical store name and identity. */
|
|
25
|
+
export function effectiveStoreName(name: string, identity: StoreIdentity): string {
|
|
26
|
+
return `${name}_${storeIdentitySlug(identity)}`;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Invariant check for stores whose physical name carries their identity: the recorded version can
|
|
31
|
+
* only disagree with the expected one if there is a store-naming bug.
|
|
32
|
+
*/
|
|
33
|
+
export async function assertStoreIdentity(
|
|
34
|
+
store: AztecAsyncKVStore,
|
|
35
|
+
storeName: string,
|
|
36
|
+
identity: StoreIdentity,
|
|
37
|
+
): Promise<void> {
|
|
38
|
+
const expected = new DatabaseVersion(identity.schemaVersion, identity.rollupAddress);
|
|
39
|
+
const singleton = store.openSingleton<string>('dbVersion');
|
|
40
|
+
const stored = await singleton.getAsync();
|
|
41
|
+
if (stored === undefined) {
|
|
42
|
+
await singleton.set(expected.toBuffer().toString('utf-8'));
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
let storedVersion: DatabaseVersion;
|
|
46
|
+
try {
|
|
47
|
+
storedVersion = DatabaseVersion.fromBuffer(Buffer.from(stored, 'utf-8'));
|
|
48
|
+
} catch {
|
|
49
|
+
throw new StoreIdentityMismatchError(storeName, expected.toString(), stored);
|
|
50
|
+
}
|
|
51
|
+
if (!storedVersion.equals(expected)) {
|
|
52
|
+
throw new StoreIdentityMismatchError(storeName, expected.toString(), storedVersion.toString());
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Thrown when a store's recorded identity does not match the identity it was opened under. Since the identity is
|
|
58
|
+
* part of the physical store name, this can only indicate a store-naming bug; the store is left untouched.
|
|
59
|
+
*/
|
|
60
|
+
export class StoreIdentityMismatchError extends Error {
|
|
61
|
+
constructor(
|
|
62
|
+
public readonly storeName: string,
|
|
63
|
+
public readonly expected: string,
|
|
64
|
+
public readonly actual: string,
|
|
65
|
+
) {
|
|
66
|
+
super(
|
|
67
|
+
`Store '${storeName}' records identity ${actual} but was opened as ${expected}. ` +
|
|
68
|
+
`Refusing to open; data was NOT modified.`,
|
|
69
|
+
);
|
|
70
|
+
this.name = 'StoreIdentityMismatchError';
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -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';
|
|
@@ -128,10 +128,11 @@ export class SenderTaggingStore implements StagedStore {
|
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
/**
|
|
131
|
-
* Stores pending index ranges.
|
|
131
|
+
* Stores pending index ranges, rejecting any range that disagrees with an already-stored one.
|
|
132
132
|
* @remarks If the same (secret, txHash) pair already exists in the db with an equal range, it's a no-op. This is
|
|
133
133
|
* expected to happen because whenever we start sync we start from the last finalized index and we can have pending
|
|
134
|
-
* ranges already stored from previous syncs. If the ranges differ, it throws an error as that indicates a bug
|
|
134
|
+
* ranges already stored from previous syncs. If the ranges differ, it throws an error as that indicates a bug in
|
|
135
|
+
* callers that record indexes at prove time. Discovery from onchain logs must use `mergePendingIndexes` instead.
|
|
135
136
|
* @param ranges - The tagging index ranges containing the directional app tagging secrets and the index ranges that are
|
|
136
137
|
* to be stored in the db.
|
|
137
138
|
* @param txHash - The tx in which the tagging indexes were used in private logs.
|
|
@@ -141,6 +142,33 @@ export class SenderTaggingStore implements StagedStore {
|
|
|
141
142
|
* @throws If a different range already exists for the same (secret, txHash) pair.
|
|
142
143
|
*/
|
|
143
144
|
storePendingIndexes(ranges: TaggingIndexRange[], txHash: TxHash, jobId: string): Promise<void> {
|
|
145
|
+
return this.#storePendingIndexes(ranges, txHash, jobId, false);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Stores pending index ranges, widening an existing entry for the same (secret, txHash) pair to the union of the
|
|
150
|
+
* stored and incoming ranges instead of throwing on a mismatch. Discovery from onchain logs needs this: it may see
|
|
151
|
+
* only the surviving (non-revertible phase) sub-range of a partially reverted tx recorded at prove time (the
|
|
152
|
+
* finalized receipt step of the sync resolves that difference), or indexes beyond a partially discovered entry
|
|
153
|
+
* when a tx from another PXE straddles a sync window boundary. Callers that record indexes at prove time must use
|
|
154
|
+
* `storePendingIndexes` instead, so that a range disagreement surfaces as a bug rather than being absorbed.
|
|
155
|
+
* @param ranges - The tagging index ranges containing the directional app tagging secrets and the index ranges that are
|
|
156
|
+
* to be stored in the db.
|
|
157
|
+
* @param txHash - The tx in which the tagging indexes were used in private logs.
|
|
158
|
+
* @param jobId - job context for staged writes to this store. See `JobCoordinator` for more details.
|
|
159
|
+
* @throws If the highestIndex is further than window length from the highest finalized index for the same secret.
|
|
160
|
+
* @throws If the lowestIndex is lower than or equal to the last finalized index for the same secret.
|
|
161
|
+
*/
|
|
162
|
+
mergePendingIndexes(ranges: TaggingIndexRange[], txHash: TxHash, jobId: string): Promise<void> {
|
|
163
|
+
return this.#storePendingIndexes(ranges, txHash, jobId, true);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
#storePendingIndexes(
|
|
167
|
+
ranges: TaggingIndexRange[],
|
|
168
|
+
txHash: TxHash,
|
|
169
|
+
jobId: string,
|
|
170
|
+
mergeExisting: boolean,
|
|
171
|
+
): Promise<void> {
|
|
144
172
|
if (ranges.length === 0) {
|
|
145
173
|
return Promise.resolve();
|
|
146
174
|
}
|
|
@@ -187,21 +215,40 @@ export class SenderTaggingStore implements StagedStore {
|
|
|
187
215
|
// Check if an entry with the same txHash already exists
|
|
188
216
|
const existingEntry = pendingData.find(entry => entry.txHash === txHashStr);
|
|
189
217
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
throw new Error(
|
|
194
|
-
`Conflicting range for secret ${secretStr} and txHash ${txHashStr}: ` +
|
|
195
|
-
`existing [${existingEntry.lowestIndex}, ${existingEntry.highestIndex}] vs ` +
|
|
196
|
-
`new [${range.lowestIndex}, ${range.highestIndex}]`,
|
|
197
|
-
);
|
|
198
|
-
}
|
|
199
|
-
// Exact duplicate — skip
|
|
200
|
-
} else {
|
|
201
|
-
this.#writePendingIndexes(jobId, secretStr, [
|
|
218
|
+
let updatedPending: PendingIndexesEntry[] | undefined;
|
|
219
|
+
if (!existingEntry) {
|
|
220
|
+
updatedPending = [
|
|
202
221
|
...pendingData,
|
|
203
222
|
{ lowestIndex: range.lowestIndex, highestIndex: range.highestIndex, txHash: txHashStr },
|
|
204
|
-
]
|
|
223
|
+
];
|
|
224
|
+
} else if (mergeExisting) {
|
|
225
|
+
// Widen the entry to the union of both ranges, never shrink it: replacing would drop prove-time
|
|
226
|
+
// indexes the chain doesn't show (partially reverted tx), and skipping would drop onchain indexes
|
|
227
|
+
// discovered in a later sync window (tx straddling the window boundary).
|
|
228
|
+
const lowestIndex = Math.min(existingEntry.lowestIndex, range.lowestIndex);
|
|
229
|
+
const highestIndex = Math.max(existingEntry.highestIndex, range.highestIndex);
|
|
230
|
+
if (lowestIndex !== existingEntry.lowestIndex || highestIndex !== existingEntry.highestIndex) {
|
|
231
|
+
updatedPending = pendingData.map(entry =>
|
|
232
|
+
entry === existingEntry ? { lowestIndex, highestIndex, txHash: entry.txHash } : entry,
|
|
233
|
+
);
|
|
234
|
+
}
|
|
235
|
+
} else if (
|
|
236
|
+
existingEntry.lowestIndex !== range.lowestIndex ||
|
|
237
|
+
existingEntry.highestIndex !== range.highestIndex
|
|
238
|
+
) {
|
|
239
|
+
// Different ranges for the same (secret, txHash) indicate a bug in callers that record indexes at prove
|
|
240
|
+
// time.
|
|
241
|
+
throw new Error(
|
|
242
|
+
`Conflicting range for secret ${secretStr} and txHash ${txHashStr}: ` +
|
|
243
|
+
`existing [${existingEntry.lowestIndex}, ${existingEntry.highestIndex}] vs ` +
|
|
244
|
+
`new [${range.lowestIndex}, ${range.highestIndex}]`,
|
|
245
|
+
);
|
|
246
|
+
}
|
|
247
|
+
// Remaining cases (a merge whose union equals the stored range, or an identical range without
|
|
248
|
+
// mergeExisting): duplicate evidence, nothing to write.
|
|
249
|
+
|
|
250
|
+
if (updatedPending) {
|
|
251
|
+
this.#writePendingIndexes(jobId, secretStr, updatedPending);
|
|
205
252
|
}
|
|
206
253
|
}
|
|
207
254
|
});
|
|
@@ -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,30 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
// This
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
|
|
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.
|
|
5
|
+
//
|
|
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;
|
|
21
|
+
|
|
22
|
+
// The number of tags probed per constrained secret in the first round.
|
|
23
|
+
//
|
|
24
|
+
// The probe doubles each round (2, 4, 8, ..., capped at UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN) while every probed
|
|
25
|
+
// index is a hit, stopping at the first missing tag. Constrained delivery is gapless, so a single missing tag proves
|
|
26
|
+
// the stream has ended: at steady state this turns a full WINDOW_LEN probe into two tags. A secret K logs behind
|
|
27
|
+
// catches up in ~log2(K) round-trips while the probe is still doubling (2, 4, 8, 16, 32), but once it saturates the cap
|
|
28
|
+
// and advances WINDOW_LEN tags per round, deeper catch-up is linear at ~K/WINDOW_LEN rounds. Either way it beats both
|
|
29
|
+
// the full window every round and one round per log.
|
|
30
|
+
export const INITIAL_CONSTRAINED_PROBE_LEN = 2;
|
package/src/tagging/index.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
export { syncTaggedPrivateLogs } from './recipient_sync/sync_tagged_private_logs.js';
|
|
13
13
|
export { syncSenderTaggingIndexes } from './sender_sync/sync_sender_tagging_indexes.js';
|
|
14
14
|
export { persistSenderTaggingIndexRangesForTx } from './persist_sender_tagging_index_ranges.js';
|
|
15
|
-
export { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from './constants.js';
|
|
15
|
+
export { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN, INITIAL_CONSTRAINED_PROBE_LEN } from './constants.js';
|
|
16
16
|
export { getAllPrivateLogsByTags, getAllPublicLogsByTagsFromContract } from './get_all_logs_by_tags.js';
|
|
17
17
|
|
|
18
18
|
// Re-export tagging-related types from stdlib
|