@aztec/pxe 0.0.1-commit.e558bd1c → 0.0.1-commit.e5a3663dd

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 (246) hide show
  1. package/dest/bin/check_oracle_version.js +4 -4
  2. package/dest/block_synchronizer/block_stream_source.d.ts +10 -0
  3. package/dest/block_synchronizer/block_stream_source.d.ts.map +1 -0
  4. package/dest/block_synchronizer/block_stream_source.js +37 -0
  5. package/dest/block_synchronizer/block_synchronizer.d.ts +6 -2
  6. package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
  7. package/dest/block_synchronizer/block_synchronizer.js +30 -10
  8. package/dest/config/index.d.ts +2 -2
  9. package/dest/config/index.d.ts.map +1 -1
  10. package/dest/config/index.js +8 -15
  11. package/dest/config/package_info.js +1 -1
  12. package/dest/contract_function_simulator/contract_function_simulator.d.ts +62 -30
  13. package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
  14. package/dest/contract_function_simulator/contract_function_simulator.js +206 -76
  15. package/dest/contract_function_simulator/ephemeral_array_service.d.ts +28 -0
  16. package/dest/contract_function_simulator/ephemeral_array_service.d.ts.map +1 -0
  17. package/dest/contract_function_simulator/ephemeral_array_service.js +78 -0
  18. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts +7 -7
  19. package/dest/contract_function_simulator/execution_tagging_index_cache.d.ts.map +1 -1
  20. package/dest/contract_function_simulator/execution_tagging_index_cache.js +19 -11
  21. package/dest/contract_function_simulator/index.d.ts +2 -1
  22. package/dest/contract_function_simulator/index.d.ts.map +1 -1
  23. package/dest/contract_function_simulator/index.js +1 -0
  24. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -6
  25. package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
  26. package/dest/contract_function_simulator/noir-structs/event_validation_request.js +8 -10
  27. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.d.ts +1 -1
  28. package/dest/contract_function_simulator/noir-structs/log_retrieval_request.js +1 -1
  29. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts +2 -2
  30. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.d.ts.map +1 -1
  31. package/dest/contract_function_simulator/noir-structs/log_retrieval_response.js +2 -4
  32. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +4 -7
  33. package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts.map +1 -1
  34. package/dest/contract_function_simulator/noir-structs/note_validation_request.js +6 -11
  35. package/dest/contract_function_simulator/oracle/interfaces.d.ts +63 -45
  36. package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
  37. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts +9 -0
  38. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.d.ts.map +1 -0
  39. package/dest/contract_function_simulator/oracle/legacy_oracle_mappings.js +47 -0
  40. package/dest/contract_function_simulator/oracle/oracle.d.ts +76 -44
  41. package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
  42. package/dest/contract_function_simulator/oracle/oracle.js +289 -97
  43. package/dest/contract_function_simulator/oracle/private_execution.js +5 -3
  44. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +58 -86
  45. package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
  46. package/dest/contract_function_simulator/oracle/private_execution_oracle.js +121 -95
  47. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +124 -64
  48. package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
  49. package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +356 -126
  50. package/dest/contract_function_simulator/pick_notes.d.ts +1 -1
  51. package/dest/contract_function_simulator/pick_notes.d.ts.map +1 -1
  52. package/dest/contract_function_simulator/pick_notes.js +20 -3
  53. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts +1 -1
  54. package/dest/contract_function_simulator/proxied_contract_data_source.d.ts.map +1 -1
  55. package/dest/contract_function_simulator/proxied_contract_data_source.js +3 -0
  56. package/dest/contract_logging.d.ts +27 -0
  57. package/dest/contract_logging.d.ts.map +1 -0
  58. package/dest/contract_logging.js +38 -0
  59. package/dest/contract_sync/contract_sync_service.d.ts +7 -4
  60. package/dest/contract_sync/contract_sync_service.d.ts.map +1 -1
  61. package/dest/contract_sync/contract_sync_service.js +69 -35
  62. package/dest/contract_sync/helpers.d.ts +2 -2
  63. package/dest/contract_sync/helpers.d.ts.map +1 -1
  64. package/dest/contract_sync/helpers.js +9 -4
  65. package/dest/debug/pxe_debug_utils.d.ts +5 -6
  66. package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
  67. package/dest/debug/pxe_debug_utils.js +4 -7
  68. package/dest/entrypoints/client/bundle/index.d.ts +3 -1
  69. package/dest/entrypoints/client/bundle/index.d.ts.map +1 -1
  70. package/dest/entrypoints/client/bundle/index.js +2 -0
  71. package/dest/entrypoints/client/bundle/utils.d.ts +2 -2
  72. package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
  73. package/dest/entrypoints/client/bundle/utils.js +11 -3
  74. package/dest/entrypoints/client/lazy/index.d.ts +3 -1
  75. package/dest/entrypoints/client/lazy/index.d.ts.map +1 -1
  76. package/dest/entrypoints/client/lazy/index.js +2 -0
  77. package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
  78. package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
  79. package/dest/entrypoints/client/lazy/utils.js +11 -3
  80. package/dest/entrypoints/pxe_creation_options.d.ts +3 -1
  81. package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
  82. package/dest/entrypoints/pxe_creation_options.js +3 -1
  83. package/dest/entrypoints/server/index.d.ts +3 -2
  84. package/dest/entrypoints/server/index.d.ts.map +1 -1
  85. package/dest/entrypoints/server/index.js +2 -1
  86. package/dest/entrypoints/server/utils.d.ts +2 -2
  87. package/dest/entrypoints/server/utils.d.ts.map +1 -1
  88. package/dest/entrypoints/server/utils.js +11 -3
  89. package/dest/events/event_service.d.ts +3 -2
  90. package/dest/events/event_service.d.ts.map +1 -1
  91. package/dest/events/event_service.js +26 -5
  92. package/dest/events/private_event_filter_validator.d.ts +3 -2
  93. package/dest/events/private_event_filter_validator.d.ts.map +1 -1
  94. package/dest/events/private_event_filter_validator.js +15 -0
  95. package/dest/logs/log_service.d.ts +7 -7
  96. package/dest/logs/log_service.d.ts.map +1 -1
  97. package/dest/logs/log_service.js +33 -48
  98. package/dest/messages/message_context_service.d.ts +17 -0
  99. package/dest/messages/message_context_service.d.ts.map +1 -0
  100. package/dest/messages/message_context_service.js +36 -0
  101. package/dest/notes/note_service.d.ts +4 -4
  102. package/dest/notes/note_service.d.ts.map +1 -1
  103. package/dest/notes/note_service.js +17 -7
  104. package/dest/notes_filter.d.ts +24 -0
  105. package/dest/notes_filter.d.ts.map +1 -0
  106. package/dest/notes_filter.js +4 -0
  107. package/dest/oracle_version.d.ts +4 -3
  108. package/dest/oracle_version.d.ts.map +1 -1
  109. package/dest/oracle_version.js +20 -10
  110. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts +4 -0
  111. package/dest/private_kernel/hints/compute_tx_expiration_timestamp.d.ts.map +1 -0
  112. package/dest/private_kernel/hints/{compute_tx_include_by_timestamp.js → compute_tx_expiration_timestamp.js} +12 -12
  113. package/dest/private_kernel/hints/index.d.ts +1 -1
  114. package/dest/private_kernel/hints/index.js +1 -1
  115. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +4 -3
  116. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -1
  117. package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.js +129 -68
  118. package/dest/private_kernel/hints/test_utils.d.ts +122 -0
  119. package/dest/private_kernel/hints/test_utils.d.ts.map +1 -0
  120. package/dest/private_kernel/hints/test_utils.js +203 -0
  121. package/dest/private_kernel/private_kernel_execution_prover.d.ts +1 -1
  122. package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
  123. package/dest/private_kernel/private_kernel_execution_prover.js +18 -13
  124. package/dest/private_kernel/private_kernel_oracle.d.ts +10 -6
  125. package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
  126. package/dest/private_kernel/private_kernel_oracle.js +19 -18
  127. package/dest/pxe.d.ts +84 -24
  128. package/dest/pxe.d.ts.map +1 -1
  129. package/dest/pxe.js +153 -83
  130. package/dest/storage/anchor_block_store/anchor_block_store.js +1 -1
  131. package/dest/storage/capsule_store/capsule_service.d.ts +21 -0
  132. package/dest/storage/capsule_store/capsule_service.d.ts.map +1 -0
  133. package/dest/storage/capsule_store/capsule_service.js +50 -0
  134. package/dest/storage/capsule_store/capsule_store.d.ts +9 -9
  135. package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
  136. package/dest/storage/capsule_store/capsule_store.js +36 -28
  137. package/dest/storage/capsule_store/index.d.ts +2 -1
  138. package/dest/storage/capsule_store/index.d.ts.map +1 -1
  139. package/dest/storage/capsule_store/index.js +1 -0
  140. package/dest/storage/contract_store/contract_store.d.ts +42 -15
  141. package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
  142. package/dest/storage/contract_store/contract_store.js +148 -70
  143. package/dest/storage/metadata.d.ts +1 -1
  144. package/dest/storage/metadata.js +1 -1
  145. package/dest/storage/note_store/note_store.d.ts +3 -3
  146. package/dest/storage/note_store/note_store.d.ts.map +1 -1
  147. package/dest/storage/note_store/note_store.js +3 -4
  148. package/dest/storage/private_event_store/private_event_store.d.ts +1 -1
  149. package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
  150. package/dest/storage/private_event_store/private_event_store.js +3 -0
  151. package/dest/storage/private_event_store/stored_private_event.js +1 -1
  152. package/dest/storage/tagging_store/recipient_tagging_store.d.ts +6 -6
  153. package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
  154. package/dest/storage/tagging_store/sender_tagging_store.d.ts +29 -28
  155. package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
  156. package/dest/storage/tagging_store/sender_tagging_store.js +141 -115
  157. package/dest/tagging/get_all_logs_by_tags.d.ts +1 -1
  158. package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -1
  159. package/dest/tagging/get_all_logs_by_tags.js +17 -3
  160. package/dest/tagging/index.d.ts +3 -3
  161. package/dest/tagging/index.d.ts.map +1 -1
  162. package/dest/tagging/index.js +1 -1
  163. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +4 -5
  164. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
  165. package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -22
  166. package/dest/tagging/recipient_sync/utils/find_highest_indexes.js +2 -2
  167. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +6 -7
  168. package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
  169. package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +12 -11
  170. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +4 -8
  171. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
  172. package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +13 -7
  173. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +4 -3
  174. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
  175. package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +20 -10
  176. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -7
  177. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
  178. package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +36 -24
  179. package/package.json +16 -16
  180. package/src/bin/check_oracle_version.ts +4 -4
  181. package/src/block_synchronizer/block_stream_source.ts +52 -0
  182. package/src/block_synchronizer/block_synchronizer.ts +33 -11
  183. package/src/config/index.ts +3 -9
  184. package/src/config/package_info.ts +1 -1
  185. package/src/contract_function_simulator/contract_function_simulator.ts +366 -138
  186. package/src/contract_function_simulator/ephemeral_array_service.ts +110 -0
  187. package/src/contract_function_simulator/execution_tagging_index_cache.ts +19 -14
  188. package/src/contract_function_simulator/index.ts +1 -0
  189. package/src/contract_function_simulator/noir-structs/event_validation_request.ts +9 -9
  190. package/src/contract_function_simulator/noir-structs/log_retrieval_request.ts +1 -1
  191. package/src/contract_function_simulator/noir-structs/log_retrieval_response.ts +2 -5
  192. package/src/contract_function_simulator/noir-structs/note_validation_request.ts +4 -10
  193. package/src/contract_function_simulator/oracle/interfaces.ts +91 -53
  194. package/src/contract_function_simulator/oracle/legacy_oracle_mappings.ts +104 -0
  195. package/src/contract_function_simulator/oracle/oracle.ts +378 -140
  196. package/src/contract_function_simulator/oracle/private_execution.ts +4 -4
  197. package/src/contract_function_simulator/oracle/private_execution_oracle.ts +151 -183
  198. package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +598 -156
  199. package/src/contract_function_simulator/pick_notes.ts +22 -3
  200. package/src/contract_function_simulator/proxied_contract_data_source.ts +8 -1
  201. package/src/contract_logging.ts +52 -0
  202. package/src/contract_sync/contract_sync_service.ts +102 -55
  203. package/src/contract_sync/helpers.ts +8 -3
  204. package/src/debug/pxe_debug_utils.ts +11 -14
  205. package/src/entrypoints/client/bundle/index.ts +2 -0
  206. package/src/entrypoints/client/bundle/utils.ts +11 -4
  207. package/src/entrypoints/client/lazy/index.ts +2 -0
  208. package/src/entrypoints/client/lazy/utils.ts +11 -4
  209. package/src/entrypoints/pxe_creation_options.ts +7 -0
  210. package/src/entrypoints/server/index.ts +2 -1
  211. package/src/entrypoints/server/utils.ts +9 -10
  212. package/src/events/event_service.ts +30 -5
  213. package/src/events/private_event_filter_validator.ts +21 -1
  214. package/src/logs/log_service.ts +63 -91
  215. package/src/messages/message_context_service.ts +44 -0
  216. package/src/notes/note_service.ts +19 -8
  217. package/src/notes_filter.ts +24 -0
  218. package/src/oracle_version.ts +20 -10
  219. package/src/private_kernel/hints/{compute_tx_include_by_timestamp.ts → compute_tx_expiration_timestamp.ts} +13 -13
  220. package/src/private_kernel/hints/index.ts +1 -1
  221. package/src/private_kernel/hints/private_kernel_reset_private_inputs_builder.ts +164 -117
  222. package/src/private_kernel/hints/test_utils.ts +325 -0
  223. package/src/private_kernel/private_kernel_execution_prover.ts +18 -16
  224. package/src/private_kernel/private_kernel_oracle.ts +21 -21
  225. package/src/pxe.ts +278 -131
  226. package/src/storage/anchor_block_store/anchor_block_store.ts +1 -1
  227. package/src/storage/capsule_store/capsule_service.ts +90 -0
  228. package/src/storage/capsule_store/capsule_store.ts +44 -26
  229. package/src/storage/capsule_store/index.ts +1 -0
  230. package/src/storage/contract_store/contract_store.ts +181 -80
  231. package/src/storage/metadata.ts +1 -1
  232. package/src/storage/note_store/note_store.ts +5 -5
  233. package/src/storage/private_event_store/private_event_store.ts +4 -0
  234. package/src/storage/private_event_store/stored_private_event.ts +1 -1
  235. package/src/storage/tagging_store/recipient_tagging_store.ts +9 -5
  236. package/src/storage/tagging_store/sender_tagging_store.ts +185 -138
  237. package/src/tagging/get_all_logs_by_tags.ts +28 -4
  238. package/src/tagging/index.ts +2 -2
  239. package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +12 -25
  240. package/src/tagging/recipient_sync/utils/find_highest_indexes.ts +2 -2
  241. package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +10 -15
  242. package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +23 -10
  243. package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +26 -11
  244. package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +27 -26
  245. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts +0 -4
  246. package/dest/private_kernel/hints/compute_tx_include_by_timestamp.d.ts.map +0 -1
