@aztec/pxe 0.0.1-commit.1bea0213 → 0.0.1-commit.23b0eb0

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.
Files changed (114) hide show
  1. package/dest/block_synchronizer/block_synchronizer.d.ts +3 -3
  2. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  3. package/dest/block_synchronizer/block_synchronizer.js +3 -3
  4. package/dest/contract_function_simulator/contract_function_simulator.d.ts +2 -4
  5. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  6. package/dest/contract_function_simulator/contract_function_simulator.js +7 -9
  7. package/dest/contract_function_simulator/oracle/interfaces.d.ts +7 -7
  8. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  9. package/dest/contract_function_simulator/oracle/oracle.d.ts +3 -3
  10. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  11. package/dest/contract_function_simulator/oracle/oracle.js +9 -9
  12. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +2 -3
  13. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +5 -5
  15. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +15 -11
  16. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +23 -27
  18. package/dest/contract_sync/index.d.ts +4 -3
  19. package/dest/contract_sync/index.d.ts.map +1 -1
  20. package/dest/contract_sync/index.js +11 -4
  21. package/dest/debug/pxe_debug_utils.d.ts +16 -6
  22. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  23. package/dest/debug/pxe_debug_utils.js +17 -8
  24. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  25. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  26. package/dest/entrypoints/client/bundle/utils.js +12 -6
  27. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  28. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  29. package/dest/entrypoints/client/lazy/utils.js +13 -7
  30. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  31. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  32. package/dest/entrypoints/server/utils.d.ts +1 -1
  33. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  34. package/dest/entrypoints/server/utils.js +19 -8
  35. package/dest/events/event_service.d.ts +4 -5
  36. package/dest/events/event_service.d.ts.map +1 -1
  37. package/dest/events/event_service.js +5 -6
  38. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  39. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  40. package/dest/job_coordinator/job_coordinator.js +3 -2
  41. package/dest/logs/log_service.d.ts +6 -5
  42. package/dest/logs/log_service.d.ts.map +1 -1
  43. package/dest/logs/log_service.js +10 -15
  44. package/dest/notes/note_service.d.ts +4 -5
  45. package/dest/notes/note_service.d.ts.map +1 -1
  46. package/dest/notes/note_service.js +6 -7
  47. package/dest/oracle_version.d.ts +3 -3
  48. package/dest/oracle_version.d.ts.map +1 -1
  49. package/dest/oracle_version.js +2 -2
  50. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  51. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  52. package/dest/private_kernel/private_kernel_execution_prover.js +2 -2
  53. package/dest/pxe.d.ts +1 -1
  54. package/dest/pxe.d.ts.map +1 -1
  55. package/dest/pxe.js +11 -9
  56. package/dest/storage/address_store/address_store.d.ts +1 -1
  57. package/dest/storage/address_store/address_store.d.ts.map +1 -1
  58. package/dest/storage/address_store/address_store.js +12 -11
  59. package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
  60. package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
  61. package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
  62. package/dest/storage/capsule_store/capsule_store.js +6 -8
  63. package/dest/storage/contract_store/contract_store.d.ts +1 -1
  64. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  65. package/dest/storage/contract_store/contract_store.js +22 -13
  66. package/dest/storage/metadata.d.ts +1 -1
  67. package/dest/storage/metadata.js +1 -1
  68. package/dest/storage/note_store/note_store.d.ts +11 -1
  69. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  70. package/dest/storage/note_store/note_store.js +143 -105
  71. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  72. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  73. package/dest/storage/private_event_store/private_event_store.js +84 -61
  74. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  75. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +1 -1
  76. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  77. package/dest/storage/tagging_store/recipient_tagging_store.js +31 -19
  78. package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
  79. package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
  80. package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
  81. package/dest/storage/tagging_store/sender_tagging_store.d.ts +1 -1
  82. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  83. package/dest/storage/tagging_store/sender_tagging_store.js +183 -113
  84. package/package.json +16 -16
  85. package/src/block_synchronizer/block_synchronizer.ts +15 -12
  86. package/src/contract_function_simulator/contract_function_simulator.ts +6 -6
  87. package/src/contract_function_simulator/oracle/interfaces.ts +8 -8
  88. package/src/contract_function_simulator/oracle/oracle.ts +21 -11
  89. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +3 -5
  90. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +26 -29
  91. package/src/contract_sync/index.ts +23 -2
  92. package/src/debug/pxe_debug_utils.ts +23 -9
  93. package/src/entrypoints/client/bundle/utils.ts +7 -14
  94. package/src/entrypoints/client/lazy/utils.ts +8 -14
  95. package/src/entrypoints/pxe_creation_options.ts +2 -1
  96. package/src/entrypoints/server/utils.ts +15 -19
  97. package/src/events/event_service.ts +4 -6
  98. package/src/job_coordinator/job_coordinator.ts +4 -3
  99. package/src/logs/log_service.ts +14 -14
  100. package/src/notes/note_service.ts +5 -7
  101. package/src/oracle_version.ts +2 -2
  102. package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
  103. package/src/pxe.ts +21 -7
  104. package/src/storage/address_store/address_store.ts +15 -15
  105. package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
  106. package/src/storage/capsule_store/capsule_store.ts +8 -8
  107. package/src/storage/contract_store/contract_store.ts +22 -11
  108. package/src/storage/metadata.ts +1 -1
  109. package/src/storage/note_store/note_store.ts +159 -129
  110. package/src/storage/private_event_store/private_event_store.ts +102 -81
  111. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  112. package/src/storage/tagging_store/recipient_tagging_store.ts +31 -21
  113. package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
  114. package/src/storage/tagging_store/sender_tagging_store.ts +210 -126
