@aztec/pxe 0.0.1-commit.c7c42ec → 0.0.1-commit.f295ac2

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 (180) hide show
  1. package/dest/block_synchronizer/block_synchronizer.d.ts +6 -2
  2. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  3. package/dest/block_synchronizer/block_synchronizer.js +21 -13
  4. package/dest/config/package_info.js +1 -1
  5. package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
  6. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  7. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  8. package/dest/contract_function_simulator/contract_function_simulator.d.ts +8 -9
  9. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  10. package/dest/contract_function_simulator/contract_function_simulator.js +33 -16
  11. package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
  12. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  13. package/dest/contract_function_simulator/execution_note_cache.js +45 -28
  14. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +3 -2
  15. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  16. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +5 -2
  17. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
  18. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  19. package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
  20. package/dest/contract_function_simulator/oracle/interfaces.d.ts +9 -8
  21. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  22. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
  23. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  24. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +4 -4
  25. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  26. package/dest/contract_function_simulator/oracle/note_packing_utils.js +5 -5
  27. package/dest/contract_function_simulator/oracle/oracle.d.ts +6 -6
  28. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  29. package/dest/contract_function_simulator/oracle/oracle.js +20 -19
  30. package/dest/contract_function_simulator/oracle/private_execution.d.ts +5 -9
  31. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  32. package/dest/contract_function_simulator/oracle/private_execution.js +11 -10
  33. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +8 -18
  34. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +10 -35
  36. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +14 -12
  37. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +54 -52
  39. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  40. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  41. package/dest/entrypoints/client/bundle/utils.js +10 -1
  42. package/dest/entrypoints/client/lazy/utils.d.ts +1 -1
  43. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  44. package/dest/entrypoints/client/lazy/utils.js +10 -1
  45. package/dest/entrypoints/pxe_creation_options.d.ts +3 -2
  46. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  47. package/dest/entrypoints/server/index.d.ts +2 -1
  48. package/dest/entrypoints/server/index.d.ts.map +1 -1
  49. package/dest/entrypoints/server/index.js +1 -0
  50. package/dest/entrypoints/server/utils.d.ts +1 -1
  51. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  52. package/dest/entrypoints/server/utils.js +11 -7
  53. package/dest/events/event_service.d.ts +4 -3
  54. package/dest/events/event_service.d.ts.map +1 -1
  55. package/dest/events/event_service.js +17 -19
  56. package/dest/events/private_event_filter_validator.d.ts +5 -5
  57. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  58. package/dest/events/private_event_filter_validator.js +5 -6
  59. package/dest/job_coordinator/job_coordinator.d.ts +74 -0
  60. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
  61. package/dest/job_coordinator/job_coordinator.js +93 -0
  62. package/dest/logs/log_service.d.ts +3 -2
  63. package/dest/logs/log_service.d.ts.map +1 -1
  64. package/dest/logs/log_service.js +5 -3
  65. package/dest/notes/note_service.d.ts +3 -3
  66. package/dest/notes/note_service.d.ts.map +1 -1
  67. package/dest/notes/note_service.js +23 -28
  68. package/dest/oracle_version.d.ts +2 -2
  69. package/dest/oracle_version.js +2 -2
  70. package/dest/private_kernel/hints/index.d.ts +2 -2
  71. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  72. package/dest/private_kernel/hints/index.js +1 -1
  73. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
  74. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  75. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +13 -7
  76. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  77. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  78. package/dest/private_kernel/private_kernel_execution_prover.js +4 -5
  79. package/dest/private_kernel/private_kernel_oracle.d.ts +24 -28
  80. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  81. package/dest/private_kernel/private_kernel_oracle.js +90 -2
  82. package/dest/pxe.d.ts +8 -36
  83. package/dest/pxe.d.ts.map +1 -1
  84. package/dest/pxe.js +65 -87
  85. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  86. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  87. package/dest/storage/capsule_store/capsule_store.js +132 -23
  88. package/dest/storage/contract_store/contract_store.d.ts +2 -1
  89. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  90. package/dest/storage/contract_store/contract_store.js +12 -0
  91. package/dest/storage/note_store/note_store.d.ts +6 -5
  92. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  93. package/dest/storage/note_store/note_store.js +89 -94
  94. package/dest/storage/private_event_store/private_event_store.d.ts +33 -6
  95. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  96. package/dest/storage/private_event_store/private_event_store.js +139 -32
  97. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  98. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  99. package/dest/storage/tagging_store/recipient_tagging_store.js +69 -12
  100. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  101. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  102. package/dest/storage/tagging_store/sender_tagging_store.js +110 -28
  103. package/dest/tagging/constants.d.ts +2 -0
  104. package/dest/tagging/constants.d.ts.map +1 -0
  105. package/dest/tagging/constants.js +10 -0
  106. package/dest/tagging/index.d.ts +2 -2
  107. package/dest/tagging/index.d.ts.map +1 -1
  108. package/dest/tagging/index.js +1 -10
  109. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +2 -2
  110. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  111. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +7 -7
  112. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +2 -2
  113. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  114. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
  115. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  116. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  117. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +2 -2
  118. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +4 -2
  119. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  120. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +4 -2
  121. package/dest/tree_membership/tree_membership_service.d.ts +9 -11
  122. package/dest/tree_membership/tree_membership_service.d.ts.map +1 -1
  123. package/dest/tree_membership/tree_membership_service.js +25 -34
  124. package/package.json +18 -18
  125. package/src/block_synchronizer/block_synchronizer.ts +30 -12
  126. package/src/config/package_info.ts +1 -1
  127. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  128. package/src/contract_function_simulator/contract_function_simulator.ts +42 -16
  129. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  130. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +4 -0
  131. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  132. package/src/contract_function_simulator/oracle/interfaces.ts +8 -7
  133. package/src/contract_function_simulator/oracle/note_packing_utils.ts +6 -6
  134. package/src/contract_function_simulator/oracle/oracle.ts +24 -22
  135. package/src/contract_function_simulator/oracle/private_execution.ts +10 -19
  136. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +13 -38
  137. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +56 -50
  138. package/src/entrypoints/client/bundle/utils.ts +7 -1
  139. package/src/entrypoints/client/lazy/utils.ts +7 -2
  140. package/src/entrypoints/pxe_creation_options.ts +2 -1
  141. package/src/entrypoints/server/index.ts +1 -0
  142. package/src/entrypoints/server/utils.ts +11 -15
  143. package/src/events/event_service.ts +17 -21
  144. package/src/events/private_event_filter_validator.ts +3 -5
  145. package/src/job_coordinator/job_coordinator.ts +149 -0
  146. package/src/logs/log_service.ts +3 -1
  147. package/src/notes/note_service.ts +23 -29
  148. package/src/oracle_version.ts +2 -2
  149. package/src/private_kernel/hints/index.ts +1 -1
  150. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +33 -22
  151. package/src/private_kernel/private_kernel_execution_prover.ts +3 -5
  152. package/src/private_kernel/private_kernel_oracle.ts +116 -36
  153. package/src/pxe.ts +98 -116
  154. package/src/storage/capsule_store/capsule_store.ts +159 -23
  155. package/src/storage/contract_store/contract_store.ts +20 -0
  156. package/src/storage/note_store/note_store.ts +98 -95
  157. package/src/storage/private_event_store/private_event_store.ts +199 -37
  158. package/src/storage/tagging_store/recipient_tagging_store.ts +89 -13
  159. package/src/storage/tagging_store/sender_tagging_store.ts +129 -28
  160. package/src/tagging/constants.ts +10 -0
  161. package/src/tagging/index.ts +1 -11
  162. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +10 -6
  163. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +8 -7
  164. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +6 -2
  165. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +4 -1
  166. package/src/tree_membership/tree_membership_service.ts +27 -42
  167. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  168. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  169. package/dest/contract_function_simulator/proxied_node.js +0 -27
  170. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  171. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  172. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  173. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  174. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
  175. package/dest/public_storage/public_storage_service.d.ts +0 -24
  176. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  177. package/dest/public_storage/public_storage_service.js +0 -26
  178. package/src/contract_function_simulator/proxied_node.ts +0 -33
  179. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
  180. package/src/public_storage/public_storage_service.ts +0 -33