package/dest/pxe.js CHANGED
@@ -13,12 +13,14 @@ import { BlockSynchronizer } from './block_synchronizer/index.js';
13
13
  import { BenchmarkedNodeFactory } from './contract_function_simulator/benchmarked_node.js';
14
14
  import { ContractFunctionSimulator, generateSimulatedProvingResult } from './contract_function_simulator/contract_function_simulator.js';
15
15
  import { ProxiedContractStoreFactory } from './contract_function_simulator/proxied_contract_data_source.js';
16
+ import { displayDebugLogs } from './contract_logging.js';
16
17
  import { ContractSyncService } from './contract_sync/contract_sync_service.js';
17
18
  import { readCurrentClassId } from './contract_sync/helpers.js';
18
19
  import { PXEDebugUtils } from './debug/pxe_debug_utils.js';
19
20
  import { enrichPublicSimulationError, enrichSimulationError } from './error_enriching.js';
20
21
  import { PrivateEventFilterValidator } from './events/private_event_filter_validator.js';
21
22
  import { JobCoordinator } from './job_coordinator/job_coordinator.js';
23
+ import { MessageContextService } from './messages/message_context_service.js';
22
24
  import { PrivateKernelExecutionProver } from './private_kernel/private_kernel_execution_prover.js';
23
25
  import { PrivateKernelOracle } from './private_kernel/private_kernel_oracle.js';