@@ -33,7 +33,6 @@ import {
33
33
  import { ensureContractSynced } from '../../contract_sync/index.js';
34
34
  import { NoteService } from '../../notes/note_service.js';
35
35
  import type { AddressStore } from '../../storage/address_store/address_store.js';
36
- import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
37
36
  import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
38
37
  import type { ContractStore } from '../../storage/contract_store/contract_store.js';
39
38
  import type { NoteStore } from '../../storage/note_store/note_store.js';
@@ -89,7 +88,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
89
88
  keyStore: KeyStore,
90
89
  addressStore: AddressStore,
91
90
  aztecNode: AztecNode,
92
- anchorBlockStore: AnchorBlockStore,
93
91
  private readonly senderTaggingStore: SenderTaggingStore,
94
92
  recipientTaggingStore: RecipientTaggingStore,
95
93
  senderAddressBookStore: SenderAddressBookStore,
@@ -113,7 +111,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
113
111
  keyStore,
114
112
  addressStore,
115
113
  aztecNode,
116
- anchorBlockStore,
117
114
  recipientTaggingStore,
118
115
  senderAddressBookStore,
119
116
  capsuleStore,
@@ -364,7 +361,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
364
361
 
365
362
  const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.contractAddress);
366
363
 
367
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
364
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
368
365
  const dbNotes = await noteService.getNotes(
369
366
  this.callContext.contractAddress,
370
367
  owner,
@@ -546,7 +543,9 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
546
543
  this.utilityExecutor,
547
544
  this.aztecNode,
548
545
  this.contractStore,
546
+ this.noteStore,
549
547
  this.anchorBlockHeader,
548
+ this.jobId,
550
549
  );
551
550
 
552
551
  const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
@@ -574,7 +573,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
574
573
  this.keyStore,
575
574
  this.addressStore,
576
575
  this.aztecNode,
577
- this.anchorBlockStore,
578
576
  this.senderTaggingStore,
579
577
  this.recipientTaggingStore,
580
578
  this.senderAddressBookStore,
@@ -25,7 +25,6 @@ import { LogService } from '../../logs/log_service.js';
25
25
  import { NoteService } from '../../notes/note_service.js';
26
26
  import { ORACLE_VERSION } from '../../oracle_version.js';
27
27
  import type { AddressStore } from '../../storage/address_store/address_store.js';
28
- import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
29
28
  import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
30
29
  import type { ContractStore } from '../../storage/contract_store/contract_store.js';
31
30
  import type { NoteStore } from '../../storage/note_store/note_store.js';
@@ -61,7 +60,6 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
61
60
  protected readonly keyStore: KeyStore,
62
61
  protected readonly addressStore: AddressStore,
63
62
  protected readonly aztecNode: AztecNode,
64
- protected readonly anchorBlockStore: AnchorBlockStore,
65
63
  protected readonly recipientTaggingStore: RecipientTaggingStore,
66
64
  protected readonly senderAddressBookStore: SenderAddressBookStore,
67
65
  protected readonly capsuleStore: CapsuleStore,
@@ -97,28 +95,34 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
97
95
 
98
96
  /**
99
97
  * Fetches the index and sibling path of a leaf at a given block from the note hash tree.
100
- * @param blockHash - The block hash at which to get the membership witness.
101
- * @param leafValue - The leaf value
98
+ * @param anchorBlockHash - The hash of a block that contains the note hash tree root in which to find the membership
99
+ * witness.
100
+ * @param noteHash - The note hash to find in the note hash tree.
102
101
  * @returns The membership witness containing the leaf index and sibling path
103
102
  */