@@ -6,6 +6,7 @@ import { LogLevels, applyStringFormatting, createLogger } from '@aztec/foundatio
6
6
  import type { KeyStore } from '@aztec/key-store';
7
7
  import type { AuthWitness } from '@aztec/stdlib/auth-witness';
8
8
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
9
+ import { L2BlockHash } from '@aztec/stdlib/block';
9
10
  import type { CompleteAddress, ContractInstance } from '@aztec/stdlib/contract';
10
11
  import { siloNullifier } from '@aztec/stdlib/hash';
11
12
  import type { AztecNode } from '@aztec/stdlib/interfaces/server';
@@ -20,7 +21,6 @@ import { EventService } from '../../events/event_service.js';
20
21
  import { LogService } from '../../logs/log_service.js';
21
22
  import { NoteService } from '../../notes/note_service.js';
22
23
  import { ORACLE_VERSION } from '../../oracle_version.js';
23
- import { PublicStorageService } from '../../public_storage/public_storage_service.js';
24
24
  import type { AddressStore } from '../../storage/address_store/address_store.js';
25
25
  import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
26
26
  import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
@@ -64,6 +64,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
64
64
  protected readonly senderAddressBookStore: SenderAddressBookStore,
65
65
  protected readonly capsuleStore: CapsuleStore,
