@aztec/simulator 0.82.2 → 0.82.3-nightly.20250403

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 (155) hide show
  1. package/README.md +6 -0
  2. package/dest/private/acvm/oracle/oracle.d.ts +3 -2
  3. package/dest/private/acvm/oracle/oracle.d.ts.map +1 -1
  4. package/dest/private/acvm/oracle/oracle.js +9 -6
  5. package/dest/private/acvm/oracle/typed_oracle.d.ts +4 -3
  6. package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -1
  7. package/dest/private/acvm/oracle/typed_oracle.js +4 -1
  8. package/dest/private/execution_data_provider.d.ts +20 -16
  9. package/dest/private/execution_data_provider.d.ts.map +1 -1
  10. package/dest/private/private_execution_oracle.d.ts +1 -1
  11. package/dest/private/private_execution_oracle.d.ts.map +1 -1
  12. package/dest/private/private_execution_oracle.js +2 -6
  13. package/dest/private/unconstrained_execution_oracle.d.ts +4 -2
  14. package/dest/private/unconstrained_execution_oracle.d.ts.map +1 -1
  15. package/dest/private/unconstrained_execution_oracle.js +5 -6
  16. package/dest/public/avm/avm_context.d.ts +3 -3
  17. package/dest/public/avm/avm_context.d.ts.map +1 -1
  18. package/dest/public/avm/avm_contract_call_result.d.ts +4 -2
  19. package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
  20. package/dest/public/avm/avm_contract_call_result.js +9 -5
  21. package/dest/public/avm/avm_machine_state.d.ts +2 -0
  22. package/dest/public/avm/avm_machine_state.d.ts.map +1 -1
  23. package/dest/public/avm/avm_machine_state.js +2 -0
  24. package/dest/public/avm/avm_simulator.d.ts +2 -2
  25. package/dest/public/avm/avm_simulator.d.ts.map +1 -1
  26. package/dest/public/avm/avm_simulator.js +5 -6
  27. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts +2 -2
  28. package/dest/public/avm/fixtures/avm_simulation_tester.d.ts.map +1 -1
  29. package/dest/public/avm/fixtures/avm_simulation_tester.js +3 -4
  30. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts +1 -2
  31. package/dest/public/avm/fixtures/base_avm_simulation_tester.d.ts.map +1 -1
  32. package/dest/public/avm/fixtures/base_avm_simulation_tester.js +0 -5
  33. package/dest/public/avm/fixtures/index.d.ts +6 -5
  34. package/dest/public/avm/fixtures/index.d.ts.map +1 -1
  35. package/dest/public/avm/fixtures/index.js +3 -3
  36. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts +3 -2
  37. package/dest/public/avm/fixtures/simple_contract_data_source.d.ts.map +1 -1
  38. package/dest/public/avm/fixtures/simple_contract_data_source.js +30 -6
  39. package/dest/public/avm/index.d.ts +0 -1
  40. package/dest/public/avm/index.d.ts.map +1 -1
  41. package/dest/public/avm/index.js +0 -1
  42. package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
  43. package/dest/public/avm/opcodes/accrued_substate.js +1 -1
  44. package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
  45. package/dest/public/avm/opcodes/external_calls.js +2 -0
  46. package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
  47. package/dest/public/avm/opcodes/memory.js +8 -10
  48. package/dest/public/avm/serialization/instruction_serialization.d.ts +5 -2
  49. package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
  50. package/dest/public/avm/serialization/instruction_serialization.js +25 -7
  51. package/dest/public/avm/test_utils.d.ts +1 -1
  52. package/dest/public/avm/test_utils.d.ts.map +1 -1
  53. package/dest/public/executor_metrics.d.ts +11 -3
  54. package/dest/public/executor_metrics.d.ts.map +1 -1
  55. package/dest/public/executor_metrics.js +40 -6
  56. package/dest/public/executor_metrics_interface.d.ts +10 -0
  57. package/dest/public/executor_metrics_interface.d.ts.map +1 -0
  58. package/dest/public/executor_metrics_interface.js +1 -0
  59. package/dest/public/fixtures/public_tx_simulation_tester.d.ts +12 -6
  60. package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
  61. package/dest/public/fixtures/public_tx_simulation_tester.js +39 -19
  62. package/dest/public/hinting_db_sources.d.ts +26 -3
  63. package/dest/public/hinting_db_sources.d.ts.map +1 -1
  64. package/dest/public/hinting_db_sources.js +134 -1
  65. package/dest/public/index.d.ts +1 -1
  66. package/dest/public/index.d.ts.map +1 -1
  67. package/dest/public/index.js +1 -1
  68. package/dest/public/public_db_sources.d.ts +2 -3
  69. package/dest/public/public_db_sources.d.ts.map +1 -1
  70. package/dest/public/public_db_sources.js +26 -16
  71. package/dest/public/public_processor/public_processor.d.ts +4 -4
  72. package/dest/public/public_processor/public_processor.d.ts.map +1 -1
  73. package/dest/public/public_processor/public_processor.js +7 -28
  74. package/dest/public/public_tx_simulator/apps_tests/amm_test.d.ts +9 -0
  75. package/dest/public/public_tx_simulator/apps_tests/amm_test.d.ts.map +1 -0
  76. package/dest/public/public_tx_simulator/apps_tests/amm_test.js +237 -0
  77. package/dest/public/public_tx_simulator/apps_tests/token_test.d.ts +7 -0
  78. package/dest/public/public_tx_simulator/apps_tests/token_test.d.ts.map +1 -0
  79. package/dest/public/public_tx_simulator/apps_tests/token_test.js +109 -0
  80. package/dest/public/public_tx_simulator/index.d.ts +3 -0
  81. package/dest/public/public_tx_simulator/index.d.ts.map +1 -0
  82. package/dest/public/public_tx_simulator/index.js +2 -0
  83. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +23 -0
  84. package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -0
  85. package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +58 -0
  86. package/dest/public/public_tx_simulator/public_tx_context.d.ts +5 -5
  87. package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
  88. package/dest/public/public_tx_simulator/public_tx_context.js +10 -8
  89. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +16 -16
  90. package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
  91. package/dest/public/public_tx_simulator/public_tx_simulator.js +25 -65
  92. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +19 -0
  93. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -0
  94. package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +39 -0
  95. package/dest/public/state_manager/index.d.ts +2 -0
  96. package/dest/public/state_manager/index.d.ts.map +1 -0
  97. package/dest/public/state_manager/index.js +1 -0
  98. package/dest/public/{avm/journal → state_manager}/nullifiers.d.ts +1 -1
  99. package/dest/public/state_manager/nullifiers.d.ts.map +1 -0
  100. package/dest/public/{avm/journal → state_manager}/public_storage.d.ts +1 -1
  101. package/dest/public/state_manager/public_storage.d.ts.map +1 -0
  102. package/dest/public/{avm/journal/journal.d.ts → state_manager/state_manager.d.ts} +10 -10
  103. package/dest/public/state_manager/state_manager.d.ts.map +1 -0
  104. package/dest/public/{avm/journal/journal.js → state_manager/state_manager.js} +5 -5
  105. package/dest/public/test_executor_metrics.d.ts +43 -0
  106. package/dest/public/test_executor_metrics.d.ts.map +1 -0
  107. package/dest/public/test_executor_metrics.js +158 -0
  108. package/package.json +14 -14
  109. package/src/private/acvm/oracle/oracle.ts +26 -5
  110. package/src/private/acvm/oracle/typed_oracle.ts +14 -3
  111. package/src/private/execution_data_provider.ts +34 -18
  112. package/src/private/private_execution_oracle.ts +2 -13
  113. package/src/private/unconstrained_execution_oracle.ts +22 -15
  114. package/src/public/avm/avm_context.ts +2 -2
  115. package/src/public/avm/avm_contract_call_result.ts +15 -3
  116. package/src/public/avm/avm_machine_state.ts +5 -0
  117. package/src/public/avm/avm_simulator.ts +20 -9
  118. package/src/public/avm/fixtures/avm_simulation_tester.ts +4 -4
  119. package/src/public/avm/fixtures/base_avm_simulation_tester.ts +1 -7
  120. package/src/public/avm/fixtures/index.ts +7 -7
  121. package/src/public/avm/fixtures/simple_contract_data_source.ts +33 -6
  122. package/src/public/avm/index.ts +0 -1
  123. package/src/public/avm/opcodes/accrued_substate.ts +1 -1
  124. package/src/public/avm/opcodes/external_calls.ts +3 -0
  125. package/src/public/avm/opcodes/memory.ts +8 -10
  126. package/src/public/avm/serialization/instruction_serialization.ts +24 -9
  127. package/src/public/avm/test_utils.ts +1 -1
  128. package/src/public/executor_metrics.ts +54 -6
  129. package/src/public/executor_metrics_interface.ts +15 -0
  130. package/src/public/fixtures/public_tx_simulation_tester.ts +74 -18
  131. package/src/public/hinting_db_sources.ts +228 -3
  132. package/src/public/index.ts +1 -1
  133. package/src/public/public_db_sources.ts +36 -23
  134. package/src/public/public_processor/public_processor.ts +8 -28
  135. package/src/public/public_tx_simulator/apps_tests/amm_test.ts +316 -0
  136. package/src/public/public_tx_simulator/apps_tests/token_test.ts +138 -0
  137. package/src/public/public_tx_simulator/index.ts +2 -0
  138. package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +111 -0
  139. package/src/public/public_tx_simulator/public_tx_context.ts +13 -17
  140. package/src/public/public_tx_simulator/public_tx_simulator.ts +35 -79
  141. package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +62 -0
  142. package/src/public/state_manager/index.ts +1 -0
  143. package/src/public/{avm/journal → state_manager}/nullifiers.ts +1 -1
  144. package/src/public/{avm/journal → state_manager}/public_storage.ts +1 -1
  145. package/src/public/{avm/journal/journal.ts → state_manager/state_manager.ts} +20 -13
  146. package/src/public/test_executor_metrics.ts +222 -0
  147. package/dest/public/avm/journal/index.d.ts +0 -2
  148. package/dest/public/avm/journal/index.d.ts.map +0 -1
  149. package/dest/public/avm/journal/index.js +0 -1
  150. package/dest/public/avm/journal/journal.d.ts.map +0 -1
  151. package/dest/public/avm/journal/nullifiers.d.ts.map +0 -1
  152. package/dest/public/avm/journal/public_storage.d.ts.map +0 -1
  153. package/src/public/avm/journal/index.ts +0 -1
  154. /package/dest/public/{avm/journal → state_manager}/nullifiers.js +0 -0
  155. /package/dest/public/{avm/journal → state_manager}/public_storage.js +0 -0
