@aztec/pxe 0.0.1-commit.2ed92850 → 0.0.1-commit.54489865

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 (83) 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 +5 -5
  4. package/dest/contract_function_simulator/contract_function_simulator.d.ts +1 -1
  5. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  6. package/dest/contract_function_simulator/contract_function_simulator.js +4 -4
  7. package/dest/contract_function_simulator/oracle/interfaces.d.ts +8 -8
  8. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  9. package/dest/contract_function_simulator/oracle/oracle.js +7 -7
  10. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +8 -8
  11. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  12. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +2 -2
  13. package/dest/debug/pxe_debug_utils.d.ts +16 -6
  14. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  15. package/dest/debug/pxe_debug_utils.js +17 -8
  16. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  17. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  18. package/dest/entrypoints/client/bundle/utils.js +10 -5
  19. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  20. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  21. package/dest/entrypoints/client/lazy/utils.js +11 -6
  22. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  23. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  24. package/dest/entrypoints/server/utils.d.ts +1 -1
  25. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  26. package/dest/entrypoints/server/utils.js +19 -8
  27. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  28. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  29. package/dest/job_coordinator/job_coordinator.js +3 -2
  30. package/dest/logs/log_service.d.ts +3 -2
  31. package/dest/logs/log_service.d.ts.map +1 -1
  32. package/dest/logs/log_service.js +2 -2
  33. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  34. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  35. package/dest/private_kernel/private_kernel_execution_prover.js +2 -2
  36. package/dest/private_kernel/private_kernel_oracle.d.ts +3 -3
  37. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  38. package/dest/pxe.d.ts +1 -1
  39. package/dest/pxe.d.ts.map +1 -1
  40. package/dest/pxe.js +7 -5
  41. package/dest/storage/note_store/note_store.d.ts +1 -1
  42. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  43. package/dest/storage/note_store/note_store.js +29 -31
  44. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  45. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  46. package/dest/storage/private_event_store/private_event_store.js +45 -47
  47. package/dest/storage/private_event_store/stored_private_event.d.ts +4 -4
  48. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -1
  49. package/dest/storage/private_event_store/stored_private_event.js +2 -2
  50. package/dest/tagging/get_all_logs_by_tags.d.ts +4 -4
  51. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  52. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -3
  53. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  54. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -3
  55. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  56. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -3
  57. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  58. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +3 -3
  59. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  60. package/package.json +16 -16
  61. package/src/block_synchronizer/block_synchronizer.ts +17 -19
  62. package/src/contract_function_simulator/contract_function_simulator.ts +6 -2
  63. package/src/contract_function_simulator/oracle/interfaces.ts +7 -7
  64. package/src/contract_function_simulator/oracle/oracle.ts +7 -7
  65. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +9 -7
  66. package/src/debug/pxe_debug_utils.ts +23 -9
  67. package/src/entrypoints/client/bundle/utils.ts +4 -13
  68. package/src/entrypoints/client/lazy/utils.ts +5 -13
  69. package/src/entrypoints/pxe_creation_options.ts +2 -1
  70. package/src/entrypoints/server/utils.ts +15 -19
  71. package/src/job_coordinator/job_coordinator.ts +4 -3
  72. package/src/logs/log_service.ts +6 -3
  73. package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
  74. package/src/private_kernel/private_kernel_oracle.ts +2 -2
  75. package/src/pxe.ts +15 -6
  76. package/src/storage/note_store/note_store.ts +28 -33
  77. package/src/storage/private_event_store/private_event_store.ts +57 -59
  78. package/src/storage/private_event_store/stored_private_event.ts +3 -3
  79. package/src/tagging/get_all_logs_by_tags.ts +3 -3
  80. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +2 -2
  81. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +2 -2
  82. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +2 -2
  83. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +3 -3
@@ -8,7 +8,7 @@ import type { MembershipWitness } from '@aztec/foundation/trees';
8
8
  import type { KeyStore } from '@aztec/key-store';
9
9
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
10
10
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
11
- import { L2BlockHash } from '@aztec/stdlib/block';
11
+ import { BlockHash } from '@aztec/stdlib/block';
12
12
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
13
13
  import { siloNullifier } from '@aztec/stdlib/hash';
