@aztec/simulator 0.0.1-commit.03f7ef2 → 0.0.1-commit.04d373f

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 (255) hide show
  1. package/README.md +6 -4
  2. package/dest/common/errors.d.ts +7 -1
  3. package/dest/common/errors.d.ts.map +1 -1
  4. package/dest/private/acvm/acvm.d.ts +4 -2
  5. package/dest/private/acvm/acvm.d.ts.map +1 -1
  6. package/dest/private/acvm/acvm.js +4 -3
  7. package/dest/private/acvm_native.d.ts +5 -3
  8. package/dest/private/acvm_native.d.ts.map +1 -1
  9. package/dest/private/acvm_native.js +8 -6
  10. package/dest/private/acvm_wasm.d.ts +4 -3
  11. package/dest/private/acvm_wasm.d.ts.map +1 -1
  12. package/dest/private/acvm_wasm.js +7 -5
  13. package/dest/private/circuit_recording/circuit_recorder.d.ts +4 -3
  14. package/dest/private/circuit_recording/circuit_recorder.d.ts.map +1 -1
  15. package/dest/private/circuit_recording/circuit_recorder.js +22 -19
  16. package/dest/private/circuit_recording/file_circuit_recorder.d.ts +3 -2
  17. package/dest/private/circuit_recording/file_circuit_recorder.d.ts.map +1 -1
  18. package/dest/private/circuit_recording/file_circuit_recorder.js +2 -2
  19. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts +7 -2
  20. package/dest/private/circuit_recording/memory_circuit_recorder.d.ts.map +1 -1
  21. package/dest/private/circuit_recording/memory_circuit_recorder.js +4 -4
  22. package/dest/private/factory.d.ts +3 -3
  23. package/dest/private/factory.d.ts.map +1 -1
  24. package/dest/private/factory.js +7 -4
  25. package/dest/public/avm/avm_context.d.ts +3 -3
  26. package/dest/public/avm/avm_context.d.ts.map +1 -1
  27. package/dest/public/avm/avm_contract_call_result.d.ts +6 -6
  28. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  29. package/dest/public/avm/avm_contract_call_result.js +3 -3
  30. package/dest/public/avm/avm_execution_environment.d.ts +6 -5
  31. package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
  32. package/dest/public/avm/avm_gas.js +3 -3
  33. package/dest/public/avm/avm_machine_state.d.ts +6 -5
  34. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  35. package/dest/public/avm/avm_machine_state.js +3 -2
  36. package/dest/public/avm/avm_memory_types.d.ts +1 -1
  37. package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
  38. package/dest/public/avm/avm_memory_types.js +3 -0
  39. package/dest/public/avm/avm_simulator.d.ts +3 -2
  40. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  41. package/dest/public/avm/avm_simulator.js +6 -5
  42. package/dest/public/avm/calldata.d.ts +51 -0
  43. package/dest/public/avm/calldata.d.ts.map +1 -0
  44. package/dest/public/avm/calldata.js +64 -0
  45. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts +2 -0
  46. package/dest/public/avm/fixtures/account_proof_fetcher.d.ts.map +1 -0
  47. package/dest/public/avm/fixtures/account_proof_fetcher.js +152 -0
  48. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +1 -1
  49. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  50. package/dest/public/avm/fixtures/avm_simulation_tester.js +3 -2
  51. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +2 -1
  52. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  53. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +17 -2
  54. package/dest/public/avm/fixtures/initializers.d.ts +1 -1
  55. package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
  56. package/dest/public/avm/fixtures/initializers.js +2 -1
  57. package/dest/public/avm/fixtures/utils.d.ts +1 -1
  58. package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
  59. package/dest/public/avm/fixtures/utils.js +3 -0
  60. package/dest/public/avm/opcodes/accrued_substate.d.ts +17 -18
  61. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  62. package/dest/public/avm/opcodes/accrued_substate.js +42 -43
  63. package/dest/public/avm/opcodes/arithmetic.d.ts +8 -8
  64. package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
  65. package/dest/public/avm/opcodes/arithmetic.js +1 -1
  66. package/dest/public/avm/opcodes/bitwise.d.ts +7 -7
  67. package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
  68. package/dest/public/avm/opcodes/bitwise.js +5 -5
  69. package/dest/public/avm/opcodes/comparators.d.ts +4 -4
  70. package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
  71. package/dest/public/avm/opcodes/comparators.js +1 -1
  72. package/dest/public/avm/opcodes/contract.d.ts +5 -4
  73. package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
  74. package/dest/public/avm/opcodes/contract.js +13 -9
  75. package/dest/public/avm/opcodes/control_flow.d.ts +3 -3
  76. package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
  77. package/dest/public/avm/opcodes/control_flow.js +4 -4
  78. package/dest/public/avm/opcodes/conversion.d.ts +3 -3
  79. package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
  80. package/dest/public/avm/opcodes/conversion.js +4 -4
  81. package/dest/public/avm/opcodes/ec_add.d.ts +4 -6
  82. package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
  83. package/dest/public/avm/opcodes/ec_add.js +22 -27
  84. package/dest/public/avm/opcodes/environment_getters.d.ts +5 -5
  85. package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
  86. package/dest/public/avm/opcodes/environment_getters.js +6 -6
  87. package/dest/public/avm/opcodes/external_calls.d.ts +9 -9
  88. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  89. package/dest/public/avm/opcodes/external_calls.js +23 -22
  90. package/dest/public/avm/opcodes/hashing.d.ts +8 -8
  91. package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
  92. package/dest/public/avm/opcodes/hashing.js +12 -12
  93. package/dest/public/avm/opcodes/instruction_impl.d.ts +4 -4
  94. package/dest/public/avm/opcodes/instruction_impl.d.ts.map +1 -1
  95. package/dest/public/avm/opcodes/instruction_impl.js +4 -4
  96. package/dest/public/avm/opcodes/memory.d.ts +14 -14
  97. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  98. package/dest/public/avm/opcodes/memory.js +25 -25
  99. package/dest/public/avm/opcodes/misc.d.ts +3 -3
  100. package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
  101. package/dest/public/avm/opcodes/misc.js +4 -4
  102. package/dest/public/avm/opcodes/storage.d.ts +16 -15
  103. package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
  104. package/dest/public/avm/opcodes/storage.js +34 -24
  105. package/dest/public/avm/serialization/bytecode_serialization.js +3 -3
  106. package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
  107. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  108. package/dest/public/avm/serialization/instruction_serialization.js +1 -1
  109. package/dest/public/contracts_db_checkpoint.d.ts +2 -2
  110. package/dest/public/contracts_db_checkpoint.d.ts.map +1 -1
  111. package/dest/public/contracts_db_checkpoint.js +1 -1
  112. package/dest/public/debug_fn_name.d.ts +4 -4
  113. package/dest/public/debug_fn_name.d.ts.map +1 -1
  114. package/dest/public/debug_fn_name.js +7 -5
  115. package/dest/public/executor_metrics.d.ts +1 -1
  116. package/dest/public/executor_metrics.d.ts.map +1 -1
  117. package/dest/public/executor_metrics.js +12 -33
  118. package/dest/public/fixtures/amm_test.js +2 -2
  119. package/dest/public/fixtures/bulk_test.d.ts +3 -3
  120. package/dest/public/fixtures/bulk_test.d.ts.map +1 -1
  121. package/dest/public/fixtures/bulk_test.js +32 -21
  122. package/dest/public/fixtures/custom_bytecode_tests.d.ts +13 -11
  123. package/dest/public/fixtures/custom_bytecode_tests.d.ts.map +1 -1
  124. package/dest/public/fixtures/custom_bytecode_tests.js +79 -19
  125. package/dest/public/fixtures/minimal_public_tx.js +2 -2
  126. package/dest/public/fixtures/opcode_spammer.d.ts +3 -4
  127. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
  128. package/dest/public/fixtures/opcode_spammer.js +100 -136
  129. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +6 -5
  130. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  131. package/dest/public/fixtures/public_tx_simulation_tester.js +37 -10
  132. package/dest/public/fixtures/utils.d.ts +2 -2
  133. package/dest/public/fixtures/utils.d.ts.map +1 -1
  134. package/dest/public/fixtures/utils.js +19 -20
  135. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts +21 -7
  136. package/dest/public/fuzzing/avm_fuzzer_simulator.d.ts.map +1 -1
  137. package/dest/public/fuzzing/avm_fuzzer_simulator.js +42 -10
  138. package/dest/public/fuzzing/avm_simulator_bin.js +29 -11
  139. package/dest/public/hinting_db_sources.d.ts +5 -5
  140. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  141. package/dest/public/hinting_db_sources.js +10 -7
  142. package/dest/public/public_db_sources.d.ts +9 -5
  143. package/dest/public/public_db_sources.d.ts.map +1 -1
  144. package/dest/public/public_db_sources.js +20 -14
  145. package/dest/public/public_processor/guarded_merkle_tree.d.ts +5 -5
  146. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  147. package/dest/public/public_processor/guarded_merkle_tree.js +7 -5
  148. package/dest/public/public_processor/public_processor.d.ts +11 -6
  149. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  150. package/dest/public/public_processor/public_processor.js +511 -92
  151. package/dest/public/public_processor/public_processor_metrics.d.ts +5 -2
  152. package/dest/public/public_processor/public_processor_metrics.d.ts.map +1 -1
  153. package/dest/public/public_processor/public_processor_metrics.js +36 -45
  154. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts +3 -2
  155. package/dest/public/public_tx_simulator/contract_provider_for_cpp.d.ts.map +1 -1
  156. package/dest/public/public_tx_simulator/contract_provider_for_cpp.js +5 -4
  157. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +5 -5
  158. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  159. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +10 -10
  160. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +4 -4
  161. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
  162. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +7 -7
  163. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts +4 -4
  164. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.d.ts.map +1 -1
  165. package/dest/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.js +6 -6
  166. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts +3 -2
  167. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.d.ts.map +1 -1
  168. package/dest/public/public_tx_simulator/dumping_cpp_public_tx_simulator.js +2 -2
  169. package/dest/public/public_tx_simulator/factories.d.ts +3 -2
  170. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  171. package/dest/public/public_tx_simulator/factories.js +4 -4
  172. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +1 -1
  173. package/dest/public/public_tx_simulator/public_tx_context.d.ts +10 -5
  174. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  175. package/dest/public/public_tx_simulator/public_tx_context.js +16 -18
  176. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +11 -5
  177. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  178. package/dest/public/public_tx_simulator/public_tx_simulator.js +26 -16
  179. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +395 -19
  180. package/dest/public/side_effect_trace.d.ts +5 -4
  181. package/dest/public/side_effect_trace.d.ts.map +1 -1
  182. package/dest/public/side_effect_trace.js +3 -3
  183. package/dest/public/state_manager/state_manager.d.ts +10 -4
  184. package/dest/public/state_manager/state_manager.d.ts.map +1 -1
  185. package/dest/public/state_manager/state_manager.js +14 -7
  186. package/dest/public/test_executor_metrics.d.ts +8 -2
  187. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  188. package/dest/public/test_executor_metrics.js +24 -2
  189. package/package.json +17 -17
  190. package/src/private/acvm/acvm.ts +4 -3
  191. package/src/private/acvm_native.ts +11 -5
  192. package/src/private/acvm_wasm.ts +11 -4
  193. package/src/private/circuit_recording/circuit_recorder.ts +23 -20
  194. package/src/private/circuit_recording/file_circuit_recorder.ts +7 -2
  195. package/src/private/circuit_recording/memory_circuit_recorder.ts +6 -4
  196. package/src/private/factory.ts +7 -4
  197. package/src/public/avm/avm_context.ts +2 -2
  198. package/src/public/avm/avm_contract_call_result.ts +8 -6
  199. package/src/public/avm/avm_execution_environment.ts +9 -4
  200. package/src/public/avm/avm_gas.ts +2 -2
  201. package/src/public/avm/avm_machine_state.ts +6 -5
  202. package/src/public/avm/avm_memory_types.ts +4 -0
  203. package/src/public/avm/avm_simulator.ts +9 -6
  204. package/src/public/avm/calldata.ts +101 -0
  205. package/src/public/avm/fixtures/account_proof.json +553 -0
  206. package/src/public/avm/fixtures/account_proof_fetcher.ts +166 -0
  207. package/src/public/avm/fixtures/avm_simulation_tester.ts +8 -2
  208. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +22 -2
  209. package/src/public/avm/fixtures/initializers.ts +2 -1
  210. package/src/public/avm/fixtures/utils.ts +3 -0
  211. package/src/public/avm/opcodes/accrued_substate.ts +31 -34
  212. package/src/public/avm/opcodes/arithmetic.ts +1 -1
  213. package/src/public/avm/opcodes/bitwise.ts +3 -3
  214. package/src/public/avm/opcodes/comparators.ts +1 -1
  215. package/src/public/avm/opcodes/contract.ts +9 -8
  216. package/src/public/avm/opcodes/control_flow.ts +2 -2
  217. package/src/public/avm/opcodes/conversion.ts +3 -3
  218. package/src/public/avm/opcodes/ec_add.ts +21 -31
  219. package/src/public/avm/opcodes/environment_getters.ts +7 -7
  220. package/src/public/avm/opcodes/external_calls.ts +18 -16
  221. package/src/public/avm/opcodes/hashing.ts +6 -6
  222. package/src/public/avm/opcodes/instruction_impl.ts +2 -2
  223. package/src/public/avm/opcodes/memory.ts +19 -19
  224. package/src/public/avm/opcodes/misc.ts +2 -2
  225. package/src/public/avm/opcodes/storage.ts +30 -22
  226. package/src/public/avm/serialization/bytecode_serialization.ts +2 -2
  227. package/src/public/avm/serialization/instruction_serialization.ts +1 -1
  228. package/src/public/contracts_db_checkpoint.ts +1 -1
  229. package/src/public/debug_fn_name.ts +10 -8
  230. package/src/public/executor_metrics.ts +9 -33
  231. package/src/public/fixtures/amm_test.ts +2 -2
  232. package/src/public/fixtures/bulk_test.ts +31 -6
  233. package/src/public/fixtures/custom_bytecode_tests.ts +166 -19
  234. package/src/public/fixtures/minimal_public_tx.ts +2 -2
  235. package/src/public/fixtures/opcode_spammer.ts +200 -125
  236. package/src/public/fixtures/public_tx_simulation_tester.ts +47 -6
  237. package/src/public/fixtures/utils.ts +26 -22
  238. package/src/public/fuzzing/avm_fuzzer_simulator.ts +61 -13
  239. package/src/public/fuzzing/avm_simulator_bin.ts +43 -8
  240. package/src/public/hinting_db_sources.ts +10 -7
  241. package/src/public/public_db_sources.ts +36 -19
  242. package/src/public/public_processor/guarded_merkle_tree.ts +6 -6
  243. package/src/public/public_processor/public_processor.ts +156 -93
  244. package/src/public/public_processor/public_processor_metrics.ts +28 -44
  245. package/src/public/public_tx_simulator/contract_provider_for_cpp.ts +9 -5
  246. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +17 -7
  247. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +7 -5
  248. package/src/public/public_tx_simulator/cpp_vs_ts_public_tx_simulator.ts +7 -5
  249. package/src/public/public_tx_simulator/dumping_cpp_public_tx_simulator.ts +3 -1
  250. package/src/public/public_tx_simulator/factories.ts +6 -3
  251. package/src/public/public_tx_simulator/public_tx_context.ts +21 -16
  252. package/src/public/public_tx_simulator/public_tx_simulator.ts +32 -17
  253. package/src/public/side_effect_trace.ts +5 -2
  254. package/src/public/state_manager/state_manager.ts +29 -20
  255. package/src/public/test_executor_metrics.ts +27 -3
