@aztec/simulator 0.0.1-commit.d6f2b3f94 → 0.0.1-commit.dbf9cec

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 (57) hide show
  1. package/README.md +4 -4
  2. package/dest/public/avm/avm_gas.js +3 -3
  3. package/dest/public/avm/opcodes/accrued_substate.d.ts +2 -2
  4. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  5. package/dest/public/avm/opcodes/accrued_substate.js +3 -4
  6. package/dest/public/avm/serialization/bytecode_serialization.js +3 -3
  7. package/dest/public/avm/serialization/instruction_serialization.d.ts +2 -2
  8. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  9. package/dest/public/avm/serialization/instruction_serialization.js +1 -1
  10. package/dest/public/fixtures/amm_test.js +2 -2
  11. package/dest/public/fixtures/opcode_spammer.d.ts +1 -1
  12. package/dest/public/fixtures/opcode_spammer.d.ts.map +1 -1
  13. package/dest/public/fixtures/opcode_spammer.js +6 -6
  14. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +1 -1
  15. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  16. package/dest/public/fixtures/public_tx_simulation_tester.js +29 -2
  17. package/dest/public/fixtures/utils.js +4 -4
  18. package/dest/public/hinting_db_sources.d.ts +2 -2
  19. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  20. package/dest/public/hinting_db_sources.js +1 -1
  21. package/dest/public/public_processor/guarded_merkle_tree.d.ts +2 -2
  22. package/dest/public/public_processor/guarded_merkle_tree.d.ts.map +1 -1
  23. package/dest/public/public_processor/guarded_merkle_tree.js +1 -1
  24. package/dest/public/public_processor/public_processor.d.ts +5 -3
  25. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  26. package/dest/public/public_processor/public_processor.js +17 -7
  27. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts +1 -1
  28. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.d.ts.map +1 -1
  29. package/dest/public/public_tx_simulator/cpp_public_tx_simulator.js +2 -3
  30. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts +1 -1
  31. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.d.ts.map +1 -1
  32. package/dest/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.js +2 -2
  33. package/dest/public/public_tx_simulator/factories.d.ts +2 -2
  34. package/dest/public/public_tx_simulator/factories.d.ts.map +1 -1
  35. package/dest/public/public_tx_simulator/factories.js +2 -2
  36. package/dest/public/public_tx_simulator/public_tx_simulator.js +2 -2
  37. package/dest/public/test_executor_metrics.d.ts +6 -1
  38. package/dest/public/test_executor_metrics.d.ts.map +1 -1
  39. package/dest/public/test_executor_metrics.js +22 -0
  40. package/package.json +16 -16
  41. package/src/public/avm/avm_gas.ts +2 -2
  42. package/src/public/avm/opcodes/accrued_substate.ts +3 -4
  43. package/src/public/avm/serialization/bytecode_serialization.ts +2 -2
  44. package/src/public/avm/serialization/instruction_serialization.ts +1 -1
  45. package/src/public/fixtures/amm_test.ts +2 -2
  46. package/src/public/fixtures/opcode_spammer.ts +6 -10
  47. package/src/public/fixtures/public_tx_simulation_tester.ts +34 -3
  48. package/src/public/fixtures/utils.ts +4 -4
  49. package/src/public/fuzzing/avm_fuzzer_simulator.ts +1 -1
  50. package/src/public/hinting_db_sources.ts +1 -1
  51. package/src/public/public_processor/guarded_merkle_tree.ts +1 -1
  52. package/src/public/public_processor/public_processor.ts +24 -15
  53. package/src/public/public_tx_simulator/cpp_public_tx_simulator.ts +2 -3
  54. package/src/public/public_tx_simulator/cpp_public_tx_simulator_with_hinted_dbs.ts +2 -2
  55. package/src/public/public_tx_simulator/factories.ts +2 -1
  56. package/src/public/public_tx_simulator/public_tx_simulator.ts +3 -3
  57. package/src/public/test_executor_metrics.ts +24 -0
@@ -572,7 +572,7 @@ export class HintingMerkleWriteOperations implements MerkleTreeWriteOperations {
572
572
  return await this.db.close();
573
573
  }
574
574
 