66
66
  protected readonly privateEventStore: PrivateEventStore,
67
+ protected readonly jobId: string,
67
68
  protected log = createLogger('simulator:client_view_context'),
68
69
  protected readonly scopes?: AztecAddress[],
69
70
  ) {}
@@ -79,13 +80,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
79
80
  }
80
81
 
81
82
  public utilityGetUtilityContext(): UtilityContext {
82
- return UtilityContext.from({
83
- blockNumber: this.anchorBlockHeader.globalVariables.blockNumber,
84
- timestamp: this.anchorBlockHeader.globalVariables.timestamp,
85
- contractAddress: this.contractAddress,
86
- version: this.anchorBlockHeader.globalVariables.version,
87
- chainId: this.anchorBlockHeader.globalVariables.chainId,
88
- });
83
+ return new UtilityContext(this.anchorBlockHeader, this.contractAddress);
89
84
  }
90
85
 
91
86
  /**
@@ -100,32 +95,32 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
100
95
 
101
96
  /**
102
97
  * Fetches the index and sibling path of a leaf at a given block from a given tree.
103
- * @param blockNumber - The block number at which to get the membership witness.
98
+ * @param blockHash - The block hash at which to get the membership witness.
104
99
  * @param treeId - Id of the tree to get the sibling path from.
105
100
  * @param leafValue - The leaf value
106
101
  * @returns The index and sibling path concatenated [index, sibling_path]
107
102
  */