24
26
  import { AddressStore } from './storage/address_store/address_store.js';
@@ -35,6 +37,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
35
37
  * manage private state of users.
36
38
  */ export class PXE {
37
39
  node;
40
+ db;
38
41
  blockStateSynchronizer;
39
42
  keyStore;
40
43
  contractStore;
@@ -47,6 +50,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
47
50
  addressStore;
48
51
  privateEventStore;
49
52
  contractSyncService;
53
+ messageContextService;
54
+ l2TipsStore;
50
55
  simulator;
51
56
  proverEnabled;
52
57
  proofCreator;
@@ -55,8 +60,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
55
60
  jobQueue;
56
61
  jobCoordinator;
57
62
  debug;
58
- constructor(node, blockStateSynchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, contractSyncService, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debug){
63
+ constructor(node, db, blockStateSynchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, contractSyncService, messageContextService, l2TipsStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debug){
59
64
  this.node = node;
65
+ this.db = db;
60
66
  this.blockStateSynchronizer = blockStateSynchronizer;
61
67
  this.keyStore = keyStore;
62
68
  this.contractStore = contractStore;
@@ -69,6 +75,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
69
75
  this.addressStore = addressStore;
70
76
  this.privateEventStore = privateEventStore;
71
77
  this.contractSyncService = contractSyncService;
78
+ this.messageContextService = messageContextService;
79
+ this.l2TipsStore = l2TipsStore;
72
80
  this.simulator = simulator;
73
81
  this.proverEnabled = proverEnabled;
74
82
  this.proofCreator = proofCreator;
@@ -84,11 +92,12 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
84
92
  * can be contacted.
85
93
  *
86
94
  * @returns A promise that resolves PXE is ready to be used.
87
- */ static async create(node, store, proofCreator, simulator, protocolContractsProvider, config, loggerOrSuffix) {
95
+ */ static async create({ node, store, proofCreator, simulator, protocolContractsProvider, config, loggerOrSuffix }) {
88
96
  // Extract bindings from the logger, or use empty bindings if a string suffix is provided.
89
97
  const bindings = loggerOrSuffix && typeof loggerOrSuffix !== 'string' ? loggerOrSuffix.getBindings() : undefined;
90
98
  const log = !loggerOrSuffix || typeof loggerOrSuffix === 'string' ? createLogger(loggerOrSuffix ? `pxe:service:${loggerOrSuffix}` : `pxe:service`) : loggerOrSuffix;
91
- const proverEnabled = !!config.proverEnabled;
99
+ const info = await node.getNodeInfo();
100
+ const proverEnabled = config.proverEnabled !== undefined ? config.proverEnabled : info.realProofs;
92
101
  const addressStore = new AddressStore(store);
93
102
  const privateEventStore = new PrivateEventStore(store);
94
103
  const contractStore = new ContractStore(store);
@@ -101,6 +110,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
101
110
  const keyStore = new KeyStore(store);
102
111
  const tipsStore = new L2TipsKVStore(store, 'pxe');
103
112
  const contractSyncService = new ContractSyncService(node, contractStore, noteStore, createLogger('pxe:contract_sync', bindings));
113
+ const messageContextService = new MessageContextService(node);
104
114
  const synchronizer = new BlockSynchronizer(node, store, anchorBlockStore, noteStore, privateEventStore, tipsStore, contractSyncService, config, bindings);
105
115
  const jobCoordinator = new JobCoordinator(store, bindings);
106
116
  jobCoordinator.registerStores([
@@ -113,18 +123,32 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
113
123
  ]);
114
124
  const debugUtils = new PXEDebugUtils(contractSyncService, noteStore, synchronizer, anchorBlockStore);
115
125
  const jobQueue = new SerialQueue();
116
- const pxe = new PXE(node, synchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, contractSyncService, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debugUtils);
117
- debugUtils.setPXEHelpers(pxe.#putInJobQueue.bind(pxe), pxe.#getSimulatorForTx.bind(pxe), pxe.#simulateUtility.bind(pxe));
126
+ const pxe = new PXE(node, store, synchronizer, keyStore, contractStore, noteStore, capsuleStore, anchorBlockStore, senderTaggingStore, senderAddressBookStore, recipientTaggingStore, addressStore, privateEventStore, contractSyncService, messageContextService, tipsStore, simulator, proverEnabled, proofCreator, protocolContractsProvider, log, jobQueue, jobCoordinator, debugUtils);
127
+ debugUtils.setPXEHelpers(pxe.#putInJobQueue.bind(pxe), pxe.#getSimulatorForTx.bind(pxe), pxe.#executeUtility.bind(pxe));
118
128
  pxe.jobQueue.start();
119
129
  await pxe.#registerProtocolContracts();
120
- const info = await node.getNodeInfo();
121
130
  log.info(`Started PXE connected to chain ${info.l1ChainId} version ${info.rollupVersion}`);
122
131
  return pxe;
123
132
  }
124
133
  // Internal methods
125
134
  #getSimulatorForTx(overrides) {
126
135
  const proxyContractStore = ProxiedContractStoreFactory.create(this.contractStore, overrides?.contracts);
127
- return new ContractFunctionSimulator(proxyContractStore, this.noteStore, this.keyStore, this.addressStore, BenchmarkedNodeFactory.create(this.node), this.senderTaggingStore, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, this.simulator, this.contractSyncService);
136
+ return new ContractFunctionSimulator({
137
+ contractStore: proxyContractStore,
138
+ noteStore: this.noteStore,
139
+ keyStore: this.keyStore,
140
+ addressStore: this.addressStore,
141
+ aztecNode: BenchmarkedNodeFactory.create(this.node),
142
+ l2TipsStore: this.l2TipsStore,
143
+ senderTaggingStore: this.senderTaggingStore,
144
+ recipientTaggingStore: this.recipientTaggingStore,
145
+ senderAddressBookStore: this.senderAddressBookStore,
146
+ capsuleStore: this.capsuleStore,
147
+ privateEventStore: this.privateEventStore,
148
+ simulator: this.simulator,
149
+ contractSyncService: this.contractSyncService,
150
+ messageContextService: this.messageContextService
151
+ });
128
152
  }
129
153
  #contextualizeError(err, ...context) {
130
154
  let contextStr = '';
@@ -167,8 +191,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
167
191
  async #registerProtocolContracts() {
168
192
  const registered = {};
169
193
  for (const name of protocolContractNames){
170
- const { address, contractClass, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
171
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
194
+ const { address, instance, artifact } = await this.protocolContractsProvider.getProtocolContractArtifact(name);
195
+ await this.contractStore.addContractArtifact(artifact);
172
196
  await this.contractStore.addContractInstance(instance);
173
197
  registered[name] = address.toString();
174
198
  }
@@ -176,14 +200,18 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
176
200
  }
177
201
  // Executes the entrypoint private function, as well as all nested private
178
202
  // functions that might arise.
179
- async #executePrivate(contractFunctionSimulator, txRequest, scopes, jobId) {
203
+ async #executePrivate({ contractFunctionSimulator, txRequest, anchorBlockHeader, scopes, jobId, senderForTags }) {
180
204
  const { origin: contractAddress, functionSelector } = txRequest;
181
205
  try {
182
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
183
- await this.contractSyncService.ensureContractSynced(contractAddress, functionSelector, (privateSyncCall)=>this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId), anchorBlockHeader, jobId);
184
- const result = await contractFunctionSimulator.run(txRequest, contractAddress, functionSelector, undefined, anchorBlockHeader, // The sender for tags is set by contracts, typically by an account
185
- // contract entrypoint
186
- undefined, scopes, jobId);
206
+ await this.contractSyncService.ensureContractSynced(contractAddress, functionSelector, (privateSyncCall, execScopes)=>this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes);
207
+ const result = await contractFunctionSimulator.run(txRequest, {
208
+ contractAddress,
209
+ selector: functionSelector,
210
+ anchorBlockHeader,
211
+ scopes,
212
+ jobId,
213
+ senderForTags
214
+ });
187
215
  this.log.debug(`Private simulation completed for ${contractAddress.toString()}:${functionSelector}`);
188
216
  return result;
189
217
  } catch (err) {
@@ -194,18 +222,22 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
194
222
  }
195
223
  }
196
224
  /**
197
- * Simulate a utility function call on the given contract.
225
+ * Execute a utility function call on the given contract.
198
226
  * @param contractFunctionSimulator - The simulator to use for the function call.
199
227
  * @param call - The function call to execute.
200
228
  * @param authWitnesses - Authentication witnesses required for the function call.
201
229
  * @param scopes - Optional array of account addresses whose notes can be accessed in this call. Defaults to all
202
230
  * accounts if not specified.
203
231
  * @param jobId - The job ID for staged writes.
204
- * @returns The simulation result containing the outputs of the utility function.
205
- */ async #simulateUtility(contractFunctionSimulator, call, authWitnesses, scopes, jobId) {
232
+ * @returns The execution result containing the outputs of the utility function.
233
+ */ async #executeUtility(contractFunctionSimulator, call, authWitnesses, scopes, jobId) {
206
234
  try {
207
235
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
208
- return contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
236
+ const { result, offchainEffects } = await contractFunctionSimulator.runUtility(call, authWitnesses ?? [], anchorBlockHeader, scopes, jobId);
237
+ return {
238
+ result,
239
+ offchainEffects
240
+ };
209
241
  } catch (err) {
210
242
  if (err instanceof SimulationError) {
211
243
  await enrichSimulationError(err, this.contractStore, this.log);
@@ -248,16 +280,26 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
248
280
  * @param privateExecutionResult - The result of the private execution
249
281
  * @param config - The configuration for the kernel execution prover.
250
282
  * @returns An object that contains the output of the kernel execution, including the ChonkProof if proving is enabled.
251
- */ async #prove(txExecutionRequest, proofCreator, privateExecutionResult, config) {
252
- const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
253
- const anchorBlockHash = await anchorBlockHeader.hash();
254
- const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHash);
283
+ */ async #prove(txExecutionRequest, proofCreator, privateExecutionResult, anchorBlockHeader, config) {
284
+ const kernelOracle = new PrivateKernelOracle(this.contractStore, this.keyStore, this.node, anchorBlockHeader);
255
285
  const kernelTraceProver = new PrivateKernelExecutionProver(kernelOracle, proofCreator, !this.proverEnabled, this.log.getBindings());
256
286
  this.log.debug(`Executing kernel trace prover (${JSON.stringify(config)})...`);
257
287
  return await kernelTraceProver.proveWithKernels(txExecutionRequest.toTxRequest(), privateExecutionResult, config);
258
288
  }
259
289
  // Public API
260
- getContractInstance(address) {
290
+ /**
291
+ * Returns the block header up to which the PXE has synced.
292
+ * @returns The synced block header
293
+ */ getSyncedBlockHeader() {
294
+ return this.#putInJobQueue(()=>{
295
+ return this.anchorBlockStore.getBlockHeader();
296
+ });
297
+ }
298
+ /**
299
+ * Returns the contract instance for a given address, if it's registered in the PXE.
300
+ * @param address - The contract address.
301
+ * @returns The contract instance if found, undefined otherwise.
302
+ */ getContractInstance(address) {
261
303
  return this.contractStore.getContractInstance(address);
262
304
  }
263
305
  /**
@@ -299,6 +341,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
299
341
  * @returns The address of the sender.
300
342
  * TODO: It's strange that we return the address here and I (benesjan) think we should drop the return value.
301
343
  */ async registerSender(sender) {
344
+ if (!await sender.isValid()) {
345
+ throw new Error(`Address ${sender} is not valid: it does not correspond to a point on the Grumpkin curve. Cannot register it as a sender.`);
346
+ }
302
347
  const accounts = await this.keyStore.getAccounts();
303
348
  if (accounts.includes(sender)) {
304
349
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
@@ -307,6 +352,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
307
352
  const wasAdded = await this.senderAddressBookStore.addSender(sender);
308
353
  if (wasAdded) {
309
354
  this.log.info(`Added sender:\n ${sender.toString()}`);
355
+ // Wipe the entire sync cache: the new sender's tagged logs could contain notes/events for any contract, so
356
+ // all contracts must re-sync to discover them. Queued to avoid wiping while a job is in flight.
357
+ await this.#putInJobQueue(()=>Promise.resolve(this.contractSyncService.wipe()));
310
358
  } else {
311
359
  this.log.info(`Sender:\n "${sender.toString()}"\n already registered.`);
312
360
  }
@@ -344,8 +392,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
344
392
  *
345
393
  * @param artifact - The build artifact for the contract class.
346
394
  */ async registerContractClass(artifact) {
347
- const { id: contractClassId } = await getContractClassFromArtifact(artifact);
348
- await this.contractStore.addContractArtifact(contractClassId, artifact);
395
+ const contractClassId = await this.contractStore.addContractArtifact(artifact);
349
396
  this.log.info(`Added contract class ${artifact.name} with id ${contractClassId}`);
350
397
  }
351
398
  /**
@@ -361,15 +408,14 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
361
408
  if (artifact) {
362
409
  // If the user provides an artifact, validate it against the expected class id and register it
363
410
  const contractClass = await getContractClassFromArtifact(artifact);
364
- const contractClassId = contractClass.id;
365
- if (!contractClassId.equals(instance.currentContractClassId)) {
366
- throw new Error(`Artifact does not match expected class id (computed ${contractClassId} but instance refers to ${instance.currentContractClassId})`);
411
+ if (!contractClass.id.equals(instance.currentContractClassId)) {
412
+ throw new Error(`Artifact does not match expected class id (computed ${contractClass.id} but instance refers to ${instance.currentContractClassId})`);
367
413
  }
368
414
  const computedAddress = await computeContractAddressFromInstance(instance);
369
415
  if (!computedAddress.equals(instance.address)) {
370
416
  throw new Error('Added a contract in which the address does not match the contract instance.');
371
417
  }
372
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
418
+ await this.contractStore.addContractArtifact(artifact, contractClass);
373
419
  const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
374
420
  await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
375
421
  } else {
@@ -405,11 +451,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
405
451
  if (!contractClass.id.equals(currentClassId)) {
406
452
  throw new Error('Could not update contract to a class different from the current one.');
407
453
  }
408
- await this.contractStore.addContractArtifact(contractClass.id, artifact);
409
454
  const publicFunctionSignatures = artifact.functions.filter((fn)=>fn.functionType === FunctionType.PUBLIC).map((fn)=>decodeFunctionSignature(fn.name, fn.parameters));
410
455
  await this.node.registerContractFunctionSignatures(publicFunctionSignatures);
411
456
  currentInstance.currentContractClassId = contractClass.id;
412
- await this.contractStore.addContractInstance(currentInstance);
457
+ await Promise.all([
458
+ this.contractStore.addContractArtifact(artifact, contractClass),
459
+ this.contractStore.addContractInstance(currentInstance)
460
+ ]);
413
461
  this.log.info(`Updated contract ${artifact.name} at ${contractAddress.toString()} to class ${contractClass.id}`);
414
462
  });
415
463
  }
@@ -424,10 +472,11 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
424
472
  * (where validators prove the public portion).
425
473
  *
426
474
  * @param txRequest - An authenticated tx request ready for proving
475
+ * @param scopes - Addresses whose private state and keys are accessible during private execution.
427
476
  * @returns A result containing the proof and public inputs of the tail circuit.
428
477
  * @throws If contract code not found, or public simulation reverts.
429
478
  * Also throws if simulatePublic is true and public simulation reverts.
430
- */ proveTx(txRequest) {
479
+ */ proveTx(txRequest, { scopes, senderForTags }) {
431
480
  let privateExecutionResult;
432
481
  // We disable proving concurrently mostly out of caution, since it accesses some of our stores. Proving is so
433
482
  // computationally demanding that it'd be rare for someone to try to do it concurrently regardless.
@@ -436,10 +485,18 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
436
485
  try {
437
486
  const syncTimer = new Timer();
438
487
  await this.blockStateSynchronizer.sync();
488
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
439
489
  const syncTime = syncTimer.ms();
440
490
  const contractFunctionSimulator = this.#getSimulatorForTx();
441
- privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
442
- const { publicInputs, chonkProof, executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
491
+ privateExecutionResult = await this.#executePrivate({
492
+ contractFunctionSimulator,
493
+ txRequest,
494
+ anchorBlockHeader,
495
+ scopes,
496
+ jobId,
497
+ senderForTags
498
+ });
499
+ const { publicInputs, chonkProof, executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
443
500
  simulate: false,
444
501
  skipFeeEnforcement: false,
445
502
  profileMode: 'none'
@@ -469,16 +526,16 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
469
526
  // transaction before this one is included in a block from this PXE, and that transaction contains a log with
470
527
  // a tag derived from the same secret, we would reuse the tag and the transactions would be linked. Hence
471
528
  // storing the tags here prevents linkage of txs sent from the same PXE.
472
- const preTagsUsedInTheTx = privateExecutionResult.entrypoint.preTags;
473
- if (preTagsUsedInTheTx.length > 0) {
529
+ const taggingIndexRangesUsedInTheTx = privateExecutionResult.entrypoint.taggingIndexRanges;
530
+ if (taggingIndexRangesUsedInTheTx.length > 0) {
474
531
  // TODO(benesjan): The following is an expensive operation. Figure out a way to avoid it.
475
532
  const txHash = (await txProvingResult.toTx()).txHash;
476
- await this.senderTaggingStore.storePendingIndexes(preTagsUsedInTheTx, txHash, jobId);
477
- this.log.debug(`Stored used pre-tags as sender for the tx`, {
478
- preTagsUsedInTheTx
533
+ await this.senderTaggingStore.storePendingIndexes(taggingIndexRangesUsedInTheTx, txHash, jobId);
534
+ this.log.debug(`Stored used tagging index ranges as sender for the tx`, {
535
+ taggingIndexRangesUsedInTheTx
479
536
  });
480
537
  } else {
481
- this.log.debug(`No pre-tags used in the tx`);
538
+ this.log.debug(`No tagging index ranges used in the tx`);
482
539
  }
483
540
  return txProvingResult;
484
541
  } catch (err) {
@@ -488,13 +545,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
488
545
  }
489
546
  /**
490
547
  * Profiles a transaction, reporting gate counts (unless disabled) and returns an execution trace.
491
- *
492
- * @param txRequest - An authenticated tx request ready for simulation
493
- * @param msgSender - (Optional) The message sender to use for the simulation.
494
- * @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
548
+ * @param txRequest - An authenticated tx request ready for simulation.
495
549
  * @returns A trace of the program execution with gate counts.
496
550
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
497
- */ profileTx(txRequest, profileMode, skipProofGeneration = true) {
551
+ */ profileTx(txRequest, { profileMode, skipProofGeneration = true, scopes, senderForTags }) {
498
552
  // We disable concurrent profiles for consistency with simulateTx.
499
553
  return this.#putInJobQueue(async (jobId)=>{
500
554
  const totalTimer = new Timer();
@@ -510,10 +564,18 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
510
564
  this.log.info(`Profiling transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`, txInfo);
511
565
  const syncTimer = new Timer();
512
566
  await this.blockStateSynchronizer.sync();
567
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
513
568
  const syncTime = syncTimer.ms();
514
569
  const contractFunctionSimulator = this.#getSimulatorForTx();
515
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, undefined, jobId);
516
- const { executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
570
+ const privateExecutionResult = await this.#executePrivate({
571
+ contractFunctionSimulator,
572
+ txRequest,
573
+ anchorBlockHeader,
574
+ scopes,
575
+ jobId,
576
+ senderForTags
577
+ });
578
+ const { executionSteps, timings: { proving } = {} } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
517
579
  simulate: skipProofGeneration,
518
580
  skipFeeEnforcement: false,
519
581
  profileMode
@@ -557,18 +619,13 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
557
619
  * In that case, the transaction returned is only potentially ready to be sent to the network for execution.
558
620
  *
559
621
  *
560
- * @param txRequest - An authenticated tx request ready for simulation
561
- * @param simulatePublic - Whether to simulate the public part of the transaction.
562
- * @param skipTxValidation - (Optional) If false, this function throws if the transaction is unable to be included in a block at the current state.
563
- * @param skipFeeEnforcement - (Optional) If false, fees are enforced.
564
- * @param overrides - (Optional) State overrides for the simulation, such as msgSender, contract instances and artifacts.
565
- * @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will default to all.
622
+ * @param txRequest - An authenticated tx request ready for simulation.
566
623
  * @returns A simulated transaction result object that includes public and private return values.
567
624
  * @throws If the code for the functions executed in this transaction have not been made available via `addContracts`.
568
625
  * Also throws if simulatePublic is true and public simulation reverts.
569
626
  *
570
627
  * TODO(#7456) Prevent msgSender being defined here for the first call
571
- */ simulateTx(txRequest, simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, overrides, scopes) {
628
+ */ simulateTx(txRequest, { simulatePublic, skipTxValidation = false, skipFeeEnforcement = false, skipKernels = true, overrides, scopes, senderForTags }) {
572
629
  // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
573
630
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
574
631
  // delete the same read value, or reading values that another simulation is currently modifying).
@@ -586,27 +643,35 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
586
643
  this.log.info(`Simulating transaction execution request to ${txRequest.functionSelector} at ${txRequest.origin}`, txInfo);
587
644
  const syncTimer = new Timer();
588
645
  await this.blockStateSynchronizer.sync();
646
+ const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
589
647
  const syncTime = syncTimer.ms();
590
- const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
591
- // Temporary: in case there are overrides, we have to skip the kernels or validations
592
- // will fail. Consider handing control to the user/wallet on whether they want to run them
593
- // or not.
594
648
  const overriddenContracts = overrides?.contracts ? new Set(Object.keys(overrides.contracts)) : undefined;
595
649
  const hasOverriddenContracts = overriddenContracts !== undefined && overriddenContracts.size > 0;
596
- const skipKernels = hasOverriddenContracts;
597
- // Set overridden contracts on the sync service so it knows to skip syncing them
650
+ if (hasOverriddenContracts && !skipKernels) {
651
+ throw new Error('Simulating with overridden contracts is not compatible with kernel execution. Please set skipKernels to true when simulating with overridden contracts.');
652
+ }
653
+ const contractFunctionSimulator = this.#getSimulatorForTx(overrides);
598
654
  if (hasOverriddenContracts) {
599
- this.contractSyncService.setOverriddenContracts(jobId, overriddenContracts);
655
+ // Overridden contracts don't have a sync function, so calling sync on them would fail.
656
+ // We exclude them so the sync service skips them entirely.
657
+ this.contractSyncService.setExcludedFromSync(jobId, overriddenContracts);
600
658
  }
601
659
  // Execution of private functions only; no proving, and no kernel logic.
602
- const privateExecutionResult = await this.#executePrivate(contractFunctionSimulator, txRequest, scopes, jobId);
660
+ const privateExecutionResult = await this.#executePrivate({
661
+ contractFunctionSimulator,
662
+ txRequest,
663
+ anchorBlockHeader,
664
+ scopes,
665
+ jobId,
666
+ senderForTags
667
+ });
603
668
  let publicInputs;
604
669
  let executionSteps = [];
605
670
  if (skipKernels) {
606
- ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(privateExecutionResult, this.contractStore));
671
+ ({ publicInputs, executionSteps } = await generateSimulatedProvingResult(privateExecutionResult, (addr, sel)=>this.contractStore.getDebugFunctionName(addr, sel), this.node));
607
672
  } else {
608
673
  // Kernel logic, plus proving of all private functions and kernels.
609
- ({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, {
674
+ ({ publicInputs, executionSteps } = await this.#prove(txRequest, this.proofCreator, privateExecutionResult, anchorBlockHeader, {
610
675
  simulate: true,
611
676
  skipFeeEnforcement,
612
677
  profileMode: 'none'
@@ -620,6 +685,9 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
620
685
  const publicSimulationTimer = new Timer();
621
686
  publicOutput = await this.#simulatePublicCalls(simulatedTx, skipFeeEnforcement);
622
687
  publicSimulationTime = publicSimulationTimer.ms();
688
+ if (publicOutput?.debugLogs?.length) {
689
+ await displayDebugLogs(publicOutput.debugLogs, (addr)=>this.contractStore.getDebugContractName(addr));
690
+ }
623
691
  }
624
692
  let validationTime;
625
693
  if (!skipTxValidation) {
@@ -630,7 +698,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
630
698
  });
631
699
  validationTime = validationTimer.ms();
632
700
  if (validationResult.result === 'invalid') {
633
- throw new Error('The simulated transaction is unable to be added to state and is invalid.');
701
+ const reason = validationResult.reason.length > 0 ? ` Reason: ${validationResult.reason.join(', ')}` : '';
702
+ throw new Error(`The simulated transaction is unable to be added to state and is invalid.${reason}`);
634
703
  }
635
704
  }
636
705
  const txHash = simulatedTx.getTxHash();
@@ -663,22 +732,19 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
663
732
  nodeRPCCalls: simulatorStats.nodeRPCCalls
664
733
  });
665
734
  } catch (err) {
666
- throw this.#contextualizeError(err, inspect(txRequest), `simulatePublic=${simulatePublic}`, `skipTxValidation=${skipTxValidation}`, `scopes=${scopes?.map((s)=>s.toString()).join(', ') ?? 'undefined'}`);
735
+ throw this.#contextualizeError(err, inspect(txRequest), `simulatePublic=${simulatePublic}`, `skipTxValidation=${skipTxValidation}`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
667
736
  }
668
737
  });
669
738
  }
670
739
  /**
671
- * Simulate the execution of a contract utility function.
672
- *
740
+ * Executes a contract utility function.
673
741
  * @param call - The function call containing the function details, arguments, and target contract address.
674
- * @param authwits - (Optional) The authentication witnesses required for the function call.
675
- * @param scopes - (Optional) The accounts whose notes we can access in this call. Currently optional and will
676
- * default to all.
677
- * @returns The result of the utility function call, structured based on the function ABI.
678
- */ simulateUtility(call, authwits, scopes) {
679
- // We disable concurrent simulations since those might execute oracles which read and write to the PXE stores (e.g.
742
+ */ executeUtility(call, { authwits, scopes } = {
743
+ scopes: []
744
+ }) {
745
+ // We disable concurrent executions since those might execute oracles which read and write to the PXE stores (e.g.
680
746
  // to the capsules), and we need to prevent concurrent runs from interfering with one another (e.g. attempting to
681
- // delete the same read value, or reading values that another simulation is currently modifying).
747
+ // delete the same read value, or reading values that another execution is currently modifying).
682
748
  return this.#putInJobQueue(async (jobId)=>{
683
749
  try {
684
750
  const totalTimer = new Timer();
@@ -688,8 +754,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
688
754
  const functionTimer = new Timer();
689
755
  const contractFunctionSimulator = this.#getSimulatorForTx();
690
756
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
691
- await this.contractSyncService.ensureContractSynced(call.to, call.selector, (privateSyncCall)=>this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId), anchorBlockHeader, jobId);
692
- const executionResult = await this.#simulateUtility(contractFunctionSimulator, call, authwits ?? [], scopes, jobId);
757
+ await this.contractSyncService.ensureContractSynced(call.to, call.selector, (privateSyncCall, execScopes)=>this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, scopes);
758
+ const { result: executionResult, offchainEffects } = await this.#executeUtility(contractFunctionSimulator, call, authwits ?? [], scopes, jobId);
693
759
  const functionTime = functionTimer.ms();
694
760
  const totalTime = totalTimer.ms();
695
761
  const perFunction = [
@@ -707,6 +773,8 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
707
773
  const simulationStats = contractFunctionSimulator.getStats();
708
774
  return {
709
775
  result: executionResult,
776
+ offchainEffects,
777
+ anchorBlockTimestamp: anchorBlockHeader.globalVariables.timestamp,
710
778
  stats: {
711
779
  timings,
712
780
  nodeRPCCalls: simulationStats.nodeRPCCalls
@@ -715,7 +783,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
715
783
  } catch (err) {
716
784
  const { to, name, args } = call;
717
785
  const stringifiedArgs = args.map((arg)=>arg.toString()).join(', ');
718
- throw this.#contextualizeError(err, `simulateUtility ${to}:${name}(${stringifiedArgs})`, `scopes=${scopes?.map((s)=>s.toString()).join(', ') ?? 'undefined'}`);
786
+ throw this.#contextualizeError(err, `executeUtility ${to}:${name}(${stringifiedArgs})`, `scopes=${scopes.map((s)=>s.toString()).join(', ')}`);
719
787
  }
720
788
  });
721
789
  }
@@ -738,7 +806,7 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
738
806
  const anchorBlockHeader = await this.anchorBlockStore.getBlockHeader();
739
807
  anchorBlockNumber = anchorBlockHeader.getBlockNumber();
740
808
  const contractFunctionSimulator = this.#getSimulatorForTx();
741
- await this.contractSyncService.ensureContractSynced(filter.contractAddress, null, async (privateSyncCall)=>await this.#simulateUtility(contractFunctionSimulator, privateSyncCall, [], undefined, jobId), anchorBlockHeader, jobId);
809
+ await this.contractSyncService.ensureContractSynced(filter.contractAddress, null, async (privateSyncCall, execScopes)=>await this.#executeUtility(contractFunctionSimulator, privateSyncCall, [], execScopes, jobId), anchorBlockHeader, jobId, filter.scopes);
742
810
  });
743
811
  // anchorBlockNumber is set during the job and fixed to whatever it is after a block sync
744
812
  const sanitizedFilter = new PrivateEventFilterValidator(anchorBlockNumber).validate(filter);
@@ -746,8 +814,10 @@ import { SenderTaggingStore } from './storage/tagging_store/sender_tagging_store
746
814
  return this.privateEventStore.getPrivateEvents(eventSelector, sanitizedFilter);
747
815
  }
748
816
  /**
749
- * Stops the PXE's job queue.
750
- */ stop() {
751
- return this.jobQueue.end();
817
+ * Stops the PXE's job queue and closes the backing store.
818
+ */ async stop() {
819
+ await this.jobQueue.end();
820
+ await this.blockStateSynchronizer.stop();
821
+ await this.db.close();
752
822
  }
753
823
  }
@@ -17,7 +17,7 @@ export class AnchorBlockStore {
17
17
  await this.#synchronizedHeader.set(header.toBuffer());
18
18
  }
19
19
  async getBlockHeader() {
20
- const headerBuffer = await this.#synchronizedHeader.getAsync();
20
+ const headerBuffer = await this.#store.transactionAsync(()=>this.#synchronizedHeader.getAsync());
21
21
  if (!headerBuffer) {
22
22
  throw new Error(`Trying to get block header with a not-yet-synchronized PXE - this should never happen`);
23
23
  }
@@ -0,0 +1,21 @@
1
+ import type { Fr } from '@aztec/foundation/curves/bn254';
2
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
3
+ import type { Capsule } from '@aztec/stdlib/tx';
4
+ import type { CapsuleStore } from './capsule_store.js';
5
+ /**
6
+ * Wraps a CapsuleStore with scope-based access control. Each operation asserts that the requested scope is in the
7
+ * allowed scopes list before delegating to the underlying store.
8
+ */
9
+ export declare class CapsuleService {
10
+ private readonly capsuleStore;
11
+ private readonly allowedScopes;
12
+ constructor(capsuleStore: CapsuleStore, allowedScopes: AztecAddress[]);
13
+ setCapsule(contractAddress: AztecAddress, slot: Fr, capsule: Fr[], jobId: string, scope: AztecAddress): void;
14
+ getCapsule(contractAddress: AztecAddress, slot: Fr, jobId: string, scope: AztecAddress, transientCapsules?: Capsule[]): Promise<Fr[] | null>;
15
+ deleteCapsule(contractAddress: AztecAddress, slot: Fr, jobId: string, scope: AztecAddress): void;
16
+ copyCapsule(contractAddress: AztecAddress, srcSlot: Fr, dstSlot: Fr, numEntries: number, jobId: string, scope: AztecAddress): Promise<void>;
17
+ appendToCapsuleArray(contractAddress: AztecAddress, baseSlot: Fr, content: Fr[][], jobId: string, scope: AztecAddress): Promise<void>;
18
+ readCapsuleArray(contractAddress: AztecAddress, baseSlot: Fr, jobId: string, scope: AztecAddress): Promise<Fr[][]>;
19
+ setCapsuleArray(contractAddress: AztecAddress, baseSlot: Fr, content: Fr[][], jobId: string, scope: AztecAddress): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fwc3VsZV9zZXJ2aWNlLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc3RvcmFnZS9jYXBzdWxlX3N0b3JlL2NhcHN1bGVfc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFFdkQ7OztHQUdHO0FBQ0gscUJBQWEsY0FBYztJQUV2QixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVk7SUFDN0IsT0FBTyxDQUFDLFFBQVEsQ0FBQyxhQUFhO0lBRmhDLFlBQ21CLFlBQVksRUFBRSxZQUFZLEVBQzFCLGFBQWEsRUFBRSxZQUFZLEVBQUUsRUFDNUM7SUFFSixVQUFVLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLFFBR3BHO0lBRUssVUFBVSxDQUNkLGVBQWUsRUFBRSxZQUFZLEVBQzdCLElBQUksRUFBRSxFQUFFLEVBQ1IsS0FBSyxFQUFFLE1BQU0sRUFDYixLQUFLLEVBQUUsWUFBWSxFQUNuQixpQkFBaUIsQ0FBQyxFQUFFLE9BQU8sRUFBRSxHQUM1QixPQUFPLENBQUMsRUFBRSxFQUFFLEdBQUcsSUFBSSxDQUFDLENBWXRCO0lBRUQsYUFBYSxDQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxZQUFZLFFBR3hGO0lBRUQsV0FBVyxDQUNULGVBQWUsRUFBRSxZQUFZLEVBQzdCLE9BQU8sRUFBRSxFQUFFLEVBQ1gsT0FBTyxFQUFFLEVBQUUsRUFDWCxVQUFVLEVBQUUsTUFBTSxFQUNsQixLQUFLLEVBQUUsTUFBTSxFQUNiLEtBQUssRUFBRSxZQUFZLEdBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FHZjtJQUVELG9CQUFvQixDQUNsQixlQUFlLEVBQUUsWUFBWSxFQUM3QixRQUFRLEVBQUUsRUFBRSxFQUNaLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUNmLEtBQUssRUFBRSxNQUFNLEVBQ2IsS0FBSyxFQUFFLFlBQVksR0FDbEIsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUdmO0lBRUQsZ0JBQWdCLENBQUMsZUFBZSxFQUFFLFlBQVksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFlBQVksR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUdqSDtJQUVELGVBQWUsQ0FBQyxlQUFlLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsWUFBWSxpQkFHL0c7Q0FDRiJ9
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capsule_service.d.ts","sourceRoot":"","sources":["../../../src/storage/capsule_store/capsule_service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAC3D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAEhD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAEvD;;;GAGG;AACH,qBAAa,cAAc;IAEvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAFhC,YACmB,YAAY,EAAE,YAAY,EAC1B,aAAa,EAAE,YAAY,EAAE,EAC5C;IAEJ,UAAU,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,QAGpG;IAEK,UAAU,CACd,eAAe,EAAE,YAAY,EAC7B,IAAI,EAAE,EAAE,EACR,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,EACnB,iBAAiB,CAAC,EAAE,OAAO,EAAE,GAC5B,OAAO,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,CAYtB;IAED,aAAa,CAAC,eAAe,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,QAGxF;IAED,WAAW,CACT,eAAe,EAAE,YAAY,EAC7B,OAAO,EAAE,EAAE,EACX,OAAO,EAAE,EAAE,EACX,UAAU,EAAE,MAAM,EAClB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;IAED,oBAAoB,CAClB,eAAe,EAAE,YAAY,EAC7B,QAAQ,EAAE,EAAE,EACZ,OAAO,EAAE,EAAE,EAAE,EAAE,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,YAAY,GAClB,OAAO,CAAC,IAAI,CAAC,CAGf;IAED,gBAAgB,CAAC,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAGjH;IAED,eAAe,CAAC,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,iBAG/G;CACF"}
@@ -0,0 +1,50 @@
1
+ import { AztecAddress } from '@aztec/stdlib/aztec-address';
2
+ /**
3
+ * Wraps a CapsuleStore with scope-based access control. Each operation asserts that the requested scope is in the
4
+ * allowed scopes list before delegating to the underlying store.
5
+ */ export class CapsuleService {
6
+ capsuleStore;
7
+ allowedScopes;
8
+ constructor(capsuleStore, allowedScopes){
9
+ this.capsuleStore = capsuleStore;
10
+ this.allowedScopes = allowedScopes;
11
+ }
12
+ setCapsule(contractAddress, slot, capsule, jobId, scope) {
13
+ assertAllowedScope(scope, this.allowedScopes);
14
+ this.capsuleStore.setCapsule(contractAddress, slot, capsule, jobId, scope);
15
+ }
16
+ async getCapsule(contractAddress, slot, jobId, scope, transientCapsules) {
17
+ assertAllowedScope(scope, this.allowedScopes);
18
+ // TODO(#12425): On the following line, the pertinent capsule gets overshadowed by the transient one. Tackle this.
19
+ const maybeTransientCapsule = transientCapsules?.find((c)=>c.contractAddress.equals(contractAddress) && c.storageSlot.equals(slot) && (c.scope ?? AztecAddress.ZERO).equals(scope))?.data;
20
+ return maybeTransientCapsule ?? await this.capsuleStore.getCapsule(contractAddress, slot, jobId, scope);
21
+ }
22
+ deleteCapsule(contractAddress, slot, jobId, scope) {
23
+ assertAllowedScope(scope, this.allowedScopes);
24
+ this.capsuleStore.deleteCapsule(contractAddress, slot, jobId, scope);
25
+ }
26
+ copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, jobId, scope) {
27
+ assertAllowedScope(scope, this.allowedScopes);
28
+ return this.capsuleStore.copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, jobId, scope);
29
+ }
30
+ appendToCapsuleArray(contractAddress, baseSlot, content, jobId, scope) {
31
+ assertAllowedScope(scope, this.allowedScopes);
32
+ return this.capsuleStore.appendToCapsuleArray(contractAddress, baseSlot, content, jobId, scope);
33
+ }
34
+ readCapsuleArray(contractAddress, baseSlot, jobId, scope) {
35
+ assertAllowedScope(scope, this.allowedScopes);
36
+ return this.capsuleStore.readCapsuleArray(contractAddress, baseSlot, jobId, scope);
37
+ }
38
+ setCapsuleArray(contractAddress, baseSlot, content, jobId, scope) {
39
+ assertAllowedScope(scope, this.allowedScopes);
40
+ return this.capsuleStore.setCapsuleArray(contractAddress, baseSlot, content, jobId, scope);
41
+ }
42
+ }
43
+ function assertAllowedScope(scope, allowedScopes) {
44
+ if (scope.equals(AztecAddress.ZERO)) {
45
+ return;
46
+ }
47
+ if (!allowedScopes.some((allowed)=>allowed.equals(scope))) {
48
+ throw new Error(`Scope ${scope.toString()} is not in the allowed scopes list: [${allowedScopes.map((s)=>s.toString()).join(', ')}]. See https://docs.aztec.network/errors/10`);
49
+ }
50
+ }