104
103
  public utilityGetNoteHashMembershipWitness(
105
- blockHash: BlockHash,
106
- leafValue: Fr,
104
+ anchorBlockHash: BlockHash,
105
+ noteHash: Fr,
107
106
  ): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
108
- return this.aztecNode.getNoteHashMembershipWitness(blockHash, leafValue);
107
+ return this.aztecNode.getNoteHashMembershipWitness(anchorBlockHash, noteHash);
109
108
  }
110
109
 
111
110
  /**
112
- * Fetches the index and sibling path of a leaf at a given block from the archive tree.
113
- * @param blockHash - The block hash at which to get the membership witness.
114
- * @param leafValue - The leaf value
111
+ * Fetches the index and sibling path of a block hash in the archive tree.
112
+ *
113
+ * Block hashes are the leaves of the archive tree. Each time a new block is added to the chain,
114
+ * its block hash is appended as a new leaf to the archive tree.
115
+ *
116
+ * @param anchorBlockHash - The hash of a block that contains the archive tree root in which to find the membership
117
+ * witness.
118
+ * @param blockHash - The block hash to find in the archive tree.
115
119
  * @returns The membership witness containing the leaf index and sibling path
116
120
  */
117
- public utilityGetArchiveMembershipWitness(
121
+ public utilityGetBlockHashMembershipWitness(
122
+ anchorBlockHash: BlockHash,
118
123
  blockHash: BlockHash,
119
- leafValue: Fr,
120
124
  ): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
121
- return this.aztecNode.getArchiveMembershipWitness(blockHash, leafValue);
125
+ return this.aztecNode.getBlockHashMembershipWitness(anchorBlockHash, blockHash);
122
126
  }
123
127
 
124
128
  /**
@@ -166,7 +170,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
166
170
  * @returns Block extracted from a block with block number `blockNumber`.
167
171
  */