575
- async [Symbol.dispose](): Promise<void> {
575
+ async [Symbol.asyncDispose](): Promise<void> {
576
576
  await this.close();
577
577
  }
578
578
 
@@ -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> {
@@ -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 {
@@ -130,7 +131,6 @@ class PublicProcessorTimeoutError extends Error {
130
131
  */
131
132
  export class PublicProcessor implements Traceable {
132
133
  private metrics: PublicProcessorMetrics;
133
-
134
134
  constructor(
135
135
  protected globalVariables: GlobalVariables,
136
136
  private guardedMerkleTree: GuardedMerkleTreeOperations,
@@ -140,6 +140,7 @@ export class PublicProcessor implements Traceable {
140
140
  telemetryClient: TelemetryClient = getTelemetryClient(),
141
141
  private log: Logger,
142
142
  private opts: Pick<SequencerConfig, 'fakeProcessingDelayPerTxMs' | 'fakeThrowAfterProcessingTxCount'> = {},
143
+ private debugLogStore: DebugLogStore = new NullDebugLogStore(),
143
144
  ) {
144
145
  this.metrics = new PublicProcessorMetrics(telemetryClient, 'PublicProcessor');
145
146
  }
@@ -159,12 +160,13 @@ export class PublicProcessor implements Traceable {
159
160
  txs: Iterable<Tx> | AsyncIterable<Tx>,
160
161
  limits: PublicProcessorLimits = {},
161
162
  validator: PublicProcessorValidator = {},
162
- ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], number]> {
163
+ ): Promise<[ProcessedTx[], FailedTx[], Tx[], NestedProcessReturnValues[], number, DebugLog[]]> {
163
164
  const { maxTransactions, maxBlockSize, deadline, maxBlockGas, maxBlobFields } = limits;
164
165
  const { preprocessValidator, nullifierCache } = validator;
165
166
  const result: ProcessedTx[] = [];
166
167
  const usedTxs: Tx[] = [];
167
168
  const failed: FailedTx[] = [];
169
+ const debugLogs: DebugLog[] = [];
168
170
  const timer = new Timer();
169
171
 
170
172
  let totalSizeInBytes = 0;
@@ -241,7 +243,7 @@ export class PublicProcessor implements Traceable {
241
243
  this.contractsDB.createCheckpoint();
242
244
 
243
245
  try {
244
- const [processedTx, returnValues] = await this.processTx(tx, deadline);
246
+ const [processedTx, returnValues, txDebugLogs] = await this.processTx(tx, deadline);
245
247
 
246
248
  // Inject a fake processing failure after N txs if requested
247
249
  const fakeThrowAfter = this.opts.fakeThrowAfterProcessingTxCount;
@@ -290,6 +292,9 @@ export class PublicProcessor implements Traceable {
290
292
  result.push(processedTx);
291
293
  usedTxs.push(tx);
292
294
  returns = returns.concat(returnValues);
295
+ debugLogs.push(...txDebugLogs);
296
+
297
+ this.debugLogStore.storeLogs(processedTx.hash.toString(), txDebugLogs);
293
298
 
294
299
  totalPublicGas = totalPublicGas.add(processedTx.gasUsed.publicGas);
295
300
  totalBlockGas = totalBlockGas.add(processedTx.gasUsed.totalGas);
@@ -363,7 +368,7 @@ export class PublicProcessor implements Traceable {
363
368
  totalSizeInBytes,
364
369
  });
365
370
 
366
- return [result, failed, usedTxs, returns, totalBlobFields];
371
+ return [result, failed, usedTxs, returns, totalBlobFields, debugLogs];
367
372
  }
368
373
 
369
374
  private async checkWorldStateUnchanged(
@@ -383,8 +388,13 @@ export class PublicProcessor implements Traceable {
383
388
  }
384
389
 
385
390
  @trackSpan('PublicProcessor.processTx', tx => ({ [Attributes.TX_HASH]: tx.getTxHash().toString() }))
386
- private async processTx(tx: Tx, deadline: Date | undefined): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
387
- const [time, [processedTx, returnValues]] = await elapsed(() => this.processTxWithinDeadline(tx, deadline));
391
+ private async processTx(
392
+ tx: Tx,
393
+ deadline: Date | undefined,
394
+ ): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
395
+ const [time, [processedTx, returnValues, debugLogs]] = await elapsed(() =>
396
+ this.processTxWithinDeadline(tx, deadline),
397
+ );
388
398
 
389
399
  this.log.verbose(
390
400
  !tx.hasPublicCalls()
@@ -407,7 +417,7 @@ export class PublicProcessor implements Traceable {
407
417
  },
408
418
  );
409
419
 
410
- return [processedTx, returnValues ?? []];
420
+ return [processedTx, returnValues ?? [], debugLogs];
411
421
  }
412
422
 
413
423
  private async doTreeInsertionsForPrivateOnlyTx(processedTx: ProcessedTx): Promise<void> {
@@ -441,10 +451,9 @@ export class PublicProcessor implements Traceable {
441
451
  private async processTxWithinDeadline(
442
452
  tx: Tx,
443
453
  deadline: Date | undefined,
444
- ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> {
445
- const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined]> = tx.hasPublicCalls()
446
- ? () => this.processTxWithPublicCalls(tx)
447
- : () => this.processPrivateOnlyTx(tx);
454
+ ): Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> {
455
+ const innerProcessFn: () => Promise<[ProcessedTx, NestedProcessReturnValues[] | undefined, DebugLog[]]> =
456
+ tx.hasPublicCalls() ? () => this.processTxWithPublicCalls(tx) : () => this.processPrivateOnlyTx(tx);
448
457
 
449
458
  // Fake a delay per tx if instructed (used for tests)
450
459
  const fakeDelayPerTxMs = this.opts.fakeProcessingDelayPerTxMs;
@@ -512,7 +521,7 @@ export class PublicProcessor implements Traceable {
512
521
  @trackSpan('PublicProcessor.processPrivateOnlyTx', (tx: Tx) => ({
513
522
  [Attributes.TX_HASH]: tx.getTxHash().toString(),
514
523
  }))
515
- private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined]> {
524
+ private async processPrivateOnlyTx(tx: Tx): Promise<[ProcessedTx, undefined, DebugLog[]]> {
516
525
  const gasFees = this.globalVariables.gasFees;
517
526
  const transactionFee = computeTransactionFee(gasFees, tx.data.constants.txContext.gasSettings, tx.data.gasUsed);
518
527
 
@@ -537,13 +546,13 @@ export class PublicProcessor implements Traceable {
537
546
 
538
547
  await this.contractsDB.addNewContracts(tx);
539
548
 
540
- return [processedTx, undefined];
549
+ return [processedTx, undefined, []];
541
550
  }
542
551
 
543
552
  @trackSpan('PublicProcessor.processTxWithPublicCalls', tx => ({
544
553
  [Attributes.TX_HASH]: tx.getTxHash().toString(),
545
554
  }))
546
- private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[]]> {
555
+ private async processTxWithPublicCalls(tx: Tx): Promise<[ProcessedTx, NestedProcessReturnValues[], DebugLog[]]> {
547
556
  const timer = new Timer();
548
557
 
549
558
  const result = await this.publicTxSimulator.simulate(tx);
@@ -581,7 +590,7 @@ export class PublicProcessor implements Traceable {
581
590
  revertReason,
582
591
  );
583
592
 
584
- return [processedTx, appLogicReturnValues];
593
+ return [processedTx, appLogicReturnValues, result.logs ?? []];
585
594
  }
586
595
 
587
596
  /**
@@ -1,4 +1,4 @@
1
- import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log';
1
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
2
2
  import { sleep } from '@aztec/foundation/sleep';
3
3
  import { type CancellationToken, avmSimulate, cancelSimulation, createCancellationToken } from '@aztec/native';
4
4
  import { ProtocolContractsList } from '@aztec/protocol-contracts';
@@ -100,8 +100,7 @@ export class CppPublicTxSimulator extends PublicTxSimulator implements PublicTxS
100
100
  inputBuffer,
101
101
  contractProvider,
102
102
  wsCppHandle,
103
- logLevel,
104
- // TODO: re-enable logging
103
+ this.log.level,
105
104
  undefined,
106
105
  this.cancellationToken,
107
106
  );
@@ -1,4 +1,4 @@
1
- import { type Logger, type LoggerBindings, createLogger, logLevel } from '@aztec/foundation/log';
1
+ import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
2
2
  import { avmSimulateWithHintedDbs } from '@aztec/native';
3
3
  import {
4
4
  AvmCircuitInputs,
@@ -75,7 +75,7 @@ export class CppPublicTxSimulatorHintedDbs extends PublicTxSimulator implements
75
75
 
76
76
  let resultBuffer: Buffer;
77
77
  try {
78
- resultBuffer = await avmSimulateWithHintedDbs(inputBuffer, logLevel);
78
+ resultBuffer = await avmSimulateWithHintedDbs(inputBuffer, this.log.level);
79
79
  } catch (error: any) {
80
80
  throw new SimulationError(`C++ hinted simulation failed: ${error.message}`, []);
81
81
  }
@@ -19,10 +19,11 @@ export function createPublicTxSimulatorForBlockBuilding(
19
19
  globalVariables: GlobalVariables,
20
20
  telemetryClient: TelemetryClient,
21
21
  bindings?: LoggerBindings,
22
+ collectDebugLogs = false,
22
23
  ) {
23
24
  const config = PublicSimulatorConfig.from({
24
25
  skipFeeEnforcement: false,
25
- collectDebugLogs: false,
26
+ collectDebugLogs,
26
27
  collectHints: false,
27
28
  collectPublicInputs: false,
28
29
  collectStatistics: false,
@@ -1,4 +1,4 @@
1
- import { AVM_MAX_PROCESSABLE_L2_GAS } from '@aztec/constants';
1
+ import { MAX_PROCESSABLE_L2_GAS } from '@aztec/constants';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { type Logger, type LoggerBindings, createLogger } from '@aztec/foundation/log';
4
4
  import { ProtocolContractAddress, ProtocolContractsList } from '@aztec/protocol-contracts';
@@ -199,8 +199,8 @@ export class PublicTxSimulator implements PublicTxSimulatorInterface {
199
199
 
200
200
  // Such transactions should be filtered by GasTxValidator.
201
201
  assert(
202
- context.getActualGasUsed().l2Gas <= AVM_MAX_PROCESSABLE_L2_GAS,
203
- `Transaction consumes ${context.getActualGasUsed().l2Gas} L2 gas, which exceeds the AVM maximum processable gas of ${AVM_MAX_PROCESSABLE_L2_GAS}`,
202
+ context.getActualGasUsed().l2Gas <= MAX_PROCESSABLE_L2_GAS,
203
+ `Transaction consumes ${context.getActualGasUsed().l2Gas} L2 gas, which exceeds the maximum processable gas of ${MAX_PROCESSABLE_L2_GAS}`,
204
204
  );
205
205
  await this.payFee(context);
206
206
 
@@ -21,6 +21,7 @@ export interface PublicTxMetrics {
21
21
  totalDurationMs: number;
22
22
  manaUsed: number | undefined;
23
23
  totalInstructionsExecuted: number;
24
+ bytecodeSizes: { contractName: string; sizeBytes: number }[];
24
25
  nonRevertiblePrivateInsertionsUs: number | undefined;
25
26
  revertiblePrivateInsertionsUs: number | undefined;
26
27
  enqueuedCalls: PublicEnqueuedCallMetrics[];
@@ -62,6 +63,7 @@ function createEmptyTxMetrics(): PublicTxMetrics {
62
63
  totalDurationMs: 0,
63
64
  manaUsed: 0,
64
65
  totalInstructionsExecuted: 0,
66
+ bytecodeSizes: [],
65
67
  nonRevertiblePrivateInsertionsUs: undefined,
66
68
  revertiblePrivateInsertionsUs: undefined,
67
69
  enqueuedCalls: [],
@@ -172,6 +174,12 @@ export class TestExecutorMetrics implements ExecutorMetricsInterface {
172
174
  }
173
175
  }
174
176
 
177
+ recordBytecodeSize(txLabel: string, contractName: string, sizeBytes: number) {
178
+ const txMetrics = this.txMetrics.get(txLabel);
179
+ assert(txMetrics, `Cannot record bytecode size for unknown tx label: ${txLabel}`);
180
+ txMetrics.bytecodeSizes.push({ contractName, sizeBytes });
181
+ }
182
+
175
183
  recordProverMetrics(txLabel: string, metrics: Partial<PublicTxMetrics>) {
176
184
  if (!this.txMetrics.has(txLabel)) {
177
185
  this.txMetrics.set(txLabel, createEmptyTxMetrics());
@@ -216,6 +224,15 @@ export class TestExecutorMetrics implements ExecutorMetricsInterface {
216
224
  ) {
217
225
  pretty += `${INDENT0}Total instructions executed: ${fmtNum(txMetrics.totalInstructionsExecuted)}\n`;
218
226
  }
227
+ if (
228
+ (filter === PublicTxMetricsFilter.TOTALS || filter === PublicTxMetricsFilter.ALL) &&
229
+ txMetrics.bytecodeSizes.length > 0
230
+ ) {
231
+ pretty += `${INDENT0}Bytecode sizes:\n`;
232
+ for (const { contractName, sizeBytes } of txMetrics.bytecodeSizes) {
233
+ pretty += `${INDENT1}${contractName}: ${fmtNum(sizeBytes, 'bytes')}\n`;
234
+ }
235
+ }
219
236
  if (filter === PublicTxMetricsFilter.DURATIONS || filter === PublicTxMetricsFilter.ALL) {
220
237
  pretty += `${INDENT0}Private insertions:\n`;
221
238
  pretty += `${INDENT1}Non-revertible: ${fmtNum(txMetrics.nonRevertiblePrivateInsertionsUs! / 1_000, 'ms')}\n`;
@@ -387,6 +404,13 @@ export class TestExecutorMetrics implements ExecutorMetricsInterface {
387
404
  });
388
405
  }
389
406
  }
407
+ for (const { contractName, sizeBytes } of txMetrics.bytecodeSizes) {
408
+ data.push({
409
+ name: `${txLabel}/bytecodeSizeBytes/${contractName}`,
410
+ value: sizeBytes,
411
+ unit: 'bytes',
412
+ });
413
+ }
390
414
  }
391
415
  return JSON.stringify(data, null, indent);
392
416
  }