@@ -1,13 +1,21 @@
1
+ import type { RevertCode } from '@aztec/stdlib/avm';
1
2
  import { type TelemetryClient, type Tracer } from '@aztec/telemetry-client';
2
- export declare class ExecutorMetrics {
3
+ import type { ExecutorMetricsInterface } from './executor_metrics_interface.js';
4
+ export declare class ExecutorMetrics implements ExecutorMetricsInterface {
3
5
  readonly tracer: Tracer;
4
6
  private fnCount;
5
7
  private fnDuration;
6
8
  private manaPerSecond;
9
+ private manaUsed;
10
+ private totalInstructions;
11
+ private txHashing;
7
12
  private privateEffectsInsertions;
8
13
  constructor(client: TelemetryClient, name?: string);
9
- recordFunctionSimulation(durationMs: number, manaUsed: number, fnName: string): void;
10
- recordFunctionSimulationFailure(): void;
14
+ startRecordingTxSimulation(_txLabel: string): void;
15
+ stopRecordingTxSimulation(_txLabel: string, _revertedCode?: RevertCode): void;
16
+ recordEnqueuedCallSimulation(fnName: string, durationMs: number, manaUsed: number, totalInstructions: number): void;
17
+ recordEnqueuedCallSimulationFailure(_fnName: string, _durationMs: number, _manaUsed: number, _totalInstructions: number): void;
18
+ recordTxHashComputation(durationMs: number): void;
11
19
  recordPrivateEffectsInsertion(durationUs: number, type: 'revertible' | 'non-revertible'): void;
12
20
  }
13
21
  //# sourceMappingURL=executor_metrics.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"executor_metrics.d.ts","sourceRoot":"","sources":["../../src/public/executor_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,qBAAa,eAAe;IAC1B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,wBAAwB,CAAY;gBAEhC,MAAM,EAAE,eAAe,EAAE,IAAI,SAAmB;IA2B5D,wBAAwB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAe7E,+BAA+B;IAM/B,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,gBAAgB;CAKxF"}
1
+ {"version":3,"file":"executor_metrics.d.ts","sourceRoot":"","sources":["../../src/public/executor_metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAIL,KAAK,eAAe,EACpB,KAAK,MAAM,EAGZ,MAAM,yBAAyB,CAAC;AAEjC,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,iCAAiC,CAAC;AAEhF,qBAAa,eAAgB,YAAW,wBAAwB;IAC9D,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,aAAa,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAY;IAC5B,OAAO,CAAC,iBAAiB,CAAY;IACrC,OAAO,CAAC,SAAS,CAAY;IAC7B,OAAO,CAAC,wBAAwB,CAAY;gBAEhC,MAAM,EAAE,eAAe,EAAE,IAAI,SAAmB;IA6C5D,0BAA0B,CAAC,QAAQ,EAAE,MAAM;IAI3C,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,UAAU;IAItE,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM;IAsB5G,mCAAmC,CACjC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,kBAAkB,EAAE,MAAM;IAO5B,uBAAuB,CAAC,UAAU,EAAE,MAAM;IAI1C,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,gBAAgB;CAKxF"}
@@ -4,6 +4,9 @@ export class ExecutorMetrics {
4
4
  fnCount;
5
5
  fnDuration;
6
6
  manaPerSecond;
7
+ manaUsed;
8
+ totalInstructions;
9
+ txHashing;
7
10
  privateEffectsInsertions;
8
11
  constructor(client, name = 'PublicExecutor'){
9
12
  this.tracer = client.getTracer(name);
@@ -21,19 +24,47 @@ export class ExecutorMetrics {
21
24
  unit: 'mana/s',
22
25
  valueType: ValueType.INT
23
26
  });
24
- this.privateEffectsInsertions = meter.createHistogram(Metrics.PUBLIC_EXECUTION_PRIVATE_EFFECTS_INSERTION, {
27
+ this.manaUsed = meter.createHistogram(Metrics.PUBLIC_EXECUTOR_SIMULATION_MANA_USED, {
28
+ description: 'Total mana used',
29
+ unit: 'mana',
30
+ valueType: ValueType.INT
31
+ });
32
+ this.totalInstructions = meter.createHistogram(Metrics.PUBLIC_EXECUTOR_SIMULATION_TOTAL_INSTRUCTIONS, {
33
+ description: 'Total number of instructions executed',
34
+ unit: 'instructions',
35
+ valueType: ValueType.INT
36
+ });
37
+ this.txHashing = meter.createHistogram(Metrics.PUBLIC_EXECUTOR_TX_HASHING, {
38
+ description: 'Tx hashing time',
39
+ unit: 'ms',
40
+ valueType: ValueType.INT
41
+ });
42
+ this.privateEffectsInsertions = meter.createHistogram(Metrics.PUBLIC_EXECUTOR_PRIVATE_EFFECTS_INSERTION, {
25
43
  description: 'Private effects insertion time',
26
44
  unit: 'us',
27
45
  valueType: ValueType.INT
28
46
  });
29
47
  }
30
- recordFunctionSimulation(durationMs, manaUsed, fnName) {
48
+ startRecordingTxSimulation(_txLabel) {
49
+ // do nothing (unimplemented)
50
+ }
51
+ stopRecordingTxSimulation(_txLabel, _revertedCode) {
52
+ // do nothing (unimplemented)
53
+ }
54
+ recordEnqueuedCallSimulation(fnName, durationMs, manaUsed, totalInstructions) {
31
55
  this.fnCount.add(1, {
32
56
  [Attributes.OK]: true,
33
- [Attributes.APP_CIRCUIT_NAME]: fnName,
34
- [Attributes.MANA_USED]: manaUsed
57
+ [Attributes.APP_CIRCUIT_NAME]: fnName
58
+ });
59
+ this.manaUsed.record(Math.ceil(manaUsed), {
60
+ [Attributes.APP_CIRCUIT_NAME]: fnName
61
+ });
62
+ this.totalInstructions.record(Math.ceil(totalInstructions), {
63
+ [Attributes.APP_CIRCUIT_NAME]: fnName
64
+ });
65
+ this.fnDuration.record(Math.ceil(durationMs), {
66
+ [Attributes.APP_CIRCUIT_NAME]: fnName
35
67
  });
36
- this.fnDuration.record(Math.ceil(durationMs));
37
68
  if (durationMs > 0 && manaUsed > 0) {
38
69
  const manaPerSecond = Math.round(manaUsed * 1000 / durationMs);
39
70
  this.manaPerSecond.record(manaPerSecond, {
@@ -41,11 +72,14 @@ export class ExecutorMetrics {
41
72
  });
42
73
  }
43
74
  }
44
- recordFunctionSimulationFailure() {
75
+ recordEnqueuedCallSimulationFailure(_fnName, _durationMs, _manaUsed, _totalInstructions) {
45
76
  this.fnCount.add(1, {
46
77
  [Attributes.OK]: false
47
78
  });
48
79
  }
80
+ recordTxHashComputation(durationMs) {
81
+ this.txHashing.record(Math.ceil(durationMs));
82
+ }
49
83
  recordPrivateEffectsInsertion(durationUs, type) {
50
84
  this.privateEffectsInsertions.record(Math.ceil(durationUs), {
51
85
  [Attributes.REVERTIBILITY]: type
@@ -0,0 +1,10 @@
1
+ import type { RevertCode } from '@aztec/stdlib/avm';
2
+ export interface ExecutorMetricsInterface {
3
+ startRecordingTxSimulation(txLabel: string): void;
4
+ stopRecordingTxSimulation(txLabel: string, revertedCode?: RevertCode): void;
5
+ recordEnqueuedCallSimulation(fnName: string, durationMs: number, manaUsed: number, totalInstructions: number): void;
6
+ recordEnqueuedCallSimulationFailure(fnName: string, durationMs: number, manaUsed: number, totalInstructions: number): void;
7
+ recordTxHashComputation(durationMs: number): void;
8
+ recordPrivateEffectsInsertion(durationUs: number, type: 'revertible' | 'non-revertible'): void;
9
+ }
10
+ //# sourceMappingURL=executor_metrics_interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor_metrics_interface.d.ts","sourceRoot":"","sources":["../../src/public/executor_metrics_interface.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAEpD,MAAM,WAAW,wBAAwB;IACvC,0BAA0B,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,yBAAyB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5E,4BAA4B,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACpH,mCAAmC,CACjC,MAAM,EAAE,MAAM,EACd,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,iBAAiB,EAAE,MAAM,GACxB,IAAI,CAAC;IACR,uBAAuB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAClD,6BAA6B,CAAC,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,YAAY,GAAG,gBAAgB,GAAG,IAAI,CAAC;CAChG"}
@@ -0,0 +1 @@
1
+ export { };
@@ -5,9 +5,10 @@ import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server'
5
5
  import { GlobalVariables, type Tx } from '@aztec/stdlib/tx';
6
6
  import { BaseAvmSimulationTester } from '../avm/fixtures/base_avm_simulation_tester.js';
7
7
  import { SimpleContractDataSource } from '../avm/fixtures/simple_contract_data_source.js';
8
- import { type PublicTxResult } from '../public_tx_simulator/public_tx_simulator.js';
9
- export declare const DEFAULT_BLOCK_NUMBER = 42;
8
+ import type { PublicTxResult } from '../public_tx_simulator/public_tx_simulator.js';
9
+ import { TestExecutorMetrics } from '../test_executor_metrics.js';
10
10
  export type TestEnqueuedCall = {
11
+ sender?: AztecAddress;
11
12
  address: AztecAddress;
12
13
  fnName: string;
13
14
  args: any[];
@@ -21,12 +22,17 @@ export type TestEnqueuedCall = {
21
22
  */
22
23
  export declare class PublicTxSimulationTester extends BaseAvmSimulationTester {
23
24
  #private;
24
- private merkleTree;
25
+ private metrics;
25
26
  private txCount;
26
- constructor(merkleTree: MerkleTreeWriteOperations, contractDataSource: SimpleContractDataSource);
27
- static create(): Promise<PublicTxSimulationTester>;
27
+ private simulator;
28
+ private metricsPrefix?;
29
+ constructor(merkleTree: MerkleTreeWriteOperations, contractDataSource: SimpleContractDataSource, globals?: GlobalVariables, metrics?: TestExecutorMetrics);
30
+ static create(globals?: GlobalVariables, metrics?: TestExecutorMetrics): Promise<PublicTxSimulationTester>;
31
+ setMetricsPrefix(prefix: string): void;
28
32
  createTx(sender: AztecAddress, setupCalls?: TestEnqueuedCall[], appCalls?: TestEnqueuedCall[], teardownCall?: TestEnqueuedCall, feePayer?: AztecAddress, firstNullifier?: Fr): Promise<Tx>;
29
- simulateTx(sender: AztecAddress, setupCalls?: TestEnqueuedCall[], appCalls?: TestEnqueuedCall[], teardownCall?: TestEnqueuedCall, feePayer?: AztecAddress, firstNullifier?: Fr, globals?: GlobalVariables): Promise<PublicTxResult>;
33
+ simulateTx(sender: AztecAddress, setupCalls?: TestEnqueuedCall[], appCalls?: TestEnqueuedCall[], teardownCall?: TestEnqueuedCall, feePayer?: AztecAddress, firstNullifier?: Fr, txLabel?: string): Promise<PublicTxResult>;
34
+ simulateTxWithLabel(txLabel: string, sender: AztecAddress, setupCalls?: TestEnqueuedCall[], appCalls?: TestEnqueuedCall[], teardownCall?: TestEnqueuedCall, feePayer?: AztecAddress, firstNullifier?: Fr): Promise<PublicTxResult>;
35
+ prettyPrintMetrics(): void;
30
36
  }
31
37
  export declare function defaultGlobals(): GlobalVariables;
32
38
  //# sourceMappingURL=public_tx_simulation_tester.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public_tx_simulation_tester.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/public_tx_simulation_tester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,KAAK,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEjF,OAAO,EAAE,eAAe,EAAiC,KAAK,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAG3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAE1F,OAAO,EAAE,KAAK,cAAc,EAAqB,MAAM,+CAA+C,CAAC;AAKvG,eAAO,MAAM,oBAAoB,KAAK,CAAC;AAEvC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,wBAAyB,SAAQ,uBAAuB;;IAGvD,OAAO,CAAC,UAAU;IAF9B,OAAO,CAAC,OAAO,CAAK;gBAEA,UAAU,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,wBAAwB;WAInF,MAAM,IAAI,OAAO,CAAC,wBAAwB,CAAC;IAMlD,QAAQ,CACnB,MAAM,EAAE,YAAY,EACpB,UAAU,GAAE,gBAAgB,EAAO,EACnC,QAAQ,GAAE,gBAAgB,EAAO,EACjC,YAAY,CAAC,EAAE,gBAAgB,EAC/B,QAAQ,GAAE,YAAqB,EAE/B,cAAc,KAAkC,GAC/C,OAAO,CAAC,EAAE,CAAC;IAUD,UAAU,CACrB,MAAM,EAAE,YAAY,EACpB,UAAU,GAAE,gBAAgB,EAAO,EACnC,QAAQ,GAAE,gBAAgB,EAAO,EACjC,YAAY,CAAC,EAAE,gBAAgB,EAC/B,QAAQ,GAAE,YAAqB,EAE/B,cAAc,KAAkC,EAChD,OAAO,kBAAmB,GACzB,OAAO,CAAC,cAAc,CAAC;CAoC3B;AAED,wBAAgB,cAAc,oBAM7B"}
1
+ {"version":3,"file":"public_tx_simulation_tester.d.ts","sourceRoot":"","sources":["../../../src/public/fixtures/public_tx_simulation_tester.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,KAAK,gBAAgB,EAAmB,MAAM,mBAAmB,CAAC;AAC3E,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAEjF,OAAO,EAAE,eAAe,EAAiC,KAAK,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAG3F,OAAO,EAAE,uBAAuB,EAAE,MAAM,+CAA+C,CAAC;AAExF,OAAO,EAAE,wBAAwB,EAAE,MAAM,gDAAgD,CAAC;AAG1F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,+CAA+C,CAAC;AACpF,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAMlE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,OAAO,EAAE,YAAY,CAAC;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,GAAG,EAAE,CAAC;IACZ,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;CACrC,CAAC;AAEF;;;;GAIG;AACH,qBAAa,wBAAyB,SAAQ,uBAAuB;;IASjE,OAAO,CAAC,OAAO;IARjB,OAAO,CAAC,OAAO,CAAK;IACpB,OAAO,CAAC,SAAS,CAA4B;IAC7C,OAAO,CAAC,aAAa,CAAC,CAAS;gBAG7B,UAAU,EAAE,yBAAyB,EACrC,kBAAkB,EAAE,wBAAwB,EAC5C,OAAO,GAAE,eAAkC,EACnC,OAAO,GAAE,mBAA+C;WAiB9C,MAAM,CACxB,OAAO,GAAE,eAAkC,EAC3C,OAAO,GAAE,mBAA+C,GACvD,OAAO,CAAC,wBAAwB,CAAC;IAM7B,gBAAgB,CAAC,MAAM,EAAE,MAAM;IAIzB,QAAQ,CACnB,MAAM,EAAE,YAAY,EACpB,UAAU,GAAE,gBAAgB,EAAO,EACnC,QAAQ,GAAE,gBAAgB,EAAO,EACjC,YAAY,CAAC,EAAE,gBAAgB,EAC/B,QAAQ,GAAE,YAAqB,EAE/B,cAAc,KAAkC,GAC/C,OAAO,CAAC,EAAE,CAAC;IAcD,UAAU,CACrB,MAAM,EAAE,YAAY,EACpB,UAAU,GAAE,gBAAgB,EAAO,EACnC,QAAQ,GAAE,gBAAgB,EAAO,EACjC,YAAY,CAAC,EAAE,gBAAgB,EAC/B,QAAQ,GAAE,YAAqB,EAE/B,cAAc,KAAkC,EAChD,OAAO,GAAE,MAAsB,GAC9B,OAAO,CAAC,cAAc,CAAC;IAyBb,mBAAmB,CAC9B,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,YAAY,EACpB,UAAU,CAAC,EAAE,gBAAgB,EAAE,EAC/B,QAAQ,CAAC,EAAE,gBAAgB,EAAE,EAC7B,YAAY,CAAC,EAAE,gBAAgB,EAC/B,QAAQ,CAAC,EAAE,YAAY,EACvB,cAAc,CAAC,EAAE,EAAE,GAClB,OAAO,CAAC,cAAc,CAAC;IAInB,kBAAkB;CAuB1B;AAED,wBAAgB,cAAc,oBAM7B"}
@@ -6,47 +6,67 @@ import { PublicCallRequest } from '@aztec/stdlib/kernel';
6
6
  import { GlobalVariables, PublicCallRequestWithCalldata } from '@aztec/stdlib/tx';
7
7
  import { NativeWorldStateService } from '@aztec/world-state';
8
8
  import { BaseAvmSimulationTester } from '../avm/fixtures/base_avm_simulation_tester.js';
9
- import { getContractFunctionAbi, getFunctionSelector } from '../avm/fixtures/index.js';
9
+ import { DEFAULT_BLOCK_NUMBER, getContractFunctionAbi, getFunctionSelector } from '../avm/fixtures/index.js';
10
10
  import { SimpleContractDataSource } from '../avm/fixtures/simple_contract_data_source.js';
11
11
  import { PublicContractsDB, PublicTreesDB } from '../public_db_sources.js';
12
- import { PublicTxSimulator } from '../public_tx_simulator/public_tx_simulator.js';
12
+ import { MeasuredPublicTxSimulator } from '../public_tx_simulator/measured_public_tx_simulator.js';
13
+ import { TestExecutorMetrics } from '../test_executor_metrics.js';
13
14
  import { createTxForPublicCalls } from './utils.js';
14
15
  const TIMESTAMP = new Fr(99833);
15
16
  const DEFAULT_GAS_FEES = new GasFees(2, 3);
16
- export const DEFAULT_BLOCK_NUMBER = 42;
17
17
  /**
18
18
  * A test class that extends the BaseAvmSimulationTester to enable real-app testing of the PublicTxSimulator.
19
19
  * It provides an interface for simulating one transaction at a time and maintains state between subsequent
20
20
  * transactions.
21
21
  */ export class PublicTxSimulationTester extends BaseAvmSimulationTester {
22
- merkleTree;
22
+ metrics;
23
23
  txCount;
24
- constructor(merkleTree, contractDataSource){
25
- super(contractDataSource, merkleTree), this.merkleTree = merkleTree, this.txCount = 0;
24
+ simulator;
25
+ metricsPrefix;
26
+ constructor(merkleTree, contractDataSource, globals = defaultGlobals(), metrics = new TestExecutorMetrics()){
27
+ super(contractDataSource, merkleTree), this.metrics = metrics, this.txCount = 0;
28
+ const treesDB = new PublicTreesDB(merkleTree);
29
+ const contractsDB = new PublicContractsDB(contractDataSource);
30
+ this.simulator = new MeasuredPublicTxSimulator(treesDB, contractsDB, globals, /*doMerkleOperations=*/ true, /*skipFeeEnforcement=*/ false, this.metrics);
26
31
  }
27
- static async create() {
32
+ static async create(globals = defaultGlobals(), metrics = new TestExecutorMetrics()) {
28
33
  const contractDataSource = new SimpleContractDataSource();
29
34
  const merkleTree = await (await NativeWorldStateService.tmp()).fork();
30
- return new PublicTxSimulationTester(merkleTree, contractDataSource);
35
+ return new PublicTxSimulationTester(merkleTree, contractDataSource, globals, metrics);
36
+ }
37
+ setMetricsPrefix(prefix) {
38
+ this.metricsPrefix = prefix;
31
39
  }
32
40
  async createTx(sender, setupCalls = [], appCalls = [], teardownCall, feePayer = sender, /* need some unique first nullifier for note-nonce computations */ firstNullifier = new Fr(420000 + this.txCount++)) {
33
- const setupCallRequests = await asyncMap(setupCalls, (call)=>this.#createPubicCallRequestForCall(call, sender));
34
- const appCallRequests = await asyncMap(appCalls, (call)=>this.#createPubicCallRequestForCall(call, sender));
35
- const teardownCallRequest = teardownCall ? await this.#createPubicCallRequestForCall(teardownCall, sender) : undefined;
41
+ const setupCallRequests = await asyncMap(setupCalls, (call)=>this.#createPubicCallRequestForCall(call, call.sender ?? sender));
42
+ const appCallRequests = await asyncMap(appCalls, (call)=>this.#createPubicCallRequestForCall(call, call.sender ?? sender));
43
+ const teardownCallRequest = teardownCall ? await this.#createPubicCallRequestForCall(teardownCall, teardownCall.sender ?? sender) : undefined;
36
44
  return createTxForPublicCalls(firstNullifier, setupCallRequests, appCallRequests, teardownCallRequest, feePayer);
37
45
  }
38
- async simulateTx(sender, setupCalls = [], appCalls = [], teardownCall, feePayer = sender, /* need some unique first nullifier for note-nonce computations */ firstNullifier = new Fr(420000 + this.txCount++), globals = defaultGlobals()) {
46
+ async simulateTx(sender, setupCalls = [], appCalls = [], teardownCall, feePayer = sender, /* need some unique first nullifier for note-nonce computations */ firstNullifier = new Fr(420000 + this.txCount++), txLabel = 'unlabeledTx') {
39
47
  const tx = await this.createTx(sender, setupCalls, appCalls, teardownCall, feePayer, firstNullifier);
40
48
  await this.setFeePayerBalance(feePayer);
41
- const treesDB = new PublicTreesDB(this.merkleTree);
42
- const contractsDB = new PublicContractsDB(this.contractDataSource);
43
- const simulator = new PublicTxSimulator(treesDB, contractsDB, globals, /*doMerkleOperations=*/ true);
44
- const startTime = performance.now();
45
- const avmResult = await simulator.simulate(tx);
46
- const endTime = performance.now();
47
- this.logger.debug(`Public transaction simulation took ${endTime - startTime}ms`);
49
+ const txLabelWithCount = `${txLabel}.${this.txCount - 1}`;
50
+ const fullTxLabel = this.metricsPrefix ? `${this.metricsPrefix}.${txLabelWithCount}` : txLabelWithCount;
51
+ const avmResult = await this.simulator.simulate(tx, fullTxLabel);
52
+ // Something like this is often useful for debugging:
53
+ //if (avmResult.revertReason) {
54
+ // // resolve / enrich revert reason
55
+ // const lastAppCall = appCalls[appCalls.length - 1];
56
+ // const contractArtifact =
57
+ // lastAppCall.contractArtifact || (await this.contractDataSource.getContractArtifact(lastAppCall.address));
58
+ // const fnAbi = getContractFunctionAbi(lastAppCall.fnName, contractArtifact!);
59
+ // const revertReason = resolveAssertionMessageFromRevertData(avmResult.revertReason.revertData, fnAbi!);
60
+ // this.logger.debug(`Revert reason: ${revertReason}`);
61
+ //}
48
62
  return avmResult;
49
63
  }
64
+ async simulateTxWithLabel(txLabel, sender, setupCalls, appCalls, teardownCall, feePayer, firstNullifier) {
65
+ return await this.simulateTx(sender, setupCalls, appCalls, teardownCall, feePayer, firstNullifier, txLabel);
66
+ }
67
+ prettyPrintMetrics() {
68
+ this.metrics.prettyPrint();
69
+ }
50
70
  async #createPubicCallRequestForCall(call, sender) {
51
71
  const address = call.address;
52
72
  const contractArtifact = call.contractArtifact || await this.contractDataSource.getContractArtifact(address);
@@ -1,19 +1,42 @@
1
- import type { Fr } from '@aztec/foundation/fields';
1
+ /// <reference types="node" resolution-mode="require"/>
2
+ /// <reference types="node" resolution-mode="require"/>
3
+ import { Fr } from '@aztec/foundation/fields';
4
+ import type { IndexedTreeLeafPreimage, SiblingPath } from '@aztec/foundation/trees';
2
5
  import type { FunctionSelector } from '@aztec/stdlib/abi';
3
6
  import { type AvmExecutionHints } from '@aztec/stdlib/avm';
4
7
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
5
8
  import type { ContractClassPublic, ContractInstanceWithAddress } from '@aztec/stdlib/contract';
6
- import type { PublicContractsDBInterface } from '../server.js';
9
+ import { type IndexedTreeId, MerkleTreeId, type MerkleTreeLeafType, type SequentialInsertionResult } from '@aztec/stdlib/trees';
10
+ import type { PublicContractsDBInterface } from '../common/db_interfaces.js';
11
+ import { PublicTreesDB } from './public_db_sources.js';
7
12
  /**
8
13
  * A public contracts database that forwards requests and collects AVM hints.
9
14
  */
10
15
  export declare class HintingPublicContractsDB implements PublicContractsDBInterface {
11
16
  private readonly db;
12
- readonly hints: AvmExecutionHints;
17
+ private hints;
13
18
  constructor(db: PublicContractsDBInterface, hints: AvmExecutionHints);
14
19
  getContractInstance(address: AztecAddress, blockNumber: number): Promise<ContractInstanceWithAddress | undefined>;
15
20
  getContractClass(contractClassId: Fr): Promise<ContractClassPublic | undefined>;
16
21
  getBytecodeCommitment(contractClassId: Fr): Promise<Fr | undefined>;
17
22
  getDebugFunctionName(contractAddress: AztecAddress, selector: FunctionSelector): Promise<string | undefined>;
18
23
  }
24
+ /**
25
+ * A public trees database that forwards requests and collects AVM hints.
26
+ */
27
+ export declare class HintingPublicTreesDB extends PublicTreesDB {
28
+ private hints;
29
+ private static readonly log;
30
+ constructor(db: PublicTreesDB, hints: AvmExecutionHints);
31
+ getSiblingPath<N extends number>(treeId: MerkleTreeId, index: bigint): Promise<SiblingPath<N>>;
32
+ getPreviousValueIndex<ID extends IndexedTreeId>(treeId: ID, value: bigint): Promise<{
33
+ index: bigint;
34
+ alreadyPresent: boolean;
35
+ } | undefined>;
36
+ getLeafPreimage<ID extends IndexedTreeId>(treeId: ID, index: bigint): Promise<IndexedTreeLeafPreimage | undefined>;
37
+ getLeafValue<ID extends MerkleTreeId>(treeId: ID, index: bigint): Promise<MerkleTreeLeafType<typeof treeId> | undefined>;
38
+ sequentialInsert<TreeHeight extends number, ID extends IndexedTreeId>(treeId: ID, leaves: Buffer[]): Promise<SequentialInsertionResult<TreeHeight>>;
39
+ revertCheckpoint(): Promise<void>;
40
+ private getHintKey;
41
+ }
19
42
  //# sourceMappingURL=hinting_db_sources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"hinting_db_sources.d.ts","sourceRoot":"","sources":["../../src/public/hinting_db_sources.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAIL,KAAK,iBAAiB,EACvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAE/F,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,cAAc,CAAC;AAE/D;;GAEG;AACH,qBAAa,wBAAyB,YAAW,0BAA0B;IAC7D,OAAO,CAAC,QAAQ,CAAC,EAAE;aAA8C,KAAK,EAAE,iBAAiB;gBAAxE,EAAE,EAAE,0BAA0B,EAAkB,KAAK,EAAE,iBAAiB;IAExF,mBAAmB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC;IAmBtC,gBAAgB,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAe/E,qBAAqB,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IAQnE,oBAAoB,CAC/B,eAAe,EAAE,YAAY,EAC7B,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAG/B"}
1
+ {"version":3,"file":"hinting_db_sources.d.ts","sourceRoot":"","sources":["../../src/public/hinting_db_sources.ts"],"names":[],"mappings":";;AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAE9C,OAAO,KAAK,EAAE,uBAAuB,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACpF,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,EAIL,KAAK,iBAAiB,EAQvB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAC/F,OAAO,EAEL,KAAK,aAAa,EAClB,YAAY,EACZ,KAAK,kBAAkB,EAKvB,KAAK,yBAAyB,EAE/B,MAAM,qBAAqB,CAAC;AAI7B,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,4BAA4B,CAAC;AAC7E,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;GAEG;AACH,qBAAa,wBAAyB,YAAW,0BAA0B;IAC7D,OAAO,CAAC,QAAQ,CAAC,EAAE;IAA8B,OAAO,CAAC,KAAK;gBAA7C,EAAE,EAAE,0BAA0B,EAAU,KAAK,EAAE,iBAAiB;IAEhF,mBAAmB,CAC9B,OAAO,EAAE,YAAY,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,2BAA2B,GAAG,SAAS,CAAC;IAmBtC,gBAAgB,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC;IAe/E,qBAAqB,CAAC,eAAe,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC;IAQnE,oBAAoB,CAC/B,eAAe,EAAE,YAAY,EAC7B,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;CAG/B;AAED;;GAEG;AACH,qBAAa,oBAAqB,SAAQ,aAAa;IAGtB,OAAO,CAAC,KAAK;IAF5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAgD;gBAE/D,EAAE,EAAE,aAAa,EAAU,KAAK,EAAE,iBAAiB;IAKzC,cAAc,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAO9F,qBAAqB,CAAC,EAAE,SAAS,aAAa,EAClE,MAAM,EAAE,EAAE,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CACN;QACE,KAAK,EAAE,MAAM,CAAC;QACd,cAAc,EAAE,OAAO,CAAC;KACzB,GACD,SAAS,CACZ;IAgBqB,eAAe,CAAC,EAAE,SAAS,aAAa,EAC5D,MAAM,EAAE,EAAE,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC;IA0BzB,YAAY,CAAC,EAAE,SAAS,YAAY,EACxD,MAAM,EAAE,EAAE,EACV,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,kBAAkB,CAAC,OAAO,MAAM,CAAC,GAAG,SAAS,CAAC;IAiBnC,gBAAgB,CAAC,UAAU,SAAS,MAAM,EAAE,EAAE,SAAS,aAAa,EACxF,MAAM,EAAE,EAAE,EACV,MAAM,EAAE,MAAM,EAAE,GACf,OAAO,CAAC,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAkE3B,gBAAgB,IAAI,OAAO,CAAC,IAAI,CAAC;YAkCzC,UAAU;CAIzB"}
@@ -1,4 +1,9 @@
1
- import { AvmBytecodeCommitmentHint, AvmContractClassHint, AvmContractInstanceHint } from '@aztec/stdlib/avm';
1
+ import { Fr } from '@aztec/foundation/fields';
2
+ import { createLogger } from '@aztec/foundation/log';
3
+ import { AvmBytecodeCommitmentHint, AvmContractClassHint, AvmContractInstanceHint, AvmGetLeafPreimageHintNullifierTree, AvmGetLeafPreimageHintPublicDataTree, AvmGetLeafValueHint, AvmGetPreviousValueIndexHint, AvmGetSiblingPathHint, AvmSequentialInsertHintNullifierTree, AvmSequentialInsertHintPublicDataTree } from '@aztec/stdlib/avm';
4
+ import { AppendOnlyTreeSnapshot, MerkleTreeId, NullifierLeaf, PublicDataTreeLeaf, getTreeName } from '@aztec/stdlib/trees';
5
+ import { strict as assert } from 'assert';
6
+ import { PublicTreesDB } from './public_db_sources.js';
2
7
  /**
3
8
  * A public contracts database that forwards requests and collects AVM hints.
4
9
  */ export class HintingPublicContractsDB {
@@ -34,3 +39,131 @@ import { AvmBytecodeCommitmentHint, AvmContractClassHint, AvmContractInstanceHin
34
39
  return await this.db.getDebugFunctionName(contractAddress, selector);
35
40
  }
36
41
  }
42
+ /**
43
+ * A public trees database that forwards requests and collects AVM hints.
44
+ */ export class HintingPublicTreesDB extends PublicTreesDB {
45
+ hints;
46
+ static log = createLogger('HintingPublicTreesDB');
47
+ constructor(db, hints){
48
+ super(db), this.hints = hints;
49
+ }
50
+ // Getters.
51
+ async getSiblingPath(treeId, index) {
52
+ const path = await super.getSiblingPath(treeId, index);
53
+ const key = await this.getHintKey(treeId);
54
+ this.hints.getSiblingPathHints.push(new AvmGetSiblingPathHint(key, treeId, index, path.toFields()));
55
+ return Promise.resolve(path);
56
+ }
57
+ async getPreviousValueIndex(treeId, value) {
58
+ const result = await super.getPreviousValueIndex(treeId, value);
59
+ if (result === undefined) {
60
+ throw new Error(`getPreviousValueIndex(${getTreeName(treeId)}, ${value}}) returned undefined. Possible wrong tree setup or corrupted state.`);
61
+ }
62
+ const key = await this.getHintKey(treeId);
63
+ this.hints.getPreviousValueIndexHints.push(new AvmGetPreviousValueIndexHint(key, treeId, new Fr(value), result.index, result.alreadyPresent));
64
+ return result;
65
+ }
66
+ async getLeafPreimage(treeId, index) {
67
+ const preimage = await super.getLeafPreimage(treeId, index);
68
+ if (preimage) {
69
+ const key = await this.getHintKey(treeId);
70
+ switch(treeId){
71
+ case MerkleTreeId.PUBLIC_DATA_TREE:
72
+ this.hints.getLeafPreimageHintsPublicDataTree.push(new AvmGetLeafPreimageHintPublicDataTree(key, index, preimage));
73
+ break;
74
+ case MerkleTreeId.NULLIFIER_TREE:
75
+ this.hints.getLeafPreimageHintsNullifierTree.push(new AvmGetLeafPreimageHintNullifierTree(key, index, preimage));
76
+ break;
77
+ default:
78
+ // Use getLeafValue for the other trees.
79
+ throw new Error('getLeafPreimage only supported for PublicDataTree and NullifierTree!');
80
+ break;
81
+ }
82
+ }
83
+ return preimage;
84
+ }
85
+ async getLeafValue(treeId, index) {
86
+ // Use getLeafPreimage for PublicDataTree and NullifierTree.
87
+ assert(treeId == MerkleTreeId.NOTE_HASH_TREE || treeId == MerkleTreeId.L1_TO_L2_MESSAGE_TREE);
88
+ const value = await super.getLeafValue(treeId, index);
89
+ if (value) {
90
+ const key = await this.getHintKey(treeId);
91
+ // We can cast to Fr because we know the type of the tree.
92
+ this.hints.getLeafValueHints.push(new AvmGetLeafValueHint(key, treeId, index, value));
93
+ }
94
+ return value;
95
+ }
96
+ // State modification.
97
+ // FIXME(fcarreiro): This is a horrible interface (in the merkle ops). It's receiving the leaves as buffers,
98
+ // from a leaf class that is NOT the one that will be used to write. Make this type safe.
99
+ async sequentialInsert(treeId, leaves) {
100
+ // Use appendLeaf for NoteHashTree and L1ToL2MessageTree.
101
+ assert(treeId == MerkleTreeId.PUBLIC_DATA_TREE || treeId == MerkleTreeId.NULLIFIER_TREE);
102
+ // We only support 1 leaf at a time for now. Can easily be extended.
103
+ assert(leaves.length === 1, 'sequentialInsert supports only one leaf at a time!');
104
+ const beforeState = await this.getHintKey(treeId);
105
+ const result = await super.sequentialInsert(treeId, leaves);
106
+ const afterState = await this.getHintKey(treeId);
107
+ HintingPublicTreesDB.log.debug(`Evolved tree state (${getTreeName(treeId)}): ${beforeState.root}, ${beforeState.nextAvailableLeafIndex} -> ${afterState.root}, ${afterState.nextAvailableLeafIndex}.`);
108
+ switch(treeId){
109
+ case MerkleTreeId.PUBLIC_DATA_TREE:
110
+ this.hints.sequentialInsertHintsPublicDataTree.push(new AvmSequentialInsertHintPublicDataTree(beforeState, afterState, treeId, PublicDataTreeLeaf.fromBuffer(leaves[0]), {
111
+ leaf: result.lowLeavesWitnessData[0].leafPreimage,
112
+ index: result.lowLeavesWitnessData[0].index,
113
+ path: result.lowLeavesWitnessData[0].siblingPath.toFields()
114
+ }, {
115
+ leaf: result.insertionWitnessData[0].leafPreimage,
116
+ index: result.insertionWitnessData[0].index,
117
+ path: result.insertionWitnessData[0].siblingPath.toFields()
118
+ }));
119
+ break;
120
+ case MerkleTreeId.NULLIFIER_TREE:
121
+ this.hints.sequentialInsertHintsNullifierTree.push(new AvmSequentialInsertHintNullifierTree(beforeState, afterState, treeId, NullifierLeaf.fromBuffer(leaves[0]), {
122
+ leaf: result.lowLeavesWitnessData[0].leafPreimage,
123
+ index: result.lowLeavesWitnessData[0].index,
124
+ path: result.lowLeavesWitnessData[0].siblingPath.toFields()
125
+ }, {
126
+ leaf: result.insertionWitnessData[0].leafPreimage,
127
+ index: result.insertionWitnessData[0].index,
128
+ path: result.insertionWitnessData[0].siblingPath.toFields()
129
+ }));
130
+ break;
131
+ default:
132
+ throw new Error('sequentialInsert only supported for PublicDataTree and NullifierTree!');
133
+ break;
134
+ }
135
+ return result;
136
+ }
137
+ async revertCheckpoint() {
138
+ HintingPublicTreesDB.log.debug('revertCheckpoint not hinted yet!');
139
+ // TODO(fcarreiro): we probably want to hint on StateReference hash.
140
+ // WARNING: is this enough? we might actually need the number of the checkpoint or similar...
141
+ // We will need to keep a stack of checkpoints on the C++ side.
142
+ const beforeState = {
143
+ [MerkleTreeId.PUBLIC_DATA_TREE]: await this.getHintKey(MerkleTreeId.PUBLIC_DATA_TREE),
144
+ [MerkleTreeId.NULLIFIER_TREE]: await this.getHintKey(MerkleTreeId.NULLIFIER_TREE),
145
+ [MerkleTreeId.NOTE_HASH_TREE]: await this.getHintKey(MerkleTreeId.NOTE_HASH_TREE),
146
+ [MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: await this.getHintKey(MerkleTreeId.L1_TO_L2_MESSAGE_TREE),
147
+ [MerkleTreeId.ARCHIVE]: await this.getHintKey(MerkleTreeId.ARCHIVE)
148
+ };
149
+ await super.revertCheckpoint();
150
+ const afterState = {
151
+ [MerkleTreeId.PUBLIC_DATA_TREE]: await this.getHintKey(MerkleTreeId.PUBLIC_DATA_TREE),
152
+ [MerkleTreeId.NULLIFIER_TREE]: await this.getHintKey(MerkleTreeId.NULLIFIER_TREE),
153
+ [MerkleTreeId.NOTE_HASH_TREE]: await this.getHintKey(MerkleTreeId.NOTE_HASH_TREE),
154
+ [MerkleTreeId.L1_TO_L2_MESSAGE_TREE]: await this.getHintKey(MerkleTreeId.L1_TO_L2_MESSAGE_TREE),
155
+ [MerkleTreeId.ARCHIVE]: await this.getHintKey(MerkleTreeId.ARCHIVE)
156
+ };
157
+ HintingPublicTreesDB.log.debug('Evolved tree state:');
158
+ for (const treeId of Object.keys(beforeState)){
159
+ const id = treeId;
160
+ const treeName = getTreeName(id);
161
+ HintingPublicTreesDB.log.debug(`${treeName}: ${beforeState[id].root}, ${beforeState[id].nextAvailableLeafIndex} -> ${afterState[id].root}, ${afterState[id].nextAvailableLeafIndex}.`);
162
+ }
163
+ }
164
+ // Private methods.
165
+ async getHintKey(treeId) {
166
+ const treeInfo = await super.getTreeInfo(treeId);
167
+ return new AppendOnlyTreeSnapshot(Fr.fromBuffer(treeInfo.root), Number(treeInfo.size));
168
+ }
169
+ }
@@ -1,5 +1,5 @@
1
1
  export * from '../common/db_interfaces.js';
2
- export * from './public_tx_simulator/public_tx_simulator.js';
2
+ export * from './public_tx_simulator/index.js';
3
3
  export * from './public_db_sources.js';
4
4
  export { PublicProcessor, PublicProcessorFactory } from './public_processor/public_processor.js';
5
5
  export { SideEffectTrace } from './side_effect_trace.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/public/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,8CAA8C,CAAC;AAC7D,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,kCAAkC,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/public/index.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,cAAc,gCAAgC,CAAC;AAC/C,cAAc,wBAAwB,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC/D,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,kCAAkC,EAAE,MAAM,YAAY,CAAC"}
@@ -1,5 +1,5 @@
1
1
  export * from '../common/db_interfaces.js';
2
- export * from './public_tx_simulator/public_tx_simulator.js';
2
+ export * from './public_tx_simulator/index.js';
3
3
  export * from './public_db_sources.js';
4
4
  export { PublicProcessor, PublicProcessorFactory } from './public_processor/public_processor.js';
5
5
  export { SideEffectTrace } from './side_effect_trace.js';
@@ -5,7 +5,7 @@ import type { IndexedTreeLeafPreimage, SiblingPath } from '@aztec/foundation/tre
5
5
  import type { FunctionSelector } from '@aztec/stdlib/abi';
6
6
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
7
7
  import { type ContractClassPublic, type ContractDataSource, type ContractInstanceWithAddress } from '@aztec/stdlib/contract';
8
- import type { BatchInsertionResult, IndexedTreeId, MerkleTreeLeafType, MerkleTreeReadOperations, MerkleTreeWriteOperations, SequentialInsertionResult, TreeInfo } from '@aztec/stdlib/interfaces/server';
8
+ import type { BatchInsertionResult, IndexedTreeId, MerkleTreeLeafType, MerkleTreeWriteOperations, SequentialInsertionResult, TreeInfo } from '@aztec/stdlib/interfaces/server';
9
9
  import { MerkleTreeId } from '@aztec/stdlib/trees';
10
10
  import type { BlockHeader, StateReference, Tx } from '@aztec/stdlib/tx';
11
11
  import type { PublicContractsDBInterface, PublicStateDBInterface } from '../common/db_interfaces.js';
@@ -126,7 +126,7 @@ declare class ForwardMerkleTree implements MerkleTreeWriteOperations {
126
126
  * A class that provides access to the merkle trees, and other helper methods.
127
127
  */
128
128
  export declare class PublicTreesDB extends ForwardMerkleTree implements PublicStateDBInterface {
129
- db: MerkleTreeWriteOperations;
129
+ private readonly db;
130
130
  private logger;
131
131
  constructor(db: MerkleTreeWriteOperations);
132
132
  /**
@@ -148,6 +148,5 @@ export declare class PublicTreesDB extends ForwardMerkleTree implements PublicSt
148
148
  getNoteHash(leafIndex: bigint): Promise<Fr | undefined>;
149
149
  getNullifierIndex(nullifier: Fr): Promise<bigint | undefined>;
150
150
  }
151
- export declare function readPublicState(db: MerkleTreeReadOperations, contract: AztecAddress, slot: Fr): Promise<Fr>;
152
151
  export {};
153
152
  //# sourceMappingURL=public_db_sources.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"public_db_sources.d.ts","sourceRoot":"","sources":["../../src/public/public_db_sources.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"public_db_sources.d.ts","sourceRoot":"","sources":["../../src/public/public_db_sources.ts"],"names":[],"mappings":"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"}
@@ -260,7 +260,16 @@ import { TxContractCache } from './tx_contract_cache.js';
260
260
  * @param slot - Slot to read in the contract storage.
261
261
  * @returns The current value in the storage slot.
262
262
  */ async storageRead(contract, slot) {
263
- return await readPublicState(this.db, contract, slot);
263
+ const leafSlot = (await computePublicDataTreeLeafSlot(contract, slot)).toBigInt();
264
+ const lowLeafResult = await this.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
265
+ if (!lowLeafResult) {
266
+ throw new Error('Low leaf not found');
267
+ }
268
+ // TODO(fcarreiro): We need this for the hints. Might move it to the hinting layer.
269
+ await this.getSiblingPath(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
270
+ // Unconditionally fetching the preimage for the hints. Move it to the hinting layer?
271
+ const preimage = await this.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
272
+ return lowLeafResult.alreadyPresent ? preimage.leaf.value : Fr.ZERO;
264
273
  }
265
274
  /**
266
275
  * Records a write to public storage.
@@ -271,13 +280,15 @@ import { TxContractCache } from './tx_contract_cache.js';
271
280
  */ async storageWrite(contract, slot, newValue) {
272
281
  const leafSlot = await computePublicDataTreeLeafSlot(contract, slot);
273
282
  const publicDataWrite = new PublicDataWrite(leafSlot, newValue);
274
- await this.db.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [
283
+ await this.sequentialInsert(MerkleTreeId.PUBLIC_DATA_TREE, [
275
284
  publicDataWrite.toBuffer()
276
285
  ]);
277
286
  }
278
287
  async getL1ToL2LeafValue(leafIndex) {
279
288
  const timer = new Timer();
280
- const leafValue = await this.db.getLeafValue(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, leafIndex);
289
+ const leafValue = await this.getLeafValue(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, leafIndex);
290
+ // TODO(fcarreiro): We need this for the hints. Might move it to the hinting layer.
291
+ await this.getSiblingPath(MerkleTreeId.L1_TO_L2_MESSAGE_TREE, leafIndex);
281
292
  this.logger.debug(`[DB] Fetched L1 to L2 message leaf value`, {
282
293
  eventName: 'public-db-access',
283
294
  duration: timer.ms(),
@@ -287,7 +298,9 @@ import { TxContractCache } from './tx_contract_cache.js';
287
298
  }
288
299
  async getNoteHash(leafIndex) {
289
300
  const timer = new Timer();
290
- const leafValue = await this.db.getLeafValue(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
301
+ const leafValue = await this.getLeafValue(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
302
+ // TODO(fcarreiro): We need this for the hints. Might move it to the hinting layer.
303
+ await this.getSiblingPath(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
291
304
  this.logger.debug(`[DB] Fetched note hash leaf value`, {
292
305
  eventName: 'public-db-access',
293
306
  duration: timer.ms(),
@@ -297,9 +310,15 @@ import { TxContractCache } from './tx_contract_cache.js';
297
310
  }
298
311
  async getNullifierIndex(nullifier) {
299
312
  const timer = new Timer();
300
- const index = (await this.db.findLeafIndices(MerkleTreeId.NULLIFIER_TREE, [
301
- nullifier.toBuffer()
302
- ]))[0];
313
+ const lowLeafResult = await this.getPreviousValueIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBigInt());
314
+ if (!lowLeafResult) {
315
+ throw new Error('Low leaf not found');
316
+ }
317
+ // TODO(fcarreiro): We need this for the hints. Might move it to the hinting layer.
318
+ await this.getSiblingPath(MerkleTreeId.NULLIFIER_TREE, lowLeafResult.index);
319
+ // TODO(fcarreiro): We need this for the hints. Might move it to the hinting layer.
320
+ await this.getLeafPreimage(MerkleTreeId.NULLIFIER_TREE, lowLeafResult.index);
321
+ const index = lowLeafResult.alreadyPresent ? lowLeafResult.index : undefined;
303
322
  this.logger.debug(`[DB] Fetched nullifier index`, {
304
323
  eventName: 'public-db-access',
305
324
  duration: timer.ms(),
@@ -308,12 +327,3 @@ import { TxContractCache } from './tx_contract_cache.js';
308
327
  return index;
309
328
  }
310
329
  }
311
- export async function readPublicState(db, contract, slot) {
312
- const leafSlot = (await computePublicDataTreeLeafSlot(contract, slot)).toBigInt();
313
- const lowLeafResult = await db.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
314
- if (!lowLeafResult || !lowLeafResult.alreadyPresent) {
315
- return Fr.ZERO;
316
- }
317
- const preimage = await db.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
318
- return preimage.value;
319
- }