@aztec/pxe 0.0.1-commit.bf2612ae → 0.0.1-commit.c2595eba

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 (58) 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 +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/utility_execution_oracle.d.ts +1 -1
  8. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  9. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +2 -2
  10. package/dest/debug/pxe_debug_utils.d.ts +16 -6
  11. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  12. package/dest/debug/pxe_debug_utils.js +17 -8
  13. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  14. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  15. package/dest/entrypoints/client/bundle/utils.js +10 -5
  16. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  17. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  18. package/dest/entrypoints/client/lazy/utils.js +11 -6
  19. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  20. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  21. package/dest/entrypoints/server/utils.d.ts +1 -1
  22. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  23. package/dest/entrypoints/server/utils.js +19 -8
  24. package/dest/job_coordinator/job_coordinator.d.ts +3 -2
  25. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -1
  26. package/dest/job_coordinator/job_coordinator.js +3 -2
  27. package/dest/logs/log_service.d.ts +3 -2
  28. package/dest/logs/log_service.d.ts.map +1 -1
  29. package/dest/logs/log_service.js +2 -2
  30. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  31. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  32. package/dest/private_kernel/private_kernel_execution_prover.js +2 -2
  33. package/dest/pxe.d.ts +1 -1
  34. package/dest/pxe.d.ts.map +1 -1
  35. package/dest/pxe.js +7 -5
  36. package/dest/storage/note_store/note_store.d.ts +1 -1
  37. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  38. package/dest/storage/note_store/note_store.js +29 -31
  39. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  40. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  41. package/dest/storage/private_event_store/private_event_store.js +45 -47
  42. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  43. package/package.json +16 -16
  44. package/src/block_synchronizer/block_synchronizer.ts +15 -12
  45. package/src/contract_function_simulator/contract_function_simulator.ts +6 -2
  46. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +2 -0
  47. package/src/debug/pxe_debug_utils.ts +23 -9
  48. package/src/entrypoints/client/bundle/utils.ts +4 -13
  49. package/src/entrypoints/client/lazy/utils.ts +5 -13
  50. package/src/entrypoints/pxe_creation_options.ts +2 -1
  51. package/src/entrypoints/server/utils.ts +15 -19
  52. package/src/job_coordinator/job_coordinator.ts +4 -3
  53. package/src/logs/log_service.ts +6 -3
  54. package/src/private_kernel/private_kernel_execution_prover.ts +6 -3
  55. package/src/pxe.ts +15 -6
  56. package/src/storage/note_store/note_store.ts +28 -33
  57. package/src/storage/private_event_store/private_event_store.ts +57 -59
  58. package/src/storage/private_event_store/stored_private_event.ts +1 -1
@@ -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.
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
  /**
@@ -131,78 +131,76 @@ export class PrivateEventStore implements StagedStore {
131
131
  * @returns - The event log contents, augmented with metadata about the transaction and block in which the event was
132
132
  * included.
133
133
  */
