@aztec/pxe 5.0.0-rc.2 → 5.0.1
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/block_synchronizer/block_synchronizer.d.ts +5 -3
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +7 -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_sync → contract}/contract_sync_service.d.ts +7 -6
- package/dest/contract/contract_sync_service.d.ts.map +1 -0
- package/dest/{contract_sync → contract}/contract_sync_service.js +10 -30
- 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 +9 -3
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +31 -14
- 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 +4 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +2 -1
- package/dest/contract_function_simulator/noir-structs/fact.d.ts +5 -5
- package/dest/contract_function_simulator/noir-structs/fact.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/fact.js +2 -2
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts +3 -3
- package/dest/contract_function_simulator/noir-structs/fact_collection.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/fact_collection.js +3 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +7 -1
- package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
- 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 +2 -2
- 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 -1
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts +8 -1
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/resolved_tagging_strategy.js +17 -0
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts +7 -2
- package/dest/contract_function_simulator/oracle/acir_callback.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/acir_callback.js +55 -11
- 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/oracle_registry.d.ts +11 -7
- package/dest/contract_function_simulator/oracle/oracle_registry.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_registry.js +50 -10
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts +48 -9
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle_type_mappings.js +51 -30
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +10 -2
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +73 -32
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +23 -16
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +105 -60
- 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 +11 -5
- 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 +11 -5
- 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 +28 -0
- package/dest/entrypoints/server/index.d.ts +6 -2
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +4 -1
- 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 +8 -2
- package/dest/error_enriching.d.ts +5 -3
- package/dest/error_enriching.d.ts.map +1 -1
- package/dest/error_enriching.js +12 -10
- package/dest/hooks/execution_hooks.d.ts +15 -4
- package/dest/hooks/execution_hooks.d.ts.map +1 -1
- package/dest/hooks/index.d.ts +3 -2
- 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 +10 -1
- package/dest/hooks/resolve_tagging_secret_strategy.d.ts.map +1 -1
- package/dest/hooks/resolve_tagging_secret_strategy.js +3 -3
- package/dest/logs/log_service.d.ts +5 -3
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +38 -17
- package/dest/notes/note_service.d.ts +1 -1
- package/dest/notes/note_service.js +1 -1
- package/dest/oracle_version.d.ts +2 -2
- package/dest/oracle_version.js +2 -2
- 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/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 +81 -46
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +138 -104
- 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 +31 -7
- 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 +63 -74
- package/dest/storage/fact_store/fact_service.d.ts +6 -4
- package/dest/storage/fact_store/fact_service.d.ts.map +1 -1
- package/dest/storage/fact_store/fact_service.js +19 -4
- package/dest/storage/fact_store/fact_store.d.ts +1 -1
- package/dest/storage/fact_store/fact_store.js +1 -1
- package/dest/storage/fact_store/index.d.ts +2 -1
- package/dest/storage/fact_store/index.d.ts.map +1 -1
- package/dest/storage/fact_store/index.js +1 -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/metadata.d.ts +2 -2
- package/dest/storage/metadata.d.ts.map +1 -1
- package/dest/storage/metadata.js +1 -1
- 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/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 +17 -6
- package/dest/storage/tagging_store/tagging_secret_sources_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/tagging_secret_sources_store.js +24 -11
- 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/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/package.json +17 -17
- package/src/block_synchronizer/block_synchronizer.ts +9 -1
- package/src/contract/contract_class_service.ts +83 -0
- package/src/{contract_sync → contract}/contract_sync_service.ts +18 -37
- 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 +56 -14
- package/src/contract_function_simulator/execution_note_cache.ts +7 -28
- package/src/contract_function_simulator/index.ts +7 -1
- package/src/contract_function_simulator/noir-structs/fact.ts +4 -4
- package/src/contract_function_simulator/noir-structs/fact_collection.ts +9 -4
- package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +6 -0
- package/src/contract_function_simulator/noir-structs/pending_tagged_log.ts +12 -0
- package/src/contract_function_simulator/noir-structs/provided_secret.ts +1 -1
- package/src/contract_function_simulator/noir-structs/resolved_tagging_strategy.ts +21 -0
- package/src/contract_function_simulator/oracle/acir_callback.ts +58 -12
- package/src/contract_function_simulator/oracle/legacy_oracle_registry.ts +147 -0
- package/src/contract_function_simulator/oracle/oracle_registry.ts +37 -7
- package/src/contract_function_simulator/oracle/oracle_type_mappings.ts +49 -32
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +92 -41
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +149 -71
- 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 +16 -4
- package/src/entrypoints/client/lazy/index.ts +1 -0
- package/src/entrypoints/client/lazy/utils.ts +16 -4
- package/src/entrypoints/client/store.ts +38 -0
- package/src/entrypoints/server/index.ts +6 -1
- package/src/entrypoints/server/store.ts +47 -0
- package/src/entrypoints/server/utils.ts +21 -7
- package/src/error_enriching.ts +26 -10
- package/src/hooks/execution_hooks.ts +14 -3
- package/src/hooks/index.ts +2 -0
- package/src/hooks/resolve_custom_request.ts +24 -0
- package/src/hooks/resolve_tagging_secret_strategy.ts +14 -0
- package/src/logs/log_service.ts +35 -11
- package/src/notes/note_service.ts +1 -1
- package/src/oracle_version.ts +2 -2
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +11 -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 +212 -143
- 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__/KeyStore.json +12 -12
- 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 +3 -3
- package/src/storage/backwards_compatibility_tests/__snapshots__/opened_stores.json +1 -1
- package/src/storage/backwards_compatibility_tests/schema_tests.ts +38 -4
- package/src/storage/contract_store/contract_store.ts +85 -92
- package/src/storage/fact_store/fact_service.ts +29 -5
- package/src/storage/fact_store/fact_store.ts +1 -1
- package/src/storage/fact_store/index.ts +10 -0
- package/src/storage/fact_store/origin_state.ts +75 -0
- package/src/storage/metadata.ts +1 -1
- package/src/storage/store_identity.ts +72 -0
- package/src/storage/tagging_store/sender_tagging_store.ts +62 -15
- package/src/storage/tagging_store/tagging_secret_sources_store.ts +36 -15
- package/src/tagging/constants.ts +19 -9
- 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/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.map +0 -1
- package/dest/contract_sync/helpers.d.ts +0 -28
- package/dest/contract_sync/helpers.d.ts.map +0 -1
- package/dest/contract_sync/helpers.js +0 -48
- package/src/contract_function_simulator/proxied_contract_data_source.ts +0 -60
- package/src/contract_sync/helpers.ts +0 -79
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
2
|
+
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
3
|
+
/** The triple that determine which physical store a logical store name maps to. */
|
|
4
|
+
export type StoreIdentity = {
|
|
5
|
+
/** Chain ID of the L1 the rollup is deployed to. */
|
|
6
|
+
l1ChainId: number;
|
|
7
|
+
/** Address of the rollup contract the store's data pertains to. */
|
|
8
|
+
rollupAddress: EthAddress;
|
|
9
|
+
/** Schema version of the data held in the store. */
|
|
10
|
+
schemaVersion: number;
|
|
11
|
+
};
|
|
12
|
+
/**
|
|
13
|
+
* Composes the store-name discriminator for a store identity. Two identities map to the same physical store iff
|
|
14
|
+
* their slugs are equal, so the format must stay stable: `<l1ChainId>-<rollupAddress>-v<schemaVersion>` — changing
|
|
15
|
+
* it orphans every existing store.
|
|
16
|
+
*/
|
|
17
|
+
export declare function storeIdentitySlug({ l1ChainId, rollupAddress, schemaVersion }: StoreIdentity): string;
|
|
18
|
+
/** Composes the physical store name for a logical store name and identity. */
|
|
19
|
+
export declare function effectiveStoreName(name: string, identity: StoreIdentity): string;
|
|
20
|
+
/**
|
|
21
|
+
* Invariant check for stores whose physical name carries their identity: the recorded version can
|
|
22
|
+
* only disagree with the expected one if there is a store-naming bug.
|
|
23
|
+
*/
|
|
24
|
+
export declare function assertStoreIdentity(store: AztecAsyncKVStore, storeName: string, identity: StoreIdentity): Promise<void>;
|
|
25
|
+
/**
|
|
26
|
+
* Thrown when a store's recorded identity does not match the identity it was opened under. Since the identity is
|
|
27
|
+
* part of the physical store name, this can only indicate a store-naming bug; the store is left untouched.
|
|
28
|
+
*/
|
|
29
|
+
export declare class StoreIdentityMismatchError extends Error {
|
|
30
|
+
readonly storeName: string;
|
|
31
|
+
readonly expected: string;
|
|
32
|
+
readonly actual: string;
|
|
33
|
+
constructor(storeName: string, expected: string, actual: string);
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmVfaWRlbnRpdHkuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdG9yYWdlL3N0b3JlX2lkZW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHekQsbUZBQW1GO0FBQ25GLE1BQU0sTUFBTSxhQUFhLEdBQUc7SUFDMUIsb0RBQW9EO0lBQ3BELFNBQVMsRUFBRSxNQUFNLENBQUM7SUFDbEIsbUVBQW1FO0lBQ25FLGFBQWEsRUFBRSxVQUFVLENBQUM7SUFDMUIsb0RBQW9EO0lBQ3BELGFBQWEsRUFBRSxNQUFNLENBQUM7Q0FDdkIsQ0FBQztBQUVGOzs7O0dBSUc7QUFDSCx3QkFBZ0IsaUJBQWlCLENBQUMsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBRSxFQUFFLGFBQWEsR0FBRyxNQUFNLENBRXBHO0FBRUQsOEVBQThFO0FBQzlFLHdCQUFnQixrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLEdBQUcsTUFBTSxDQUVoRjtBQUVEOzs7R0FHRztBQUNILHdCQUFzQixtQkFBbUIsQ0FDdkMsS0FBSyxFQUFFLGlCQUFpQixFQUN4QixTQUFTLEVBQUUsTUFBTSxFQUNqQixRQUFRLEVBQUUsYUFBYSxHQUN0QixPQUFPLENBQUMsSUFBSSxDQUFDLENBaUJmO0FBRUQ7OztHQUdHO0FBQ0gscUJBQWEsMEJBQTJCLFNBQVEsS0FBSzthQUVqQyxTQUFTLEVBQUUsTUFBTTthQUNqQixRQUFRLEVBQUUsTUFBTTthQUNoQixNQUFNLEVBQUUsTUFBTTtJQUhoQyxZQUNrQixTQUFTLEVBQUUsTUFBTSxFQUNqQixRQUFRLEVBQUUsTUFBTSxFQUNoQixNQUFNLEVBQUUsTUFBTSxFQU8vQjtDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store_identity.d.ts","sourceRoot":"","sources":["../../src/storage/store_identity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAGzD,mFAAmF;AACnF,MAAM,MAAM,aAAa,GAAG;IAC1B,oDAAoD;IACpD,SAAS,EAAE,MAAM,CAAC;IAClB,mEAAmE;IACnE,aAAa,EAAE,UAAU,CAAC;IAC1B,oDAAoD;IACpD,aAAa,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,aAAa,GAAG,MAAM,CAEpG;AAED,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,MAAM,CAEhF;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,KAAK,EAAE,iBAAiB,EACxB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,aAAa,GACtB,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;GAGG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;aAEjC,SAAS,EAAE,MAAM;aACjB,QAAQ,EAAE,MAAM;aAChB,MAAM,EAAE,MAAM;IAHhC,YACkB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,MAAM,EAO/B;CACF"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { DatabaseVersion } from '@aztec/stdlib/database-version/version';
|
|
2
|
+
/**
|
|
3
|
+
* Composes the store-name discriminator for a store identity. Two identities map to the same physical store iff
|
|
4
|
+
* their slugs are equal, so the format must stay stable: `<l1ChainId>-<rollupAddress>-v<schemaVersion>` — changing
|
|
5
|
+
* it orphans every existing store.
|
|
6
|
+
*/ export function storeIdentitySlug({ l1ChainId, rollupAddress, schemaVersion }) {
|
|
7
|
+
return `${l1ChainId}-${rollupAddress.toString()}-v${schemaVersion}`;
|
|
8
|
+
}
|
|
9
|
+
/** Composes the physical store name for a logical store name and identity. */ export function effectiveStoreName(name, identity) {
|
|
10
|
+
return `${name}_${storeIdentitySlug(identity)}`;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Invariant check for stores whose physical name carries their identity: the recorded version can
|
|
14
|
+
* only disagree with the expected one if there is a store-naming bug.
|
|
15
|
+
*/ export async function assertStoreIdentity(store, storeName, identity) {
|
|
16
|
+
const expected = new DatabaseVersion(identity.schemaVersion, identity.rollupAddress);
|
|
17
|
+
const singleton = store.openSingleton('dbVersion');
|
|
18
|
+
const stored = await singleton.getAsync();
|
|
19
|
+
if (stored === undefined) {
|
|
20
|
+
await singleton.set(expected.toBuffer().toString('utf-8'));
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
let storedVersion;
|
|
24
|
+
try {
|
|
25
|
+
storedVersion = DatabaseVersion.fromBuffer(Buffer.from(stored, 'utf-8'));
|
|
26
|
+
} catch {
|
|
27
|
+
throw new StoreIdentityMismatchError(storeName, expected.toString(), stored);
|
|
28
|
+
}
|
|
29
|
+
if (!storedVersion.equals(expected)) {
|
|
30
|
+
throw new StoreIdentityMismatchError(storeName, expected.toString(), storedVersion.toString());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Thrown when a store's recorded identity does not match the identity it was opened under. Since the identity is
|
|
35
|
+
* part of the physical store name, this can only indicate a store-naming bug; the store is left untouched.
|
|
36
|
+
*/ export class StoreIdentityMismatchError extends Error {
|
|
37
|
+
storeName;
|
|
38
|
+
expected;
|
|
39
|
+
actual;
|
|
40
|
+
constructor(storeName, expected, actual){
|
|
41
|
+
super(`Store '${storeName}' records identity ${actual} but was opened as ${expected}. ` + `Refusing to open; data was NOT modified.`), this.storeName = storeName, this.expected = expected, this.actual = actual;
|
|
42
|
+
this.name = 'StoreIdentityMismatchError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -19,10 +19,11 @@ export declare class SenderTaggingStore implements StagedStore {
|
|
|
19
19
|
commit(jobId: string): Promise<void>;
|
|
20
20
|
discardStaged(jobId: string): Promise<void>;
|
|
21
21
|
/**
|
|
22
|
-
* Stores pending index ranges.
|
|
22
|
+
* Stores pending index ranges, rejecting any range that disagrees with an already-stored one.
|
|
23
23
|
* @remarks If the same (secret, txHash) pair already exists in the db with an equal range, it's a no-op. This is
|
|
24
24
|
* expected to happen because whenever we start sync we start from the last finalized index and we can have pending
|
|
25
|
-
* ranges already stored from previous syncs. If the ranges differ, it throws an error as that indicates a bug
|
|
25
|
+
* ranges already stored from previous syncs. If the ranges differ, it throws an error as that indicates a bug in
|
|
26
|
+
* callers that record indexes at prove time. Discovery from onchain logs must use `mergePendingIndexes` instead.
|
|
26
27
|
* @param ranges - The tagging index ranges containing the directional app tagging secrets and the index ranges that are
|
|
27
28
|
* to be stored in the db.
|
|
28
29
|
* @param txHash - The tx in which the tagging indexes were used in private logs.
|
|
@@ -32,6 +33,21 @@ export declare class SenderTaggingStore implements StagedStore {
|
|
|
32
33
|
* @throws If a different range already exists for the same (secret, txHash) pair.
|
|
33
34
|
*/
|
|
34
35
|
storePendingIndexes(ranges: TaggingIndexRange[], txHash: TxHash, jobId: string): Promise<void>;
|
|
36
|
+
/**
|
|
37
|
+
* Stores pending index ranges, widening an existing entry for the same (secret, txHash) pair to the union of the
|
|
38
|
+
* stored and incoming ranges instead of throwing on a mismatch. Discovery from onchain logs needs this: it may see
|
|
39
|
+
* only the surviving (non-revertible phase) sub-range of a partially reverted tx recorded at prove time (the
|
|
40
|
+
* finalized receipt step of the sync resolves that difference), or indexes beyond a partially discovered entry
|
|
41
|
+
* when a tx from another PXE straddles a sync window boundary. Callers that record indexes at prove time must use
|
|
42
|
+
* `storePendingIndexes` instead, so that a range disagreement surfaces as a bug rather than being absorbed.
|
|
43
|
+
* @param ranges - The tagging index ranges containing the directional app tagging secrets and the index ranges that are
|
|
44
|
+
* to be stored in the db.
|
|
45
|
+
* @param txHash - The tx in which the tagging indexes were used in private logs.
|
|
46
|
+
* @param jobId - job context for staged writes to this store. See `JobCoordinator` for more details.
|
|
47
|
+
* @throws If the highestIndex is further than window length from the highest finalized index for the same secret.
|
|
48
|
+
* @throws If the lowestIndex is lower than or equal to the last finalized index for the same secret.
|
|
49
|
+
*/
|
|
50
|
+
mergePendingIndexes(ranges: TaggingIndexRange[], txHash: TxHash, jobId: string): Promise<void>;
|
|
35
51
|
/**
|
|
36
52
|
* Returns the transaction hashes of all pending transactions that contain highest indexes within a specified range
|
|
37
53
|
* for a given directional app tagging secret. We check based on the highest indexes only as that is the relevant
|
|
@@ -75,4 +91,4 @@ export declare class SenderTaggingStore implements StagedStore {
|
|
|
75
91
|
*/
|
|
76
92
|
finalizePendingIndexesOfAPartiallyRevertedTx(txEffect: TxEffect, jobId: string): Promise<void>;
|
|
77
93
|
}
|
|
78
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
94
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZGVyX3RhZ2dpbmdfc3RvcmUuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zdG9yYWdlL3RhZ2dpbmdfc3RvcmUvc2VuZGVyX3RhZ2dpbmdfc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFDeEUsT0FBTyxFQUFFLGdCQUFnQixFQUFhLEtBQUssaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUN6RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRXBELE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBTTVFOzs7O0dBSUc7QUFDSCxxQkFBYSxrQkFBbUIsWUFBVyxXQUFXOztJQUNwRCxRQUFRLENBQUMsU0FBUyxvQkFBb0I7SUE0QnRDLFlBQVksS0FBSyxFQUFFLGlCQUFpQixFQVFuQztJQTRDRDs7OztPQUlHO0lBQ0csTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQW9CekM7SUFFRCxhQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBSTFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILG1CQUFtQixDQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRTdGO0lBRUQ7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILG1CQUFtQixDQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBRTdGO0lBNkZEOzs7Ozs7Ozs7T0FTRztJQUNILDJCQUEyQixDQUN6QixNQUFNLEVBQUUsZ0JBQWdCLEVBQ3hCLFVBQVUsRUFBRSxNQUFNLEVBQ2xCLFFBQVEsRUFBRSxNQUFNLEVBQ2hCLEtBQUssRUFBRSxNQUFNLEdBQ1osT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBUW5CO0lBRUQ7Ozs7T0FJRztJQUNILHFCQUFxQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRTFGO0lBRUQ7Ozs7O09BS0c7SUFDSCxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxHQUFHLFNBQVMsQ0FBQyxDQWlCckY7SUFFRDs7T0FFRztJQUNILGtCQUFrQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0EyQ25FO0lBNENEOzs7T0FHRztJQUNHLHNCQUFzQixDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FzRDdFO0lBRUQ7Ozs7Ozs7T0FPRztJQUNHLDRDQUE0QyxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBZ0RuRztDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sender_tagging_store.d.ts","sourceRoot":"","sources":["../../../src/storage/tagging_store/sender_tagging_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAa,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAM5E;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,WAAW;;IACpD,QAAQ,CAAC,SAAS,oBAAoB;IA4BtC,YAAY,KAAK,EAAE,iBAAiB,EAQnC;IA4CD;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1C;IAED
|
|
1
|
+
{"version":3,"file":"sender_tagging_store.d.ts","sourceRoot":"","sources":["../../../src/storage/tagging_store/sender_tagging_store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAiB,MAAM,iBAAiB,CAAC;AACxE,OAAO,EAAE,gBAAgB,EAAa,KAAK,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0CAA0C,CAAC;AAM5E;;;;GAIG;AACH,qBAAa,kBAAmB,YAAW,WAAW;;IACpD,QAAQ,CAAC,SAAS,oBAAoB;IA4BtC,YAAY,KAAK,EAAE,iBAAiB,EAQnC;IA4CD;;;;OAIG;IACG,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBzC;IAED,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI1C;IAED;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F;IAED;;;;;;;;;;;;;OAaG;IACH,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE7F;IA6FD;;;;;;;;;OASG;IACH,2BAA2B,CACzB,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,EAAE,CAAC,CAQnB;IAED;;;;OAIG;IACH,qBAAqB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAE1F;IAED;;;;;OAKG;IACH,gBAAgB,CAAC,MAAM,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAiBrF;IAED;;OAEG;IACH,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA2CnE;IA4CD;;;OAGG;IACG,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAsD7E;IAED;;;;;;;OAOG;IACG,4CAA4C,CAAC,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAgDnG;CACF"}
|
|
@@ -100,10 +100,11 @@ import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.
|
|
|
100
100
|
return Promise.resolve();
|
|
101
101
|
}
|
|
102
102
|
/**
|
|
103
|
-
* Stores pending index ranges.
|
|
103
|
+
* Stores pending index ranges, rejecting any range that disagrees with an already-stored one.
|
|
104
104
|
* @remarks If the same (secret, txHash) pair already exists in the db with an equal range, it's a no-op. This is
|
|
105
105
|
* expected to happen because whenever we start sync we start from the last finalized index and we can have pending
|
|
106
|
-
* ranges already stored from previous syncs. If the ranges differ, it throws an error as that indicates a bug
|
|
106
|
+
* ranges already stored from previous syncs. If the ranges differ, it throws an error as that indicates a bug in
|
|
107
|
+
* callers that record indexes at prove time. Discovery from onchain logs must use `mergePendingIndexes` instead.
|
|
107
108
|
* @param ranges - The tagging index ranges containing the directional app tagging secrets and the index ranges that are
|
|
108
109
|
* to be stored in the db.
|
|
109
110
|
* @param txHash - The tx in which the tagging indexes were used in private logs.
|
|
@@ -112,6 +113,25 @@ import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.
|
|
|
112
113
|
* @throws If the lowestIndex is lower than or equal to the last finalized index for the same secret.
|
|
113
114
|
* @throws If a different range already exists for the same (secret, txHash) pair.
|
|
114
115
|
*/ storePendingIndexes(ranges, txHash, jobId) {
|
|
116
|
+
return this.#storePendingIndexes(ranges, txHash, jobId, false);
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Stores pending index ranges, widening an existing entry for the same (secret, txHash) pair to the union of the
|
|
120
|
+
* stored and incoming ranges instead of throwing on a mismatch. Discovery from onchain logs needs this: it may see
|
|
121
|
+
* only the surviving (non-revertible phase) sub-range of a partially reverted tx recorded at prove time (the
|
|
122
|
+
* finalized receipt step of the sync resolves that difference), or indexes beyond a partially discovered entry
|
|
123
|
+
* when a tx from another PXE straddles a sync window boundary. Callers that record indexes at prove time must use
|
|
124
|
+
* `storePendingIndexes` instead, so that a range disagreement surfaces as a bug rather than being absorbed.
|
|
125
|
+
* @param ranges - The tagging index ranges containing the directional app tagging secrets and the index ranges that are
|
|
126
|
+
* to be stored in the db.
|
|
127
|
+
* @param txHash - The tx in which the tagging indexes were used in private logs.
|
|
128
|
+
* @param jobId - job context for staged writes to this store. See `JobCoordinator` for more details.
|
|
129
|
+
* @throws If the highestIndex is further than window length from the highest finalized index for the same secret.
|
|
130
|
+
* @throws If the lowestIndex is lower than or equal to the last finalized index for the same secret.
|
|
131
|
+
*/ mergePendingIndexes(ranges, txHash, jobId) {
|
|
132
|
+
return this.#storePendingIndexes(ranges, txHash, jobId, true);
|
|
133
|
+
}
|
|
134
|
+
#storePendingIndexes(ranges, txHash, jobId, mergeExisting) {
|
|
115
135
|
if (ranges.length === 0) {
|
|
116
136
|
return Promise.resolve();
|
|
117
137
|
}
|
|
@@ -144,21 +164,38 @@ import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.
|
|
|
144
164
|
}
|
|
145
165
|
// Check if an entry with the same txHash already exists
|
|
146
166
|
const existingEntry = pendingData.find((entry)=>entry.txHash === txHashStr);
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
throw new Error(`Conflicting range for secret ${secretStr} and txHash ${txHashStr}: ` + `existing [${existingEntry.lowestIndex}, ${existingEntry.highestIndex}] vs ` + `new [${range.lowestIndex}, ${range.highestIndex}]`);
|
|
151
|
-
}
|
|
152
|
-
// Exact duplicate — skip
|
|
153
|
-
} else {
|
|
154
|
-
this.#writePendingIndexes(jobId, secretStr, [
|
|
167
|
+
let updatedPending;
|
|
168
|
+
if (!existingEntry) {
|
|
169
|
+
updatedPending = [
|
|
155
170
|
...pendingData,
|
|
156
171
|
{
|
|
157
172
|
lowestIndex: range.lowestIndex,
|
|
158
173
|
highestIndex: range.highestIndex,
|
|
159
174
|
txHash: txHashStr
|
|
160
175
|
}
|
|
161
|
-
]
|
|
176
|
+
];
|
|
177
|
+
} else if (mergeExisting) {
|
|
178
|
+
// Widen the entry to the union of both ranges, never shrink it: replacing would drop prove-time
|
|
179
|
+
// indexes the chain doesn't show (partially reverted tx), and skipping would drop onchain indexes
|
|
180
|
+
// discovered in a later sync window (tx straddling the window boundary).
|
|
181
|
+
const lowestIndex = Math.min(existingEntry.lowestIndex, range.lowestIndex);
|
|
182
|
+
const highestIndex = Math.max(existingEntry.highestIndex, range.highestIndex);
|
|
183
|
+
if (lowestIndex !== existingEntry.lowestIndex || highestIndex !== existingEntry.highestIndex) {
|
|
184
|
+
updatedPending = pendingData.map((entry)=>entry === existingEntry ? {
|
|
185
|
+
lowestIndex,
|
|
186
|
+
highestIndex,
|
|
187
|
+
txHash: entry.txHash
|
|
188
|
+
} : entry);
|
|
189
|
+
}
|
|
190
|
+
} else if (existingEntry.lowestIndex !== range.lowestIndex || existingEntry.highestIndex !== range.highestIndex) {
|
|
191
|
+
// Different ranges for the same (secret, txHash) indicate a bug in callers that record indexes at prove
|
|
192
|
+
// time.
|
|
193
|
+
throw new Error(`Conflicting range for secret ${secretStr} and txHash ${txHashStr}: ` + `existing [${existingEntry.lowestIndex}, ${existingEntry.highestIndex}] vs ` + `new [${range.lowestIndex}, ${range.highestIndex}]`);
|
|
194
|
+
}
|
|
195
|
+
// Remaining cases (a merge whose union equals the stored range, or an identical range without
|
|
196
|
+
// mergeExisting): duplicate evidence, nothing to write.
|
|
197
|
+
if (updatedPending) {
|
|
198
|
+
this.#writePendingIndexes(jobId, secretStr, updatedPending);
|
|
162
199
|
}
|
|
163
200
|
}
|
|
164
201
|
});
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { Point } from '@aztec/foundation/curves/grumpkin';
|
|
2
2
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
3
3
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
|
+
/**
|
|
5
|
+
* The kinds of shared secret an entry can hold.
|
|
6
|
+
*/
|
|
7
|
+
export type SharedSecretKind = 'arbitrary-secret' | 'handshake';
|
|
8
|
+
/** A shared secret registered for a recipient, with the kind that determines which tag streams it backs. */
|
|
9
|
+
export type SharedSecret = {
|
|
10
|
+
kind: SharedSecretKind;
|
|
11
|
+
secret: Point;
|
|
12
|
+
};
|
|
4
13
|
/**
|
|
5
14
|
* Stores the sources from which directional app tagging secrets are derived during recipient log synchronization.
|
|
6
15
|
*
|
|
@@ -11,7 +20,8 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
11
20
|
* - Pre-shared tagging secrets: shared secret points registered directly, bypassing ECDH. These are scoped to a
|
|
12
21
|
* specific recipient, since the derivation of the directional app tagging secret does not require any secret
|
|
13
22
|
* recipient data: given the original secret anyone can derive a recipient's app-siloed directional tagging secret,
|
|
14
|
-
* and so these must not be reused to preserve privacy.
|
|
23
|
+
* and so these must not be reused across recipients to preserve privacy. Each carries the {@link SharedSecretKind}
|
|
24
|
+
* it was registered through, which determines the tag streams it is scanned under.
|
|
15
25
|
*/
|
|
16
26
|
export declare class TaggingSecretSourcesStore {
|
|
17
27
|
#private;
|
|
@@ -23,18 +33,19 @@ export declare class TaggingSecretSourcesStore {
|
|
|
23
33
|
* Registers a pre-shared tagging secret scoped to a recipient.
|
|
24
34
|
* @returns true if the secret was newly added, false if it was already registered for that recipient.
|
|
25
35
|
*/
|
|
26
|
-
addSharedSecret(recipient: AztecAddress, secret: Point): Promise<boolean>;
|
|
36
|
+
addSharedSecret(recipient: AztecAddress, kind: SharedSecretKind, secret: Point): Promise<boolean>;
|
|
27
37
|
/** Returns the pre-shared tagging secrets registered for a given recipient. */
|
|
28
|
-
getSharedSecretsForRecipient(recipient: AztecAddress): Promise<
|
|
38
|
+
getSharedSecretsForRecipient(recipient: AztecAddress): Promise<SharedSecret[]>;
|
|
29
39
|
/** Returns every registered pre-shared tagging secret, each paired with the recipient it is scoped to. */
|
|
30
40
|
getAllSharedSecrets(): Promise<{
|
|
31
41
|
recipient: AztecAddress;
|
|
42
|
+
kind: SharedSecretKind;
|
|
32
43
|
secret: Point;
|
|
33
44
|
}[]>;
|
|
34
45
|
/**
|
|
35
|
-
* Removes a pre-shared tagging secret scoped to a recipient.
|
|
46
|
+
* Removes a pre-shared tagging secret scoped to a recipient. Both the secret and its kind must match.
|
|
36
47
|
* @returns true if the secret was registered and removed, false if it was not registered for that recipient.
|
|
37
48
|
*/
|
|
38
|
-
removeSharedSecret(recipient: AztecAddress, secret: Point): Promise<boolean>;
|
|
49
|
+
removeSharedSecret(recipient: AztecAddress, kind: SharedSecretKind, secret: Point): Promise<boolean>;
|
|
39
50
|
}
|
|
40
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFnZ2luZ19zZWNyZXRfc291cmNlc19zdG9yZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3N0b3JhZ2UvdGFnZ2luZ19zdG9yZS90YWdnaW5nX3NlY3JldF9zb3VyY2VzX3N0b3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUUxRCxPQUFPLEtBQUssRUFBRSxpQkFBaUIsRUFBcUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1RixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFM0Q7O0dBRUc7QUFDSCxNQUFNLE1BQU0sZ0JBQWdCLEdBQUcsa0JBQWtCLEdBQUcsV0FBVyxDQUFDO0FBRWhFLDRHQUE0RztBQUM1RyxNQUFNLE1BQU0sWUFBWSxHQUFHO0lBQUUsSUFBSSxFQUFFLGdCQUFnQixDQUFDO0lBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQTtDQUFFLENBQUM7QUFFckU7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gscUJBQWEseUJBQXlCOztJQUtwQyxZQUFZLEtBQUssRUFBRSxpQkFBaUIsRUFLbkM7SUFFRCxTQUFTLENBQUMsT0FBTyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBVWpEO0lBRUQsVUFBVSxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUlwQztJQUVELFlBQVksQ0FBQyxPQUFPLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FVcEQ7SUFFRDs7O09BR0c7SUFDSCxlQUFlLENBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLENBbUJoRztJQUVELCtFQUErRTtJQUMvRSw0QkFBNEIsQ0FBQyxTQUFTLEVBQUUsWUFBWSxHQUFHLE9BQU8sQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQU03RTtJQUVELDBHQUEwRztJQUMxRyxtQkFBbUIsSUFBSSxPQUFPLENBQUM7UUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDO1FBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDO1FBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQTtLQUFFLEVBQUUsQ0FBQyxDQVFuRztJQUVEOzs7T0FHRztJQUNILGtCQUFrQixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQVluRztDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tagging_secret_sources_store.d.ts","sourceRoot":"","sources":["../../../src/storage/tagging_store/tagging_secret_sources_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D
|
|
1
|
+
{"version":3,"file":"tagging_secret_sources_store.d.ts","sourceRoot":"","sources":["../../../src/storage/tagging_store/tagging_secret_sources_store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mCAAmC,CAAC;AAE1D,OAAO,KAAK,EAAE,iBAAiB,EAAqC,MAAM,iBAAiB,CAAC;AAC5F,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAE3D;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,GAAG,WAAW,CAAC;AAEhE,4GAA4G;AAC5G,MAAM,MAAM,YAAY,GAAG;IAAE,IAAI,EAAE,gBAAgB,CAAC;IAAC,MAAM,EAAE,KAAK,CAAA;CAAE,CAAC;AAErE;;;;;;;;;;;;GAYG;AACH,qBAAa,yBAAyB;;IAKpC,YAAY,KAAK,EAAE,iBAAiB,EAKnC;IAED,SAAS,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAUjD;IAED,UAAU,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAIpC;IAED,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAUpD;IAED;;;OAGG;IACH,eAAe,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAmBhG;IAED,+EAA+E;IAC/E,4BAA4B,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAM7E;IAED,0GAA0G;IAC1G,mBAAmB,IAAI,OAAO,CAAC;QAAE,SAAS,EAAE,YAAY,CAAC;QAAC,IAAI,EAAE,gBAAgB,CAAC;QAAC,MAAM,EAAE,KAAK,CAAA;KAAE,EAAE,CAAC,CAQnG;IAED;;;OAGG;IACH,kBAAkB,CAAC,SAAS,EAAE,YAAY,EAAE,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,CAYnG;CACF"}
|
|
@@ -11,7 +11,8 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
11
11
|
* - Pre-shared tagging secrets: shared secret points registered directly, bypassing ECDH. These are scoped to a
|
|
12
12
|
* specific recipient, since the derivation of the directional app tagging secret does not require any secret
|
|
13
13
|
* recipient data: given the original secret anyone can derive a recipient's app-siloed directional tagging secret,
|
|
14
|
-
* and so these must not be reused to preserve privacy.
|
|
14
|
+
* and so these must not be reused across recipients to preserve privacy. Each carries the {@link SharedSecretKind}
|
|
15
|
+
* it was registered through, which determines the tag streams it is scanned under.
|
|
15
16
|
*/ export class TaggingSecretSourcesStore {
|
|
16
17
|
#store;
|
|
17
18
|
#senders;
|
|
@@ -47,42 +48,48 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
47
48
|
/**
|
|
48
49
|
* Registers a pre-shared tagging secret scoped to a recipient.
|
|
49
50
|
* @returns true if the secret was newly added, false if it was already registered for that recipient.
|
|
50
|
-
*/ addSharedSecret(recipient, secret) {
|
|
51
|
+
*/ addSharedSecret(recipient, kind, secret) {
|
|
51
52
|
return this.#store.transactionAsync(async ()=>{
|
|
52
53
|
const secretStr = secret.toString();
|
|
53
54
|
// MultiMap.set silently ignores an identical (key, value), so we scan to report whether this is a new secret.
|
|
54
55
|
for await (const existing of this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString())){
|
|
55
|
-
if (existing === secretStr) {
|
|
56
|
+
if (existing.secret === secretStr) {
|
|
57
|
+
if (existing.kind !== kind) {
|
|
58
|
+
throw new Error(`Secret already registered for recipient with kind '${existing.kind}', cannot re-register it as '${kind}'.`);
|
|
59
|
+
}
|
|
56
60
|
return false;
|
|
57
61
|
}
|
|
58
62
|
}
|
|
59
|
-
await this.#sharedSecretsByRecipient.set(recipient.toString(),
|
|
63
|
+
await this.#sharedSecretsByRecipient.set(recipient.toString(), {
|
|
64
|
+
kind,
|
|
65
|
+
secret: secretStr
|
|
66
|
+
});
|
|
60
67
|
return true;
|
|
61
68
|
});
|
|
62
69
|
}
|
|
63
70
|
/** Returns the pre-shared tagging secrets registered for a given recipient. */ getSharedSecretsForRecipient(recipient) {
|
|
64
71
|
return this.#store.transactionAsync(async ()=>{
|
|
65
|
-
return (await toArray(this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString()))).map(
|
|
72
|
+
return (await toArray(this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString()))).map(deserializeSharedSecret);
|
|
66
73
|
});
|
|
67
74
|
}
|
|
68
75
|
/** Returns every registered pre-shared tagging secret, each paired with the recipient it is scoped to. */ getAllSharedSecrets() {
|
|
69
76
|
return this.#store.transactionAsync(async ()=>{
|
|
70
77
|
const entries = await toArray(this.#sharedSecretsByRecipient.entriesAsync());
|
|
71
|
-
return entries.map(([recipient,
|
|
78
|
+
return entries.map(([recipient, entry])=>({
|
|
72
79
|
recipient: AztecAddress.fromStringUnsafe(recipient),
|
|
73
|
-
|
|
80
|
+
...deserializeSharedSecret(entry)
|
|
74
81
|
}));
|
|
75
82
|
});
|
|
76
83
|
}
|
|
77
84
|
/**
|
|
78
|
-
* Removes a pre-shared tagging secret scoped to a recipient.
|
|
85
|
+
* Removes a pre-shared tagging secret scoped to a recipient. Both the secret and its kind must match.
|
|
79
86
|
* @returns true if the secret was registered and removed, false if it was not registered for that recipient.
|
|
80
|
-
*/ removeSharedSecret(recipient, secret) {
|
|
87
|
+
*/ removeSharedSecret(recipient, kind, secret) {
|
|
81
88
|
return this.#store.transactionAsync(async ()=>{
|
|
82
89
|
const secretStr = secret.toString();
|
|
83
90
|
for await (const existing of this.#sharedSecretsByRecipient.getValuesAsync(recipient.toString())){
|
|
84
|
-
if (existing === secretStr) {
|
|
85
|
-
await this.#sharedSecretsByRecipient.deleteValue(recipient.toString(),
|
|
91
|
+
if (existing.kind === kind && existing.secret === secretStr) {
|
|
92
|
+
await this.#sharedSecretsByRecipient.deleteValue(recipient.toString(), existing);
|
|
86
93
|
return true;
|
|
87
94
|
}
|
|
88
95
|
}
|
|
@@ -90,3 +97,9 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
90
97
|
});
|
|
91
98
|
}
|
|
92
99
|
}
|
|
100
|
+
function deserializeSharedSecret(entry) {
|
|
101
|
+
return {
|
|
102
|
+
kind: entry.kind,
|
|
103
|
+
secret: Point.fromString(entry.secret)
|
|
104
|
+
};
|
|
105
|
+
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN
|
|
2
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export declare const UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN: number;
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdGFnZ2luZy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUJBLGVBQU8sTUFBTSxzQ0FBc0MsUUFBK0IsQ0FBQyJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/tagging/constants.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/tagging/constants.ts"],"names":[],"mappings":"AAmBA,eAAO,MAAM,sCAAsC,QAA+B,CAAC"}
|
|
@@ -1,10 +1,19 @@
|
|
|
1
|
-
|
|
2
|
-
//
|
|
3
|
-
//
|
|
4
|
-
// MAX_PRIVATE_LOGS_PER_TX indexes consumed in case the logs are squashed. This happens when the log contains a note
|
|
5
|
-
// and the note is nullified in the same tx.
|
|
1
|
+
import { MAX_PRIVATE_LOGS_PER_TX } from '@aztec/constants';
|
|
2
|
+
// This window bounds how far a sender's next tag index for a directional app tagging secret can run ahead of that
|
|
3
|
+
// secret's highest finalized index before `PXE::proveTx` throws.
|
|
6
4
|
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
//
|
|
10
|
-
|
|
5
|
+
// MAX_PRIVATE_LOGS_PER_TX is a floor for ordinary transaction patterns: the private kernel accumulates every
|
|
6
|
+
// surviving private log into a single tx-wide array of exactly this size, so a fresh secret's very first
|
|
7
|
+
// ordinary tx can consume that many indexes before anything is finalized.
|
|
8
|
+
//
|
|
9
|
+
// The +20 on top is headroom for multiple pending ordinary txs to the same counterparty stacking up
|
|
10
|
+
// before the first one is observed as mined. Only a run of near-MAX_PRIVATE_LOGS_PER_TX txs back-to-back would
|
|
11
|
+
// exhaust this; ordinary transfers use far fewer logs per tx, so the same margin covers many more of those. Keep the
|
|
12
|
+
// margin additive rather than another multiple of the floor. A larger window also makes recipient-side sync more
|
|
13
|
+
// expensive, since discovery has to probe ahead of the last finalized index for every active secret.
|
|
14
|
+
//
|
|
15
|
+
// TODO(F-783): MAX_PRIVATE_LOGS_PER_TX is not a hard ceiling in general — a tx that creates and nullifies (squashes)
|
|
16
|
+
// many notes/logs to the same secret can drive that secret's raw tag index arbitrarily higher, since indexes are
|
|
17
|
+
// reserved at log emission time, before squashing is decided, and the kernel's reset/squash loop is not bounded by
|
|
18
|
+
// MAX_PRIVATE_LOGS_PER_TX. No fixed window value closes that gap.
|
|
19
|
+
export const UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN = MAX_PRIVATE_LOGS_PER_TX + 20;
|
|
@@ -48,7 +48,7 @@ import { loadAndStoreNewTaggingIndexes } from './utils/load_and_store_new_taggin
|
|
|
48
48
|
break;
|
|
49
49
|
}
|
|
50
50
|
// Receipts for pending tx hashes that the logs query just surfaced still need a sequential follow-up call.
|
|
51
|
-
// `
|
|
51
|
+
// `mergePendingIndexes` is idempotent on (secret, txHash), so a re-discovered hash stays classified as known
|
|
52
52
|
// and is not re-fetched here.
|
|
53
53
|
const knownSet = new Set(knownPendingTxHashes.map((h)=>h.toString()));
|
|
54
54
|
const newPendingTxHashes = allPendingTxHashes.filter((h)=>!knownSet.has(h.toString()));
|
|
@@ -16,4 +16,4 @@ import type { SenderTaggingStore } from '../../../storage/tagging_store/sender_t
|
|
|
16
16
|
* preserving way.
|
|
17
17
|
*/
|
|
18
18
|
export declare function loadAndStoreNewTaggingIndexes(extendedSecret: AppTaggingSecret, start: number, end: number, aztecNode: AztecNode, taggingStore: SenderTaggingStore, anchorBlockHash: BlockHash, jobId: string): Promise<void>;
|
|
19
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
19
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZF9hbmRfc3RvcmVfbmV3X3RhZ2dpbmdfaW5kZXhlcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RhZ2dpbmcvc2VuZGVyX3N5bmMvdXRpbHMvbG9hZF9hbmRfc3RvcmVfbmV3X3RhZ2dpbmdfaW5kZXhlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEVBQUUsS0FBSyxnQkFBZ0IsRUFBYSxNQUFNLG9CQUFvQixDQUFDO0FBR3RFLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFHakc7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsd0JBQXNCLDZCQUE2QixDQUNqRCxjQUFjLEVBQUUsZ0JBQWdCLEVBQ2hDLEtBQUssRUFBRSxNQUFNLEVBQ2IsR0FBRyxFQUFFLE1BQU0sRUFDWCxTQUFTLEVBQUUsU0FBUyxFQUNwQixZQUFZLEVBQUUsa0JBQWtCLEVBQ2hDLGVBQWUsRUFBRSxTQUFTLEVBQzFCLEtBQUssRUFBRSxNQUFNLGlCQW9CZCJ9
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load_and_store_new_tagging_indexes.d.ts","sourceRoot":"","sources":["../../../../src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAGjG;;;;;;;;;;;;GAYG;AACH,wBAAsB,6BAA6B,CACjD,cAAc,EAAE,gBAAgB,EAChC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,kBAAkB,EAChC,eAAe,EAAE,SAAS,EAC1B,KAAK,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"load_and_store_new_tagging_indexes.d.ts","sourceRoot":"","sources":["../../../../src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,EAAE,KAAK,gBAAgB,EAAa,MAAM,oBAAoB,CAAC;AAGtE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAGjG;;;;;;;;;;;;GAYG;AACH,wBAAsB,6BAA6B,CACjD,cAAc,EAAE,gBAAgB,EAChC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,kBAAkB,EAChC,eAAe,EAAE,SAAS,EAC1B,KAAK,EAAE,MAAM,iBAoBd"}
|
|
@@ -23,7 +23,11 @@ import { getAllPrivateLogsByTags } from '../../get_all_logs_by_tags.js';
|
|
|
23
23
|
})));
|
|
24
24
|
const txsForTags = await getTxsContainingTags(siloedTagsForWindow, aztecNode, anchorBlockHash);
|
|
25
25
|
const txIndexesMap = getTxIndexesMap(txsForTags, start, siloedTagsForWindow.length);
|
|
26
|
-
// Now we iterate over the map, construct the tagging index ranges and store them in the db.
|
|
26
|
+
// Now we iterate over the map, construct the tagging index ranges and store them in the db. A tx already tracked
|
|
27
|
+
// in the store is merged rather than range-checked: if this PXE sent the tx and it partially reverted, the chain
|
|
28
|
+
// only shows the surviving sub-range of the prove-time entry (the finalized receipt step of the sync owns
|
|
29
|
+
// resolving that difference), and a tx from another PXE may straddle a sync window boundary, in which case the
|
|
30
|
+
// entry is widened so the next index choice covers the full onchain range.
|
|
27
31
|
for (const [txHashStr, indexes] of txIndexesMap.entries()){
|
|
28
32
|
const txHash = TxHash.fromString(txHashStr);
|
|
29
33
|
const ranges = [
|
|
@@ -33,7 +37,7 @@ import { getAllPrivateLogsByTags } from '../../get_all_logs_by_tags.js';
|
|
|
33
37
|
highestIndex: Math.max(...indexes)
|
|
34
38
|
}
|
|
35
39
|
];
|
|
36
|
-
await taggingStore.
|
|
40
|
+
await taggingStore.mergePendingIndexes(ranges, txHash, jobId);
|
|
37
41
|
}
|
|
38
42
|
}
|
|
39
43
|
// Returns txs that used the given tags. A tag might have been used in multiple txs and for this reason we return
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/pxe",
|
|
3
|
-
"version": "5.0.
|
|
3
|
+
"version": "5.0.1",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"typedocOptions": {
|
|
6
6
|
"entryPoints": [
|
|
@@ -71,20 +71,20 @@
|
|
|
71
71
|
]
|
|
72
72
|
},
|
|
73
73
|
"dependencies": {
|
|
74
|
-
"@aztec/bb-prover": "5.0.
|
|
75
|
-
"@aztec/bb.js": "5.0.
|
|
76
|
-
"@aztec/builder": "5.0.
|
|
77
|
-
"@aztec/constants": "5.0.
|
|
78
|
-
"@aztec/ethereum": "5.0.
|
|
79
|
-
"@aztec/foundation": "5.0.
|
|
80
|
-
"@aztec/key-store": "5.0.
|
|
81
|
-
"@aztec/kv-store": "5.0.
|
|
82
|
-
"@aztec/noir-protocol-circuits-types": "5.0.
|
|
83
|
-
"@aztec/noir-types": "5.0.
|
|
84
|
-
"@aztec/protocol-contracts": "5.0.
|
|
85
|
-
"@aztec/simulator": "5.0.
|
|
86
|
-
"@aztec/standard-contracts": "5.0.
|
|
87
|
-
"@aztec/stdlib": "5.0.
|
|
74
|
+
"@aztec/bb-prover": "5.0.1",
|
|
75
|
+
"@aztec/bb.js": "5.0.1",
|
|
76
|
+
"@aztec/builder": "5.0.1",
|
|
77
|
+
"@aztec/constants": "5.0.1",
|
|
78
|
+
"@aztec/ethereum": "5.0.1",
|
|
79
|
+
"@aztec/foundation": "5.0.1",
|
|
80
|
+
"@aztec/key-store": "5.0.1",
|
|
81
|
+
"@aztec/kv-store": "5.0.1",
|
|
82
|
+
"@aztec/noir-protocol-circuits-types": "5.0.1",
|
|
83
|
+
"@aztec/noir-types": "5.0.1",
|
|
84
|
+
"@aztec/protocol-contracts": "5.0.1",
|
|
85
|
+
"@aztec/simulator": "5.0.1",
|
|
86
|
+
"@aztec/standard-contracts": "5.0.1",
|
|
87
|
+
"@aztec/stdlib": "5.0.1",
|
|
88
88
|
"koa": "^2.16.1",
|
|
89
89
|
"koa-router": "^13.1.1",
|
|
90
90
|
"lodash.omit": "^4.5.0",
|
|
@@ -93,8 +93,8 @@
|
|
|
93
93
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
94
94
|
},
|
|
95
95
|
"devDependencies": {
|
|
96
|
-
"@aztec/noir-test-contracts.js": "5.0.
|
|
97
|
-
"@aztec/world-state": "5.0.
|
|
96
|
+
"@aztec/noir-test-contracts.js": "5.0.1",
|
|
97
|
+
"@aztec/world-state": "5.0.1",
|
|
98
98
|
"@jest/globals": "^30.0.0",
|
|
99
99
|
"@types/jest": "^30.0.0",
|
|
100
100
|
"@types/lodash.omit": "^4.5.7",
|
|
@@ -8,7 +8,8 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
|
8
8
|
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
9
9
|
|
|
10
10
|
import type { BlockSynchronizerConfig } from '../config/index.js';
|
|
11
|
-
import type {
|
|
11
|
+
import type { ContractClassService } from '../contract/contract_class_service.js';
|
|
12
|
+
import type { ContractSyncService } from '../contract/contract_sync_service.js';
|
|
12
13
|
import type { AnchorBlockStore } from '../storage/anchor_block_store/index.js';
|
|
13
14
|
import type { FactStore } from '../storage/fact_store/fact_store.js';
|
|
14
15
|
import type { NoteStore } from '../storage/note_store/index.js';
|
|
@@ -35,6 +36,7 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
35
36
|
private readonly factStore: FactStore,
|
|
36
37
|
private readonly l2TipsStore: L2TipsKVStore,
|
|
37
38
|
private readonly contractSyncService: ContractSyncService,
|
|
39
|
+
private readonly contractClassService: ContractClassService,
|
|
38
40
|
private readonly config: Partial<BlockSynchronizerConfig> = {},
|
|
39
41
|
bindings?: LoggerBindings,
|
|
40
42
|
) {
|
|
@@ -177,6 +179,12 @@ export class BlockSynchronizer implements L2BlockStreamEventHandler {
|
|
|
177
179
|
// Therefore, we clear the contract synchronization cache here such that the sync is re-triggered upon new
|
|
178
180
|
// execution.
|
|
179
181
|
this.contractSyncService.wipe();
|
|
182
|
+
|
|
183
|
+
// The contract class service keeps a per-block cache - since updating our anchor means it is very unlikely we'd
|
|
184
|
+
// ever re-simulate at past anchors, we wipe its cache to prevent runaway memory growth on very long-lived PXE
|
|
185
|
+
// instances.
|
|
186
|
+
this.contractClassService.wipe();
|
|
187
|
+
|
|
180
188
|
this.log.verbose(`Updated pxe last block to ${blockHeader.getBlockNumber()}`, blockHeader.toInspect());
|
|
181
189
|
await this.anchorBlockStore.setHeader(blockHeader);
|
|
182
190
|
}
|