@aztec/pxe 0.0.1-commit.96bb3f7 → 0.0.1-commit.a072138
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 +1 -1
- package/dest/block_synchronizer/block_synchronizer.d.ts +9 -5
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +66 -21
- package/dest/config/index.d.ts +3 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +17 -0
- package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
- package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
- package/dest/contract_function_simulator/benchmarked_node.js +77 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +6 -10
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +33 -25
- package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +45 -28
- package/dest/contract_function_simulator/index.d.ts +2 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -11
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
- package/dest/contract_function_simulator/oracle/oracle.d.ts +10 -8
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +44 -33
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +0 -35
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +11 -3
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +22 -10
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +33 -20
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +78 -76
- package/dest/contract_sync/index.d.ts +23 -0
- package/dest/contract_sync/index.d.ts.map +1 -0
- package/dest/contract_sync/index.js +54 -0
- package/dest/debug/pxe_debug_utils.d.ts +16 -6
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +20 -10
- 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 +12 -6
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +13 -7
- package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +3 -1
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +2 -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 +19 -8
- package/dest/events/event_service.d.ts +6 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +19 -22
- package/dest/events/private_event_filter_validator.d.ts +5 -5
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +5 -6
- package/dest/job_coordinator/job_coordinator.d.ts +3 -2
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
- package/dest/job_coordinator/job_coordinator.js +3 -2
- package/dest/logs/log_service.d.ts +6 -4
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +21 -16
- package/dest/notes/note_service.d.ts +7 -7
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +31 -36
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +4 -3
- package/dest/private_kernel/hints/index.d.ts +2 -2
- package/dest/private_kernel/hints/index.d.ts.map +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
- package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +12 -6
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +3 -3
- package/dest/private_kernel/private_kernel_oracle.d.ts +23 -28
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +90 -2
- package/dest/pxe.d.ts +7 -36
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +43 -83
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
- 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 -1
- package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +130 -23
- package/dest/storage/contract_store/contract_store.d.ts +1 -2
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +22 -25
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +51 -52
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +282 -263
- package/dest/storage/note_store/stored_note.d.ts +16 -0
- package/dest/storage/note_store/stored_note.d.ts.map +1 -0
- package/dest/storage/note_store/stored_note.js +43 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +43 -8
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +226 -111
- package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
- package/dest/storage/private_event_store/stored_private_event.js +56 -0
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +252 -100
- package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
- package/dest/tagging/get_all_logs_by_tags.js +46 -0
- package/dest/tagging/index.d.ts +2 -1
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +1 -0
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +6 -6
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +7 -7
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
- 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 +10 -5
- package/package.json +18 -18
- package/src/bin/check_oracle_version.ts +1 -0
- package/src/block_synchronizer/block_synchronizer.ts +85 -33
- package/src/config/index.ts +14 -0
- package/src/contract_function_simulator/benchmarked_node.ts +103 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +34 -28
- package/src/contract_function_simulator/execution_note_cache.ts +44 -25
- package/src/contract_function_simulator/index.ts +1 -1
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
- package/src/contract_function_simulator/oracle/interfaces.ts +20 -10
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
- package/src/contract_function_simulator/oracle/oracle.ts +65 -40
- package/src/contract_function_simulator/oracle/private_execution.ts +1 -67
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +35 -12
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +100 -82
- package/src/contract_sync/index.ts +98 -0
- package/src/debug/pxe_debug_utils.ts +26 -11
- package/src/entrypoints/client/bundle/utils.ts +7 -14
- package/src/entrypoints/client/lazy/utils.ts +8 -14
- package/src/entrypoints/pxe_creation_options.ts +2 -1
- package/src/entrypoints/server/index.ts +2 -0
- package/src/entrypoints/server/utils.ts +15 -19
- package/src/events/event_service.ts +17 -25
- package/src/events/private_event_filter_validator.ts +3 -5
- package/src/job_coordinator/job_coordinator.ts +4 -3
- package/src/logs/log_service.ts +32 -14
- package/src/notes/note_service.ts +38 -43
- package/src/oracle_version.ts +4 -3
- package/src/private_kernel/hints/index.ts +1 -1
- package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +32 -20
- package/src/private_kernel/private_kernel_execution_prover.ts +7 -4
- package/src/private_kernel/private_kernel_oracle.ts +116 -37
- package/src/pxe.ts +77 -118
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
- package/src/storage/capsule_store/capsule_store.ts +159 -23
- package/src/storage/contract_store/contract_store.ts +22 -31
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +317 -318
- package/src/storage/note_store/stored_note.ts +48 -0
- package/src/storage/private_event_store/private_event_store.ts +292 -124
- package/src/storage/private_event_store/stored_private_event.ts +73 -0
- package/src/storage/tagging_store/recipient_tagging_store.ts +106 -20
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +293 -108
- package/src/tagging/get_all_logs_by_tags.ts +68 -0
- package/src/tagging/index.ts +1 -0
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +16 -5
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +9 -6
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -17
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
- package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
- package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_node.js +0 -27
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.js +0 -85
- package/dest/public_storage/public_storage_service.d.ts +0 -24
- package/dest/public_storage/public_storage_service.d.ts.map +0 -1
- package/dest/public_storage/public_storage_service.js +0 -26
- package/dest/tree_membership/tree_membership_service.d.ts +0 -52
- package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.js +0 -84
- package/src/contract_function_simulator/proxied_node.ts +0 -33
- package/src/private_kernel/private_kernel_oracle_impl.ts +0 -127
- package/src/public_storage/public_storage_service.ts +0 -33
- package/src/tree_membership/tree_membership_service.ts +0 -112
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { toArray } from '@aztec/foundation/iterable';
|
|
2
1
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
3
2
|
import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.js';
|
|
4
3
|
/**
|
|
5
4
|
* Data provider of tagging data used when syncing the sender tagging indexes. The recipient counterpart of this class
|
|
6
|
-
* is called RecipientTaggingStore. We have the
|
|
5
|
+
* is called RecipientTaggingStore. We have the data stores separate for sender and recipient because
|
|
7
6
|
* the algorithms are completely disjoint and there is not data reuse between the two.
|
|
8
7
|
*/ export class SenderTaggingStore {
|
|
8
|
+
storeName = 'sender_tagging';
|
|
9
9
|
#store;
|
|
10
10
|
// Stores the pending indexes for each directional app tagging secret. Pending here means that the tx that contained
|
|
11
11
|
// the private logs with tags corresponding to these indexes has not been finalized yet.
|
|
@@ -15,15 +15,89 @@ import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.
|
|
|
15
15
|
// the smaller ones are irrelevant due to tx atomicity.
|
|
16
16
|
//
|
|
17
17
|
// TODO(#17615): This assumes no logs are used in the non-revertible phase.
|
|
18
|
+
//
|
|
19
|
+
// directional app tagging secret => { pending index, txHash }[]
|
|
18
20
|
#pendingIndexes;
|
|
21
|
+
// jobId => directional app tagging secret => { pending index, txHash }[]
|
|
22
|
+
#pendingIndexesForJob;
|
|
19
23
|
// Stores the last (highest) finalized index for each directional app tagging secret. We care only about the last
|
|
20
24
|
// index because unlike the pending indexes, it will never happen that a finalized index would be removed and hence
|
|
21
25
|
// we don't need to store the history.
|
|
26
|
+
//
|
|
27
|
+
// directional app tagging secret => highest finalized index
|
|
22
28
|
#lastFinalizedIndexes;
|
|
29
|
+
// jobId => directional app tagging secret => highest finalized index
|
|
30
|
+
#lastFinalizedIndexesForJob;
|
|
23
31
|
constructor(store){
|
|
24
32
|
this.#store = store;
|
|
25
33
|
this.#pendingIndexes = this.#store.openMap('pending_indexes');
|
|
26
34
|
this.#lastFinalizedIndexes = this.#store.openMap('last_finalized_indexes');
|
|
35
|
+
this.#pendingIndexesForJob = new Map();
|
|
36
|
+
this.#lastFinalizedIndexesForJob = new Map();
|
|
37
|
+
}
|
|
38
|
+
#getPendingIndexesForJob(jobId) {
|
|
39
|
+
let pendingIndexesForJob = this.#pendingIndexesForJob.get(jobId);
|
|
40
|
+
if (!pendingIndexesForJob) {
|
|
41
|
+
pendingIndexesForJob = new Map();
|
|
42
|
+
this.#pendingIndexesForJob.set(jobId, pendingIndexesForJob);
|
|
43
|
+
}
|
|
44
|
+
return pendingIndexesForJob;
|
|
45
|
+
}
|
|
46
|
+
#getLastFinalizedIndexesForJob(jobId) {
|
|
47
|
+
let jobStagedLastFinalizedIndexes = this.#lastFinalizedIndexesForJob.get(jobId);
|
|
48
|
+
if (!jobStagedLastFinalizedIndexes) {
|
|
49
|
+
jobStagedLastFinalizedIndexes = new Map();
|
|
50
|
+
this.#lastFinalizedIndexesForJob.set(jobId, jobStagedLastFinalizedIndexes);
|
|
51
|
+
}
|
|
52
|
+
return jobStagedLastFinalizedIndexes;
|
|
53
|
+
}
|
|
54
|
+
async #readPendingIndexes(jobId, secret) {
|
|
55
|
+
// Always issue DB read to keep IndexedDB transaction alive (they auto-commit when a new micro-task starts and there
|
|
56
|
+
// are no pending read requests). The staged value still takes precedence if it exists.
|
|
57
|
+
const dbValue = await this.#pendingIndexes.getAsync(secret);
|
|
58
|
+
const staged = this.#getPendingIndexesForJob(jobId).get(secret);
|
|
59
|
+
return staged !== undefined ? staged : dbValue ?? [];
|
|
60
|
+
}
|
|
61
|
+
#writePendingIndexes(jobId, secret, pendingIndexes) {
|
|
62
|
+
this.#getPendingIndexesForJob(jobId).set(secret, pendingIndexes);
|
|
63
|
+
}
|
|
64
|
+
async #readLastFinalizedIndex(jobId, secret) {
|
|
65
|
+
// Always issue DB read to keep IndexedDB transaction alive (they auto-commit when a new micro-task starts and there
|
|
66
|
+
// are no pending read requests). The staged value still takes precedence if it exists.
|
|
67
|
+
const dbValue = await this.#lastFinalizedIndexes.getAsync(secret);
|
|
68
|
+
const staged = this.#getLastFinalizedIndexesForJob(jobId).get(secret);
|
|
69
|
+
return staged ?? dbValue;
|
|
70
|
+
}
|
|
71
|
+
#writeLastFinalizedIndex(jobId, secret, lastFinalizedIndex) {
|
|
72
|
+
this.#getLastFinalizedIndexesForJob(jobId).set(secret, lastFinalizedIndex);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Writes all job-specific in-memory data to persistent storage.
|
|
76
|
+
*
|
|
77
|
+
* @remark This method must run in a DB transaction context. It's designed to be called from JobCoordinator#commitJob.
|
|
78
|
+
*/ async commit(jobId) {
|
|
79
|
+
const pendingIndexesForJob = this.#pendingIndexesForJob.get(jobId);
|
|
80
|
+
if (pendingIndexesForJob) {
|
|
81
|
+
for (const [secret, pendingIndexes] of pendingIndexesForJob.entries()){
|
|
82
|
+
if (pendingIndexes.length === 0) {
|
|
83
|
+
await this.#pendingIndexes.delete(secret);
|
|
84
|
+
} else {
|
|
85
|
+
await this.#pendingIndexes.set(secret, pendingIndexes);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
const lastFinalizedIndexesForJob = this.#lastFinalizedIndexesForJob.get(jobId);
|
|
90
|
+
if (lastFinalizedIndexesForJob) {
|
|
91
|
+
for (const [secret, lastFinalizedIndex] of lastFinalizedIndexesForJob.entries()){
|
|
92
|
+
await this.#lastFinalizedIndexes.set(secret, lastFinalizedIndex);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return this.discardStaged(jobId);
|
|
96
|
+
}
|
|
97
|
+
discardStaged(jobId) {
|
|
98
|
+
this.#pendingIndexesForJob.delete(jobId);
|
|
99
|
+
this.#lastFinalizedIndexesForJob.delete(jobId);
|
|
100
|
+
return Promise.resolve();
|
|
27
101
|
}
|
|
28
102
|
/**
|
|
29
103
|
* Stores pending indexes.
|
|
@@ -33,6 +107,7 @@ import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.
|
|
|
33
107
|
* @param preTags - The pre-tags containing the directional app tagging secrets and the indexes that are to be
|
|
34
108
|
* stored in the db.
|
|
35
109
|
* @param txHash - The tx in which the pretags were used in private logs.
|
|
110
|
+
* @param jobId - job context for staged writes to this store. See `JobCoordinator` for more details.
|
|
36
111
|
* @throws If any two pre-tags contain the same directional app tagging secret. This is enforced because we care
|
|
37
112
|
* only about the highest index for a given secret that was used in the tx. Hence this check is a good way to catch
|
|
38
113
|
* bugs.
|
|
@@ -45,49 +120,68 @@ import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.
|
|
|
45
120
|
* @throws If the newly stored pending index is lower than or equal to the last finalized index for the same secret.
|
|
46
121
|
* This is enforced because this should never happen if the syncing is done correctly as we look for logs from higher
|
|
47
122
|
* indexes than finalized ones.
|
|
48
|
-
*/
|
|
123
|
+
*/ storePendingIndexes(preTags, txHash, jobId) {
|
|
124
|
+
if (preTags.length === 0) {
|
|
125
|
+
return Promise.resolve();
|
|
126
|
+
}
|
|
49
127
|
// The secrets in pre-tags should be unique because we always store just the highest index per given secret-txHash
|
|
50
128
|
// pair. Below we check that this is the case.
|
|
51
129
|
const secretsSet = new Set(preTags.map((preTag)=>preTag.secret.toString()));
|
|
52
130
|
if (secretsSet.size !== preTags.length) {
|
|
53
|
-
|
|
131
|
+
return Promise.reject(new Error(`Duplicate secrets found when storing pending indexes`));
|
|
54
132
|
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
//
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
133
|
+
const txHashStr = txHash.toString();
|
|
134
|
+
return this.#store.transactionAsync(async ()=>{
|
|
135
|
+
// Prefetch all data, start reads during iteration to keep IndexedDB transaction alive
|
|
136
|
+
const preTagReadPromises = preTags.map(({ secret, index })=>{
|
|
137
|
+
const secretStr = secret.toString();
|
|
138
|
+
return {
|
|
139
|
+
secret,
|
|
140
|
+
secretStr,
|
|
141
|
+
index,
|
|
142
|
+
pending: this.#readPendingIndexes(jobId, secretStr),
|
|
143
|
+
finalized: this.#readLastFinalizedIndex(jobId, secretStr)
|
|
144
|
+
};
|
|
145
|
+
});
|
|
146
|
+
// Await all reads together
|
|
147
|
+
const preTagData = await Promise.all(preTagReadPromises.map(async (item)=>({
|
|
148
|
+
...item,
|
|
149
|
+
pendingData: await item.pending,
|
|
150
|
+
finalizedIndex: await item.finalized
|
|
151
|
+
})));
|
|
152
|
+
// Process in memory and validate
|
|
153
|
+
for (const { secretStr, index, pendingData, finalizedIndex } of preTagData){
|
|
154
|
+
// First we check that for any secret the highest used index in tx is not further than window length from
|
|
155
|
+
// the highest finalized index.
|
|
156
|
+
if (index > (finalizedIndex ?? 0) + UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN) {
|
|
157
|
+
throw new Error(`Highest used index ${index} is further than window length from the highest finalized index ${finalizedIndex ?? 0}.
|
|
158
|
+
Tagging window length ${UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN} is configured too low. Contact the Aztec team
|
|
159
|
+
to increase it!`);
|
|
160
|
+
}
|
|
161
|
+
// Throw if the new pending index is lower than or equal to the last finalized index
|
|
162
|
+
if (finalizedIndex !== undefined && index <= finalizedIndex) {
|
|
163
|
+
throw new Error(`Cannot store pending index ${index} for secret ${secretStr}: ` + `it is lower than or equal to the last finalized index ${finalizedIndex}`);
|
|
78
164
|
}
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
index,
|
|
86
|
-
txHash: txHashStr
|
|
165
|
+
// Check if this secret + txHash combination already exists
|
|
166
|
+
const existingForSecretAndTx = pendingData.find((entry)=>entry.txHash === txHashStr);
|
|
167
|
+
if (existingForSecretAndTx) {
|
|
168
|
+
// If it exists with a different index, throw an error
|
|
169
|
+
if (existingForSecretAndTx.index !== index) {
|
|
170
|
+
throw new Error(`Cannot store index ${index} for secret ${secretStr} and txHash ${txHashStr}: ` + `a different index ${existingForSecretAndTx.index} already exists for this secret-txHash pair`);
|
|
87
171
|
}
|
|
88
|
-
|
|
172
|
+
// If it exists with the same index, ignore the update (no-op)
|
|
173
|
+
} else {
|
|
174
|
+
// If it doesn't exist, add it
|
|
175
|
+
this.#writePendingIndexes(jobId, secretStr, [
|
|
176
|
+
...pendingData,
|
|
177
|
+
{
|
|
178
|
+
index,
|
|
179
|
+
txHash: txHashStr
|
|
180
|
+
}
|
|
181
|
+
]);
|
|
182
|
+
}
|
|
89
183
|
}
|
|
90
|
-
}
|
|
184
|
+
});
|
|
91
185
|
}
|
|
92
186
|
/**
|
|
93
187
|
* Returns the transaction hashes of all pending transactions that contain indexes within a specified range
|
|
@@ -97,100 +191,158 @@ import { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from '../../tagging/constants.
|
|
|
97
191
|
* @param endIndex - The upper bound of the index range (exclusive).
|
|
98
192
|
* @returns An array of unique transaction hashes for pending transactions that contain indexes in the range
|
|
99
193
|
* [startIndex, endIndex). Returns an empty array if no pending indexes exist in the range.
|
|
100
|
-
*/
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
194
|
+
*/ getTxHashesOfPendingIndexes(secret, startIndex, endIndex, jobId) {
|
|
195
|
+
return this.#store.transactionAsync(async ()=>{
|
|
196
|
+
const existing = await this.#readPendingIndexes(jobId, secret.toString());
|
|
197
|
+
const txHashes = existing.filter((entry)=>entry.index >= startIndex && entry.index < endIndex).map((entry)=>entry.txHash);
|
|
198
|
+
return Array.from(new Set(txHashes)).map(TxHash.fromString);
|
|
199
|
+
});
|
|
104
200
|
}
|
|
105
201
|
/**
|
|
106
202
|
* Returns the last (highest) finalized index for a given secret.
|
|
107
203
|
* @param secret - The secret to get the last finalized index for.
|
|
108
204
|
* @returns The last (highest) finalized index for the given secret.
|
|
109
|
-
*/ getLastFinalizedIndex(secret) {
|
|
110
|
-
return this.#
|
|
205
|
+
*/ getLastFinalizedIndex(secret, jobId) {
|
|
206
|
+
return this.#store.transactionAsync(()=>this.#readLastFinalizedIndex(jobId, secret.toString()));
|
|
111
207
|
}
|
|
112
208
|
/**
|
|
113
209
|
* Returns the last used index for a given directional app tagging secret, considering both finalized and pending
|
|
114
210
|
* indexes.
|
|
115
211
|
* @param secret - The directional app tagging secret to query the last used index for.
|
|
116
212
|
* @returns The last used index.
|
|
117
|
-
*/
|
|
213
|
+
*/ getLastUsedIndex(secret, jobId) {
|
|
118
214
|
const secretStr = secret.toString();
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
215
|
+
return this.#store.transactionAsync(async ()=>{
|
|
216
|
+
const pendingPromise = this.#readPendingIndexes(jobId, secretStr);
|
|
217
|
+
const finalizedPromise = this.#readLastFinalizedIndex(jobId, secretStr);
|
|
218
|
+
const [pendingTxScopedIndexes, lastFinalized] = await Promise.all([
|
|
219
|
+
pendingPromise,
|
|
220
|
+
finalizedPromise
|
|
221
|
+
]);
|
|
222
|
+
const pendingIndexes = pendingTxScopedIndexes.map((entry)=>entry.index);
|
|
223
|
+
if (pendingTxScopedIndexes.length === 0) {
|
|
224
|
+
return lastFinalized;
|
|
225
|
+
}
|
|
226
|
+
// As the last used index we return the highest one from the pending indexes. Note that this value will be always
|
|
227
|
+
// higher than the last finalized index because we prune lower pending indexes when a tx is finalized.
|
|
228
|
+
return Math.max(...pendingIndexes);
|
|
229
|
+
});
|
|
127
230
|
}
|
|
128
231
|
/**
|
|
129
232
|
* Drops all pending indexes corresponding to the given transaction hashes.
|
|
130
|
-
*/
|
|
233
|
+
*/ dropPendingIndexes(txHashes, jobId) {
|
|
131
234
|
if (txHashes.length === 0) {
|
|
132
|
-
return;
|
|
235
|
+
return Promise.resolve();
|
|
133
236
|
}
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
237
|
+
const txHashStrings = new Set(txHashes.map((txHash)=>txHash.toString()));
|
|
238
|
+
return this.#store.transactionAsync(async ()=>{
|
|
239
|
+
// Prefetch all data, start reads during iteration to keep IndexedDB transaction alive
|
|
240
|
+
const secretReadPromises = new Map();
|
|
241
|
+
for await (const secret of this.#pendingIndexes.keysAsync()){
|
|
242
|
+
secretReadPromises.set(secret, this.#readPendingIndexes(jobId, secret));
|
|
243
|
+
}
|
|
244
|
+
// Add staged-only secrets (sync, no DB)
|
|
245
|
+
for (const secret of this.#getPendingIndexesForJob(jobId).keys()){
|
|
246
|
+
if (!secretReadPromises.has(secret)) {
|
|
247
|
+
secretReadPromises.set(secret, Promise.resolve(this.#getPendingIndexesForJob(jobId).get(secret) ?? []));
|
|
145
248
|
}
|
|
146
|
-
// else: No items were filtered out (txHashes not found for this secret) --> no-op
|
|
147
249
|
}
|
|
148
|
-
|
|
250
|
+
// Await all reads together
|
|
251
|
+
const secrets = [
|
|
252
|
+
...secretReadPromises.keys()
|
|
253
|
+
];
|
|
254
|
+
const pendingDataResults = await Promise.all(secretReadPromises.values());
|
|
255
|
+
// Process in memory
|
|
256
|
+
for(let i = 0; i < secrets.length; i++){
|
|
257
|
+
const secret = secrets[i];
|
|
258
|
+
const pendingData = pendingDataResults[i];
|
|
259
|
+
if (pendingData && pendingData.length > 0) {
|
|
260
|
+
const filtered = pendingData.filter((item)=>!txHashStrings.has(item.txHash));
|
|
261
|
+
if (filtered.length === 0) {
|
|
262
|
+
this.#writePendingIndexes(jobId, secret, []);
|
|
263
|
+
} else if (filtered.length !== pendingData.length) {
|
|
264
|
+
// Some items were filtered out, so update the pending data
|
|
265
|
+
this.#writePendingIndexes(jobId, secret, filtered);
|
|
266
|
+
}
|
|
267
|
+
// else: No items were filtered out (txHashes not found for this secret) --> no-op
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
});
|
|
149
271
|
}
|
|
150
272
|
/**
|
|
151
273
|
* Updates pending indexes corresponding to the given transaction hashes to be finalized and prunes any lower pending
|
|
152
274
|
* indexes.
|
|
153
|
-
*/
|
|
275
|
+
*/ finalizePendingIndexes(txHashes, jobId) {
|
|
154
276
|
if (txHashes.length === 0) {
|
|
155
|
-
return;
|
|
277
|
+
return Promise.resolve();
|
|
156
278
|
}
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
279
|
+
const txHashStrings = new Set(txHashes.map((tx)=>tx.toString()));
|
|
280
|
+
return this.#store.transactionAsync(async ()=>{
|
|
281
|
+
// Prefetch all data, start reads during iteration to keep IndexedDB transaction alive
|
|
282
|
+
const secretDataPromises = new Map();
|
|
283
|
+
for await (const secret of this.#pendingIndexes.keysAsync()){
|
|
284
|
+
secretDataPromises.set(secret, {
|
|
285
|
+
pending: this.#readPendingIndexes(jobId, secret),
|
|
286
|
+
finalized: this.#readLastFinalizedIndex(jobId, secret)
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
// Add staged-only secrets (sync, no DB)
|
|
290
|
+
for (const secret of this.#getPendingIndexesForJob(jobId).keys()){
|
|
291
|
+
if (!secretDataPromises.has(secret)) {
|
|
292
|
+
secretDataPromises.set(secret, {
|
|
293
|
+
pending: Promise.resolve(this.#getPendingIndexesForJob(jobId).get(secret) ?? []),
|
|
294
|
+
finalized: Promise.resolve(this.#getLastFinalizedIndexesForJob(jobId).get(secret))
|
|
295
|
+
});
|
|
164
296
|
}
|
|
165
|
-
|
|
166
|
-
|
|
297
|
+
}
|
|
298
|
+
// Await all reads together
|
|
299
|
+
const secrets = [
|
|
300
|
+
...secretDataPromises.keys()
|
|
301
|
+
];
|
|
302
|
+
const dataResults = await Promise.all(secrets.map(async (secret)=>({
|
|
303
|
+
secret,
|
|
304
|
+
pendingData: await secretDataPromises.get(secret).pending,
|
|
305
|
+
lastFinalized: await secretDataPromises.get(secret).finalized
|
|
306
|
+
})));
|
|
307
|
+
// Process all txHashes for each secret in memory
|
|
308
|
+
for (const { secret, pendingData, lastFinalized } of dataResults){
|
|
309
|
+
if (!pendingData || pendingData.length === 0) {
|
|
167
310
|
continue;
|
|
168
311
|
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
312
|
+
let currentPending = pendingData;
|
|
313
|
+
let currentFinalized = lastFinalized;
|
|
314
|
+
// Process all txHashes for this secret
|
|
315
|
+
for (const txHashStr of txHashStrings){
|
|
316
|
+
const matchingIndexes = currentPending.filter((item)=>item.txHash === txHashStr).map((item)=>item.index);
|
|
317
|
+
if (matchingIndexes.length === 0) {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
if (matchingIndexes.length > 1) {
|
|
321
|
+
// We should always just store the highest pending index for a given tx hash and secret because the lower
|
|
322
|
+
// values are irrelevant.
|
|
323
|
+
throw new Error(`Multiple pending indexes found for tx hash ${txHashStr} and secret ${secret}`);
|
|
324
|
+
}
|
|
325
|
+
const newFinalized = matchingIndexes[0];
|
|
326
|
+
if (newFinalized < (currentFinalized ?? 0)) {
|
|
327
|
+
// This should never happen because when last finalized index was finalized we should have pruned the lower
|
|
328
|
+
// pending indexes.
|
|
329
|
+
throw new Error(`New finalized index ${newFinalized} is smaller than the current last finalized index ${currentFinalized}`);
|
|
330
|
+
}
|
|
331
|
+
currentFinalized = newFinalized;
|
|
332
|
+
// When we add pending indexes, we ensure they are higher than the last finalized index. However, because we
|
|
333
|
+
// cannot control the order in which transactions are finalized, there may be pending indexes that are now
|
|
334
|
+
// obsolete because they are lower than the most recently finalized index. For this reason, we prune these
|
|
335
|
+
// outdated pending indexes.
|
|
336
|
+
currentPending = currentPending.filter((item)=>item.index > currentFinalized);
|
|
173
337
|
}
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
// This should never happen because when last finalized index was finalized we should have pruned the lower
|
|
178
|
-
// pending indexes.
|
|
179
|
-
throw new Error(`New finalized index ${newFinalized} is smaller than the current last finalized index ${lastFinalized}`);
|
|
338
|
+
// Write final state if changed
|
|
339
|
+
if (currentFinalized !== lastFinalized) {
|
|
340
|
+
this.#writeLastFinalizedIndex(jobId, secret, currentFinalized);
|
|
180
341
|
}
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
// When we add pending indexes, we ensure they are higher than the last finalized index. However, because we
|
|
184
|
-
// cannot control the order in which transactions are finalized, there may be pending indexes that are now
|
|
185
|
-
// obsolete because they are lower than the most recently finalized index. For this reason, we prune these
|
|
186
|
-
// outdated pending indexes.
|
|
187
|
-
const remainingItemsOfHigherIndex = pendingData.filter((item)=>item.index > (lastFinalized ?? 0));
|
|
188
|
-
if (remainingItemsOfHigherIndex.length === 0) {
|
|
189
|
-
await this.#pendingIndexes.delete(secret);
|
|
190
|
-
} else {
|
|
191
|
-
await this.#pendingIndexes.set(secret, remainingItemsOfHigherIndex);
|
|
342
|
+
if (currentPending !== pendingData) {
|
|
343
|
+
this.#writePendingIndexes(jobId, secret, currentPending);
|
|
192
344
|
}
|
|
193
345
|
}
|
|
194
|
-
}
|
|
346
|
+
});
|
|
195
347
|
}
|
|
196
348
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
2
|
+
import type { BlockHash } from '@aztec/stdlib/block';
|
|
3
|
+
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
4
|
+
import type { SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
5
|
+
/**
|
|
6
|
+
* Fetches all private logs for the given tags, automatically paginating through all pages.
|
|
7
|
+
* @param aztecNode - The Aztec node to query.
|
|
8
|
+
* @param tags - The siloed tags to search for.
|
|
9
|
+
* @param anchorBlockHash - reference block for the Aztec node query, throws if block is not found there (typically
|
|
10
|
+
* because of reorgs).
|
|
11
|
+
* @returns An array of log arrays, one per tag, containing all logs across all pages.
|
|
12
|
+
*/
|
|
13
|
+
export declare function getAllPrivateLogsByTags(aztecNode: AztecNode, tags: SiloedTag[], anchorBlockHash: BlockHash): Promise<TxScopedL2Log[][]>;
|
|
14
|
+
/**
|
|
15
|
+
* Fetches all public logs for the given tags from a contract, automatically paginating through all pages.
|
|
16
|
+
* @param aztecNode - The Aztec node to query.
|
|
17
|
+
* @param contractAddress - The contract address to search logs for.
|
|
18
|
+
* @param tags - The tags to search for.
|
|
19
|
+
* @param anchorBlockHash - reference block for the Aztec node query, throws if block is not found there (typically
|
|
20
|
+
* because of reorgs).
|
|
21
|
+
* @returns An array of log arrays, one per tag, containing all logs across all pages.
|
|
22
|
+
*/
|
|
23
|
+
export declare function getAllPublicLogsByTagsFromContract(aztecNode: AztecNode, contractAddress: AztecAddress, tags: Tag[], anchorBlockHash: BlockHash): Promise<TxScopedL2Log[][]>;
|
|
24
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2V0X2FsbF9sb2dzX2J5X3RhZ3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWdnaW5nL2dldF9hbGxfbG9nc19ieV90YWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2pFLE9BQU8sS0FBSyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUE2QnhFOzs7Ozs7O0dBT0c7QUFDSCx3QkFBZ0IsdUJBQXVCLENBQ3JDLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLElBQUksRUFBRSxTQUFTLEVBQUUsRUFDakIsZUFBZSxFQUFFLFNBQVMsR0FDekIsT0FBTyxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsQ0FFNUI7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILHdCQUFnQixrQ0FBa0MsQ0FDaEQsU0FBUyxFQUFFLFNBQVMsRUFDcEIsZUFBZSxFQUFFLFlBQVksRUFDN0IsSUFBSSxFQUFFLEdBQUcsRUFBRSxFQUNYLGVBQWUsRUFBRSxTQUFTLEdBQ3pCLE9BQU8sQ0FBQyxhQUFhLEVBQUUsRUFBRSxDQUFDLENBSTVCIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"get_all_logs_by_tags.d.ts","sourceRoot":"","sources":["../../src/tagging/get_all_logs_by_tags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,SAAS,EAAE,GAAG,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AA6BxE;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CACrC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,SAAS,EAAE,EACjB,eAAe,EAAE,SAAS,GACzB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAE5B;AAED;;;;;;;;GAQG;AACH,wBAAgB,kCAAkC,CAChD,SAAS,EAAE,SAAS,EACpB,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,GAAG,EAAE,EACX,eAAe,EAAE,SAAS,GACzB,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAI5B"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { MAX_LOGS_PER_TAG } from '@aztec/stdlib/interfaces/api-limit';
|
|
2
|
+
/**
|
|
3
|
+
* Generic pagination helper that fetches all pages of results.
|
|
4
|
+
* @param numTags - The number of tags being queried (determines result array size).
|
|
5
|
+
* @param fetchPage - Function that fetches a single page of results given a page number.
|
|
6
|
+
* @returns An array of arrays, one per tag, containing all results across all pages.
|
|
7
|
+
*/ async function getAllPages(numTags, fetchPage) {
|
|
8
|
+
const allResultsPerTag = Array.from({
|
|
9
|
+
length: numTags
|
|
10
|
+
}, ()=>[]);
|
|
11
|
+
let page = 0;
|
|
12
|
+
let hasMore = true;
|
|
13
|
+
while(hasMore){
|
|
14
|
+
const resultsPage = await fetchPage(page);
|
|
15
|
+
hasMore = false;
|
|
16
|
+
for(let i = 0; i < resultsPage.length; i++){
|
|
17
|
+
allResultsPerTag[i].push(...resultsPage[i]);
|
|
18
|
+
if (resultsPage[i].length === MAX_LOGS_PER_TAG) {
|
|
19
|
+
hasMore = true;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
page++;
|
|
23
|
+
}
|
|
24
|
+
return allResultsPerTag;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Fetches all private logs for the given tags, automatically paginating through all pages.
|
|
28
|
+
* @param aztecNode - The Aztec node to query.
|
|
29
|
+
* @param tags - The siloed tags to search for.
|
|
30
|
+
* @param anchorBlockHash - reference block for the Aztec node query, throws if block is not found there (typically
|
|
31
|
+
* because of reorgs).
|
|
32
|
+
* @returns An array of log arrays, one per tag, containing all logs across all pages.
|
|
33
|
+
*/ export function getAllPrivateLogsByTags(aztecNode, tags, anchorBlockHash) {
|
|
34
|
+
return getAllPages(tags.length, (page)=>aztecNode.getPrivateLogsByTags(tags, page, anchorBlockHash));
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Fetches all public logs for the given tags from a contract, automatically paginating through all pages.
|
|
38
|
+
* @param aztecNode - The Aztec node to query.
|
|
39
|
+
* @param contractAddress - The contract address to search logs for.
|
|
40
|
+
* @param tags - The tags to search for.
|
|
41
|
+
* @param anchorBlockHash - reference block for the Aztec node query, throws if block is not found there (typically
|
|
42
|
+
* because of reorgs).
|
|
43
|
+
* @returns An array of log arrays, one per tag, containing all logs across all pages.
|
|
44
|
+
*/ export function getAllPublicLogsByTagsFromContract(aztecNode, contractAddress, tags, anchorBlockHash) {
|
|
45
|
+
return getAllPages(tags.length, (page)=>aztecNode.getPublicLogsByTagsFromContract(contractAddress, tags, page, anchorBlockHash));
|
|
46
|
+
}
|
package/dest/tagging/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
export { loadPrivateLogsForSenderRecipientPair } from './recipient_sync/load_private_logs_for_sender_recipient_pair.js';
|
|
12
12
|
export { syncSenderTaggingIndexes } from './sender_sync/sync_sender_tagging_indexes.js';
|
|
13
13
|
export { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from './constants.js';
|
|
14
|
+
export { getAllPrivateLogsByTags, getAllPublicLogsByTagsFromContract } from './get_all_logs_by_tags.js';
|
|
14
15
|
export { DirectionalAppTaggingSecret, Tag, SiloedTag } from '@aztec/stdlib/logs';
|
|
15
16
|
export { type PreTag } from '@aztec/stdlib/logs';
|
|
16
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90YWdnaW5nL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7R0FTRztBQUVILE9BQU8sRUFBRSxxQ0FBcUMsRUFBRSxNQUFNLGlFQUFpRSxDQUFDO0FBQ3hILE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQ3hGLE9BQU8sRUFBRSxzQ0FBc0MsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3hFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxrQ0FBa0MsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBR3hHLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDakYsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFFLE1BQU0sb0JBQW9CLENBQUMifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tagging/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qCAAqC,EAAE,MAAM,iEAAiE,CAAC;AACxH,OAAO,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,EAAE,sCAAsC,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tagging/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,qCAAqC,EAAE,MAAM,iEAAiE,CAAC;AACxH,OAAO,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AACxF,OAAO,EAAE,sCAAsC,EAAE,MAAM,gBAAgB,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,kCAAkC,EAAE,MAAM,2BAA2B,CAAC;AAGxG,OAAO,EAAE,2BAA2B,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dest/tagging/index.js
CHANGED
|
@@ -10,5 +10,6 @@
|
|
|
10
10
|
*/ export { loadPrivateLogsForSenderRecipientPair } from './recipient_sync/load_private_logs_for_sender_recipient_pair.js';
|
|
11
11
|
export { syncSenderTaggingIndexes } from './sender_sync/sync_sender_tagging_indexes.js';
|
|
12
12
|
export { UNFINALIZED_TAGGING_INDEXES_WINDOW_LEN } from './constants.js';
|
|
13
|
+
export { getAllPrivateLogsByTags, getAllPublicLogsByTagsFromContract } from './get_all_logs_by_tags.js';
|
|
13
14
|
// Re-export tagging-related types from stdlib
|
|
14
15
|
export { DirectionalAppTaggingSecret, Tag, SiloedTag } from '@aztec/stdlib/logs';
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import type { BlockNumber } from '@aztec/foundation/branded-types';
|
|
2
2
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
3
|
+
import type { BlockHash } from '@aztec/stdlib/block';
|
|
3
4
|
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
4
5
|
import type { DirectionalAppTaggingSecret, TxScopedL2Log } from '@aztec/stdlib/logs';
|
|
5
6
|
import type { RecipientTaggingStore } from '../../storage/tagging_store/recipient_tagging_store.js';
|
|
@@ -10,5 +11,5 @@ import type { RecipientTaggingStore } from '../../storage/tagging_store/recipien
|
|
|
10
11
|
* @dev This function can be safely executed "in parallel" for other sender-recipient pairs because the data in
|
|
11
12
|
* in the tagging data provider is indexed by the secret and hence completely disjoint.
|
|
12
13
|
*/
|
|
13
|
-
export declare function loadPrivateLogsForSenderRecipientPair(secret: DirectionalAppTaggingSecret, app: AztecAddress, aztecNode: AztecNode, taggingStore: RecipientTaggingStore, anchorBlockNumber: BlockNumber): Promise<TxScopedL2Log[]>;
|
|
14
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
14
|
+
export declare function loadPrivateLogsForSenderRecipientPair(secret: DirectionalAppTaggingSecret, app: AztecAddress, aztecNode: AztecNode, taggingStore: RecipientTaggingStore, anchorBlockNumber: BlockNumber, anchorBlockHash: BlockHash, jobId: string): Promise<TxScopedL2Log[]>;
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZF9wcml2YXRlX2xvZ3NfZm9yX3NlbmRlcl9yZWNpcGllbnRfcGFpci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RhZ2dpbmcvcmVjaXBpZW50X3N5bmMvbG9hZF9wcml2YXRlX2xvZ3NfZm9yX3NlbmRlcl9yZWNpcGllbnRfcGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSwyQkFBMkIsRUFBRSxhQUFhLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUVyRixPQUFPLEtBQUssRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHdEQUF3RCxDQUFDO0FBS3BHOzs7Ozs7R0FNRztBQUNILHdCQUFzQixxQ0FBcUMsQ0FDekQsTUFBTSxFQUFFLDJCQUEyQixFQUNuQyxHQUFHLEVBQUUsWUFBWSxFQUNqQixTQUFTLEVBQUUsU0FBUyxFQUNwQixZQUFZLEVBQUUscUJBQXFCLEVBQ25DLGlCQUFpQixFQUFFLFdBQVcsRUFDOUIsZUFBZSxFQUFFLFNBQVMsRUFDMUIsS0FBSyxFQUFFLE1BQU0sR0FDWixPQUFPLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FvSDFCIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load_private_logs_for_sender_recipient_pair.d.ts","sourceRoot":"","sources":["../../../src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wDAAwD,CAAC;AAKpG;;;;;;GAMG;AACH,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,2BAA2B,EACnC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,qBAAqB,EACnC,iBAAiB,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"load_private_logs_for_sender_recipient_pair.d.ts","sourceRoot":"","sources":["../../../src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAErF,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,wDAAwD,CAAC;AAKpG;;;;;;GAMG;AACH,wBAAsB,qCAAqC,CACzD,MAAM,EAAE,2BAA2B,EACnC,GAAG,EAAE,YAAY,EACjB,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,qBAAqB,EACnC,iBAAiB,EAAE,WAAW,EAC9B,eAAe,EAAE,SAAS,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,aAAa,EAAE,CAAC,CAoH1B"}
|
|
@@ -7,7 +7,7 @@ import { loadLogsForRange } from './utils/load_logs_for_range.js';
|
|
|
7
7
|
*
|
|
8
8
|
* @dev This function can be safely executed "in parallel" for other sender-recipient pairs because the data in
|
|
9
9
|
* in the tagging data provider is indexed by the secret and hence completely disjoint.
|
|
10
|
-
*/ export async function loadPrivateLogsForSenderRecipientPair(secret, app, aztecNode, taggingStore, anchorBlockNumber) {
|
|
10
|
+
*/ export async function loadPrivateLogsForSenderRecipientPair(secret, app, aztecNode, taggingStore, anchorBlockNumber, anchorBlockHash, jobId) {
|
|
11
11
|
// # Explanation of how the algorithm works
|
|
12
12
|
// When we perform the sync we will look at logs that correspond to the tagging index range
|
|
13
13
|
// (highestAgedIndex, highestFinalizedIndex + WINDOW_LEN]
|
|
@@ -61,8 +61,8 @@ import { loadLogsForRange } from './utils/load_logs_for_range.js';
|
|
|
61
61
|
}
|
|
62
62
|
let start, end;
|
|
63
63
|
{
|
|
64
|
-
const currentHighestAgedIndex = await taggingStore.getHighestAgedIndex(secret);
|
|
65
|
-
const currentHighestFinalizedIndex = await taggingStore.getHighestFinalizedIndex(secret);
|
|
64
|
+
const currentHighestAgedIndex = await taggingStore.getHighestAgedIndex(secret, jobId);
|
|
65
|
+
const currentHighestFinalizedIndex = await taggingStore.getHighestFinalizedIndex(secret, jobId);
|
|
66
66
|
// We don't want to include the highest aged index so we start from `currentHighestAgedIndex + 1` (or 0 if not set)
|
|
67
67
|
start = currentHighestAgedIndex === undefined ? 0 : currentHighestAgedIndex + 1;
|
|
68
68
|
// The highest index a sender can choose is "highest finalized index + window length" but given that
|
|
@@ -72,7 +72,7 @@ import { loadLogsForRange } from './utils/load_logs_for_range.js';
|
|
|
72
72
|
const logs = [];
|
|
73
73
|
while(true){
|
|
74
74
|
// Get private logs with their block timestamps and corresponding tagging indexes
|
|
75
|
-
const privateLogsWithIndexes = await loadLogsForRange(secret, app, aztecNode, start, end, anchorBlockNumber);
|
|
75
|
+
const privateLogsWithIndexes = await loadLogsForRange(secret, app, aztecNode, start, end, anchorBlockNumber, anchorBlockHash);
|
|
76
76
|
if (privateLogsWithIndexes.length === 0) {
|
|
77
77
|
break;
|
|
78
78
|
}
|
|
@@ -80,7 +80,7 @@ import { loadLogsForRange } from './utils/load_logs_for_range.js';
|
|
|
80
80
|
const { highestAgedIndex, highestFinalizedIndex } = findHighestIndexes(privateLogsWithIndexes, currentTimestamp, finalizedBlockNumber);
|
|
81
81
|
// Store updates in data provider and update local variables
|
|
82
82
|
if (highestAgedIndex !== undefined) {
|
|
83
|
-
await taggingStore.updateHighestAgedIndex(secret, highestAgedIndex);
|
|
83
|
+
await taggingStore.updateHighestAgedIndex(secret, highestAgedIndex, jobId);
|
|
84
84
|
}
|
|
85
85
|
if (highestFinalizedIndex === undefined) {
|
|
86
86
|
break;
|
|
@@ -89,7 +89,7 @@ import { loadLogsForRange } from './utils/load_logs_for_range.js';
|
|
|
89
89
|
// This is just a sanity check as this should never happen.
|
|
90
90
|
throw new Error('Highest aged index lower than highest finalized index invariant violated');
|
|
91
91
|
}
|
|
92
|
-
await taggingStore.updateHighestFinalizedIndex(secret, highestFinalizedIndex);
|
|
92
|
+
await taggingStore.updateHighestFinalizedIndex(secret, highestFinalizedIndex, jobId);
|
|
93
93
|
// For the next iteration we want to look only at indexes for which we have not attempted to load logs yet while
|
|
94
94
|
// ensuring that we do not look further than WINDOW_LEN ahead of the highest finalized index.
|
|
95
95
|
start = end;
|