@aztec/pxe 0.0.1-commit.96dac018d → 0.0.1-commit.993d52e
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/config/package_info.js +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +3 -3
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +5 -5
- package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_tagging_index_cache.js +3 -3
- 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/oracle/private_execution_oracle.d.ts +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +18 -10
- package/dest/logs/log_service.d.ts +1 -1
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +4 -4
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +3 -4
- 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 +64 -125
- 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 +5 -13
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +5 -5
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +4 -4
- package/dest/tagging/index.d.ts +2 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +4 -5
- 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 +3 -3
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +6 -7
- 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 +12 -11
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -8
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +3 -6
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +4 -7
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +14 -15
- package/package.json +16 -16
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/contract_function_simulator.ts +10 -3
- package/src/contract_function_simulator/execution_tagging_index_cache.ts +5 -5
- 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/oracle/private_execution_oracle.ts +23 -11
- package/src/logs/log_service.ts +10 -5
- package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +110 -157
- package/src/private_kernel/private_kernel_execution_prover.ts +6 -13
- package/src/storage/tagging_store/recipient_tagging_store.ts +9 -5
- package/src/storage/tagging_store/sender_tagging_store.ts +8 -8
- package/src/tagging/index.ts +1 -1
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +3 -6
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +10 -15
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +4 -9
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +11 -20
- package/dest/private_kernel/hints/test_utils.d.ts +0 -122
- package/dest/private_kernel/hints/test_utils.d.ts.map +0 -1
- package/dest/private_kernel/hints/test_utils.js +0 -203
- package/src/private_kernel/hints/test_utils.ts +0 -325
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load_logs_for_range.d.ts","sourceRoot":"","sources":["../../../../src/tagging/recipient_sync/utils/load_logs_for_range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"load_logs_for_range.d.ts","sourceRoot":"","sources":["../../../../src/tagging/recipient_sync/utils/load_logs_for_range.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,mCAAmC,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAK7F;;;;GAIG;AACH,wBAAsB,gBAAgB,CACpC,cAAc,EAAE,mCAAmC,EACnD,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,iBAAiB,EAAE,WAAW,EAC9B,eAAe,EAAE,SAAS,GACzB,OAAO,CAAC,KAAK,CAAC;IAAE,GAAG,EAAE,aAAa,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAuB9D"}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
|
-
import { SiloedTag
|
|
1
|
+
import { SiloedTag } from '@aztec/stdlib/logs';
|
|
2
2
|
import { getAllPrivateLogsByTags } from '../../get_all_logs_by_tags.js';
|
|
3
3
|
/**
|
|
4
|
-
* Gets private logs with their corresponding block timestamps and tagging indexes for the given index range
|
|
5
|
-
* `
|
|
6
|
-
* exclusive.
|
|
7
|
-
*/ export async function loadLogsForRange(
|
|
8
|
-
// Derive tags for the window
|
|
9
|
-
const
|
|
10
|
-
|
|
4
|
+
* Gets private logs with their corresponding block timestamps and tagging indexes for the given index range and
|
|
5
|
+
* `extendedSecret`. At most load logs from blocks up to and including `anchorBlockNumber`. `start` is inclusive and
|
|
6
|
+
* `end` is exclusive.
|
|
7
|
+
*/ export async function loadLogsForRange(extendedSecret, aztecNode, start, end, anchorBlockNumber, anchorBlockHash) {
|
|
8
|
+
// Derive siloed tags for the window
|
|
9
|
+
const siloedTags = await Promise.all(Array.from({
|
|
10
|
+
length: end - start
|
|
11
|
+
}, (_, i)=>SiloedTag.compute({
|
|
12
|
+
extendedSecret,
|
|
11
13
|
index: start + i
|
|
12
|
-
}));
|
|
13
|
-
const siloedTags = await Promise.all(preTags.map((preTag)=>Tag.compute(preTag))).then((tags)=>Promise.all(tags.map((tag)=>SiloedTag.compute(tag, app))));
|
|
14
|
+
})));
|
|
14
15
|
// We use the utility function below to retrieve all logs for the tags across all pages, so we don't need to handle
|
|
15
16
|
// pagination here.
|
|
16
17
|
const logs = await getAllPrivateLogsByTags(aztecNode, siloedTags, anchorBlockHash);
|
|
@@ -18,7 +19,7 @@ import { getAllPrivateLogsByTags } from '../../get_all_logs_by_tags.js';
|
|
|
18
19
|
const logsWithIndexes = [];
|
|
19
20
|
for(let i = 0; i < logs.length; i++){
|
|
20
21
|
const logsForTag = logs[i];
|
|
21
|
-
const taggingIndex =
|
|
22
|
+
const taggingIndex = start + i;
|
|
22
23
|
for (const log of logsForTag){
|
|
23
24
|
if (log.blockNumber <= anchorBlockNumber) {
|
|
24
25
|
logsWithIndexes.push({
|
|
@@ -1,21 +1,17 @@
|
|
|
1
|
-
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
2
1
|
import type { BlockHash } from '@aztec/stdlib/block';
|
|
3
2
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
4
|
-
import type {
|
|
3
|
+
import type { ExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/logs';
|
|
5
4
|
import type { SenderTaggingStore } from '../../storage/tagging_store/sender_tagging_store.js';
|
|
6
5
|
/**
|
|
7
6
|
* Syncs tagging indexes. This function needs to be called whenever a private log is being sent.
|
|
8
7
|
*
|
|
9
|
-
* @param secret - The secret that's unique for (sender, recipient,
|
|
8
|
+
* @param secret - The secret that's unique for (sender, recipient, app) tuple while the direction of
|
|
10
9
|
* sender -> recipient matters.
|
|
11
|
-
* @param app - The address of the contract that the logs are tagged for. Needs to be provided because we perform
|
|
12
|
-
* second round of siloing in this function which is necessary because kernels do it as well (they silo first field
|
|
13
|
-
* of the private log which corresponds to the tag).
|
|
14
10
|
* @remarks When syncing the indexes as sender we don't care about the log contents - we only care about the highest
|
|
15
11
|
* pending and highest finalized indexes as that guides the next index choice when sending a log. The next index choice
|
|
16
12
|
* is simply the highest pending index plus one (or finalized if pending is undefined).
|
|
17
13
|
* @dev This function looks for new indexes, adds them to pending, then it checks status of each pending index and
|
|
18
14
|
* updates its status accordingly.
|
|
19
15
|
*/
|
|
20
|
-
export declare function syncSenderTaggingIndexes(secret:
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
export declare function syncSenderTaggingIndexes(secret: ExtendedDirectionalAppTaggingSecret, aztecNode: AztecNode, taggingStore: SenderTaggingStore, anchorBlockHash: BlockHash, jobId: string): Promise<void>;
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY19zZW5kZXJfdGFnZ2luZ19pbmRleGVzLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdGFnZ2luZy9zZW5kZXJfc3luYy9zeW5jX3NlbmRlcl90YWdnaW5nX2luZGV4ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDakUsT0FBTyxLQUFLLEVBQUUsbUNBQW1DLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUU5RSxPQUFPLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFEQUFxRCxDQUFDO0FBSzlGOzs7Ozs7Ozs7O0dBVUc7QUFDSCx3QkFBc0Isd0JBQXdCLENBQzVDLE1BQU0sRUFBRSxtQ0FBbUMsRUFDM0MsU0FBUyxFQUFFLFNBQVMsRUFDcEIsWUFBWSxFQUFFLGtCQUFrQixFQUNoQyxlQUFlLEVBQUUsU0FBUyxFQUMxQixLQUFLLEVBQUUsTUFBTSxHQUNaLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FtRWYifQ==
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sync_sender_tagging_indexes.d.ts","sourceRoot":"","sources":["../../../src/tagging/sender_sync/sync_sender_tagging_indexes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"sync_sender_tagging_indexes.d.ts","sourceRoot":"","sources":["../../../src/tagging/sender_sync/sync_sender_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,KAAK,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AAE9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,qDAAqD,CAAC;AAK9F;;;;;;;;;;GAUG;AACH,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,mCAAmC,EAC3C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,kBAAkB,EAChC,eAAe,EAAE,SAAS,EAC1B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAmEf"}
|
|
@@ -4,17 +4,14 @@ import { loadAndStoreNewTaggingIndexes } from './utils/load_and_store_new_taggin
|
|
|
4
4
|
/**
|
|
5
5
|
* Syncs tagging indexes. This function needs to be called whenever a private log is being sent.
|
|
6
6
|
*
|
|
7
|
-
* @param secret - The secret that's unique for (sender, recipient,
|
|
7
|
+
* @param secret - The secret that's unique for (sender, recipient, app) tuple while the direction of
|
|
8
8
|
* sender -> recipient matters.
|
|
9
|
-
* @param app - The address of the contract that the logs are tagged for. Needs to be provided because we perform
|
|
10
|
-
* second round of siloing in this function which is necessary because kernels do it as well (they silo first field
|
|
11
|
-
* of the private log which corresponds to the tag).
|
|
12
9
|
* @remarks When syncing the indexes as sender we don't care about the log contents - we only care about the highest
|
|
13
10
|
* pending and highest finalized indexes as that guides the next index choice when sending a log. The next index choice
|
|
14
11
|
* is simply the highest pending index plus one (or finalized if pending is undefined).
|
|
15
12
|
* @dev This function looks for new indexes, adds them to pending, then it checks status of each pending index and
|
|
16
13
|
* updates its status accordingly.
|
|
17
|
-
*/ export async function syncSenderTaggingIndexes(secret,
|
|
14
|
+
*/ export async function syncSenderTaggingIndexes(secret, aztecNode, taggingStore, anchorBlockHash, jobId) {
|
|
18
15
|
// # Explanation of how syncing works
|
|
19
16
|
//
|
|
20
17
|
// When choosing an index, we select: highest pending index + 1 (or highest finalized index + 1 if no pending).
|
|
@@ -40,7 +37,7 @@ import { loadAndStoreNewTaggingIndexes } from './utils/load_and_store_new_taggin
|
|
|
40
37
|
while(true){
|
|
41
38
|
// Load and store indexes for the current window. These indexes may already exist in the database if txs using
|
|
42
39
|
// them were previously sent from this PXE. Any duplicates are handled by the tagging data provider.
|
|
43
|
-
await loadAndStoreNewTaggingIndexes(secret,
|
|
40
|
+
await loadAndStoreNewTaggingIndexes(secret, start, end, aztecNode, taggingStore, anchorBlockHash, jobId);
|
|
44
41
|
// Retrieve all indexes within the current window from storage and update their status accordingly.
|
|
45
42
|
const pendingTxHashes = await taggingStore.getTxHashesOfPendingIndexes(secret, start, end, jobId);
|
|
46
43
|
if (pendingTxHashes.length === 0) {
|
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
2
1
|
import type { BlockHash } from '@aztec/stdlib/block';
|
|
3
2
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
4
|
-
import type {
|
|
3
|
+
import type { ExtendedDirectionalAppTaggingSecret } from '@aztec/stdlib/logs';
|
|
5
4
|
import type { SenderTaggingStore } from '../../../storage/tagging_store/sender_tagging_store.js';
|
|
6
5
|
/**
|
|
7
6
|
* Loads tagging indexes from the Aztec node and stores them in the tagging data provider.
|
|
8
7
|
* @remarks This function is one of two places by which a pending index can get to the tagging data provider. The other
|
|
9
8
|
* place is when a tx is being sent from this PXE.
|
|
10
|
-
* @param
|
|
11
|
-
* @param app - The address of the contract that the logs are tagged for. Used for siloing tags to match
|
|
12
|
-
* kernel circuit behavior.
|
|
9
|
+
* @param extendedSecret - The extended directional app tagging secret that's unique for (sender, recipient, app) tuple.
|
|
13
10
|
* @param start - The starting index (inclusive) of the window to process.
|
|
14
11
|
* @param end - The ending index (exclusive) of the window to process.
|
|
15
12
|
* @param aztecNode - The Aztec node instance to query for logs.
|
|
@@ -17,5 +14,5 @@ import type { SenderTaggingStore } from '../../../storage/tagging_store/sender_t
|
|
|
17
14
|
* @param jobId - Job identifier, used to keep writes in-memory until they can be persisted in a data integrity
|
|
18
15
|
* preserving way.
|
|
19
16
|
*/
|
|
20
|
-
export declare function loadAndStoreNewTaggingIndexes(
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
17
|
+
export declare function loadAndStoreNewTaggingIndexes(extendedSecret: ExtendedDirectionalAppTaggingSecret, start: number, end: number, aztecNode: AztecNode, taggingStore: SenderTaggingStore, anchorBlockHash: BlockHash, jobId: string): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZF9hbmRfc3RvcmVfbmV3X3RhZ2dpbmdfaW5kZXhlcy5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3RhZ2dpbmcvc2VuZGVyX3N5bmMvdXRpbHMvbG9hZF9hbmRfc3RvcmVfbmV3X3RhZ2dpbmdfaW5kZXhlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRSxPQUFPLEtBQUssRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBSTlFLE9BQU8sS0FBSyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sd0RBQXdELENBQUM7QUFHakc7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCx3QkFBc0IsNkJBQTZCLENBQ2pELGNBQWMsRUFBRSxtQ0FBbUMsRUFDbkQsS0FBSyxFQUFFLE1BQU0sRUFDYixHQUFHLEVBQUUsTUFBTSxFQUNYLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLFlBQVksRUFBRSxrQkFBa0IsRUFDaEMsZUFBZSxFQUFFLFNBQVMsRUFDMUIsS0FBSyxFQUFFLE1BQU0saUJBZWQifQ==
|
|
@@ -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,
|
|
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,KAAK,EAAE,mCAAmC,EAAE,MAAM,oBAAoB,CAAC;AAI9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wDAAwD,CAAC;AAGjG;;;;;;;;;;;GAWG;AACH,wBAAsB,6BAA6B,CACjD,cAAc,EAAE,mCAAmC,EACnD,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,kBAAkB,EAChC,eAAe,EAAE,SAAS,EAC1B,KAAK,EAAE,MAAM,iBAed"}
|
|
@@ -1,34 +1,33 @@
|
|
|
1
|
-
import { SiloedTag
|
|
1
|
+
import { SiloedTag } from '@aztec/stdlib/logs';
|
|
2
2
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
3
3
|
import { getAllPrivateLogsByTags } from '../../get_all_logs_by_tags.js';
|
|
4
4
|
/**
|
|
5
5
|
* Loads tagging indexes from the Aztec node and stores them in the tagging data provider.
|
|
6
6
|
* @remarks This function is one of two places by which a pending index can get to the tagging data provider. The other
|
|
7
7
|
* place is when a tx is being sent from this PXE.
|
|
8
|
-
* @param
|
|
9
|
-
* @param app - The address of the contract that the logs are tagged for. Used for siloing tags to match
|
|
10
|
-
* kernel circuit behavior.
|
|
8
|
+
* @param extendedSecret - The extended directional app tagging secret that's unique for (sender, recipient, app) tuple.
|
|
11
9
|
* @param start - The starting index (inclusive) of the window to process.
|
|
12
10
|
* @param end - The ending index (exclusive) of the window to process.
|
|
13
11
|
* @param aztecNode - The Aztec node instance to query for logs.
|
|
14
12
|
* @param taggingStore - The data provider to store pending indexes.
|
|
15
13
|
* @param jobId - Job identifier, used to keep writes in-memory until they can be persisted in a data integrity
|
|
16
14
|
* preserving way.
|
|
17
|
-
*/ export async function loadAndStoreNewTaggingIndexes(
|
|
15
|
+
*/ export async function loadAndStoreNewTaggingIndexes(extendedSecret, start, end, aztecNode, taggingStore, anchorBlockHash, jobId) {
|
|
18
16
|
// We compute the tags for the current window of indexes
|
|
19
|
-
const
|
|
20
|
-
|
|
17
|
+
const siloedTagsForWindow = await Promise.all(Array.from({
|
|
18
|
+
length: end - start
|
|
19
|
+
}, (_, i)=>SiloedTag.compute({
|
|
20
|
+
extendedSecret,
|
|
21
21
|
index: start + i
|
|
22
|
-
}));
|
|
23
|
-
const siloedTagsForWindow = await Promise.all(preTagsForWindow.map(async (preTag)=>SiloedTag.compute(await Tag.compute(preTag), app)));
|
|
22
|
+
})));
|
|
24
23
|
const txsForTags = await getTxsContainingTags(siloedTagsForWindow, aztecNode, anchorBlockHash);
|
|
25
|
-
const highestIndexMap = getTxHighestIndexMap(txsForTags,
|
|
24
|
+
const highestIndexMap = getTxHighestIndexMap(txsForTags, start, siloedTagsForWindow.length);
|
|
26
25
|
// Now we iterate over the map, reconstruct the preTags and tx hash and store them in the db.
|
|
27
26
|
for (const [txHashStr, highestIndex] of highestIndexMap.entries()){
|
|
28
27
|
const txHash = TxHash.fromString(txHashStr);
|
|
29
28
|
await taggingStore.storePendingIndexes([
|
|
30
29
|
{
|
|
31
|
-
|
|
30
|
+
extendedSecret,
|
|
32
31
|
index: highestIndex
|
|
33
32
|
}
|
|
34
33
|
], txHash, jobId);
|
|
@@ -43,13 +42,13 @@ async function getTxsContainingTags(tags, aztecNode, anchorBlockHash) {
|
|
|
43
42
|
return allLogs.map((logs)=>logs.map((log)=>log.txHash));
|
|
44
43
|
}
|
|
45
44
|
// Returns a map of txHash to the highest index for that txHash.
|
|
46
|
-
function getTxHighestIndexMap(txHashesForTags,
|
|
47
|
-
if (txHashesForTags.length !==
|
|
48
|
-
throw new Error(`Number of tx hashes arrays does not match number of
|
|
45
|
+
function getTxHighestIndexMap(txHashesForTags, start, count) {
|
|
46
|
+
if (txHashesForTags.length !== count) {
|
|
47
|
+
throw new Error(`Number of tx hashes arrays does not match number of tags. ${txHashesForTags.length} !== ${count}`);
|
|
49
48
|
}
|
|
50
49
|
const highestIndexMap = new Map();
|
|
51
50
|
for(let i = 0; i < txHashesForTags.length; i++){
|
|
52
|
-
const taggingIndex =
|
|
51
|
+
const taggingIndex = start + i;
|
|
53
52
|
const txHashesForTag = txHashesForTags[i];
|
|
54
53
|
for (const txHash of txHashesForTag){
|
|
55
54
|
const key = txHash.toString();
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/pxe",
|
|
3
|
-
"version": "0.0.1-commit.
|
|
3
|
+
"version": "0.0.1-commit.993d52e",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"typedocOptions": {
|
|
6
6
|
"entryPoints": [
|
|
@@ -70,19 +70,19 @@
|
|
|
70
70
|
]
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@aztec/bb-prover": "0.0.1-commit.
|
|
74
|
-
"@aztec/bb.js": "0.0.1-commit.
|
|
75
|
-
"@aztec/builder": "0.0.1-commit.
|
|
76
|
-
"@aztec/constants": "0.0.1-commit.
|
|
77
|
-
"@aztec/ethereum": "0.0.1-commit.
|
|
78
|
-
"@aztec/foundation": "0.0.1-commit.
|
|
79
|
-
"@aztec/key-store": "0.0.1-commit.
|
|
80
|
-
"@aztec/kv-store": "0.0.1-commit.
|
|
81
|
-
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.
|
|
82
|
-
"@aztec/noir-types": "0.0.1-commit.
|
|
83
|
-
"@aztec/protocol-contracts": "0.0.1-commit.
|
|
84
|
-
"@aztec/simulator": "0.0.1-commit.
|
|
85
|
-
"@aztec/stdlib": "0.0.1-commit.
|
|
73
|
+
"@aztec/bb-prover": "0.0.1-commit.993d52e",
|
|
74
|
+
"@aztec/bb.js": "0.0.1-commit.993d52e",
|
|
75
|
+
"@aztec/builder": "0.0.1-commit.993d52e",
|
|
76
|
+
"@aztec/constants": "0.0.1-commit.993d52e",
|
|
77
|
+
"@aztec/ethereum": "0.0.1-commit.993d52e",
|
|
78
|
+
"@aztec/foundation": "0.0.1-commit.993d52e",
|
|
79
|
+
"@aztec/key-store": "0.0.1-commit.993d52e",
|
|
80
|
+
"@aztec/kv-store": "0.0.1-commit.993d52e",
|
|
81
|
+
"@aztec/noir-protocol-circuits-types": "0.0.1-commit.993d52e",
|
|
82
|
+
"@aztec/noir-types": "0.0.1-commit.993d52e",
|
|
83
|
+
"@aztec/protocol-contracts": "0.0.1-commit.993d52e",
|
|
84
|
+
"@aztec/simulator": "0.0.1-commit.993d52e",
|
|
85
|
+
"@aztec/stdlib": "0.0.1-commit.993d52e",
|
|
86
86
|
"koa": "^2.16.1",
|
|
87
87
|
"koa-router": "^13.1.1",
|
|
88
88
|
"lodash.omit": "^4.5.0",
|
|
@@ -91,8 +91,8 @@
|
|
|
91
91
|
"viem": "npm:@aztec/viem@2.38.2"
|
|
92
92
|
},
|
|
93
93
|
"devDependencies": {
|
|
94
|
-
"@aztec/merkle-tree": "0.0.1-commit.
|
|
95
|
-
"@aztec/noir-test-contracts.js": "0.0.1-commit.
|
|
94
|
+
"@aztec/merkle-tree": "0.0.1-commit.993d52e",
|
|
95
|
+
"@aztec/noir-test-contracts.js": "0.0.1-commit.993d52e",
|
|
96
96
|
"@jest/globals": "^30.0.0",
|
|
97
97
|
"@types/jest": "^30.0.0",
|
|
98
98
|
"@types/lodash.omit": "^4.5.7",
|
|
@@ -689,7 +689,6 @@ function squashTransientSideEffects(
|
|
|
689
689
|
scopedNullifiersCLA,
|
|
690
690
|
/*futureNoteHashReads=*/ [],
|
|
691
691
|
/*futureNullifierReads=*/ [],
|
|
692
|
-
/*futureLogs=*/ [],
|
|
693
692
|
noteHashNullifierCounterMap,
|
|
694
693
|
minRevertibleSideEffectCounter,
|
|
695
694
|
);
|
|
@@ -732,8 +731,16 @@ async function verifyReadRequests(
|
|
|
732
731
|
nullifierReadRequests.length,
|
|
733
732
|
);
|
|
734
733
|
|
|
735
|
-
const noteHashResetActions = getNoteHashReadRequestResetActions(
|
|
736
|
-
|
|
734
|
+
const noteHashResetActions = getNoteHashReadRequestResetActions(
|
|
735
|
+
noteHashReadRequestsCLA,
|
|
736
|
+
scopedNoteHashesCLA,
|
|
737
|
+
/*futureNoteHashes=*/ [],
|
|
738
|
+
);
|
|
739
|
+
const nullifierResetActions = getNullifierReadRequestResetActions(
|
|
740
|
+
nullifierReadRequestsCLA,
|
|
741
|
+
scopedNullifiersCLA,
|
|
742
|
+
/*futureNullifiers=*/ [],
|
|
743
|
+
);
|
|
737
744
|
|
|
738
745
|
const settledNoteHashReads: { index: number; value: Fr }[] = [];
|
|
739
746
|
for (let i = 0; i < noteHashResetActions.actions.length; i++) {
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ExtendedDirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
|
-
* A map that stores the tagging index for a given directional app tagging secret.
|
|
4
|
+
* A map that stores the tagging index for a given extended directional app tagging secret.
|
|
5
5
|
* Note: The directional app tagging secret is unique for a (sender, recipient, contract) tuple while the direction
|
|
6
6
|
* of sender -> recipient matters.
|
|
7
7
|
*/
|
|
8
8
|
export class ExecutionTaggingIndexCache {
|
|
9
9
|
private taggingIndexMap: Map<string, number> = new Map();
|
|
10
10
|
|
|
11
|
-
public getLastUsedIndex(secret:
|
|
11
|
+
public getLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret): number | undefined {
|
|
12
12
|
return this.taggingIndexMap.get(secret.toString());
|
|
13
13
|
}
|
|
14
14
|
|
|
15
|
-
public setLastUsedIndex(secret:
|
|
15
|
+
public setLastUsedIndex(secret: ExtendedDirectionalAppTaggingSecret, index: number) {
|
|
16
16
|
const currentValue = this.taggingIndexMap.get(secret.toString());
|
|
17
17
|
if (currentValue !== undefined && currentValue !== index - 1) {
|
|
18
18
|
throw new Error(`Invalid tagging index update. Current value: ${currentValue}, new value: ${index}`);
|
|
@@ -25,7 +25,7 @@ export class ExecutionTaggingIndexCache {
|
|
|
25
25
|
*/
|
|
26
26
|
public getUsedPreTags(): PreTag[] {
|
|
27
27
|
return Array.from(this.taggingIndexMap.entries()).map(([secret, index]) => ({
|
|
28
|
-
|
|
28
|
+
extendedSecret: ExtendedDirectionalAppTaggingSecret.fromString(secret),
|
|
29
29
|
index,
|
|
30
30
|
}));
|
|
31
31
|
}
|
|
@@ -5,7 +5,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
5
5
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
6
6
|
|
|
7
7
|
// TODO(#14617): should we compute this from constants? This value is aztec-nr specific.
|
|
8
|
-
const MAX_EVENT_SERIALIZED_LEN =
|
|
8
|
+
const MAX_EVENT_SERIALIZED_LEN = 10;
|
|
9
9
|
|
|
10
10
|
/**
|
|
11
11
|
* Intermediate struct used to perform batch event validation by PXE. The `utilityValidateAndStoreEnqueuedNotesAndEvents` oracle
|
|
@@ -4,7 +4,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
|
4
4
|
import { TxHash } from '@aztec/stdlib/tx';
|
|
5
5
|
|
|
6
6
|
// TODO(#14617): should we compute this from constants? This value is aztec-nr specific.
|
|
7
|
-
export const MAX_NOTE_PACKED_LEN =
|
|
7
|
+
export const MAX_NOTE_PACKED_LEN = 8;
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* Intermediate struct used to perform batch note validation by PXE. The `utilityValidateAndStoreEnqueuedNotesAndEvents` oracle
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
15
15
|
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
16
16
|
import { PrivateContextInputs } from '@aztec/stdlib/kernel';
|
|
17
|
-
import { type ContractClassLog,
|
|
17
|
+
import { type ContractClassLog, ExtendedDirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
|
|
18
18
|
import { Tag } from '@aztec/stdlib/logs';
|
|
19
19
|
import { Note, type NoteStatus } from '@aztec/stdlib/note';
|
|
20
20
|
import {
|
|
@@ -216,25 +216,29 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
216
216
|
* @returns An app tag to be used in a log.
|
|
217
217
|
*/
|
|
218
218
|
public async privateGetNextAppTagAsSender(sender: AztecAddress, recipient: AztecAddress): Promise<Tag> {
|
|
219
|
-
const
|
|
219
|
+
const extendedSecret = await this.#calculateExtendedDirectionalAppTaggingSecret(
|
|
220
|
+
this.contractAddress,
|
|
221
|
+
sender,
|
|
222
|
+
recipient,
|
|
223
|
+
);
|
|
220
224
|
|
|
221
|
-
const index = await this.#getIndexToUseForSecret(
|
|
225
|
+
const index = await this.#getIndexToUseForSecret(extendedSecret);
|
|
222
226
|
this.log.debug(
|
|
223
227
|
`Incrementing tagging index for sender: ${sender}, recipient: ${recipient}, contract: ${this.contractAddress} to ${index}`,
|
|
224
228
|
);
|
|
225
|
-
this.taggingIndexCache.setLastUsedIndex(
|
|
229
|
+
this.taggingIndexCache.setLastUsedIndex(extendedSecret, index);
|
|
226
230
|
|
|
227
|
-
return Tag.compute({
|
|
231
|
+
return Tag.compute({ extendedSecret, index });
|
|
228
232
|
}
|
|
229
233
|
|
|
230
|
-
async #
|
|
234
|
+
async #calculateExtendedDirectionalAppTaggingSecret(
|
|
231
235
|
contractAddress: AztecAddress,
|
|
232
236
|
sender: AztecAddress,
|
|
233
237
|
recipient: AztecAddress,
|
|
234
238
|
) {
|
|
235
239
|
const senderCompleteAddress = await this.getCompleteAddressOrFail(sender);
|
|
236
240
|
const senderIvsk = await this.keyStore.getMasterIncomingViewingSecretKey(sender);
|
|
237
|
-
return
|
|
241
|
+
return ExtendedDirectionalAppTaggingSecret.compute(
|
|
238
242
|
senderCompleteAddress,
|
|
239
243
|
senderIvsk,
|
|
240
244
|
recipient,
|
|
@@ -243,7 +247,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
243
247
|
);
|
|
244
248
|
}
|
|
245
249
|
|
|
246
|
-
async #getIndexToUseForSecret(secret:
|
|
250
|
+
async #getIndexToUseForSecret(secret: ExtendedDirectionalAppTaggingSecret): Promise<number> {
|
|
247
251
|
// If we have the tagging index in the cache, we use it. If not we obtain it from the execution data provider.
|
|
248
252
|
const lastUsedIndexInTx = this.taggingIndexCache.getLastUsedIndex(secret);
|
|
249
253
|
|
|
@@ -255,7 +259,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
255
259
|
// that'd be wasteful as most tagging secrets are not used in each tx.
|
|
256
260
|
await syncSenderTaggingIndexes(
|
|
257
261
|
secret,
|
|
258
|
-
this.contractAddress,
|
|
259
262
|
this.aztecNode,
|
|
260
263
|
this.senderTaggingStore,
|
|
261
264
|
await this.anchorBlockHeader.hash(),
|
|
@@ -527,13 +530,22 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
527
530
|
|
|
528
531
|
isStaticCall = isStaticCall || this.callContext.isStaticCall;
|
|
529
532
|
|
|
533
|
+
// When scopes are set and the target contract is a registered account (has keys in the keyStore),
|
|
534
|
+
// expand scopes to include it so nested private calls can sync and read the contract's own notes.
|
|
535
|
+
// We only expand for registered accounts because the log service needs the recipient's keys to derive
|
|
536
|
+
// tagging secrets, which are only available for registered accounts.
|
|
537
|
+
const expandedScopes =
|
|
538
|
+
this.scopes !== 'ALL_SCOPES' && (await this.keyStore.hasAccount(targetContractAddress))
|
|
539
|
+
? [...this.scopes, targetContractAddress]
|
|
540
|
+
: this.scopes;
|
|
541
|
+
|
|
530
542
|
await this.contractSyncService.ensureContractSynced(
|
|
531
543
|
targetContractAddress,
|
|
532
544
|
functionSelector,
|
|
533
545
|
this.utilityExecutor,
|
|
534
546
|
this.anchorBlockHeader,
|
|
535
547
|
this.jobId,
|
|
536
|
-
|
|
548
|
+
expandedScopes,
|
|
537
549
|
);
|
|
538
550
|
|
|
539
551
|
const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
|
|
@@ -571,7 +583,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
571
583
|
totalPublicCalldataCount: this.totalPublicCalldataCount,
|
|
572
584
|
sideEffectCounter,
|
|
573
585
|
log: this.log,
|
|
574
|
-
scopes:
|
|
586
|
+
scopes: expandedScopes,
|
|
575
587
|
senderForTags: this.senderForTags,
|
|
576
588
|
simulator: this.simulator!,
|
|
577
589
|
});
|
package/src/logs/log_service.ts
CHANGED
|
@@ -3,7 +3,13 @@ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundatio
|
|
|
3
3
|
import type { KeyStore } from '@aztec/key-store';
|
|
4
4
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
5
|
import type { AztecNode } from '@aztec/stdlib/interfaces/server';
|
|
6
|
-
import {
|
|
6
|
+
import {
|
|
7
|
+
ExtendedDirectionalAppTaggingSecret,
|
|
8
|
+
PendingTaggedLog,
|
|
9
|
+
SiloedTag,
|
|
10
|
+
Tag,
|
|
11
|
+
TxScopedL2Log,
|
|
12
|
+
} from '@aztec/stdlib/logs';
|
|
7
13
|
import type { BlockHeader } from '@aztec/stdlib/tx';
|
|
8
14
|
|
|
9
15
|
import type { AccessScopes } from '../access_scopes.js';
|
|
@@ -41,7 +47,7 @@ export class LogService {
|
|
|
41
47
|
logRetrievalRequests.map(async request => {
|
|
42
48
|
const [publicLog, privateLog] = await Promise.all([
|
|
43
49
|
this.#getPublicLogByTag(request.tag, request.contractAddress),
|
|
44
|
-
this.#getPrivateLogByTag(await SiloedTag.
|
|
50
|
+
this.#getPrivateLogByTag(await SiloedTag.computeFromTagAndApp(request.tag, request.contractAddress)),
|
|
45
51
|
]);
|
|
46
52
|
|
|
47
53
|
if (publicLog !== null && privateLog !== null) {
|
|
@@ -130,7 +136,6 @@ export class LogService {
|
|
|
130
136
|
secrets.map(secret =>
|
|
131
137
|
loadPrivateLogsForSenderRecipientPair(
|
|
132
138
|
secret,
|
|
133
|
-
contractAddress,
|
|
134
139
|
this.aztecNode,
|
|
135
140
|
this.recipientTaggingStore,
|
|
136
141
|
anchorBlockNumber,
|
|
@@ -154,7 +159,7 @@ export class LogService {
|
|
|
154
159
|
async #getSecretsForSenders(
|
|
155
160
|
contractAddress: AztecAddress,
|
|
156
161
|
recipient: AztecAddress,
|
|
157
|
-
): Promise<
|
|
162
|
+
): Promise<ExtendedDirectionalAppTaggingSecret[]> {
|
|
158
163
|
const recipientCompleteAddress = await this.addressStore.getCompleteAddress(recipient);
|
|
159
164
|
if (!recipientCompleteAddress) {
|
|
160
165
|
return [];
|
|
@@ -172,7 +177,7 @@ export class LogService {
|
|
|
172
177
|
|
|
173
178
|
return Promise.all(
|
|
174
179
|
deduplicatedSenders.map(sender => {
|
|
175
|
-
return
|
|
180
|
+
return ExtendedDirectionalAppTaggingSecret.compute(
|
|
176
181
|
recipientCompleteAddress,
|
|
177
182
|
recipientIvsk,
|
|
178
183
|
sender,
|