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

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 (214) hide show
  1. package/dest/bin/check_oracle_version.js +1 -1
  2. package/dest/block_synchronizer/block_synchronizer.d.ts +11 -5
  3. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  4. package/dest/block_synchronizer/block_synchronizer.js +68 -20
  5. package/dest/config/index.d.ts +3 -1
  6. package/dest/config/index.d.ts.map +1 -1
  7. package/dest/config/index.js +17 -0
  8. package/dest/config/package_info.js +1 -1
  9. package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
  10. package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
  11. package/dest/contract_function_simulator/benchmarked_node.js +77 -0
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts +8 -9
  13. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/contract_function_simulator.js +33 -19
  15. package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
  16. package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
  17. package/dest/contract_function_simulator/execution_note_cache.js +45 -28
  18. package/dest/contract_function_simulator/index.d.ts +2 -2
  19. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/index.js +1 -1
  21. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
  22. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +6 -3
  24. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
  25. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
  26. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
  27. package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
  28. package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
  29. package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -11
  30. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
  32. package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
  33. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
  34. package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
  35. package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
  36. package/dest/contract_function_simulator/oracle/oracle.d.ts +10 -8
  37. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  38. package/dest/contract_function_simulator/oracle/oracle.js +43 -32
  39. package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
  40. package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
  41. package/dest/contract_function_simulator/oracle/private_execution.js +1 -37
  42. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +16 -18
  43. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  44. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +24 -38
  45. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +27 -17
  46. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  47. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +72 -72
  48. package/dest/contract_sync/index.d.ts +23 -0
  49. package/dest/contract_sync/index.d.ts.map +1 -0
  50. package/dest/contract_sync/index.js +54 -0
  51. package/dest/debug/pxe_debug_utils.d.ts +16 -6
  52. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  53. package/dest/debug/pxe_debug_utils.js +20 -10
  54. package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
  55. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  56. package/dest/entrypoints/client/bundle/utils.js +20 -6
  57. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  58. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  59. package/dest/entrypoints/client/lazy/utils.js +21 -7
  60. package/dest/entrypoints/pxe_creation_options.d.ts +5 -3
  61. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  62. package/dest/entrypoints/server/index.d.ts +3 -1
  63. package/dest/entrypoints/server/index.d.ts.map +1 -1
  64. package/dest/entrypoints/server/index.js +2 -0
  65. package/dest/entrypoints/server/utils.d.ts +1 -1
  66. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  67. package/dest/entrypoints/server/utils.js +30 -15
  68. package/dest/events/event_service.d.ts +4 -3
  69. package/dest/events/event_service.d.ts.map +1 -1
  70. package/dest/events/event_service.js +17 -19
  71. package/dest/events/private_event_filter_validator.d.ts +5 -5
  72. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  73. package/dest/events/private_event_filter_validator.js +5 -6
  74. package/dest/job_coordinator/job_coordinator.d.ts +75 -0
  75. package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
  76. package/dest/job_coordinator/job_coordinator.js +94 -0
  77. package/dest/logs/log_service.d.ts +4 -2
  78. package/dest/logs/log_service.d.ts.map +1 -1
  79. package/dest/logs/log_service.js +22 -14
  80. package/dest/notes/note_service.d.ts +5 -4
  81. package/dest/notes/note_service.d.ts.map +1 -1
  82. package/dest/notes/note_service.js +30 -34
  83. package/dest/oracle_version.d.ts +3 -3
  84. package/dest/oracle_version.d.ts.map +1 -1
  85. package/dest/oracle_version.js +4 -3
  86. package/dest/private_kernel/hints/index.d.ts +2 -2
  87. package/dest/private_kernel/hints/index.d.ts.map +1 -1
  88. package/dest/private_kernel/hints/index.js +1 -1
  89. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
  90. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
  91. package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +13 -7
  92. package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
  93. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  94. package/dest/private_kernel/private_kernel_execution_prover.js +6 -7
  95. package/dest/private_kernel/private_kernel_oracle.d.ts +24 -28
  96. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  97. package/dest/private_kernel/private_kernel_oracle.js +90 -2
  98. package/dest/pxe.d.ts +8 -36
  99. package/dest/pxe.d.ts.map +1 -1
  100. package/dest/pxe.js +75 -93
  101. package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
  102. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  103. package/dest/storage/capsule_store/capsule_store.js +132 -23
  104. package/dest/storage/note_store/note_store.d.ts +45 -56
  105. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  106. package/dest/storage/note_store/note_store.js +244 -263
  107. package/dest/storage/note_store/stored_note.d.ts +16 -0
  108. package/dest/storage/note_store/stored_note.d.ts.map +1 -0
  109. package/dest/storage/note_store/stored_note.js +43 -0
  110. package/dest/storage/private_event_store/private_event_store.d.ts +47 -7
  111. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  112. package/dest/storage/private_event_store/private_event_store.js +203 -68
  113. package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
  114. package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
  115. package/dest/storage/private_event_store/stored_private_event.js +56 -0
  116. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
  117. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  118. package/dest/storage/tagging_store/recipient_tagging_store.js +69 -12
  119. package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
  120. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  121. package/dest/storage/tagging_store/sender_tagging_store.js +110 -28
  122. package/dest/tagging/constants.d.ts +2 -0
  123. package/dest/tagging/constants.d.ts.map +1 -0
  124. package/dest/tagging/constants.js +10 -0
  125. package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
  126. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
  127. package/dest/tagging/get_all_logs_by_tags.js +46 -0
  128. package/dest/tagging/index.d.ts +3 -2
  129. package/dest/tagging/index.d.ts.map +1 -1
  130. package/dest/tagging/index.js +2 -10
  131. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
  132. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  133. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -8
  134. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
  135. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  136. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
  137. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
  138. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  139. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
  140. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
  141. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  142. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
  143. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
  144. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  145. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
  146. package/package.json +18 -18
  147. package/src/bin/check_oracle_version.ts +1 -0
  148. package/src/block_synchronizer/block_synchronizer.ts +87 -32
  149. package/src/config/index.ts +14 -0
  150. package/src/config/package_info.ts +1 -1
  151. package/src/contract_function_simulator/benchmarked_node.ts +103 -0
  152. package/src/contract_function_simulator/contract_function_simulator.ts +39 -21
  153. package/src/contract_function_simulator/execution_note_cache.ts +44 -25
  154. package/src/contract_function_simulator/index.ts +1 -1
  155. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -1
  156. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
  157. package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
  158. package/src/contract_function_simulator/oracle/interfaces.ts +20 -10
  159. package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
  160. package/src/contract_function_simulator/oracle/oracle.ts +56 -41
  161. package/src/contract_function_simulator/oracle/private_execution.ts +1 -69
  162. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +43 -42
  163. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +92 -76
  164. package/src/contract_sync/index.ts +98 -0
  165. package/src/debug/pxe_debug_utils.ts +26 -11
  166. package/src/entrypoints/client/bundle/utils.ts +12 -15
  167. package/src/entrypoints/client/lazy/utils.ts +13 -16
  168. package/src/entrypoints/pxe_creation_options.ts +4 -2
  169. package/src/entrypoints/server/index.ts +2 -0
  170. package/src/entrypoints/server/utils.ts +26 -34
  171. package/src/events/event_service.ts +17 -21
  172. package/src/events/private_event_filter_validator.ts +3 -5
  173. package/src/job_coordinator/job_coordinator.ts +150 -0
  174. package/src/logs/log_service.ts +33 -12
  175. package/src/notes/note_service.ts +37 -40
  176. package/src/oracle_version.ts +4 -3
  177. package/src/private_kernel/hints/index.ts +1 -1
  178. package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +33 -22
  179. package/src/private_kernel/private_kernel_execution_prover.ts +9 -8
  180. package/src/private_kernel/private_kernel_oracle.ts +116 -36
  181. package/src/pxe.ts +136 -122
  182. package/src/storage/capsule_store/capsule_store.ts +159 -23
  183. package/src/storage/note_store/note_store.ts +286 -317
  184. package/src/storage/note_store/stored_note.ts +48 -0
  185. package/src/storage/private_event_store/private_event_store.ts +277 -76
  186. package/src/storage/private_event_store/stored_private_event.ts +73 -0
  187. package/src/storage/tagging_store/recipient_tagging_store.ts +89 -13
  188. package/src/storage/tagging_store/sender_tagging_store.ts +129 -28
  189. package/src/tagging/constants.ts +10 -0
  190. package/src/tagging/get_all_logs_by_tags.ts +68 -0
  191. package/src/tagging/index.ts +2 -11
  192. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +21 -7
  193. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
  194. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +10 -7
  195. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -13
  196. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
  197. package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
  198. package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
  199. package/dest/contract_function_simulator/proxied_node.js +0 -27
  200. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
  201. package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
  202. package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
  203. package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
  204. package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
  205. package/dest/public_storage/public_storage_service.d.ts +0 -24
  206. package/dest/public_storage/public_storage_service.d.ts.map +0 -1
  207. package/dest/public_storage/public_storage_service.js +0 -26
  208. package/dest/tree_membership/tree_membership_service.d.ts +0 -52
  209. package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
  210. package/dest/tree_membership/tree_membership_service.js +0 -84
  211. package/src/contract_function_simulator/proxied_node.ts +0 -33
  212. package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
  213. package/src/public_storage/public_storage_service.ts +0 -33
  214. package/src/tree_membership/tree_membership_service.ts +0 -112