168
172
  public async utilityGetBlockHeader(blockNumber: BlockNumber): Promise<BlockHeader | undefined> {
169
- const anchorBlockNumber = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber();
173
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
170
174
  if (blockNumber > anchorBlockNumber) {
171
175
  throw new Error(`Block number ${blockNumber} is higher than current block ${anchorBlockNumber}`);
172
176
  }
@@ -262,7 +266,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
262
266
  offset: number,
263
267
  status: NoteStatus,
264
268
  ): Promise<NoteData[]> {
265
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
269
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
266
270
 
267
271
  const dbNotes = await noteService.getNotes(this.contractAddress, owner, storageSlot, status, this.scopes);
268
272
  return pickNotes<NoteData>(dbNotes, {
@@ -349,25 +353,17 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
349
353
  public async utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot: Fr) {
350
354
  const logService = new LogService(
351
355
  this.aztecNode,
352
- this.anchorBlockStore,
356
+ this.anchorBlockHeader,
353
357
  this.keyStore,
354
358
  this.capsuleStore,
355
359
  this.recipientTaggingStore,
356
360
  this.senderAddressBookStore,
357
361
  this.addressStore,
358
362
  this.jobId,
363
+ this.log.getBindings(),
359
364
  );
360
365
 
361
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
362
-
363
- // It is acceptable to run the following operations in parallel for several reasons:
364
- // 1. syncTaggedLogs does not write to the note store — it only stores the pending tagged logs in a capsule array,
365
- // which is then processed in Noir after this handler returns.
366
- // 2. Even if syncTaggedLogs did write to the note store, it would not cause inconsistent state.
367
- await Promise.all([
368
- logService.syncTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes),
369
- noteService.syncNoteNullifiers(this.contractAddress),
370
- ]);
366
+ await logService.fetchTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
371
367
  }
372
368
 
373
369
  /**
@@ -400,7 +396,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
400
396
  await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
401
397
  ).map(EventValidationRequest.fromFields);
402
398
 
403
- const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
399
+ const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
404
400
  const noteStorePromises = noteValidationRequests.map(request =>
405
401
  noteService.validateAndStoreNote(
406
402
  request.contractAddress,
@@ -416,7 +412,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
416
412
  ),
417
413
  );
418
414
 
419
- const eventService = new EventService(this.anchorBlockStore, this.aztecNode, this.privateEventStore, this.jobId);
415
+ const eventService = new EventService(this.anchorBlockHeader, this.aztecNode, this.privateEventStore, this.jobId);
420
416
  const eventStorePromises = eventValidationRequests.map(request =>
421
417
  eventService.validateAndStoreEvent(
422
418
  request.contractAddress,
@@ -454,13 +450,14 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
454
450
 
455
451
  const logService = new LogService(
456
452
  this.aztecNode,
457
- this.anchorBlockStore,
453
+ this.anchorBlockHeader,
458
454
  this.keyStore,
459
455
  this.capsuleStore,
460
456
  this.recipientTaggingStore,
461
457
  this.senderAddressBookStore,
462
458
  this.addressStore,
463
459
  this.jobId,
460
+ this.log.getBindings(),
464
461
  );
465
462
 
466
463
  const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
@@ -6,7 +6,9 @@ import { DelayedPublicMutableValues, DelayedPublicMutableValuesWithHash } from '
6
6
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
7
7
  import type { BlockHeader } from '@aztec/stdlib/tx';
8
8
 
9
+ import { NoteService } from '../notes/note_service.js';
9
10
  import type { ContractStore } from '../storage/contract_store/contract_store.js';
11
+ import type { NoteStore } from '../storage/note_store/note_store.js';
10
12
 
11
13
  /**
12
14
  * Read the current class id of a contract from the execution data provider or AztecNode. If not found, class id
@@ -41,6 +43,10 @@ export async function syncState(
41
43
  contractStore: ContractStore,
42
44
  functionToInvokeAfterSync: FunctionSelector | null,
43
45
  utilityExecutor: (privateSyncCall: FunctionCall) => Promise<any>,
46
+ noteStore: NoteStore,
47
+ aztecNode: AztecNode,
48
+ header: BlockHeader,
49
+ jobId: string,
44
50
  ) {
45
51
  // Protocol contracts don't have private state to sync
46
52
  if (!isProtocolContract(contractAddress)) {
@@ -51,7 +57,11 @@ export async function syncState(
51
57
  );
52
58
  }
53
59
 
54
- return utilityExecutor(syncStateFunctionCall);
60
+ const noteService = new NoteService(noteStore, aztecNode, header, jobId);
61
+
62
+ // Both sync_state and syncNoteNullifiers interact with the note store, but running them in parallel is safe
63
+ // because note store is designed to handle concurrent operations.
64
+ await Promise.all([utilityExecutor(syncStateFunctionCall), noteService.syncNoteNullifiers(contractAddress)]);
55
65
  }
56
66
  }
57
67
 
@@ -89,10 +99,21 @@ export async function ensureContractSynced(
89
99
  utilityExecutor: (call: FunctionCall) => Promise<any>,
90
100
  aztecNode: AztecNode,
91
101
  contractStore: ContractStore,
102
+ noteStore: NoteStore,
92
103
  header: BlockHeader,
104
+ jobId: string,
93
105
  ): Promise<void> {
94
106
  await Promise.all([
95
- syncState(contractAddress, contractStore, functionToInvokeAfterSync, utilityExecutor),
107
+ syncState(
108
+ contractAddress,
109
+ contractStore,
110
+ functionToInvokeAfterSync,
111
+ utilityExecutor,
112
+ noteStore,
113
+ aztecNode,
114
+ header,
115
+ jobId,
116
+ ),
96
117
  verifyCurrentClassId(contractAddress, aztecNode, contractStore, header),
97
118
  ]);
98
119
  }
@@ -1,8 +1,11 @@
1
1
  import { randomBytes } from '@aztec/foundation/crypto/random';
2
2
  import type { NoteDao, NotesFilter } from '@aztec/stdlib/note';
3
+ import type { BlockHeader } from '@aztec/stdlib/tx';
3
4
 
5
+ import type { BlockSynchronizer } from '../block_synchronizer/block_synchronizer.js';
4
6
  import type { PXE } from '../pxe.js';
5
7
  import type { ContractStore } from '../storage/contract_store/contract_store.js';
8
+ import type { AnchorBlockStore } from '../storage/index.js';
6
9
  import type { NoteStore } from '../storage/note_store/note_store.js';
7
10
 
8
11
  /**
@@ -10,18 +13,20 @@ import type { NoteStore } from '../storage/note_store/note_store.js';
10
13
  * No backwards compatibility or API stability should be expected. Use at your own risk.
11
14
  */
12
15
  export class PXEDebugUtils {
13
- #pxe: PXE | undefined = undefined;
16
+ #pxe!: PXE;
17
+ #putJobInQueue!: <T>(job: (jobId: string) => Promise<T>) => Promise<T>;
14
18
 
15
19
  constructor(
16
20
  private contractStore: ContractStore,
17
21
  private noteStore: NoteStore,
22
+ private blockStateSynchronizer: BlockSynchronizer,
23
+ private anchorBlockStore: AnchorBlockStore,
18
24
  ) {}
19
25
 
20
- /**
21
- * Not injected through constructor since they're are co-dependant.
22
- */
23
- public setPXE(pxe: PXE) {
26
+ /** Not injected through constructor since they're are co-dependant */
27
+ public setPXE(pxe: PXE, putJobInQueue: <T>(job: (jobId: string) => Promise<T>) => Promise<T>) {
24
28
  this.#pxe = pxe;
29
+ this.#putJobInQueue = putJobInQueue;
25
30
  }
26
31
 
27
32
  /**
@@ -36,14 +41,23 @@ export class PXEDebugUtils {
36
41
  * @returns The requested notes.
37
42
  */
38
43
  public async getNotes(filter: NotesFilter): Promise<NoteDao[]> {
39
- if (!this.#pxe) {
40
- throw new Error('Cannot getNotes because no PXE is set');
41
- }
42
-
43
44
  // We need to manually trigger private state sync to have a guarantee that all the notes are available.
44
45
  const call = await this.contractStore.getFunctionCall('sync_state', [], filter.contractAddress);
45
46
  await this.#pxe.simulateUtility(call);
46
47
 
47
48
  return this.noteStore.getNotes(filter, randomBytes(8).toString('hex'));
48
49
  }
50
+
51
+ /** Returns the block header up to which the PXE has synced. */
52
+ public getSyncedBlockHeader(): Promise<BlockHeader> {
53
+ return this.anchorBlockStore.getBlockHeader();
54
+ }
55
+
56
+ /**
57
+ * Triggers a sync of the PXE with the node.
58
+ * Blocks until the sync is complete.
59
+ */
60
+ public sync(): Promise<void> {
61
+ return this.#putJobInQueue(() => this.blockStateSynchronizer.sync());
62
+ }
49
63
  }
@@ -1,6 +1,5 @@
1
1
  import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
2
2
  import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
3
- import { randomBytes } from '@aztec/foundation/crypto/random';
4
3
  import { createLogger } from '@aztec/foundation/log';
5
4
  import { createStore } from '@aztec/kv-store/indexeddb';
6
5
  import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
@@ -9,6 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
9
8
 
10
9
  import type { PXEConfig } from '../../../config/index.js';
11
10
  import { PXE } from '../../../pxe.js';
11
+ import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
12
12
  import type { PXECreationOptions } from '../../pxe_creation_options.js';
13
13
 
14
14
  /**
@@ -26,13 +26,7 @@ export async function createPXE(
26
26
  config: PXEConfig,
27
27
  options: PXECreationOptions = { loggers: {} },
28
28
  ) {
29
- const logSuffix =
30
- typeof options.useLogSuffix === 'boolean'
31
- ? options.useLogSuffix
32
- ? randomBytes(3).toString('hex')
33
- : undefined
34
- : options.useLogSuffix;
35
-
29
+ const actor = options.loggerActorLabel;
36
30
  const loggers = options.loggers ?? {};
37
31
 
38
32
  const l1Contracts = await aztecNode.getL1ContractAddresses();
@@ -41,14 +35,13 @@ export async function createPXE(
41
35
  l1Contracts,
42
36
  } as PXEConfig;
43
37
 
44
- const storeLogger = loggers.store ? loggers.store : createLogger('pxe:data:idb' + (logSuffix ? `:${logSuffix}` : ''));
38
+ const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
45
39
 
46
- const store = options.store ?? (await createStore('pxe_data', configWithContracts, storeLogger));
40
+ const store =
41
+ options.store ?? (await createStore('pxe_data', configWithContracts, PXE_DATA_SCHEMA_VERSION, storeLogger));
47
42
 
48
43
  const simulator = options.simulator ?? new WASMSimulator();
49
- const proverLogger = loggers.prover
50
- ? loggers.prover
51
- : createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
44
+ const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
52
45
 
53
46
  let prover;
54
47
  if (options.proverOrOptions instanceof BBPrivateKernelProver) {
@@ -58,7 +51,7 @@ export async function createPXE(
58
51
  }
59
52
  const protocolContractsProvider = new BundledProtocolContractsProvider();
60
53
 
61
- const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
54
+ const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
62
55
  const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
63
56
  return pxe;
64
57
  }
@@ -1,6 +1,5 @@
1
1
  import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
2
2
  import { BBLazyPrivateKernelProver } from '@aztec/bb-prover/client/lazy';
3
- import { randomBytes } from '@aztec/foundation/crypto/random';
4
3
  import { createLogger } from '@aztec/foundation/log';
5
4
  import { createStore } from '@aztec/kv-store/indexeddb';
6
5
  import { LazyProtocolContractsProvider } from '@aztec/protocol-contracts/providers/lazy';
@@ -9,6 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
9
8
 
10
9
  import type { PXEConfig } from '../../../config/index.js';
11
10
  import { PXE } from '../../../pxe.js';
11
+ import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
12
12
  import type { PXECreationOptions } from '../../pxe_creation_options.js';
13
13
 
14
14
  /**
@@ -17,7 +17,7 @@ import type { PXECreationOptions } from '../../pxe_creation_options.js';
17
17
  *
18
18
  * @param aztecNode - The AztecNode instance to be used by the server.
19
19
  * @param config - The PXE Config to use
20
- * @param
20
+ * @param options - (Optional) Optional information for creating an PXE.
21
21
  * @returns A Promise that resolves to the started PXE instance.
22
22
  */
23
23
  export async function createPXE(
@@ -25,12 +25,7 @@ export async function createPXE(
25
25
  config: PXEConfig,
26
26
  options: PXECreationOptions = { loggers: {} },
27
27
  ) {
28
- const logSuffix =
29
- typeof options.useLogSuffix === 'boolean'
30
- ? options.useLogSuffix
31
- ? randomBytes(3).toString('hex')
32
- : undefined
33
- : options.useLogSuffix;
28
+ const actor = options.loggerActorLabel;
34
29
 
35
30
  const l1Contracts = await aztecNode.getL1ContractAddresses();
36
31
  const configWithContracts = {
@@ -40,14 +35,13 @@ export async function createPXE(
40
35
 
41
36
  const loggers = options.loggers ?? {};
42
37
 
43
- const storeLogger = loggers.store ? loggers.store : createLogger('pxe:data:idb' + (logSuffix ? `:${logSuffix}` : ''));
38
+ const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
44
39
 
45
- const store = options.store ?? (await createStore('pxe_data', configWithContracts, storeLogger));
40
+ const store =
41
+ options.store ?? (await createStore('pxe_data', configWithContracts, PXE_DATA_SCHEMA_VERSION, storeLogger));
46
42
 
47
43
  const simulator = options.simulator ?? new WASMSimulator();
48
- const proverLogger = loggers.prover
49
- ? loggers.prover
50
- : createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
44
+ const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
51
45
 
52
46
  let prover;
53
47
  if (options.proverOrOptions instanceof BBPrivateKernelProver) {
@@ -57,7 +51,7 @@ export async function createPXE(
57
51
  }
58
52
  const protocolContractsProvider = new LazyProtocolContractsProvider();
59
53
 
60
- const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
54
+ const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
61
55
  const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
62
56
  return pxe;
63
57
  }
@@ -6,7 +6,8 @@ import type { PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
6
6
 
7
7
  export type PXECreationOptions = {
8
8
  loggers?: { store?: Logger; pxe?: Logger; prover?: Logger };
9
- useLogSuffix?: boolean | string;
9
+ /** Actor label to include in log output (e.g., 'pxe-0', 'pxe-test'). */
10
+ loggerActorLabel?: string;
10
11
  proverOrOptions?: PrivateKernelProver | BBPrivateKernelProverOptions;
11
12
  store?: AztecAsyncKVStore;
12
13
  simulator?: CircuitSimulator;
@@ -1,6 +1,5 @@
1
1
  import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
2
2
  import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
3
- import { randomBytes } from '@aztec/foundation/crypto/random';
4
3
  import { createLogger } from '@aztec/foundation/log';
5
4
  import { createStore } from '@aztec/kv-store/lmdb-v2';
6
5
  import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
@@ -20,17 +19,13 @@ export async function createPXE(
20
19
  config: PXEConfigWithoutDefaults,
21
20
  options: PXECreationOptions = { loggers: {} },
22
21
  ) {
22
+ const actor = options.loggerActorLabel;
23
+ const recorderLogger = createLogger('simulator:acvm:recording', { actor });
23
24
  const recorder = process.env.CIRCUIT_RECORD_DIR
24
- ? new FileCircuitRecorder(process.env.CIRCUIT_RECORD_DIR)
25
- : new MemoryCircuitRecorder();
26
- const simulator = new SimulatorRecorderWrapper(new WASMSimulator(), recorder);
27
-
28
- const logSuffix =
29
- typeof options.useLogSuffix === 'boolean'
30
- ? options.useLogSuffix
31
- ? randomBytes(3).toString('hex')
32
- : undefined
33
- : options.useLogSuffix;
25
+ ? new FileCircuitRecorder(process.env.CIRCUIT_RECORD_DIR, recorderLogger)
26
+ : new MemoryCircuitRecorder(recorderLogger);
27
+ const simulatorLogger = createLogger('wasm-simulator', { actor });
28
+ const simulator = new SimulatorRecorderWrapper(new WASMSimulator(simulatorLogger), recorder);
34
29
  const loggers = options.loggers ?? {};
35
30
 
36
31
  const { l1ChainId, l1ContractAddresses: l1Contracts, rollupVersion } = await aztecNode.getNodeInfo();
@@ -43,14 +38,15 @@ export async function createPXE(
43
38
  };
44
39
 
45
40
  if (!options.store) {
46
- const storeLogger = loggers.store
47
- ? loggers.store
48
- : createLogger('pxe:data:lmdb' + (logSuffix ? `:${logSuffix}` : ''));
49
- options.store = await createStore('pxe_data', PXE_DATA_SCHEMA_VERSION, configWithContracts, storeLogger);
41
+ const storeLogger = loggers.store ?? createLogger('pxe:data:lmdb', { actor });
42
+ options.store = await createStore(
43
+ 'pxe_data',
44
+ PXE_DATA_SCHEMA_VERSION,
45
+ configWithContracts,
46
+ storeLogger.getBindings(),
47
+ );
50
48
  }
51
- const proverLogger = loggers.prover
52
- ? loggers.prover
53
- : createLogger('pxe:bb:native' + (logSuffix ? `:${logSuffix}` : ''));
49
+ const proverLogger = loggers.prover ?? createLogger('pxe:bb:native', { actor });
54
50
 
55
51
  let prover;
56
52
  if (options.proverOrOptions instanceof BBPrivateKernelProver) {
@@ -61,7 +57,7 @@ export async function createPXE(
61
57
 
62
58
  const protocolContractsProvider = new BundledProtocolContractsProvider();
63
59
 
64
- const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
60
+ const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
65
61
  const pxe = await PXE.create(
66
62
  aztecNode,
67
63
  options.store,
@@ -3,14 +3,13 @@ import type { EventSelector } from '@aztec/stdlib/abi';
3
3
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
4
  import { siloNullifier } from '@aztec/stdlib/hash';
5
5
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
6
- import type { TxHash } from '@aztec/stdlib/tx';
6
+ import type { BlockHeader, TxHash } from '@aztec/stdlib/tx';
7
7
 
8
- import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
9
8
  import { PrivateEventStore } from '../storage/private_event_store/private_event_store.js';
10
9
 
11
10
  export class EventService {
12
11
  constructor(
13
- private readonly anchorBlockStore: AnchorBlockStore,
12
+ private readonly anchorBlockHeader: BlockHeader,
14
13
  private readonly aztecNode: AztecNode,
15
14
  private readonly privateEventStore: PrivateEventStore,
16
15
  private readonly jobId: string,
@@ -29,13 +28,12 @@ export class EventService {
29
28
  // (and thus we're less concerned about being ahead of the synced block), we use the synced block number to
30
29
  // maintain consistent behavior in the PXE. Additionally, events should never be ahead of the synced block here
31
30
  // since `fetchTaggedLogs` only processes logs up to the synced block.
32
- const [anchorBlockHeader, siloedEventCommitment, txEffect] = await Promise.all([
33
- this.anchorBlockStore.getBlockHeader(),
31
+ const [siloedEventCommitment, txEffect] = await Promise.all([
34
32
  siloNullifier(contractAddress, eventCommitment),
35
33
  this.aztecNode.getTxEffect(txHash),
36
34
  ]);
37
35
 
38
- const anchorBlockNumber = anchorBlockHeader.getBlockNumber();
36
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
39
37
 
40
38
  if (!txEffect) {
41
39
  throw new Error(`Could not find tx effect for tx hash ${txHash}`);
@@ -1,5 +1,5 @@
1
1
  import { randomBytes } from '@aztec/foundation/crypto/random';
2
- import { createLogger } from '@aztec/foundation/log';
2
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
3
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
4
4
 
5
5
  /**
@@ -40,7 +40,7 @@ export interface StagedStore {
40
40
  * using a job queue with concurrency=1.
41
41
  */
42
42
  export class JobCoordinator {
43
- private readonly log = createLogger('pxe:job_coordinator');
43
+ private readonly log: Logger;
44
44
 
45
45
  /** The underlying KV store */
46
46
  kvStore: AztecAsyncKVStore;
@@ -48,8 +48,9 @@ export class JobCoordinator {
48
48
  #currentJobId: string | undefined;
49
49
  #stores: Map<string, StagedStore> = new Map();
50
50
 
51
- constructor(kvStore: AztecAsyncKVStore) {
51
+ constructor(kvStore: AztecAsyncKVStore, bindings?: LoggerBindings) {
52
52
  this.kvStore = kvStore;
53
+ this.log = createLogger('pxe:job_coordinator', bindings);
53
54
  }
54
55
 
55
56
  /**
@@ -1,15 +1,15 @@
1
1
  import type { Fr } from '@aztec/foundation/curves/bn254';
2
- import { createLogger } from '@aztec/foundation/log';
2
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
3
3
  import type { KeyStore } from '@aztec/key-store';
4
4
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
5
5
  import type { CompleteAddress } from '@aztec/stdlib/contract';
6
6
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
7
7
  import { DirectionalAppTaggingSecret, PendingTaggedLog, SiloedTag, Tag, TxScopedL2Log } from '@aztec/stdlib/logs';
8
+ import type { BlockHeader } from '@aztec/stdlib/tx';
8
9
 
9
10
  import type { LogRetrievalRequest } from '../contract_function_simulator/noir-structs/log_retrieval_request.js';
10
11
  import { LogRetrievalResponse } from '../contract_function_simulator/noir-structs/log_retrieval_response.js';
11
12
  import { AddressStore } from '../storage/address_store/address_store.js';
12
- import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
13
13
  import { CapsuleStore } from '../storage/capsule_store/capsule_store.js';
14
14
  import type { RecipientTaggingStore } from '../storage/tagging_store/recipient_tagging_store.js';
15
15
  import type { SenderAddressBookStore } from '../storage/tagging_store/sender_address_book_store.js';
@@ -20,18 +20,21 @@ import {
20
20
  } from '../tagging/index.js';
21
21
 
22
22
  export class LogService {
23
- private log = createLogger('log_service');
23
+ private log: Logger;
24
24
 
25
25
  constructor(
26
26
  private readonly aztecNode: AztecNode,
27
- private readonly anchorBlockStore: AnchorBlockStore,
27
+ private readonly anchorBlockHeader: BlockHeader,
28
28
  private readonly keyStore: KeyStore,
29
29
  private readonly capsuleStore: CapsuleStore,
30
30
  private readonly recipientTaggingStore: RecipientTaggingStore,
31
31
  private readonly senderAddressBookStore: SenderAddressBookStore,
32
32
  private readonly addressStore: AddressStore,
33
33
  private readonly jobId: string,
34
- ) {}
34
+ bindings?: LoggerBindings,
35
+ ) {
36
+ this.log = createLogger('pxe:log_service', bindings);
37
+ }
35
38
 
36
39
  public async bulkRetrieveLogs(logRetrievalRequests: LogRetrievalRequest[]): Promise<(LogRetrievalResponse | null)[]> {
37
40
  return await Promise.all(
@@ -53,8 +56,7 @@ export class LogService {
53
56
  }
54
57
 
55
58
  async #getPublicLogByTag(tag: Tag, contractAddress: AztecAddress): Promise<LogRetrievalResponse | null> {
56
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
57
- const anchorBlockHash = await anchorBlockHeader.hash();
59
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
58
60
  const allLogsPerTag = await getAllPublicLogsByTagsFromContract(
59
61
  this.aztecNode,
60
62
  contractAddress,
@@ -83,8 +85,7 @@ export class LogService {
83
85
  }
84
86
 
85
87
  async #getPrivateLogByTag(siloedTag: SiloedTag): Promise<LogRetrievalResponse | null> {
86
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
87
- const anchorBlockHash = await anchorBlockHeader.hash();
88
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
88
89
  const allLogsPerTag = await getAllPrivateLogsByTags(this.aztecNode, [siloedTag], anchorBlockHash);
89
90
  const logsForTag = allLogsPerTag[0];
90
91
 
@@ -107,17 +108,16 @@ export class LogService {
107
108
  );
108
109
  }
109
110
 
110
- public async syncTaggedLogs(
111
+ public async fetchTaggedLogs(
111
112
  contractAddress: AztecAddress,
112
113
  pendingTaggedLogArrayBaseSlot: Fr,
113
114
  scopes?: AztecAddress[],
114
115
  ) {
115
- this.log.verbose('Searching for tagged logs', { contract: contractAddress });
116
+ this.log.verbose(`Fetching tagged logs for ${contractAddress.toString()}`);
116
117
 
117
118
  // We only load logs from block up to and including the anchor block number
118
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
119
- const anchorBlockNumber = anchorBlockHeader.getBlockNumber();
120
- const anchorBlockHash = await anchorBlockHeader.hash();
119
+ const anchorBlockNumber = this.anchorBlockHeader.getBlockNumber();
120
+ const anchorBlockHash = await this.anchorBlockHeader.hash();
121
121
 
122
122
  // Determine recipients: use scopes if provided, otherwise get all accounts
123
123
  const recipients = scopes && scopes.length > 0 ? scopes : await this.keyStore.getAccounts();