14
14
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
@@ -102,7 +102,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
102
102
  * @returns The membership witness containing the leaf index and sibling path
103
103
  */
104
104
  public utilityGetNoteHashMembershipWitness(
105
- blockHash: L2BlockHash,
105
+ blockHash: BlockHash,
106
106
  leafValue: Fr,
107
107
  ): Promise<MembershipWitness<typeof NOTE_HASH_TREE_HEIGHT> | undefined> {
108
108
  return this.aztecNode.getNoteHashMembershipWitness(blockHash, leafValue);
@@ -115,7 +115,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
115
115
  * @returns The membership witness containing the leaf index and sibling path
116
116
  */
117
117
  public utilityGetArchiveMembershipWitness(
118
- blockHash: L2BlockHash,
118
+ blockHash: BlockHash,
119
119
  leafValue: Fr,
120
120
  ): Promise<MembershipWitness<typeof ARCHIVE_HEIGHT> | undefined> {
121
121
  return this.aztecNode.getArchiveMembershipWitness(blockHash, leafValue);
@@ -128,7 +128,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
128
128
  * @returns The nullifier membership witness (if found).
129
129
  */
130
130
  public utilityGetNullifierMembershipWitness(
131
- blockHash: L2BlockHash,
131
+ blockHash: BlockHash,
132
132
  nullifier: Fr,
133
133
  ): Promise<NullifierMembershipWitness | undefined> {
134
134
  return this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
@@ -144,7 +144,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
144
144
  * we are trying to prove non-inclusion for.
145
145
  */
146
146
  public utilityGetLowNullifierMembershipWitness(
147
- blockHash: L2BlockHash,
147
+ blockHash: BlockHash,
148
148
  nullifier: Fr,
149
149
  ): Promise<NullifierMembershipWitness | undefined> {
150
150
  return this.aztecNode.getLowNullifierMembershipWitness(blockHash, nullifier);
@@ -156,7 +156,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
156
156
  * @param leafSlot - The slot of the public data tree to get the witness for.
157
157
  * @returns - The witness
158
158
  */
159
- public utilityGetPublicDataWitness(blockHash: L2BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
159
+ public utilityGetPublicDataWitness(blockHash: BlockHash, leafSlot: Fr): Promise<PublicDataWitness | undefined> {
160
160
  return this.aztecNode.getPublicDataWitness(blockHash, leafSlot);
161
161
  }
162
162
 
@@ -318,7 +318,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
318
318
  * @param numberOfElements - Number of elements to read from the starting storage slot.
319
319
  */
320
320
  public async utilityStorageRead(
321
- blockHash: L2BlockHash,
321
+ blockHash: BlockHash,
322
322
  contractAddress: AztecAddress,
323
323
  startStorageSlot: Fr,
324
324
  numberOfElements: number,
@@ -356,6 +356,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
356
356
  this.senderAddressBookStore,
357
357
  this.addressStore,
358
358
  this.jobId,
359
+ this.log.getBindings(),
359
360
  );
360
361
 
361
362
  const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore, this.jobId);
@@ -461,6 +462,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
461
462
  this.senderAddressBookStore,
462
463
  this.addressStore,
463
464
  this.jobId,
465
+ this.log.getBindings(),
464
466
  );
465
467
 
466
468
  const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
@@ -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';
@@ -26,13 +25,7 @@ export async function createPXE(
26
25
  config: PXEConfig,
27
26
  options: PXECreationOptions = { loggers: {} },
28
27
  ) {
29
- const logSuffix =
30
- typeof options.useLogSuffix === 'boolean'
31
- ? options.useLogSuffix
32
- ? randomBytes(3).toString('hex')
33
- : undefined
34
- : options.useLogSuffix;
35
-
28
+ const actor = options.loggerActorLabel;
36
29
  const loggers = options.loggers ?? {};
37
30
 
38
31
  const l1Contracts = await aztecNode.getL1ContractAddresses();
@@ -41,14 +34,12 @@ export async function createPXE(
41
34
  l1Contracts,
42
35
  } as PXEConfig;
43
36
 
44
- const storeLogger = loggers.store ? loggers.store : createLogger('pxe:data:idb' + (logSuffix ? `:${logSuffix}` : ''));
37
+ const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
45
38
 
46
39
  const store = options.store ?? (await createStore('pxe_data', configWithContracts, storeLogger));
47
40
 
48
41
  const simulator = options.simulator ?? new WASMSimulator();
49
- const proverLogger = loggers.prover
50
- ? loggers.prover
51
- : createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
42
+ const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
52
43
 
53
44
  let prover;
54
45
  if (options.proverOrOptions instanceof BBPrivateKernelProver) {
@@ -58,7 +49,7 @@ export async function createPXE(
58
49
  }
59
50
  const protocolContractsProvider = new BundledProtocolContractsProvider();
60
51
 
61
- const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
52
+ const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
62
53
  const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
63
54
  return pxe;
64
55
  }
@@ -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';
@@ -17,7 +16,7 @@ import type { PXECreationOptions } from '../../pxe_creation_options.js';
17
16
  *
18
17
  * @param aztecNode - The AztecNode instance to be used by the server.
19
18
  * @param config - The PXE Config to use
20
- * @param
19
+ * @param options - (Optional) Optional information for creating an PXE.
21
20
  * @returns A Promise that resolves to the started PXE instance.
22
21
  */
23
22
  export async function createPXE(
@@ -25,12 +24,7 @@ export async function createPXE(
25
24
  config: PXEConfig,
26
25
  options: PXECreationOptions = { loggers: {} },
27
26
  ) {
28
- const logSuffix =
29
- typeof options.useLogSuffix === 'boolean'
30
- ? options.useLogSuffix
31
- ? randomBytes(3).toString('hex')
32
- : undefined
33
- : options.useLogSuffix;
27
+ const actor = options.loggerActorLabel;
34
28
 
35
29
  const l1Contracts = await aztecNode.getL1ContractAddresses();
36
30
  const configWithContracts = {
@@ -40,14 +34,12 @@ export async function createPXE(
40
34
 
41
35
  const loggers = options.loggers ?? {};
42
36
 
43
- const storeLogger = loggers.store ? loggers.store : createLogger('pxe:data:idb' + (logSuffix ? `:${logSuffix}` : ''));
37
+ const storeLogger = loggers.store ?? createLogger('pxe:data:idb', { actor });
44
38
 
45
39
  const store = options.store ?? (await createStore('pxe_data', configWithContracts, storeLogger));
46
40
 
47
41
  const simulator = options.simulator ?? new WASMSimulator();
48
- const proverLogger = loggers.prover
49
- ? loggers.prover
50
- : createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
42
+ const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
51
43
 
52
44
  let prover;
53
45
  if (options.proverOrOptions instanceof BBPrivateKernelProver) {
@@ -57,7 +49,7 @@ export async function createPXE(
57
49
  }
58
50
  const protocolContractsProvider = new LazyProtocolContractsProvider();
59
51
 
60
- const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
52
+ const pxeLogger = loggers.pxe ?? createLogger('pxe:service', { actor });
61
53
  const pxe = await PXE.create(aztecNode, store, prover, simulator, protocolContractsProvider, config, pxeLogger);
62
54
  return pxe;
63
55
  }
@@ -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,
@@ -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,5 +1,5 @@
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';
@@ -20,7 +20,7 @@ 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,
@@ -31,7 +31,10 @@ export class LogService {
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(
@@ -1,6 +1,6 @@
1
1
  import { vkAsFieldsMegaHonk } from '@aztec/foundation/crypto/keys';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
- import { createLogger } from '@aztec/foundation/log';
3
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
4
4
  import { pushTestData } from '@aztec/foundation/testing';
5
5
  import { Timer } from '@aztec/foundation/timer';
6
6
  import { getVKTreeRoot } from '@aztec/noir-protocol-circuits-types/vk-tree';
@@ -56,13 +56,16 @@ export interface PrivateKernelExecutionProverConfig {
56
56
  * inform state tree updates.
57
57
  */
58
58
  export class PrivateKernelExecutionProver {
59
- private log = createLogger('pxe:private-kernel-execution-prover');
59
+ private log: Logger;
60
60
 
61
61
  constructor(
62
62
  private oracle: PrivateKernelOracle,
63
63
  private proofCreator: PrivateKernelProver,
64
64
  private fakeProofs = false,
65
- ) {}
65
+ bindings?: LoggerBindings,
66
+ ) {
67
+ this.log = createLogger('pxe:private-kernel-execution-prover', bindings);
68
+ }
66
69
 
67
70
  /**
68
71
  * Generate a proof for a given transaction request and execution result.
@@ -7,7 +7,7 @@ import { getVKIndex, getVKSiblingPath } from '@aztec/noir-protocol-circuits-type
7
7
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
8
8
  import type { FunctionSelector } from '@aztec/stdlib/abi';
9
9
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
10
- import { L2BlockHash } from '@aztec/stdlib/block';
10
+ import { BlockHash } from '@aztec/stdlib/block';
11
11
  import {
12
12
  type ContractInstanceWithAddress,
13
13
  computeContractClassIdPreimage,
@@ -30,7 +30,7 @@ export class PrivateKernelOracle {
30
30
  private contractStore: ContractStore,
31
31
  private keyStore: KeyStore,
32
32
  private node: AztecNode,
33
- private blockHash: L2BlockHash,
33
+ private blockHash: BlockHash,
34
34
  ) {}
35
35
 
36
36
  /** Retrieves the preimage of a contract address from the registered contract instances db. */
package/src/pxe.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
5
5
  import { SerialQueue } from '@aztec/foundation/queue';
6
6
  import { Timer } from '@aztec/foundation/timer';
7
7
  import { KeyStore } from '@aztec/key-store';
@@ -128,6 +128,10 @@ export class PXE {
128
128
  config: PXEConfig,
129
129
  loggerOrSuffix?: string | Logger,
130
130
  ) {
131
+ // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
132
+ const bindings: LoggerBindings | undefined =
133
+ loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
134
+
131
135
  const log =
132
136
  !loggerOrSuffix || typeof loggerOrSuffix === 'string'
133
137
  ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
@@ -153,10 +157,10 @@ export class PXE {
153
157
  privateEventStore,
154
158
  tipsStore,
155
159
  config,
156
- loggerOrSuffix,
160
+ bindings,
157
161
  );
158
162
 
159
- const jobCoordinator = new JobCoordinator(store);
163
+ const jobCoordinator = new JobCoordinator(store, bindings);
160
164
  jobCoordinator.registerStores([
161
165
  capsuleStore,
162
166
  senderTaggingStore,
@@ -165,7 +169,7 @@ export class PXE {
165
169
  noteStore,
166
170
  ]);
167
171
 
168
- const debugUtils = new PXEDebugUtils(contractStore, noteStore);
172
+ const debugUtils = new PXEDebugUtils(contractStore, noteStore, synchronizer, anchorBlockStore);
169
173
 
170
174
  const jobQueue = new SerialQueue();
171
175
 
@@ -192,7 +196,7 @@ export class PXE {
192
196
  debugUtils,
193
197
  );
194
198
 
195
- debugUtils.setPXE(pxe);
199
+ debugUtils.setPXE(pxe, pxe.#putInJobQueue.bind(pxe));
196
200
 
197
201
  pxe.jobQueue.start();
198
202
 
@@ -400,7 +404,12 @@ export class PXE {
400
404
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
401
405
  const anchorBlockHash = await anchorBlockHeader.hash();
402
406
  const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
403
- const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
407
+ const kernelTraceProver = new PrivateKernelExecutionProver(
408
+ kernelOracle,
409
+ proofCreator,
410
+ !this.proverEnabled,
411
+ this.log.getBindings(),
412
+ );
404
413
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
405
414
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
406
415
  }
@@ -18,8 +18,6 @@ import { StoredNote } from './stored_note.js';
18
18
  export class NoteStore implements StagedStore {
19
19
  readonly storeName: string = 'note';
20
20
 
21
- #store: AztecAsyncKVStore;
22
-
23
21
  // Note that we use the siloedNullifier as the note id in the store as it's guaranteed to be unique.
24
22
 
25
23
  // Main storage for notes. Avoid performing full scans on it as it contains all notes PXE knows, use
@@ -48,7 +46,6 @@ export class NoteStore implements StagedStore {
48
46
  #jobLocks: Map<string, Semaphore>;
49
47
 
50
48
  constructor(store: AztecAsyncKVStore) {
51
- this.#store = store;
52
49
  this.#notes = store.openMap('notes');
53
50
  this.#nullifiersByContractAddress = store.openMultiMap('note_nullifiers_by_contract');
54
51
  this.#nullifiersByNullificationBlockNumber = store.openMultiMap('note_block_number_to_nullifier');
@@ -182,43 +179,41 @@ export class NoteStore implements StagedStore {
182
179
  * @throws Error if any nullifier is not found in this notes store
183
180
  */
184
181
  applyNullifiers(nullifiers: DataInBlock<Fr>[], jobId: string): Promise<NoteDao[]> {
185
- return this.#withJobLock(jobId, () =>
186
- this.#store.transactionAsync(async () => {
187
- if (nullifiers.length === 0) {
188
- return [];
189
- }
190
-
191
- const notesToNullify = await Promise.all(
192
- nullifiers.map(async nullifierInBlock => {
193
- const nullifier = nullifierInBlock.data.toString();
182
+ return this.#withJobLock(jobId, async () => {
183
+ if (nullifiers.length === 0) {
184
+ return [];
185
+ }
194
186
 
195
- const storedNote = await this.#readNote(nullifier, jobId);
196
- if (!storedNote) {
197
- throw new Error(`Attempted to mark a note as nullified which does not exist in PXE DB`);
198
- }
187
+ const notesToNullify = await Promise.all(
188
+ nullifiers.map(async nullifierInBlock => {
189
+ const nullifier = nullifierInBlock.data.toString();
199
190
 
200
- return { storedNote: await this.#readNote(nullifier, jobId), blockNumber: nullifierInBlock.l2BlockNumber };
201
- }),
202
- );
191
+ const storedNote = await this.#readNote(nullifier, jobId);
192
+ if (!storedNote) {
193
+ throw new Error(`Attempted to mark a note as nullified which does not exist in PXE DB`);
194
+ }
203
195
 
204
- const notesNullifiedInThisCall: Map<string, NoteDao> = new Map();
205
- for (const noteToNullify of notesToNullify) {
206
- // Safe to coerce (!) because we throw if we find any undefined above
207
- const note = noteToNullify.storedNote!;
196
+ return { storedNote: await this.#readNote(nullifier, jobId), blockNumber: nullifierInBlock.l2BlockNumber };
197
+ }),
198
+ );
208
199
 
209
- // Skip already nullified notes
210
- if (note.isNullified()) {
211
- continue;
212
- }
200
+ const notesNullifiedInThisCall: Map<string, NoteDao> = new Map();
201
+ for (const noteToNullify of notesToNullify) {
202
+ // Safe to coerce (!) because we throw if we find any undefined above
203
+ const note = noteToNullify.storedNote!;
213
204
 
214
- note.markAsNullified(noteToNullify.blockNumber);
215
- this.#writeNote(note, jobId);
216
- notesNullifiedInThisCall.set(note.noteDao.siloedNullifier.toString(), note.noteDao);
205
+ // Skip already nullified notes
206
+ if (note.isNullified()) {
207
+ continue;
217
208
  }
218
209
 
219
- return [...notesNullifiedInThisCall.values()];
220
- }),
221
- );
210
+ note.markAsNullified(noteToNullify.blockNumber);
211
+ this.#writeNote(note, jobId);
212
+ notesNullifiedInThisCall.set(note.noteDao.siloedNullifier.toString(), note.noteDao);
213
+ }
214
+
215
+ return [...notesNullifiedInThisCall.values()];
216
+ });
222
217
  }
223
218
 
224
219
  /**