package/src/pxe.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import type { PrivateEventFilter } from '@aztec/aztec.js/wallet';
2
+ import { BlockNumber } from '@aztec/foundation/branded-types';
2
3
  import { Fr } from '@aztec/foundation/curves/bn254';
3
- import { type Logger, createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
4
5
  import { SerialQueue } from '@aztec/foundation/queue';
5
6
  import { Timer } from '@aztec/foundation/timer';
6
7
  import { KeyStore } from '@aztec/key-store';
@@ -19,14 +20,12 @@ import type { AuthWitness } from '@aztec/stdlib/auth-witness';
19
20
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
20
21
  import {
21
22
  CompleteAddress,
22
- type ContractClassWithId,
23
23
  type ContractInstanceWithAddress,
24
24
  type PartialAddress,
25
25
  computeContractAddressFromInstance,
26
26
  getContractClassFromArtifact,
27
27
  } from '@aztec/stdlib/contract';
28
28
  import { SimulationError } from '@aztec/stdlib/errors';
29
- import { computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
30
29
  import type { AztecNode, PrivateKernelProver } from '@aztec/stdlib/interfaces/client';
31
30
  import type {
32
31
  PrivateExecutionStep,
@@ -54,20 +53,22 @@ import { inspect } from 'util';
54
53
 
55
54
  import { BlockSynchronizer } from './block_synchronizer/index.js';
56
55
  import type { PXEConfig } from './config/index.js';
56
+ import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
57
57
  import {
58
58
  ContractFunctionSimulator,
59
59
  generateSimulatedProvingResult,
60
60
  } from './contract_function_simulator/contract_function_simulator.js';
61
- import { readCurrentClassId } from './contract_function_simulator/oracle/private_execution.js';
62
61
  import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
62
+ import { ensureContractSynced, readCurrentClassId } from './contract_sync/index.js';
63
63
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
64
64
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
65
65
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
66
+ import { JobCoordinator } from './job_coordinator/job_coordinator.js';
66
67
  import {
67
68
  PrivateKernelExecutionProver,
68
69
  type PrivateKernelExecutionProverConfig,
69
70
  } from './private_kernel/private_kernel_execution_prover.js';
70
- import { PrivateKernelOracleImpl } from './private_kernel/private_kernel_oracle_impl.js';
71
+ import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
71
72
  import { AddressStore } from './storage/address_store/address_store.js';
72
73
  import { AnchorBlockStore } from './storage/anchor_block_store/anchor_block_store.js';
73
74
  import { CapsuleStore } from './storage/capsule_store/capsule_store.js';
@@ -107,6 +108,7 @@ export class PXE {
107
108
  private protocolContractsProvider: ProtocolContractsProvider,
108
109
  private log: Logger,
109
110
  private jobQueue: SerialQueue,
111
+ private jobCoordinator: JobCoordinator,
110
112
  public debug: PXEDebugUtils,
111
113
  ) {}
112
114
 
@@ -126,6 +128,10 @@ export class PXE {
126
128
  config: PXEConfig,
127
129
  loggerOrSuffix?: string | Logger,
128
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
+
129
135
  const log =
130
136
  !loggerOrSuffix || typeof loggerOrSuffix === 'string'
131
137
  ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`)
@@ -135,7 +141,7 @@ export class PXE {
135
141
  const addressStore = new AddressStore(store);
136
142
  const privateEventStore = new PrivateEventStore(store);
137
143
  const contractStore = new ContractStore(store);
138
- const noteStore = await NoteStore.create(store);
144
+ const noteStore = new NoteStore(store);
139
145
  const anchorBlockStore = new AnchorBlockStore(store);
140
146
  const senderTaggingStore = new SenderTaggingStore(store);
141
147
  const senderAddressBookStore = new SenderAddressBookStore(store);
@@ -143,9 +149,27 @@ export class PXE {
143
149
  const capsuleStore = new CapsuleStore(store);
144
150
  const keyStore = new KeyStore(store);
145
151
  const tipsStore = new L2TipsKVStore(store, 'pxe');
146
- const synchronizer = new BlockSynchronizer(node, anchorBlockStore, noteStore, tipsStore, config, loggerOrSuffix);
152
+ const synchronizer = new BlockSynchronizer(
153
+ node,
154
+ store,
155
+ anchorBlockStore,
156
+ noteStore,
157
+ privateEventStore,
158
+ tipsStore,
159
+ config,
160
+ bindings,
161
+ );
162
+
163
+ const jobCoordinator = new JobCoordinator(store, bindings);
164
+ jobCoordinator.registerStores([
165
+ capsuleStore,
166
+ senderTaggingStore,
167
+ recipientTaggingStore,
168
+ privateEventStore,
169
+ noteStore,
170
+ ]);
147
171
 
148
- const debugUtils = new PXEDebugUtils(contractStore, noteStore);
172
+ const debugUtils = new PXEDebugUtils(contractStore, noteStore, synchronizer, anchorBlockStore);
149
173
 
150
174
  const jobQueue = new SerialQueue();
151
175
 
@@ -168,10 +192,11 @@ export class PXE {
168
192
  protocolContractsProvider,
169
193
  log,
170
194
  jobQueue,
195
+ jobCoordinator,
171
196
  debugUtils,
172
197
  );
173
198
 
174
- debugUtils.setPXE(pxe);
199
+ debugUtils.setPXE(pxe, pxe.#putInJobQueue.bind(pxe));
175
200
 
176
201
  pxe.jobQueue.start();
177
202
 
@@ -191,7 +216,7 @@ export class PXE {
191
216
  this.noteStore,
192
217
  this.keyStore,
193
218
  this.addressStore,
194
- this.node,
219
+ BenchmarkedNodeFactory.create(this.node),
195
220
  this.anchorBlockStore,
196
221
  this.senderTaggingStore,
197
222
  this.recipientTaggingStore,
@@ -222,7 +247,7 @@ export class PXE {
222
247
  *
223
248
  * Useful for tasks that cannot run concurrently, such as contract function simulation.
224
249
  */
225
- #putInJobQueue<T>(fn: () => Promise<T>): Promise<T> {
250
+ #putInJobQueue<T>(fn: (jobId: string) => Promise<T>): Promise<T> {
226
251
  // TODO(#12636): relax the conditions under which we forbid concurrency.
227
252
  if (this.jobQueue.length() != 0) {
228
253
  this.log.warn(
@@ -230,7 +255,22 @@ export class PXE {
230
255
  );
231
256
  }
232
257
 
233
- return this.jobQueue.put(fn);
258
+ return this.jobQueue.put(async () => {
259
+ const jobId = this.jobCoordinator.beginJob();
260
+ this.log.verbose(`Beginning job ${jobId}`);
261
+
262
+ try {
263
+ const result = await fn(jobId);
264
+ this.log.verbose(`Committing job ${jobId}`);
265
+
266
+ await this.jobCoordinator.commitJob(jobId);
267
+ return result;
268
+ } catch (err) {
269
+ this.log.verbose(`Aborting job ${jobId}`);
270
+ await this.jobCoordinator.abortJob(jobId);
271
+ throw err;
272
+ }
273
+ });
234
274
  }
235
275
 
236
276
  async #registerProtocolContracts() {
@@ -245,31 +285,28 @@ export class PXE {
245
285
  this.log.verbose(`Registered protocol contracts in pxe`, registered);
246
286
  }
247
287
 
248
- async #isContractClassPubliclyRegistered(id: Fr): Promise<boolean> {
249
- return !!(await this.node.getContractClass(id));
250
- }
251
-
252
- async #isContractPublished(address: AztecAddress): Promise<boolean> {
253
- return !!(await this.node.getContract(address));
254
- }
255
-
256
- async #isContractInitialized(address: AztecAddress): Promise<boolean> {
257
- const initNullifier = await siloNullifier(address, address.toField());
258
- return !!(await this.node.getNullifierMembershipWitness('latest', initNullifier));
259
- }
260
-
261
288
  // Executes the entrypoint private function, as well as all nested private
262
289
  // functions that might arise.
263
290
  async #executePrivate(
264
291
  contractFunctionSimulator: ContractFunctionSimulator,
265
292
  txRequest: TxExecutionRequest,
266
- scopes?: AztecAddress[],
293
+ scopes: AztecAddress[] | undefined,
294
+ jobId: string,
267
295
  ): Promise<PrivateExecutionResult> {
268
296
  const { origin: contractAddress, functionSelector } = txRequest;
269
297
 
270
298
  try {
271
299
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
272
300
 
301
+ await ensureContractSynced(
302
+ contractAddress,
303
+ functionSelector,
304
+ privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
305
+ this.node,
306
+ this.contractStore,
307
+ anchorBlockHeader,
308
+ );
309
+
273
310
  const result = await contractFunctionSimulator.run(
274
311
  txRequest,
275
312
  contractAddress,
@@ -280,6 +317,7 @@ export class PXE {
280
317
  // contract entrypoint
281
318
  undefined, // senderForTags
282
319
  scopes,
320
+ jobId,
283
321
  );
284
322
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
285
323
  return result;
@@ -298,17 +336,19 @@ export class PXE {
298
336
  * @param authWitnesses - Authentication witnesses required for the function call.
299
337
  * @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
300
338
  * accounts if not specified.
339
+ * @param jobId - The job ID for staged writes.
301
340
  * @returns The simulation result containing the outputs of the utility function.
302
341
  */
303
342
  async #simulateUtility(
304
343
  contractFunctionSimulator: ContractFunctionSimulator,
305
344
  call: FunctionCall,
306
- authWitnesses?: AuthWitness[],
307
- scopes?: AztecAddress[],
345
+ authWitnesses: AuthWitness[] | undefined,
346
+ scopes: AztecAddress[] | undefined,
347
+ jobId: string,
308
348
  ) {
309
349
  try {
310
350
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
311
- return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes);
351
+ return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
312
352
  } catch (err) {
313
353
  if (err instanceof SimulationError) {
314
354
  await enrichSimulationError(err, this.contractStore, this.log);
@@ -361,14 +401,15 @@ export class PXE {
361
401
  privateExecutionResult: PrivateExecutionResult,
362
402
  config: PrivateKernelExecutionProverConfig,
363
403
  ): Promise<PrivateKernelExecutionProofOutput<PrivateKernelTailCircuitPublicInputs>> {
364
- const simulationAnchorBlock = privateExecutionResult.getSimulationAnchorBlockNumber();
365
- const kernelOracle = new PrivateKernelOracleImpl(
366
- this.contractStore,
367
- this.keyStore,
368
- this.node,
369
- simulationAnchorBlock,
404
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
405
+ const anchorBlockHash = await anchorBlockHeader.hash();
406
+ const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
407
+ const kernelTraceProver = new PrivateKernelExecutionProver(
408
+ kernelOracle,
409
+ proofCreator,
410
+ !this.proverEnabled,
411
+ this.log.getBindings(),
370
412
  );
371
- const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled);
372
413
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
373
414
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
374
415
  }
@@ -380,66 +421,12 @@ export class PXE {
380
421
  }
381
422
 
382
423
  /**
383
- * Returns the contract class metadata given a contract class id.
384
- * The metadata consists of its contract class, whether it has been publicly registered, and its artifact.
385
- * @remark - it queries the node to check whether the contract class with the given id has been publicly registered.
386
- * @param id - Identifier of the class.
387
- * @param includeArtifact - Identifier of the class.
388
- * @returns - It returns the contract class metadata, with the artifact field being optional, and will only be returned if true is passed in
389
- * for `includeArtifact`
390
- * TODO(@spalladino): The PXE actually holds artifacts and not classes, what should we return? Also,
391
- * should the pxe query the node for contract public info, and merge it with its own definitions?
392
- * TODO(@spalladino): This method is strictly needed to decide whether to publicly register a class or not
393
- * during a public deployment. We probably want a nicer and more general API for this, but it'll have to
394
- * do for the time being.
424
+ * Returns the contract artifact for a given contract class id, if it's registered in the PXE.
425
+ * @param id - Identifier of the contract class.
426
+ * @returns The contract artifact if found, undefined otherwise.
395
427
  */
396
- public async getContractClassMetadata(
397
- id: Fr,
398
- includeArtifact: boolean = false,
399
- ): Promise<{
400
- contractClass: ContractClassWithId | undefined;
401
- isContractClassPubliclyRegistered: boolean;
402
- artifact: ContractArtifact | undefined;
403
- }> {
404
- const artifact = await this.contractStore.getContractArtifact(id);
405
- if (!artifact) {
406
- this.log.warn(`No artifact found for contract class ${id.toString()} when looking for its metadata`);
407
- }
408
-
409
- return {
410
- contractClass: artifact && (await getContractClassFromArtifact(artifact)),
411
- isContractClassPubliclyRegistered: await this.#isContractClassPubliclyRegistered(id),
412
- artifact: includeArtifact ? artifact : undefined,
413
- };
414
- }
415
-
416
- /**
417
- * Returns the contract metadata given an address.
418
- * The metadata consists of its contract instance, which includes the contract class identifier,
419
- * initialization hash, deployment salt, and public keys hash; whether the contract instance has been initialized;
420
- * and whether the contract instance with the given address has been publicly deployed.
421
- * @remark - it queries the node to check whether the contract instance has been initialized / publicly deployed through a node.
422
- * This query is not dependent on the PXE.
423
- * @param address - The address that the contract instance resides at.
424
- * @returns - It returns the contract metadata
425
- * TODO(@spalladino): Should we return the public keys in plain as well here?
426
- */
427
- public async getContractMetadata(address: AztecAddress): Promise<{
428
- contractInstance: ContractInstanceWithAddress | undefined;
429
- isContractInitialized: boolean;
430
- isContractPublished: boolean;
431
- }> {
432
- let instance;
433
- try {
434
- instance = await this.contractStore.getContractInstance(address);
435
- } catch {
436
- this.log.warn(`No instance found for contract ${address.toString()} when looking for its metadata`);
437
- }
438
- return {
439
- contractInstance: instance,
440
- isContractInitialized: await this.#isContractInitialized(address),
441
- isContractPublished: await this.#isContractPublished(address),
442
- };
428
+ public async getContractArtifact(id: Fr): Promise<ContractArtifact | undefined> {
429
+ return await this.contractStore.getContractArtifact(id);
443
430
  }
444
431
 
445
432
  /**
@@ -464,7 +451,6 @@ export class PXE {
464
451
  }
465
452
 
466
453
  await this.addressStore.addCompleteAddress(accountCompleteAddress);
467
- await this.noteStore.addScope(accountCompleteAddress.address);
468
454
  return accountCompleteAddress;
469
455
  }
470
456
 
@@ -612,13 +598,7 @@ export class PXE {
612
598
 
613
599
  const header = await this.anchorBlockStore.getBlockHeader();
614
600
 
615
- const currentClassId = await readCurrentClassId(
616
- contractAddress,
617
- currentInstance,
618
- this.node,
619
- header.globalVariables.blockNumber,
620
- header.globalVariables.timestamp,
621
- );
601
+ const currentClassId = await readCurrentClassId(contractAddress, currentInstance, this.node, header);
622
602
  if (!contractClass.id.equals(currentClassId)) {
623
603
  throw new Error('Could not update contract to a class different from the current one.');
624
604
  }
@@ -657,14 +637,14 @@ export class PXE {
657
637
  let privateExecutionResult: PrivateExecutionResult;
658
638
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
659
639
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
660
- return this.#putInJobQueue(async () => {
640
+ return this.#putInJobQueue(async jobId => {
661
641
  const totalTimer = new Timer();
662
642
  try {
663
643
  const syncTimer = new Timer();
664
644
  await this.blockStateSynchronizer.sync();
665
645
  const syncTime = syncTimer.ms();
666
646
  const contractFunctionSimulator = this.#getSimulatorForTx();
667
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest);
647
+ privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
668
648
 
669
649
  const {
670
650
  publicInputs,
@@ -711,7 +691,7 @@ export class PXE {
711
691
  // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
712
692
  const txHash = (await txProvingResult.toTx()).txHash;
713
693
 
714
- await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash);
694
+ await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash, jobId);
715
695
  this.log.debug(`Stored used pre-tags as sender for the tx`, {
716
696
  preTagsUsedInTheTx,
717
697
  });
@@ -741,7 +721,7 @@ export class PXE {
741
721
  skipProofGeneration: boolean = true,
742
722
  ): Promise<TxProfileResult> {
743
723
  // We disable concurrent profiles for consistency with simulateTx.
744
- return this.#putInJobQueue(async () => {
724
+ return this.#putInJobQueue(async jobId => {
745
725
  const totalTimer = new Timer();
746
726
  try {
747
727
  const txInfo = {
@@ -761,7 +741,12 @@ export class PXE {
761
741
  const syncTime = syncTimer.ms();
762
742
 
763
743
  const contractFunctionSimulator = this.#getSimulatorForTx();
764
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest);
744
+ const privateExecutionResult = await this.#executePrivate(
745
+ contractFunctionSimulator,
746
+ txRequest,
747
+ undefined,
748
+ jobId,
749
+ );
765
750
 
766
751
  const { executionSteps, timings: { proving } = {} } = await this.#prove(
767
752
  txRequest,
@@ -841,7 +826,7 @@ export class PXE {
841
826
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
842
827
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
843
828
  // delete the same read value, or reading values that another simulation is currently modifying).
844
- return this.#putInJobQueue(async () => {
829
+ return this.#putInJobQueue(async jobId => {
845
830
  try {
846
831
  const totalTimer = new Timer();
847
832
  const txInfo = {
@@ -867,20 +852,14 @@ export class PXE {
867
852
  const skipKernels = overrides?.contracts !== undefined && Object.keys(overrides.contracts ?? {}).length > 0;
868
853
 
869
854
  // Execution of private functions only; no proving, and no kernel logic.
870
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes);
855
+ const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
871
856
 
872
857
  let publicInputs: PrivateKernelTailCircuitPublicInputs | undefined;
873
858
  let executionSteps: PrivateExecutionStep[] = [];
874
859
 
875
860
  if (skipKernels) {
876
- // According to the protocol rules, the nonce generator for the note hashes
877
- // can either be the first nullifier in the tx or the protocol nullifier if there are none.
878
- const nonceGenerator = privateExecutionResult.firstNullifier.equals(Fr.ZERO)
879
- ? await computeProtocolNullifier(await txRequest.toTxRequest().hash())
880
- : privateExecutionResult.firstNullifier;
881
861
  ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(
882
862
  privateExecutionResult,
883
- nonceGenerator,
884
863
  this.contractStore,
885
864
  ));
886
865
  } else {
@@ -982,7 +961,7 @@ export class PXE {
982
961
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
983
962
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
984
963
  // delete the same read value, or reading values that another simulation is currently modifying).
985
- return this.#putInJobQueue(async () => {
964
+ return this.#putInJobQueue(async jobId => {
986
965
  try {
987
966
  const totalTimer = new Timer();
988
967
  const syncTimer = new Timer();
@@ -990,7 +969,24 @@ export class PXE {
990
969
  const syncTime = syncTimer.ms();
991
970
  const functionTimer = new Timer();
992
971
  const contractFunctionSimulator = this.#getSimulatorForTx();
993
- const executionResult = await this.#simulateUtility(contractFunctionSimulator, call, authwits ?? [], scopes);
972
+
973
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
974
+ await ensureContractSynced(
975
+ call.to,
976
+ call.selector,
977
+ privateSyncCall => this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
978
+ this.node,
979
+ this.contractStore,
980
+ anchorBlockHeader,
981
+ );
982
+
983
+ const executionResult = await this.#simulateUtility(
984
+ contractFunctionSimulator,
985
+ call,
986
+ authwits ?? [],
987
+ scopes,
988
+ jobId,
989
+ );
994
990
  const functionTime = functionTimer.ms();
995
991
 
996
992
  const totalTime = totalTimer.ms();
@@ -1035,11 +1031,29 @@ export class PXE {
1035
1031
  eventSelector: EventSelector,
1036
1032
  filter: PrivateEventFilter,
1037
1033
  ): Promise<PackedPrivateEvent[]> {
1038
- // We need to manually trigger private state sync to have a guarantee that all the events are available.
1039
- const call = await this.contractStore.getFunctionCall('sync_private_state', [], filter.contractAddress);
1040
- await this.simulateUtility(call);
1034
+ let anchorBlockNumber: BlockNumber;
1035
+
1036
+ await this.#putInJobQueue(async jobId => {
1037
+ await this.blockStateSynchronizer.sync();
1038
+
1039
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
1040
+ anchorBlockNumber = anchorBlockHeader.getBlockNumber();
1041
+
1042
+ const contractFunctionSimulator = this.#getSimulatorForTx();
1043
+
1044
+ await ensureContractSynced(
1045
+ filter.contractAddress,
1046
+ null,
1047
+ async privateSyncCall =>
1048
+ await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId),
1049
+ this.node,
1050
+ this.contractStore,
1051
+ anchorBlockHeader,
1052
+ );
1053
+ });
1041
1054
 
1042
- const sanitizedFilter = await new PrivateEventFilterValidator(this.anchorBlockStore).validate(filter);
1055
+ // anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
1056
+ const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber!).validate(filter);
1043
1057
 
1044
1058
  this.log.debug(
1045
1059
  `Getting private events for ${sanitizedFilter.contractAddress.toString()} from ${sanitizedFilter.fromBlock} to ${sanitizedFilter.toBlock}`,