@@ -82,7 +82,7 @@ export class GuardedMerkleTreeOperations implements MerkleTreeWriteOperations {
82
82
  return this.guardAndPush(() => this.target.close());
83
83
  }
84
84
 
85
- async [Symbol.dispose](): Promise<void> {
85
+ async [Symbol.asyncDispose](): Promise<void> {
86
86
  await this.close();
87
87
  }
88
88
  getTreeInfo(treeId: MerkleTreeId): Promise<TreeInfo> {
@@ -134,7 +134,7 @@ export class GuardedMerkleTreeOperations implements MerkleTreeWriteOperations {
134
134
  ): Promise<(BlockNumber | undefined)[]> {
135
135
  return this.guardAndPush(() => this.target.getBlockNumbersForLeafIndices(treeId, leafIndices));
136
136
  }
137
- createCheckpoint(): Promise<void> {
137
+ createCheckpoint(): Promise<number> {
138
138
  return this.guardAndPush(() => this.target.createCheckpoint());
139
139
  }
140
140
  commitCheckpoint(): Promise<void> {
@@ -143,11 +143,11 @@ export class GuardedMerkleTreeOperations implements MerkleTreeWriteOperations {
143
143
  revertCheckpoint(): Promise<void> {
144
144
  return this.guardAndPush(() => this.target.revertCheckpoint());
145
145
  }
146
- commitAllCheckpoints(): Promise<void> {
147
- return this.guardAndPush(() => this.target.commitAllCheckpoints());
146
+ commitAllCheckpointsTo(depth: number): Promise<void> {
147
+ return this.guardAndPush(() => this.target.commitAllCheckpointsTo(depth));
148
148
  }
149
- revertAllCheckpoints(): Promise<void> {
150
- return this.guardAndPush(() => this.target.revertAllCheckpoints());
149
+ revertAllCheckpointsTo(depth: number): Promise<void> {
150
+ return this.guardAndPush(() => this.target.revertAllCheckpointsTo(depth));
151
151
  }
152
152
  findSiblingPaths<ID extends MerkleTreeId>(
153
153
  treeId: ID,
@@ -1,9 +1,9 @@
1
1
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, NULLIFIER_SUBTREE_HEIGHT } from '@aztec/constants';
2
2
  import { padArrayEnd } from '@aztec/foundation/collection';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import { createLogger } from '@aztec/foundation/log';
4
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
5
5
  import { sleep } from '@aztec/foundation/sleep';
6
- import { DateProvider, Timer, elapsed, executeTimeout } from '@aztec/foundation/timer';
6
+ import { DateProvider, Timer, elapsed, execWithSignal } from '@aztec/foundation/timer';
7
7
  import { ProtocolContractAddress } from '@aztec/protocol-contracts';
8
8
  import { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
9
9
  import { computeFeePayerBalanceLeafSlot, computeFeePayerBalanceStorageSlot } from '@aztec/protocol-contracts/fee-juice';
@@ -25,6 +25,7 @@ import type {
25
25
  PublicProcessorValidator,
26
26
  SequencerConfig,
27
27
  } from '@aztec/stdlib/interfaces/server';
28
+ import { type DebugLog, type DebugLogStore, NullDebugLogStore } from '@aztec/stdlib/logs';
28
29
  import { ProvingRequestType } from '@aztec/stdlib/proofs';
29
30
  import { MerkleTreeId } from '@aztec/stdlib/trees';
30
31
  import {
@@ -62,25 +63,28 @@ import { PublicProcessorMetrics } from './public_processor_metrics.js';
62
63
  * Creates new instances of PublicProcessor given the provided merkle tree db and contract data source.
63
64
  */
64
65
  export class PublicProcessorFactory {
66
+ private log: Logger;
65
67
  constructor(
66
68
  private contractDataSource: ContractDataSource,
67
69
  private dateProvider: DateProvider = new DateProvider(),
68
70
  protected telemetryClient: TelemetryClient = getTelemetryClient(),
69
- ) {}
71
+ bindings?: LoggerBindings,
72
+ ) {
73
+ this.log = createLogger('simulator:public-processor-factory', bindings);
74
+ }
70
75
 
71
76
  /**
72
77
  * Creates a new instance of a PublicProcessor.
73
78
  * @param globalVariables - The global variables for the block being processed.
74
- * @param skipFeeEnforcement - Allows disabling balance checks for fee estimations.
79
+ * @param contractsDB - Optional pre-populated contracts DB; a fresh one is constructed if omitted.
75
80
  * @returns A new instance of a PublicProcessor.
76
81
  */
77
82
  public create(
78
83
  merkleTree: MerkleTreeWriteOperations,
79
84
  globalVariables: GlobalVariables,
80
85
  config: PublicSimulatorConfig,
86
+ contractsDB: PublicContractsDB = new PublicContractsDB(this.contractDataSource, this.log.getBindings()),
81
87
  ): PublicProcessor {
82
- const contractsDB = new PublicContractsDB(this.contractDataSource);
83
-
84
88
  const guardedFork = new GuardedMerkleTreeOperations(merkleTree);
85
89
  const publicTxSimulator = this.createPublicTxSimulator(guardedFork, contractsDB, globalVariables, config);
86
90
 
@@ -91,6 +95,7 @@ export class PublicProcessorFactory {
91
95
  publicTxSimulator,
92
96
  this.dateProvider,
93
97
  this.telemetryClient,
98
+ createLogger('simulator:public-processor', this.log.getBindings()),
94
99
  );
95
100
  }
96
101
 
@@ -100,7 +105,14 @@ export class PublicProcessorFactory {
100
105
  globalVariables: GlobalVariables,
101
106
  config?: Partial<PublicTxSimulatorConfig>,
102
107
  ): PublicTxSimulatorInterface {
103
- return new TelemetryCppPublicTxSimulator(merkleTree, contractsDB, globalVariables, this.telemetryClient, config);
108
+ return new TelemetryCppPublicTxSimulator(
109
+ merkleTree,
110
+ contractsDB,
111
+ globalVariables,
112
+ this.telemetryClient,
113
+ config,
114
+ this.log.getBindings(),
115
+ );
104
116
  }
105
117
  }
106
118
 
@@ -111,13 +123,23 @@ class PublicProcessorTimeoutError extends Error {
111
123
  }
112
124
  }
113
125
 
126
+ class PublicProcessorAbortError extends Error {
127
+ constructor(message: string = 'Aborted while processing tx') {
128
+ super(message);
129
+ this.name = 'PublicProcessorAbortError';
130
+ }
131
+ }
132
+
133
+ function isPublicProcessorInterruptError(err: any) {
134
+ return err?.name === 'PublicProcessorTimeoutError' || err?.name === 'PublicProcessorAbortError';
135
+ }
136
+
114
137
  /**
115
138
  * Converts Txs lifted from the P2P module into ProcessedTx objects by executing
116
139
  * any public function calls in them. Txs with private calls only are unaffected.
117
140
  */
118
141
  export class PublicProcessor implements Traceable {
119
142
  private metrics: PublicProcessorMetrics;
120
-
121
143
  constructor(
122
144
  protected globalVariables: GlobalVariables,
123
145
  private guardedMerkleTree: GuardedMerkleTreeOperations,
@@ -125,8 +147,9 @@ export class PublicProcessor implements Traceable {
125
147
  protected publicTxSimulator: PublicTxSimulatorInterface,
126
148
  private dateProvider: DateProvider,
127
149
  telemetryClient: TelemetryClient = getTelemetryClient(),
128
- private log = createLogger('simulator:public-processor'),
150
+ private log: Logger,
129
151
  private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs' | 'fakeThrowAfterProcessingTxCount'> = {},
152
+ private debugLogStore: DebugLogStore = new NullDebugLogStore(),
130
153
  ) {
131
154
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
132
155
  }
@@ -146,12 +169,13 @@ export class PublicProcessor implements Traceable {
146
169
  txs: Iterable<Tx> | AsyncIterable<Tx>,
147
170
  limits: PublicProcessorLimits = {},
148
171
  validator: PublicProcessorValidator = {},
149
- ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[]]> {
150
- const { maxTransactions, maxBlockSize, deadline, maxBlockGas, maxBlobFields } = limits;
172
+ ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], DebugLog[]]> {
173
+ const { maxTransactions, deadline, maxBlockGas, maxBlobFields, isBuildingProposal, signal } = limits;
151
174
  const { preprocessValidator, nullifierCache } = validator;
152
175
  const result: ProcessedTx[] = [];
153
176
  const usedTxs: Tx[] = [];
154
177
  const failed: FailedTx[] = [];
178
+ const debugLogs: DebugLog[] = [];
155
179
  const timer = new Timer();
156
180
 
157
181
  let totalSizeInBytes = 0;
@@ -159,6 +183,8 @@ export class PublicProcessor implements Traceable {
159
183
  let totalPublicGas = new Gas(0, 0);
160
184
  let totalBlockGas = new Gas(0, 0);
161
185
  let totalBlobFields = 0;
186
+ let silentlySkippedCount = 0;
187
+ let totalSilentlySkippedDurationMs = 0;
162
188
 
163
189
  for await (const tx of txs) {
164
190
  // Only process up to the max tx limit
@@ -167,28 +193,33 @@ export class PublicProcessor implements Traceable {
167
193
  break;
168
194
  }
169
195
 
170
- // Bail if we've hit the deadline
196
+ // Bail if we've hit the deadline or have been interrupted.
171
197
  if (deadline && this.dateProvider.now() > +deadline) {
172
198
  this.log.warn(`Stopping tx processing due to timeout.`);
173
199
  break;
174
200
  }
201
+ if (signal?.aborted) {
202
+ this.log.warn(`Stopping tx processing due to abort signal.`);
203
+ break;
204
+ }
175
205
 
176
- // Skip this tx if it'd exceed max block size
177
206
  const txHash = tx.getTxHash().toString();
178
- const preTxSizeInBytes = tx.getEstimatedPrivateTxEffectsSize();
179
- if (maxBlockSize !== undefined && totalSizeInBytes + preTxSizeInBytes > maxBlockSize) {
180
- this.log.warn(`Skipping processing of tx ${txHash} sized ${preTxSizeInBytes} bytes due to block size limit`, {
181
- txHash,
182
- sizeInBytes: preTxSizeInBytes,
183
- totalSizeInBytes,
184
- maxBlockSize,
185
- });
207
+
208
+ // Skip this tx if its estimated blob fields would exceed the limit.
209
+ // Only done during proposal building: during re-execution we must process the exact txs from the proposal.
210
+ const txBlobFields = tx.getPrivateTxEffectsSizeInFields();
211
+ if (isBuildingProposal && maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
212
+ this.log.warn(
213
+ `Skipping tx ${txHash} with ${txBlobFields} fields from private side effects due to blob fields limit`,
214
+ { txHash, txBlobFields, totalBlobFields, maxBlobFields },
215
+ );
186
216
  continue;
187
217
  }
188
218
 
189
- // Skip this tx if its gas limit would exceed the block gas limit
219
+ // Skip this tx if its gas limit would exceed the block gas limit (either da or l2).
220
+ // Only done during proposal building: during re-execution we must process the exact txs from the proposal.
190
221
  const txGasLimit = tx.data.constants.txContext.gasSettings.gasLimits;
191
- if (maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
222
+ if (isBuildingProposal && maxBlockGas !== undefined && totalBlockGas.add(txGasLimit).gtAny(maxBlockGas)) {
192
223
  this.log.warn(`Skipping processing of tx ${txHash} due to block gas limit`, {
193
224
  txHash,
194
225
  txGasLimit,
@@ -208,11 +239,6 @@ export class PublicProcessor implements Traceable {
208
239
  failed.push({ tx, error: new Error(`Tx failed preprocess validation: ${reason}`) });
209
240
  returns.push(new NestedProcessReturnValues([]));
210
241
  continue;
211
- } else if (result.result === 'skipped') {
212
- const reason = result.reason.join(', ');
213
- this.log.debug(`Skipping tx ${txHash.toString()} due to pre-process validation: ${reason}`);
214
- returns.push(new NestedProcessReturnValues([]));
215
- continue;
216
242
  } else {
217
243
  this.log.trace(`Tx ${txHash.toString()} is valid before processing.`);
218
244
  }
@@ -228,7 +254,9 @@ export class PublicProcessor implements Traceable {
228
254
  this.contractsDB.createCheckpoint();
229
255
 
230
256
  try {
231
- const [processedTx, returnValues] = await this.processTx(tx, deadline);
257
+ const [txProcessingTimeMs, [processedTx, returnValues, txDebugLogs]] = await elapsed(() =>
258
+ this.processTx(tx, deadline, signal),
259
+ );
232
260
 
233
261
  // Inject a fake processing failure after N txs if requested
234
262
  const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
@@ -237,23 +265,10 @@ export class PublicProcessor implements Traceable {
237
265
  }
238
266
 
239
267
  const txBlobFields = processedTx.txEffect.getNumBlobFields();
240
-
241
- // If the actual size of this tx would exceed block size, skip it
242
268
  const txSize = txBlobFields * Fr.SIZE_IN_BYTES;
243
- if (maxBlockSize !== undefined && totalSizeInBytes + txSize > maxBlockSize) {
244
- this.log.debug(`Skipping processed tx ${txHash} sized ${txSize} due to max block size.`, {
245
- txHash,
246
- sizeInBytes: txSize,
247
- totalSizeInBytes,
248
- maxBlockSize,
249
- });
250
- // Need to revert the checkpoint here and don't go any further
251
- await checkpoint.revert();
252
- this.contractsDB.revertCheckpoint();
253
- continue;
254
- }
255
269
 
256
- // If the actual blob fields of this tx would exceed the limit, skip it
270
+ // If the actual blob fields of this tx would exceed the limit, skip it.
271
+ // Note: maxBlobFields already accounts for block end blob fields and previous blocks in checkpoint.
257
272
  if (maxBlobFields !== undefined && totalBlobFields + txBlobFields > maxBlobFields) {
258
273
  this.log.debug(
259
274
  `Skipping processed tx ${txHash} with ${txBlobFields} blob fields due to max blob fields limit.`,
@@ -262,35 +277,60 @@ export class PublicProcessor implements Traceable {
262
277
  txBlobFields,
263
278
  totalBlobFields,
264
279
  maxBlobFields,
280
+ txProcessingTimeMs,
265
281
  },
266
282
  );
283
+ silentlySkippedCount += 1;
284
+ totalSilentlySkippedDurationMs += txProcessingTimeMs;
285
+ this.metrics.recordSilentlySkipped(txProcessingTimeMs);
267
286
  // Need to revert the checkpoint here and don't go any further
268
287
  await checkpoint.revert();
269
288
  this.contractsDB.revertCheckpoint();
270
289
  continue;
271
290
  }
272
291
 
292
+ // During re-execution, check if the actual gas used by this tx would push the block over the gas limit.
293
+ // Unlike the proposal-building check (which uses declared gas limits pessimistically before processing),
294
+ // this uses actual gas and stops processing when the limit is exceeded.
295
+ if (
296
+ !isBuildingProposal &&
297
+ maxBlockGas !== undefined &&
298
+ totalBlockGas.add(processedTx.gasUsed.totalGas).gtAny(maxBlockGas)
299
+ ) {
300
+ this.log.warn(`Stopping re-execution since tx ${txHash} would push block gas over limit`, {
301
+ txHash,
302
+ txGas: processedTx.gasUsed.totalGas,
303
+ totalBlockGas,
304
+ maxBlockGas,
305
+ });
306
+ await checkpoint.revert();
307
+ this.contractsDB.revertCheckpoint();
308
+ break;
309
+ }
310
+
273
311
  // FIXME(fcarreiro): it's ugly to have to notify the validator of nullifiers.
274
312
  // I'd rather pass the validators the processedTx as well and let them deal with it.
275
313
  nullifierCache?.addNullifiers(processedTx.txEffect.nullifiers.map(n => n.toBuffer()));
276
314
  result.push(processedTx);
277
315
  usedTxs.push(tx);
278
316
  returns = returns.concat(returnValues);
317
+ debugLogs.push(...txDebugLogs);
318
+
319
+ this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
279
320
 
280
321
  totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
281
322
  totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
282
323
  totalSizeInBytes += txSize;
283
324
  totalBlobFields += txBlobFields;
325
+
326
+ // Commit the tx-level contracts checkpoint on success
327
+ this.contractsDB.commitCheckpoint();
284
328
  } catch (err: any) {
285
- if (err?.name === 'PublicProcessorTimeoutError') {
286
- this.log.warn(`Stopping tx processing due to timeout.`);
287
- // We hit the transaction execution deadline.
288
- // There may still be a transaction executing on a worker thread (C++ via NAPI).
289
- // Signal cancellation AND WAIT for the simulation to actually stop.
290
- // This is critical because C++ might be in the middle of a slow operation (e.g., pad_trees)
291
- // and won't check the cancellation flag until that operation completes.
292
- // Without waiting, we'd proceed to revert checkpoints while C++ is still writing to state.
293
- // Wait for C++ to stop gracefully.
329
+ if (isPublicProcessorInterruptError(err)) {
330
+ const interruptReason = err.name === 'PublicProcessorTimeoutError' ? 'timeout' : 'abort signal';
331
+ this.log.warn(`Stopping tx processing due to ${interruptReason}.`);
332
+ // The tx may still be executing on a worker thread (C++ via NAPI).
333
+ // Signal cancellation AND WAIT for the simulation to actually stop before touching fork checkpoints.
294
334
  await this.publicTxSimulator.cancel?.();
295
335
 
296
336
  // Now stop the guarded fork to prevent any further TS-side access to the world state.
@@ -300,14 +340,10 @@ export class PublicProcessor implements Traceable {
300
340
  // 1. At least one outstanding checkpoint that has not been committed (the one created before we processed the tx).
301
341
  // 2. Possible state updates on that checkpoint or any others created during execution.
302
342
 
303
- // First we revert a checkpoint as managed by the ForkCheckpoint. This will revert whatever is the current checkpoint
304
- // which may not be the one originally created by this object. But that is ok, we do this to fulfil the ForkCheckpoint
305
- // lifecycle expectations and ensure it doesn't attempt to commit later on.
306
- await checkpoint.revert();
307
-
308
- // Now we want to revert any/all remaining checkpoints, destroying any outstanding state updates.
309
- // This needs to be done directly on the underlying fork as the guarded fork has been stopped.
310
- await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
343
+ // Revert all checkpoints at or above this checkpoint's depth (inclusive), destroying any outstanding state
344
+ // updates from this tx and any nested checkpoints created during execution. This preserves any checkpoints
345
+ // created by callers below our depth.
346
+ await checkpoint.revertToCheckpoint();
311
347
 
312
348
  // Revert any contracts added to the DB for the tx.
313
349
  this.contractsDB.revertCheckpoint();
@@ -319,9 +355,9 @@ export class PublicProcessor implements Traceable {
319
355
  break;
320
356
  }
321
357
 
322
- // Roll back state to start of TX before proceeding to next TX
323
- await checkpoint.revert();
324
- await this.guardedMerkleTree.getUnderlyingFork().revertAllCheckpoints();
358
+ // Roll back state to start of TX before proceeding to next TX.
359
+ // Reverts all checkpoints at or above this checkpoint's depth, preserving any caller checkpoints below.
360
+ await checkpoint.revertToCheckpoint();
325
361
  this.contractsDB.revertCheckpoint();
326
362
  const errorMessage = err instanceof Error || err instanceof AssertionError ? err.message : 'Unknown error';
327
363
  this.log.warn(`Failed to process tx ${txHash.toString()}: ${errorMessage} ${err?.stack}`);
@@ -333,7 +369,6 @@ export class PublicProcessor implements Traceable {
333
369
  } finally {
334
370
  // Base case is we always commit the checkpoint. Using the ForkCheckpoint means this has no effect if the tx was previously reverted
335
371
  await checkpoint.commit();
336
- this.contractsDB.commitCheckpointOkIfNone();
337
372
  }
338
373
  }
339
374
 
@@ -341,15 +376,26 @@ export class PublicProcessor implements Traceable {
341
376
  const rate = duration > 0 ? totalPublicGas.l2Gas / duration : 0;
342
377
  this.metrics.recordAllTxs(totalPublicGas, rate);
343
378
 
344
- this.log.info(`Processed ${result.length} successful txs and ${failed.length} failed txs in ${duration}s`, {
345
- duration,
346
- rate,
347
- totalPublicGas,
348
- totalBlockGas,
349
- totalSizeInBytes,
350
- });
379
+ const silentlySkippedDurationMs = Math.round(totalSilentlySkippedDurationMs);
380
+ this.log.info(
381
+ `Processed ${result.length} successful txs and ${failed.length} failed txs ` +
382
+ `(${silentlySkippedCount} silently skipped, ${silentlySkippedDurationMs}ms wasted) ` +
383
+ `in ${duration}s`,
384
+ {
385
+ blockNumber: this.globalVariables.blockNumber,
386
+ successfulCount: result.length,
387
+ failedCount: failed.length,
388
+ duration,
389
+ rate,
390
+ totalPublicGas,
391
+ totalBlockGas,
392
+ totalSizeInBytes,
393
+ silentlySkippedCount,
394
+ silentlySkippedDurationMs,
395
+ },
396
+ );
351
397
 
352
- return [result, failed, usedTxs, returns];
398
+ return [result, failed, usedTxs, returns, debugLogs];
353
399
  }
354
400
 
355
401
  private async checkWorldStateUnchanged(
@@ -369,8 +415,14 @@ export class PublicProcessor implements Traceable {
369
415
  }
370
416
 
371
417
  @trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString() }))
372
- private async processTx(tx: Tx, deadline: Date | undefined): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
373
- const [time, [processedTx, returnValues]] = await elapsed(() => this.processTxWithinDeadline(tx, deadline));
418
+ private async processTx(
419
+ tx: Tx,
420
+ deadline: Date | undefined,
421
+ signal: AbortSignal | undefined,
422
+ ): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
423
+ const [time, [processedTx, returnValues, debugLogs]] = await elapsed(() =>
424
+ this.processTxWithinDeadline(tx, deadline, signal),
425
+ );
374
426
 
375
427
  this.log.verbose(
376
428
  !tx.hasPublicCalls()
@@ -393,7 +445,7 @@ export class PublicProcessor implements Traceable {
393
445
  },
394
446
  );
395
447
 
396
- return [processedTx, returnValues ?? []];
448
+ return [processedTx, returnValues ?? [], debugLogs];
397
449
  }
398
450
 
399
451
  private async doTreeInsertionsForPrivateOnlyTx(processedTx: ProcessedTx): Promise<void> {
@@ -423,14 +475,14 @@ export class PublicProcessor implements Traceable {
423
475
  this.metrics.recordTreeInsertions(Number(treeInsertionEnd - treeInsertionStart) / 1_000);
424
476
  }
425
477
 
426
- /** Processes the given tx within deadline. Returns timeout if deadline is hit. */
478
+ /** Processes the given tx within deadline or until the signal is aborted. */
427
479
  private async processTxWithinDeadline(
428
480
  tx: Tx,
429
481
  deadline: Date | undefined,
430
- ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> {
431
- const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> = tx.hasPublicCalls()
432
- ? () => this.processTxWithPublicCalls(tx)
433
- : () => this.processPrivateOnlyTx(tx);
482
+ signal: AbortSignal | undefined,
483
+ ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> {
484
+ const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> =
485
+ tx.hasPublicCalls() ? () => this.processTxWithPublicCalls(tx) : () => this.processPrivateOnlyTx(tx);
434
486
 
435
487
  // Fake a delay per tx if instructed (used for tests)
436
488
  const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
@@ -444,27 +496,38 @@ export class PublicProcessor implements Traceable {
444
496
  }
445
497
  : innerProcessFn;
446
498
 
447
- if (!deadline) {
499
+ const processingSignal = this.getProcessingSignal(tx, deadline, signal);
500
+ if (!processingSignal) {
448
501
  return await processFn();
449
502
  }
450
503
 
451
- const txHash = tx.getTxHash();
504
+ return await execWithSignal(
505
+ () => processFn(),
506
+ processingSignal,
507
+ signal =>
508
+ signal.reason?.name === 'TimeoutError' ? new PublicProcessorTimeoutError() : new PublicProcessorAbortError(),
509
+ );
510
+ }
511
+
512
+ private getProcessingSignal(tx: Tx, deadline: Date | undefined, signal: AbortSignal | undefined) {
513
+ if (!deadline) {
514
+ return signal;
515
+ }
516
+
452
517
  const timeout = +deadline - this.dateProvider.now();
453
518
  if (timeout <= 0) {
454
519
  throw new PublicProcessorTimeoutError();
455
520
  }
456
521
 
522
+ const txHash = tx.getTxHash();
457
523
  this.log.debug(`Processing tx ${txHash.toString()} within ${timeout}ms`, {
458
524
  deadline: deadline.toISOString(),
459
525
  now: new Date(this.dateProvider.now()).toISOString(),
460
526
  txHash,
461
527
  });
462
528
 
463
- return await executeTimeout(
464
- () => processFn(),
465
- timeout,
466
- () => new PublicProcessorTimeoutError(),
467
- );
529
+ const timeoutSignal = AbortSignal.timeout(timeout);
530
+ return signal ? AbortSignal.any([signal, timeoutSignal]) : timeoutSignal;
468
531
  }
469
532
 
470
533
  /**
@@ -498,7 +561,7 @@ export class PublicProcessor implements Traceable {
498
561
  @trackSpan('PublicProcessor.processPrivateOnlyTx', (tx: Tx) => ({
499
562
  [Attributes.TX_HASH]: tx.getTxHash().toString(),
500
563
  }))
501
- private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined]> {
564
+ private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined, DebugLog[]]> {
502
565
  const gasFees = this.globalVariables.gasFees;
503
566
  const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed);
504
567
 
@@ -521,15 +584,15 @@ export class PublicProcessor implements Traceable {
521
584
  // Fee payment insertion has already been done. Do the rest.
522
585
  await this.doTreeInsertionsForPrivateOnlyTx(processedTx);
523
586
 
524
- await this.contractsDB.addNewContracts(tx);
587
+ this.contractsDB.addNewContracts(tx);
525
588
 
526
- return [processedTx, undefined];
589
+ return [processedTx, undefined, []];
527
590
  }
528
591
 
529
592
  @trackSpan('PublicProcessor.processTxWithPublicCalls', tx => ({
530
593
  [Attributes.TX_HASH]: tx.getTxHash().toString(),
531
594
  }))
532
- private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
595
+ private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
533
596
  const timer = new Timer();
534
597
 
535
598
  const result = await this.publicTxSimulator.simulate(tx);
@@ -567,7 +630,7 @@ export class PublicProcessor implements Traceable {
567
630
  revertReason,
568
631
  );
569
632
 
570
- return [processedTx, appLogicReturnValues];
633
+ return [processedTx, appLogicReturnValues, result.logs ?? []];
571
634
  }
572
635
 
573
636
  /**
@@ -1,6 +1,6 @@
1
1
  import type { ContractClassPublishedEvent } from '@aztec/protocol-contracts/class-registry';
2
2
  import type { Gas } from '@aztec/stdlib/gas';
3
- import type { TxExecutionPhase } from '@aztec/stdlib/tx';
3
+ import { TxExecutionPhase } from '@aztec/stdlib/tx';
4
4
  import {
5
5
  Attributes,
6
6
  type Gauge,
@@ -9,7 +9,7 @@ import {
9
9
  type TelemetryClient,
10
10
  type Tracer,
11
11
  type UpDownCounter,
12
- ValueType,
12
+ createUpDownCounterWithDefault,
13
13
  } from '@aztec/telemetry-client';
14
14
 
15
15
  export class PublicProcessorMetrics {
@@ -30,64 +30,43 @@ export class PublicProcessorMetrics {
30
30
 
31
31
  private treeInsertionDuration: Histogram;
32
32
 
33
+ private silentlySkippedCount: UpDownCounter;
34
+ private silentlySkippedDuration: Histogram;
35
+
33
36
  constructor(client: TelemetryClient, name = 'PublicProcessor') {
34
37
  this.tracer = client.getTracer(name);
35
38
  const meter = client.getMeter(name);
36
39
 
37
- this.txDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TX_DURATION, {
38
- description: 'How long it takes to process a transaction',
39
- unit: 'ms',
40
- valueType: ValueType.INT,
41
- });
40
+ this.txDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TX_DURATION);
42
41
 
43
- this.txCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_TX_COUNT, {
44
- description: 'Number of transactions processed',
42
+ this.txCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_TX_COUNT, {
43
+ [Attributes.OK]: [true, false],
45
44
  });
46
45
 
47
- this.txPhaseCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_TX_PHASE_COUNT, {
48
- description: 'Number of phases processed',
49
- });
46
+ this.txPhaseCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_TX_PHASE_COUNT);
50
47
 
51
- this.phaseDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_PHASE_DURATION, {
52
- description: 'How long it takes to process a phase',
53
- unit: 'ms',
54
- valueType: ValueType.INT,
55
- });
48
+ this.phaseDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_PHASE_DURATION);
56
49
 
57
- this.phaseCount = meter.createUpDownCounter(Metrics.PUBLIC_PROCESSOR_PHASE_COUNT, {
58
- description: 'Number of failed phases',
50
+ this.phaseCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_PHASE_COUNT, {
51
+ [Attributes.TX_PHASE_NAME]: [TxExecutionPhase.SETUP, TxExecutionPhase.APP_LOGIC, TxExecutionPhase.TEARDOWN],
52
+ [Attributes.OK]: [true, false],
59
53
  });
60
54
 
61
- this.bytecodeDeployed = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_DEPLOY_BYTECODE_SIZE, {
62
- description: 'Size of deployed bytecode',
63
- unit: 'By',
64
- });
55
+ this.bytecodeDeployed = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_DEPLOY_BYTECODE_SIZE);
65
56
 
66
- this.totalGas = meter.createGauge(Metrics.PUBLIC_PROCESSOR_TOTAL_GAS, {
67
- description: 'Total gas used in block',
68
- unit: 'gas',
69
- });
57
+ this.totalGas = meter.createGauge(Metrics.PUBLIC_PROCESSOR_TOTAL_GAS);
70
58
 
71
- this.totalGasHistogram = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TOTAL_GAS_HISTOGRAM, {
72
- description: 'Total gas used in block as histogram',
73
- unit: 'gas/block',
74
- });
59
+ this.totalGasHistogram = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TOTAL_GAS_HISTOGRAM);
75
60
 
76
- this.txGas = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TX_GAS, {
77
- description: 'Gas used in transaction',
78
- unit: 'gas/tx',
79
- });
61
+ this.txGas = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TX_GAS);
80
62
 
81
- this.gasRate = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_GAS_RATE, {
82
- description: 'L2 gas per second for complete block',
83
- unit: 'gas/s',
84
- });
63
+ this.gasRate = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_GAS_RATE);
85
64
 
86
- this.treeInsertionDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TREE_INSERTION, {
87
- description: 'How long it takes for tree insertion',
88
- unit: 'us',
89
- valueType: ValueType.INT,
90
- });
65
+ this.treeInsertionDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_TREE_INSERTION);
66
+
67
+ this.silentlySkippedCount = createUpDownCounterWithDefault(meter, Metrics.PUBLIC_PROCESSOR_SILENTLY_SKIPPED_COUNT);
68
+
69
+ this.silentlySkippedDuration = meter.createHistogram(Metrics.PUBLIC_PROCESSOR_SILENTLY_SKIPPED_DURATION);
91
70
  }
92
71
 
93
72
  recordPhaseDuration(phaseName: TxExecutionPhase, durationMs: number) {
@@ -151,4 +130,9 @@ export class PublicProcessorMetrics {
151
130
  recordTreeInsertions(durationUs: number) {
152
131
  this.treeInsertionDuration.record(Math.ceil(durationUs));
153
132
  }
133
+
134
+ recordSilentlySkipped(durationMs: number) {
135
+ this.silentlySkippedCount.add(1);
136
+ this.silentlySkippedDuration.record(Math.ceil(durationMs));
137
+ }
154
138
  }