134
- public getPrivateEvents(
134
+ public async getPrivateEvents(
135
135
  eventSelector: EventSelector,
136
136
  filter: PrivateEventStoreFilter,
137
137
  ): Promise<PackedPrivateEvent[]> {
138
- return this.#store.transactionAsync(async () => {
139
- const events: Array<{
140
- l2BlockNumber: number;
141
- txIndexInBlock: number;
142
- eventIndexInTx: number;
143
- event: PackedPrivateEvent;
144
- }> = [];
145
-
146
- const key = this.#keyFor(filter.contractAddress, eventSelector);
147
- const targetScopes = new Set(filter.scopes.map(s => s.toString()));
148
-
149
- const eventIds: string[] = await toArray(this.#eventsByContractAndEventSelector.getValuesAsync(key));
150
-
151
- for (const eventId of eventIds) {
152
- const eventBuffer = await this.#events.getAsync(eventId);
153
-
154
- // Defensive, if it happens, there's a problem with how we're handling #eventsByContractAndEventSelector
155
- if (!eventBuffer) {
156
- this.logger.verbose(
157
- `EventId ${eventId} does not exist in main index but it is referenced from contract event selector index`,
158
- );
159
- continue;
160
- }
138
+ const events: Array<{
139
+ l2BlockNumber: number;
140
+ txIndexInBlock: number;
141
+ eventIndexInTx: number;
142
+ event: PackedPrivateEvent;
143
+ }> = [];
161
144
 
162
- const storedPrivateEvent = StoredPrivateEvent.fromBuffer(eventBuffer);
145
+ const key = this.#keyFor(filter.contractAddress, eventSelector);
146
+ const targetScopes = new Set(filter.scopes.map(s => s.toString()));
163
147
 
164
- // Filter by block range
165
- if (storedPrivateEvent.l2BlockNumber < filter.fromBlock || storedPrivateEvent.l2BlockNumber >= filter.toBlock) {
166
- continue;
167
- }
148
+ const eventIds: string[] = await toArray(this.#eventsByContractAndEventSelector.getValuesAsync(key));
168
149
 
169
- // Filter by scopes
170
- if (storedPrivateEvent.scopes.intersection(targetScopes).size === 0) {
171
- continue;
172
- }
150
+ for (const eventId of eventIds) {
151
+ const eventBuffer = await this.#events.getAsync(eventId);
173
152
 
174
- // Filter by txHash
175
- if (filter.txHash && !storedPrivateEvent.txHash.equals(filter.txHash)) {
176
- continue;
177
- }
153
+ // Defensive, if it happens, there's a problem with how we're handling #eventsByContractAndEventSelector
154
+ if (!eventBuffer) {
155
+ this.logger.verbose(
156
+ `EventId ${eventId} does not exist in main index but it is referenced from contract event selector index`,
157
+ );
158
+ continue;
159
+ }
178
160
 
179
- events.push({
180
- l2BlockNumber: storedPrivateEvent.l2BlockNumber,
181
- txIndexInBlock: storedPrivateEvent.txIndexInBlock,
182
- eventIndexInTx: storedPrivateEvent.eventIndexInTx,
183
- event: {
184
- packedEvent: storedPrivateEvent.msgContent,
185
- l2BlockNumber: BlockNumber(storedPrivateEvent.l2BlockNumber),
186
- txHash: storedPrivateEvent.txHash,
187
- l2BlockHash: storedPrivateEvent.l2BlockHash,
188
- eventSelector,
189
- },
190
- });
161
+ const storedPrivateEvent = StoredPrivateEvent.fromBuffer(eventBuffer);
162
+
163
+ // Filter by block range
164
+ if (storedPrivateEvent.l2BlockNumber < filter.fromBlock || storedPrivateEvent.l2BlockNumber >= filter.toBlock) {
165
+ continue;
191
166
  }
192
167
 
193
- // Sort by block number, then by tx index within block, then by event index within tx
194
- events.sort((a, b) => {
195
- if (a.l2BlockNumber !== b.l2BlockNumber) {
196
- return a.l2BlockNumber - b.l2BlockNumber;
197
- }
198
- if (a.txIndexInBlock !== b.txIndexInBlock) {
199
- return a.txIndexInBlock - b.txIndexInBlock;
200
- }
201
- return a.eventIndexInTx - b.eventIndexInTx;
168
+ // Filter by scopes
169
+ if (storedPrivateEvent.scopes.intersection(targetScopes).size === 0) {
170
+ continue;
171
+ }
172
+
173
+ // Filter by txHash
174
+ if (filter.txHash && !storedPrivateEvent.txHash.equals(filter.txHash)) {
175
+ continue;
176
+ }
177
+
178
+ events.push({
179
+ l2BlockNumber: storedPrivateEvent.l2BlockNumber,
180
+ txIndexInBlock: storedPrivateEvent.txIndexInBlock,
181
+ eventIndexInTx: storedPrivateEvent.eventIndexInTx,
182
+ event: {
183
+ packedEvent: storedPrivateEvent.msgContent,
184
+ l2BlockNumber: BlockNumber(storedPrivateEvent.l2BlockNumber),
185
+ txHash: storedPrivateEvent.txHash,
186
+ l2BlockHash: storedPrivateEvent.l2BlockHash,
187
+ eventSelector,
188
+ },
202
189
  });
190
+ }
203
191
 
204
- return events.map(ev => ev.event);
192
+ // Sort by block number, then by tx index within block, then by event index within tx
193
+ events.sort((a, b) => {
194
+ if (a.l2BlockNumber !== b.l2BlockNumber) {
195
+ return a.l2BlockNumber - b.l2BlockNumber;
196
+ }
197
+ if (a.txIndexInBlock !== b.txIndexInBlock) {
198
+ return a.txIndexInBlock - b.txIndexInBlock;
199
+ }
200
+ return a.eventIndexInTx - b.eventIndexInTx;
205
201
  });
202
+
203
+ return events.map(ev => ev.event);
206
204
  }
207
205
 
208
206
  /**
@@ -49,7 +49,7 @@ export class StoredPrivateEvent {
49
49
  const msgContentLength = reader.readNumber();
50
50
  const msgContent = reader.readArray(msgContentLength, Fr);
51
51
  const l2BlockNumber = reader.readNumber();
52
- const l2BlockHash = BlockHash.fromBuffer(reader);
52
+ const l2BlockHash = new BlockHash(Fr.fromBuffer(reader));
53
53
  const txHash = TxHash.fromBuffer(reader);
54
54
  const txIndexInBlock = reader.readNumber();
55
55
  const eventIndexInTx = reader.readNumber();