108
- public utilityGetMembershipWitness(blockNumber: BlockNumber, treeId: MerkleTreeId, leafValue: Fr): Promise<Fr[]> {
109
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
110
- return treeMembershipService.getMembershipWitness(blockNumber, treeId, leafValue);
103
+ public utilityGetMembershipWitness(blockHash: L2BlockHash, treeId: MerkleTreeId, leafValue: Fr): Promise<Fr[]> {
104
+ const treeMembershipService = new TreeMembershipService(this.aztecNode);
105
+ return treeMembershipService.getMembershipWitness(blockHash, treeId, leafValue);
111
106
  }
112
107
 
113
108
  /**
114
109
  * Returns a nullifier membership witness for a given nullifier at a given block.
115
- * @param blockNumber - The block number at which to get the index.
110
+ * @param blockHash - The block hash at which to get the index.
116
111
  * @param nullifier - Nullifier we try to find witness for.
117
112
  * @returns The nullifier membership witness (if found).
118
113
  */
119
114
  public async utilityGetNullifierMembershipWitness(
120
- blockNumber: BlockNumber,
115
+ blockHash: L2BlockHash,
121
116
  nullifier: Fr,
122
117
  ): Promise<NullifierMembershipWitness | undefined> {
123
- return await this.aztecNode.getNullifierMembershipWitness(blockNumber, nullifier);
118
+ return await this.aztecNode.getNullifierMembershipWitness(blockHash, nullifier);
124
119
  }
125
120
 
126
121
  /**
127
122
  * Returns a low nullifier membership witness for a given nullifier at a given block.
128
- * @param blockNumber - The block number at which to get the index.
123
+ * @param blockHash - The block hash at which to get the index.
129
124
  * @param nullifier - Nullifier we try to find the low nullifier witness for.
130
125
  * @returns The low nullifier membership witness (if found).
131
126
  * @remarks Low nullifier witness can be used to perform a nullifier non-inclusion proof by leveraging the "linked
@@ -133,25 +128,25 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
133
128
  * we are trying to prove non-inclusion for.
134
129
  */
135
130
  public async utilityGetLowNullifierMembershipWitness(
136
- blockNumber: BlockNumber,
131
+ blockHash: L2BlockHash,
137
132
  nullifier: Fr,
138
133
  ): Promise<NullifierMembershipWitness | undefined> {
139
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
140
- return await treeMembershipService.getLowNullifierMembershipWitness(blockNumber, nullifier);
134
+ const treeMembershipService = new TreeMembershipService(this.aztecNode);
135
+ return await treeMembershipService.getLowNullifierMembershipWitness(blockHash, nullifier);
141
136
  }
142
137
 
143
138
  /**
144
139
  * Returns a public data tree witness for a given leaf slot at a given block.
145
- * @param blockNumber - The block number at which to get the index.
140
+ * @param blockHash - The block hash at which to get the index.
146
141
  * @param leafSlot - The slot of the public data tree to get the witness for.
147
142
  * @returns - The witness
148
143
  */
149
144
  public async utilityGetPublicDataWitness(
150
- blockNumber: BlockNumber,
145
+ blockHash: L2BlockHash,
151
146
  leafSlot: Fr,
152
147
  ): Promise<PublicDataWitness | undefined> {
153
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
154
- return await treeMembershipService.getPublicDataWitness(blockNumber, leafSlot);
148
+ const treeMembershipService = new TreeMembershipService(this.aztecNode);
149
+ return await treeMembershipService.getPublicDataWitness(blockHash, leafSlot);
155
150
  }
156
151
 
157
152
  /**
@@ -166,7 +161,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
166
161
  }
167
162
 
168
163
  const block = await this.aztecNode.getBlock(blockNumber);
169
- return block?.getBlockHeader() || undefined;
164
+ return block?.header;
170
165
  }
171
166
 
172
167
  /**
@@ -281,7 +276,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
281
276
  */
282
277
  public async utilityCheckNullifierExists(innerNullifier: Fr) {
283
278
  const nullifier = await siloNullifier(this.contractAddress, innerNullifier!);
284
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
279
+ const treeMembershipService = new TreeMembershipService(this.aztecNode);
285
280
  const index = await treeMembershipService.getNullifierIndex(nullifier);
286
281
  return index !== undefined;
287
282
  }
@@ -295,7 +290,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
295
290
  * @returns The l1 to l2 membership witness (index of message in the tree and sibling path).
296
291
  */
297
292
  public async utilityGetL1ToL2MembershipWitness(contractAddress: AztecAddress, messageHash: Fr, secret: Fr) {
298
- const treeMembershipService = new TreeMembershipService(this.aztecNode, this.anchorBlockStore);
293
+ const treeMembershipService = new TreeMembershipService(this.aztecNode);
299
294
  const [messageIndex, siblingPath] = await treeMembershipService.getL1ToL2MembershipWitness(
300
295
  contractAddress,
301
296
  messageHash,
@@ -308,25 +303,24 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
308
303
 
309
304
  /**
310
305
  * Read the public storage data.
306
+ * @param blockHash - The block hash to read storage at.
311
307
  * @param contractAddress - The address to read storage from.
312
308
  * @param startStorageSlot - The starting storage slot.
313
- * @param blockNumber - The block number to read storage at.
314
309
  * @param numberOfElements - Number of elements to read from the starting storage slot.
315
310
  */
316
311
  public async utilityStorageRead(
312
+ blockHash: L2BlockHash,
317
313
  contractAddress: AztecAddress,
318
314
  startStorageSlot: Fr,
319
- blockNumber: BlockNumber,
320
315
  numberOfElements: number,
321
316
  ) {
322
317
  const values = [];
323
- const publicStorageService = new PublicStorageService(this.anchorBlockStore, this.aztecNode);
324
318
 
325
319
  // TODO: why do we serialize these requests? This should probably a single call
326
320
  // Privacy considerations?
327
321
  for (let i = 0n; i < numberOfElements; i++) {
328
322
  const storageSlot = new Fr(startStorageSlot.value + i);
329
- const value = await publicStorageService.getPublicStorageAt(blockNumber, contractAddress, storageSlot);
323
+ const value = await this.aztecNode.getPublicStorageAt(blockHash, contractAddress, storageSlot);
330
324
 
331
325
  this.log.debug(
332
326
  `Oracle storage read: slot=${storageSlot.toString()} address-${contractAddress.toString()} value=${value}`,
@@ -353,12 +347,19 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
353
347
  this.recipientTaggingStore,
354
348
  this.senderAddressBookStore,
355
349
  this.addressStore,
350
+ this.jobId,
356
351
  );
357
352
 
358
- await logService.syncTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes);
359
-
360
353
  const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
361
- await noteService.syncNoteNullifiers(this.contractAddress);
354
+
355
+ // It is acceptable to run the following operations in parallel for several reasons:
356
+ // 1. syncTaggedLogs does not write to the note store — it only stores the pending tagged logs in a capsule array,
357
+ // which is then processed in Noir after this handler returns.
358
+ // 2. Even if syncTaggedLogs did write to the note store, it would not cause inconsistent state.
359
+ await Promise.all([
360
+ logService.syncTaggedLogs(this.contractAddress, pendingTaggedLogArrayBaseSlot, this.scopes),
361
+ noteService.syncNoteNullifiers(this.contractAddress),
362
+ ]);
362
363
  }
363
364
 
364
365
  /**
@@ -376,7 +377,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
376
377
  noteValidationRequestsArrayBaseSlot: Fr,
377
378
  eventValidationRequestsArrayBaseSlot: Fr,
378
379
  ) {
379
- // TODO(#10727): allow other contracts to deliver notes
380
+ // TODO(#10727): allow other contracts to store notes
380
381
  if (!this.contractAddress.equals(contractAddress)) {
381
382
  throw new Error(`Got a note validation request from ${contractAddress}, expected ${this.contractAddress}`);
382
383
  }
@@ -384,16 +385,16 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
384
385
  // We read all note and event validation requests and process them all concurrently. This makes the process much
385
386
  // faster as we don't need to wait for the network round-trip.
386
387
  const noteValidationRequests = (
387
- await this.capsuleStore.readCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot)
388
+ await this.capsuleStore.readCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, this.jobId)
388
389
  ).map(NoteValidationRequest.fromFields);
389
390
 
390
391
  const eventValidationRequests = (
391
- await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot)
392
+ await this.capsuleStore.readCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, this.jobId)
392
393
  ).map(EventValidationRequest.fromFields);
393
394
 
394
395
  const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockStore);
395
- const noteDeliveries = noteValidationRequests.map(request =>
396
- noteService.deliverNote(
396
+ const noteStorePromises = noteValidationRequests.map(request =>
397
+ noteService.storeNote(
397
398
  request.contractAddress,
398
399
  request.owner,
399
400
  request.storageSlot,
@@ -407,11 +408,12 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
407
408
  ),
408
409
  );
409
410
 
410
- const eventService = new EventService(this.anchorBlockStore, this.aztecNode, this.privateEventStore);
411
- const eventDeliveries = eventValidationRequests.map(request =>
412
- eventService.deliverEvent(
411
+ const eventService = new EventService(this.anchorBlockStore, this.aztecNode, this.privateEventStore, this.jobId);
412
+ const eventStorePromises = eventValidationRequests.map(request =>
413
+ eventService.storeEvent(
413
414
  request.contractAddress,
414
415
  request.eventTypeId,
416
+ request.randomness,
415
417
  request.serializedEvent,
416
418
  request.eventCommitment,
417
419
  request.txHash,
@@ -419,11 +421,11 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
419
421
  ),
420
422
  );
421
423
 
422
- await Promise.all([...noteDeliveries, ...eventDeliveries]);
424
+ await Promise.all([...noteStorePromises, ...eventStorePromises]);
423
425
 
424
426
  // Requests are cleared once we're done.
425
- await this.capsuleStore.setCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, []);
426
- await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, []);
427
+ await this.capsuleStore.setCapsuleArray(contractAddress, noteValidationRequestsArrayBaseSlot, [], this.jobId);
428
+ await this.capsuleStore.setCapsuleArray(contractAddress, eventValidationRequestsArrayBaseSlot, [], this.jobId);
427
429
  }
428
430
 
429
431
  public async utilityBulkRetrieveLogs(
@@ -439,7 +441,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
439
441
  // We read all log retrieval requests and process them all concurrently. This makes the process much faster as we
440
442
  // don't need to wait for the network round-trip.
441
443
  const logRetrievalRequests = (
442
- await this.capsuleStore.readCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot)
444
+ await this.capsuleStore.readCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, this.jobId)
443
445
  ).map(LogRetrievalRequest.fromFields);
444
446
 
445
447
  const logService = new LogService(
@@ -450,18 +452,20 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
450
452
  this.recipientTaggingStore,
451
453
  this.senderAddressBookStore,
452
454
  this.addressStore,
455
+ this.jobId,
453
456
  );
454
457
 
455
458
  const maybeLogRetrievalResponses = await logService.bulkRetrieveLogs(logRetrievalRequests);
456
459
 
457
460
  // Requests are cleared once we're done.
458
- await this.capsuleStore.setCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, []);
461
+ await this.capsuleStore.setCapsuleArray(contractAddress, logRetrievalRequestsArrayBaseSlot, [], this.jobId);
459
462
 
460
463
  // The responses are stored as Option<LogRetrievalResponse> in a second CapsuleArray.
461
464
  await this.capsuleStore.setCapsuleArray(
462
465
  contractAddress,
463
466
  logRetrievalResponsesArrayBaseSlot,
464
467
  maybeLogRetrievalResponses.map(LogRetrievalResponse.toSerializedOption),
468
+ this.jobId,
465
469
  );
466
470
  }
467
471
 
@@ -470,7 +474,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
470
474
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
471
475
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
472
476
  }
473
- return this.capsuleStore.storeCapsule(this.contractAddress, slot, capsule);
477
+ this.capsuleStore.storeCapsule(this.contractAddress, slot, capsule, this.jobId);
478
+ return Promise.resolve();
474
479
  }
475
480
 
476
481
  public async utilityLoadCapsule(contractAddress: AztecAddress, slot: Fr): Promise<Fr[] | null> {
@@ -481,7 +486,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
481
486
  return (
482
487
  // TODO(#12425): On the following line, the pertinent capsule gets overshadowed by the transient one. Tackle this.
483
488
  this.capsules.find(c => c.contractAddress.equals(contractAddress) && c.storageSlot.equals(slot))?.data ??
484
- (await this.capsuleStore.loadCapsule(this.contractAddress, slot))
489
+ (await this.capsuleStore.loadCapsule(this.contractAddress, slot, this.jobId))
485
490
  );
486
491
  }
487
492
 
@@ -490,7 +495,8 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
490
495
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
491
496
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
492
497
  }
493
- return this.capsuleStore.deleteCapsule(this.contractAddress, slot);
498
+ this.capsuleStore.deleteCapsule(this.contractAddress, slot, this.jobId);
499
+ return Promise.resolve();
494
500
  }
495
501
 
496
502
  public utilityCopyCapsule(
@@ -503,7 +509,7 @@ export class UtilityExecutionOracle implements IMiscOracle, IUtilityExecutionOra
503
509
  // TODO(#10727): instead of this check that this.contractAddress is allowed to access the external DB
504
510
  throw new Error(`Contract ${contractAddress} is not allowed to access ${this.contractAddress}'s PXE DB`);
505
511
  }
506
- return this.capsuleStore.copyCapsule(this.contractAddress, srcSlot, dstSlot, numEntries);
512
+ return this.capsuleStore.copyCapsule(this.contractAddress, srcSlot, dstSlot, numEntries, this.jobId);
507
513
  }
508
514
 
509
515
  // TODO(#11849): consider replacing this oracle with a pure Noir implementation of aes decryption.
@@ -1,3 +1,4 @@
1
+ import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
1
2
  import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
2
3
  import { randomBytes } from '@aztec/foundation/crypto/random';
3
4
  import { createLogger } from '@aztec/foundation/log';
@@ -49,7 +50,12 @@ export async function createPXE(
49
50
  ? loggers.prover
50
51
  : createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
51
52
 
52
- const prover = options.prover ?? new BBBundlePrivateKernelProver(simulator, proverLogger);
53
+ let prover;
54
+ if (options.proverOrOptions instanceof BBPrivateKernelProver) {
55
+ prover = options.proverOrOptions;
56
+ } else {
57
+ prover = new BBBundlePrivateKernelProver(simulator, { ...options.proverOrOptions, logger: proverLogger });
58
+ }
53
59
  const protocolContractsProvider = new BundledProtocolContractsProvider();
54
60
 
55
61
  const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
@@ -1,3 +1,4 @@
1
+ import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
1
2
  import { BBLazyPrivateKernelProver } from '@aztec/bb-prover/client/lazy';
2
3
  import { randomBytes } from '@aztec/foundation/crypto/random';
3
4
  import { createLogger } from '@aztec/foundation/log';
@@ -48,8 +49,12 @@ export async function createPXE(
48
49
  ? loggers.prover
49
50
  : createLogger('pxe:bb:wasm:bundle' + (logSuffix ? `:${logSuffix}` : ''));
50
51
 
51
- const prover = options.prover ?? new BBLazyPrivateKernelProver(simulator, proverLogger);
52
-
52
+ let prover;
53
+ if (options.proverOrOptions instanceof BBPrivateKernelProver) {
54
+ prover = options.proverOrOptions;
55
+ } else {
56
+ prover = new BBLazyPrivateKernelProver(simulator, { ...options.proverOrOptions, logger: proverLogger });
57
+ }
53
58
  const protocolContractsProvider = new LazyProtocolContractsProvider();
54
59
 
55
60
  const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
@@ -1,3 +1,4 @@
1
+ import type { BBPrivateKernelProverOptions } from '@aztec/bb-prover/client';
1
2
  import type { Logger } from '@aztec/foundation/log';
2
3
  import type { AztecAsyncKVStore } from '@aztec/kv-store';
3
4
  import type { CircuitSimulator } from '@aztec/simulator/client';
@@ -6,7 +7,7 @@ import type { PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
6
7
  export type PXECreationOptions = {
7
8
  loggers?: { store?: Logger; pxe?: Logger; prover?: Logger };
8
9
  useLogSuffix?: boolean | string;
9
- prover?: PrivateKernelProver;
10
+ proverOrOptions?: PrivateKernelProver | BBPrivateKernelProverOptions;
10
11
  store?: AztecAsyncKVStore;
11
12
  simulator?: CircuitSimulator;
12
13
  };
@@ -6,3 +6,4 @@ export * from './utils.js';
6
6
  export { NoteService } from '../../notes/note_service.js';
7
7
  export { ORACLE_VERSION } from '../../oracle_version.js';
8
8
  export { type PXECreationOptions } from '../pxe_creation_options.js';
9
+ export { JobCoordinator } from '../../job_coordinator/job_coordinator.js';
@@ -1,13 +1,10 @@
1
+ import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
1
2
  import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
2
3
  import { randomBytes } from '@aztec/foundation/crypto/random';
3
- import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import { createLogger } from '@aztec/foundation/log';
5
+ import { createStore } from '@aztec/kv-store/lmdb-v2';
4
6
  import { BundledProtocolContractsProvider } from '@aztec/protocol-contracts/providers/bundle';
5
- import {
6
- type CircuitSimulator,
7
- MemoryCircuitRecorder,
8
- SimulatorRecorderWrapper,
9
- WASMSimulator,
10
- } from '@aztec/simulator/client';
7
+ import { MemoryCircuitRecorder, SimulatorRecorderWrapper, WASMSimulator } from '@aztec/simulator/client';
11
8
  import { FileCircuitRecorder } from '@aztec/simulator/testing';
12
9
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
13
10
 
@@ -46,9 +43,6 @@ export async function createPXE(
46
43
  };
47
44
 
48
45
  if (!options.store) {
49
- // TODO once https://github.com/AztecProtocol/aztec-packages/issues/13656 is fixed, we can remove this and always
50
- // import the lmdb-v2 version
51
- const { createStore } = await import('@aztec/kv-store/lmdb-v2');
52
46
  const storeLogger = loggers.store
53
47
  ? loggers.store
54
48
  : createLogger('pxe:data:lmdb' + (logSuffix ? `:${logSuffix}` : ''));
@@ -58,7 +52,13 @@ export async function createPXE(
58
52
  ? loggers.prover
59
53
  : createLogger('pxe:bb:native' + (logSuffix ? `:${logSuffix}` : ''));
60
54
 
61
- const prover = options.prover ?? createProver(simulator, proverLogger);
55
+ let prover;
56
+ if (options.proverOrOptions instanceof BBPrivateKernelProver) {
57
+ prover = options.proverOrOptions;
58
+ } else {
59
+ prover = new BBBundlePrivateKernelProver(simulator, { ...options.proverOrOptions, logger: proverLogger });
60
+ }
61
+
62
62
  const protocolContractsProvider = new BundledProtocolContractsProvider();
63
63
 
64
64
  const pxeLogger = loggers.pxe ? loggers.pxe : createLogger('pxe:service' + (logSuffix ? `:${logSuffix}` : ''));
@@ -73,7 +73,3 @@ export async function createPXE(
73
73
  );
74
74
  return pxe;
75
75
  }
76
-
77
- function createProver(simulator: CircuitSimulator, logger?: Logger) {
78
- return new BBBundlePrivateKernelProver(simulator, logger);
79
- }
@@ -3,7 +3,6 @@ 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 { MerkleTreeId } from '@aztec/stdlib/trees';
7
6
  import type { TxHash } from '@aztec/stdlib/tx';
8
7
 
9
8
  import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
@@ -14,11 +13,13 @@ export class EventService {
14
13
  private readonly anchorBlockStore: AnchorBlockStore,
15
14
  private readonly aztecNode: AztecNode,
16
15
  private readonly privateEventStore: PrivateEventStore,
16
+ private readonly jobId: string,
17
17
  ) {}
18
18
 
19
- public async deliverEvent(
19
+ public async storeEvent(
20
20
  contractAddress: AztecAddress,
21
21
  selector: EventSelector,
22
+ randomness: Fr,
22
23
  content: Fr[],
23
24
  eventCommitment: Fr,
24
25
  txHash: TxHash,
@@ -28,50 +29,45 @@ export class EventService {
28
29
  // (and thus we're less concerned about being ahead of the synced block), we use the synced block number to
29
30
  // maintain consistent behavior in the PXE. Additionally, events should never be ahead of the synced block here
30
31
  // since `fetchTaggedLogs` only processes logs up to the synced block.
31
- const [syncedBlockHeader, siloedEventCommitment, txEffect] = await Promise.all([
32
+ const [anchorBlockHeader, siloedEventCommitment, txEffect] = await Promise.all([
32
33
  this.anchorBlockStore.getBlockHeader(),
33
34
  siloNullifier(contractAddress, eventCommitment),
34
35
  this.aztecNode.getTxEffect(txHash),
35
36
  ]);
36
37
 
37
- const syncedBlockNumber = syncedBlockHeader.getBlockNumber();
38
+ const anchorBlockNumber = anchorBlockHeader.getBlockNumber();
38
39
 
39
40
  if (!txEffect) {
40
41
  throw new Error(`Could not find tx effect for tx hash ${txHash}`);
41
42
  }
42
43
 
43
- if (txEffect.l2BlockNumber > syncedBlockNumber) {
44
- throw new Error(`Could not find tx effect for tx hash ${txHash} as of block number ${syncedBlockNumber}`);
44
+ if (txEffect.l2BlockNumber > anchorBlockNumber) {
45
+ throw new Error(`Could not find tx effect for tx hash ${txHash} as of block number ${anchorBlockNumber}`);
45
46
  }
46
47
 
47
- const eventInTx = txEffect.data.nullifiers.some(n => n.equals(siloedEventCommitment));
48
- if (!eventInTx) {
48
+ // Find the index of the event commitment in the nullifiers array to determine event ordering within the tx
49
+ const eventIndexInTx = txEffect.data.nullifiers.findIndex(n => n.equals(siloedEventCommitment));
50
+ if (eventIndexInTx === -1) {
49
51
  throw new Error(
50
52
  `Event commitment ${eventCommitment} (siloed as ${siloedEventCommitment}) is not present in tx ${txHash}`,
51
53
  );
52
54
  }
53
55
 
54
- const [nullifierIndex] = await this.aztecNode.findLeavesIndexes(syncedBlockNumber, MerkleTreeId.NULLIFIER_TREE, [
55
- siloedEventCommitment,
56
- ]);
57
-
58
- if (nullifierIndex === undefined) {
59
- throw new Error(
60
- `Event commitment ${eventCommitment} (siloed as ${siloedEventCommitment}) is not present on the nullifier tree at block ${syncedBlockNumber} (from tx ${txHash})`,
61
- );
62
- }
63
-
64
56
  return this.privateEventStore.storePrivateEventLog(
65
57
  selector,
58
+ randomness,
66
59
  content,
67
- Number(nullifierIndex.data), // Index of the event commitment in the nullifier tree
60
+ siloedEventCommitment,
68
61
  {
69
62
  contractAddress,
70
63
  scope,
71
64
  txHash,
72
- l2BlockNumber: nullifierIndex.l2BlockNumber, // Block number in which the event was emitted
73
- l2BlockHash: nullifierIndex.l2BlockHash, // Block hash in which the event was emitted
65
+ l2BlockNumber: txEffect.l2BlockNumber,
66
+ l2BlockHash: txEffect.l2BlockHash,
67
+ txIndexInBlock: txEffect.txIndexInBlock,
68
+ eventIndexInTx,
74
69
  },
70
+ this.jobId,
75
71
  );
76
72
  }
77
73
  }
@@ -2,13 +2,12 @@ import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
2
  import { INITIAL_L2_BLOCK_NUM } from '@aztec/constants';
3
3
  import { BlockNumber } from '@aztec/foundation/branded-types';
4
4
 
5
- import { AnchorBlockStore } from '../storage/anchor_block_store/anchor_block_store.js';
6
5
  import type { PrivateEventStoreFilter } from '../storage/private_event_store/private_event_store.js';
7
6
 
8
7
  export class PrivateEventFilterValidator {
9
- constructor(private anchorBlockStore: AnchorBlockStore) {}
8
+ constructor(private lastBlock: BlockNumber) {}
10
9
 
11
- async validate(filter: PrivateEventFilter): Promise<PrivateEventStoreFilter> {
10
+ validate(filter: PrivateEventFilter): PrivateEventStoreFilter {
12
11
  let { fromBlock, toBlock } = filter;
13
12
 
14
13
  // Block range filters in Aztec Node are defined as closed-open intervals [fromBlock, toBlock), so
@@ -16,9 +15,8 @@ export class PrivateEventFilterValidator {
16
15
  // We then default to [INITIAL_L2_BLOCK_NUM, latestKnownBlock + 1), ie: by default return events from
17
16
  // the first block to the latest known block.
18
17
  if (!fromBlock || !toBlock) {
19
- const lastKnownBlock = (await this.anchorBlockStore.getBlockHeader()).getBlockNumber();
20
18
  fromBlock = fromBlock ?? BlockNumber(INITIAL_L2_BLOCK_NUM);
21
- toBlock = toBlock ?? BlockNumber(lastKnownBlock + 1);
19
+ toBlock = toBlock ?? BlockNumber(this.lastBlock + 1);
22
20
  }
23
21
 
24
22
  if (filter.scopes.length === 0) {