@aztec/simulator 0.63.0 → 0.64.0

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 (107) hide show
  1. package/dest/avm/avm_contract_call_result.d.ts +18 -1
  2. package/dest/avm/avm_contract_call_result.d.ts.map +1 -1
  3. package/dest/avm/avm_contract_call_result.js +30 -3
  4. package/dest/avm/avm_memory_types.d.ts.map +1 -1
  5. package/dest/avm/avm_memory_types.js +7 -11
  6. package/dest/avm/avm_simulator.d.ts +6 -1
  7. package/dest/avm/avm_simulator.d.ts.map +1 -1
  8. package/dest/avm/avm_simulator.js +29 -8
  9. package/dest/avm/avm_tree.d.ts +4 -18
  10. package/dest/avm/avm_tree.d.ts.map +1 -1
  11. package/dest/avm/avm_tree.js +71 -53
  12. package/dest/avm/errors.d.ts +7 -0
  13. package/dest/avm/errors.d.ts.map +1 -1
  14. package/dest/avm/errors.js +11 -1
  15. package/dest/avm/fixtures/index.d.ts +2 -2
  16. package/dest/avm/fixtures/index.d.ts.map +1 -1
  17. package/dest/avm/fixtures/index.js +1 -1
  18. package/dest/avm/index.d.ts +1 -0
  19. package/dest/avm/index.d.ts.map +1 -1
  20. package/dest/avm/index.js +2 -1
  21. package/dest/avm/journal/journal.d.ts +14 -13
  22. package/dest/avm/journal/journal.d.ts.map +1 -1
  23. package/dest/avm/journal/journal.js +81 -68
  24. package/dest/avm/journal/public_storage.d.ts +0 -1
  25. package/dest/avm/journal/public_storage.d.ts.map +1 -1
  26. package/dest/avm/journal/public_storage.js +6 -6
  27. package/dest/avm/opcodes/accrued_substate.js +2 -2
  28. package/dest/avm/opcodes/addressing_mode.d.ts.map +1 -1
  29. package/dest/avm/opcodes/addressing_mode.js +8 -2
  30. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  31. package/dest/avm/opcodes/external_calls.js +2 -4
  32. package/dest/avm/opcodes/instruction.d.ts +1 -1
  33. package/dest/avm/opcodes/instruction.d.ts.map +1 -1
  34. package/dest/avm/opcodes/instruction.js +1 -1
  35. package/dest/index.d.ts +0 -1
  36. package/dest/index.d.ts.map +1 -1
  37. package/dest/index.js +1 -2
  38. package/dest/public/dual_side_effect_trace.d.ts +3 -9
  39. package/dest/public/dual_side_effect_trace.d.ts.map +1 -1
  40. package/dest/public/dual_side_effect_trace.js +5 -11
  41. package/dest/public/enqueued_call_side_effect_trace.d.ts +4 -10
  42. package/dest/public/enqueued_call_side_effect_trace.d.ts.map +1 -1
  43. package/dest/public/enqueued_call_side_effect_trace.js +6 -15
  44. package/dest/public/executor_metrics.d.ts +1 -2
  45. package/dest/public/executor_metrics.d.ts.map +1 -1
  46. package/dest/public/executor_metrics.js +2 -8
  47. package/dest/public/fixtures/index.d.ts +14 -0
  48. package/dest/public/fixtures/index.d.ts.map +1 -0
  49. package/dest/public/fixtures/index.js +100 -0
  50. package/dest/public/index.d.ts +1 -2
  51. package/dest/public/index.d.ts.map +1 -1
  52. package/dest/public/index.js +1 -2
  53. package/dest/public/public_processor.d.ts +0 -2
  54. package/dest/public/public_processor.d.ts.map +1 -1
  55. package/dest/public/public_processor.js +5 -12
  56. package/dest/public/public_tx_context.d.ts +6 -4
  57. package/dest/public/public_tx_context.d.ts.map +1 -1
  58. package/dest/public/public_tx_context.js +11 -7
  59. package/dest/public/public_tx_simulator.d.ts +56 -5
  60. package/dest/public/public_tx_simulator.d.ts.map +1 -1
  61. package/dest/public/public_tx_simulator.js +106 -26
  62. package/dest/public/side_effect_trace.d.ts +4 -10
  63. package/dest/public/side_effect_trace.d.ts.map +1 -1
  64. package/dest/public/side_effect_trace.js +6 -15
  65. package/dest/public/side_effect_trace_interface.d.ts +3 -9
  66. package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
  67. package/dest/public/transitional_adapters.d.ts +1 -2
  68. package/dest/public/transitional_adapters.d.ts.map +1 -1
  69. package/dest/public/transitional_adapters.js +8 -10
  70. package/package.json +10 -10
  71. package/src/avm/avm_contract_call_result.ts +39 -2
  72. package/src/avm/avm_memory_types.ts +6 -10
  73. package/src/avm/avm_simulator.ts +58 -8
  74. package/src/avm/avm_tree.ts +88 -64
  75. package/src/avm/errors.ts +11 -0
  76. package/src/avm/fixtures/index.ts +4 -3
  77. package/src/avm/index.ts +1 -0
  78. package/src/avm/journal/journal.ts +118 -126
  79. package/src/avm/journal/public_storage.ts +5 -6
  80. package/src/avm/opcodes/accrued_substate.ts +1 -1
  81. package/src/avm/opcodes/addressing_mode.ts +7 -2
  82. package/src/avm/opcodes/external_calls.ts +1 -3
  83. package/src/avm/opcodes/instruction.ts +1 -1
  84. package/src/index.ts +0 -1
  85. package/src/public/dual_side_effect_trace.ts +4 -13
  86. package/src/public/enqueued_call_side_effect_trace.ts +14 -17
  87. package/src/public/executor_metrics.ts +1 -9
  88. package/src/public/fixtures/index.ts +158 -0
  89. package/src/public/index.ts +1 -5
  90. package/src/public/public_processor.ts +5 -27
  91. package/src/public/public_tx_context.ts +13 -8
  92. package/src/public/public_tx_simulator.ts +182 -50
  93. package/src/public/side_effect_trace.ts +9 -19
  94. package/src/public/side_effect_trace_interface.ts +3 -9
  95. package/src/public/transitional_adapters.ts +12 -12
  96. package/dest/mocks/fixtures.d.ts +0 -28
  97. package/dest/mocks/fixtures.d.ts.map +0 -1
  98. package/dest/mocks/fixtures.js +0 -48
  99. package/dest/mocks/index.d.ts +0 -2
  100. package/dest/mocks/index.d.ts.map +0 -1
  101. package/dest/mocks/index.js +0 -2
  102. package/dest/public/executor.d.ts +0 -47
  103. package/dest/public/executor.d.ts.map +0 -1
  104. package/dest/public/executor.js +0 -90
  105. package/src/mocks/fixtures.ts +0 -72
  106. package/src/mocks/index.ts +0 -1
  107. package/src/public/executor.ts +0 -154
@@ -3,9 +3,8 @@ import { AvmCircuitInputs, AvmCircuitPublicInputs, AztecAddress, ContractStorage
3
3
  import { computeNoteHashNonce, computeUniqueNoteHash, computeVarArgsHash, siloNoteHash } from '@aztec/circuits.js/hash';
4
4
  import { padArrayEnd } from '@aztec/foundation/collection';
5
5
  import { assertLength } from '@aztec/foundation/serialize';
6
- import { AvmContractCallResult } from '../avm/avm_contract_call_result.js';
7
- import { getPublicFunctionDebugName } from '../common/debug_fn_name.js';
8
- import { createAvmExecutionEnvironment } from './executor.js';
6
+ import { AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
7
+ import { AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
9
8
  export function generateAvmCircuitPublicInputs(trace, globalVariables, startStateReference, startGasUsed, gasSettings, setupCallRequests, appLogicCallRequests, teardownCallRequests, nonRevertibleAccumulatedDataFromPrivate, revertibleAccumulatedDataFromPrivate, endStateReference, endGasUsed, transactionFee, revertCode) {
10
9
  const startTreeSnapshots = new TreeSnapshots(startStateReference.l1ToL2MessageTree, startStateReference.partial.noteHashTree, startStateReference.partial.nullifierTree, startStateReference.partial.publicDataTree);
11
10
  const endTreeSnapshots = new TreeSnapshots(endStateReference.l1ToL2MessageTree, endStateReference.partial.noteHashTree, endStateReference.partial.nullifierTree, endStateReference.partial.publicDataTree);
@@ -64,16 +63,15 @@ export function generateAvmCircuitPublicInputs(trace, globalVariables, startStat
64
63
  //console.log(`AvmCircuitPublicInputs:\n${inspect(avmCircuitPublicInputs)}`);
65
64
  return avmCircuitPublicInputs;
66
65
  }
67
- export async function generateAvmProvingRequest(real, worldStateDB, stateManager, historicalHeader, globalVariables, executionRequest, result, allocatedGas, transactionFee) {
68
- const fnName = await getPublicFunctionDebugName(worldStateDB, executionRequest.callContext.contractAddress, executionRequest.callContext.functionSelector, executionRequest.args);
69
- const avmExecutionEnv = createAvmExecutionEnvironment(executionRequest, globalVariables, transactionFee);
70
- const avmCallResult = new AvmContractCallResult(result.reverted, result.returnValues);
66
+ export function generateAvmProvingRequest(real, fnName, stateManager, historicalHeader, globalVariables, executionRequest, result, allocatedGas, transactionFee) {
67
+ const avmExecutionEnv = new AvmExecutionEnvironment(executionRequest.callContext.contractAddress, executionRequest.callContext.msgSender, executionRequest.callContext.functionSelector,
68
+ /*contractCallDepth=*/ Fr.zero(), transactionFee, globalVariables, executionRequest.callContext.isStaticCall, executionRequest.args);
69
+ const avmCallResult = new AvmFinalizedCallResult(result.reverted, result.returnValues, result.endGasLeft);
71
70
  // Generate an AVM proving request
72
71
  let avmProvingRequest;
73
72
  if (real) {
74
73
  const deprecatedFunctionCallResult = stateManager.trace.toPublicFunctionCallResult(avmExecutionEnv,
75
- /*startGasLeft=*/ allocatedGas,
76
- /*endGasLeft=*/ Gas.from(result.endGasLeft), Buffer.alloc(0), avmCallResult, fnName);
74
+ /*startGasLeft=*/ allocatedGas, Buffer.alloc(0), avmCallResult, fnName);
77
75
  const publicInputs = getPublicCircuitPublicInputs(historicalHeader, globalVariables, deprecatedFunctionCallResult);
78
76
  avmProvingRequest = makeAvmProvingRequest(publicInputs, deprecatedFunctionCallResult);
79
77
  }
@@ -124,4 +122,4 @@ function getPublicCircuitPublicInputs(historicalHeader, globalVariables, result)
124
122
  revertCode: result.reverted ? RevertCode.APP_LOGIC_REVERTED : RevertCode.OK,
125
123
  });
126
124
  }
127
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQixrQkFBa0IsRUFBK0IsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixFQUFFLEVBQ0YsR0FBRyxFQUlILGFBQWEsRUFDYixPQUFPLEVBQ1AsMkJBQTJCLEVBQzNCLHVDQUF1QyxFQUN2QywwQkFBMEIsRUFDMUIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsb0NBQW9DLEVBQ3BDLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsaURBQWlELEVBQ2pELG9DQUFvQyxFQUNwQyw4QkFBOEIsRUFDOUIsd0NBQXdDLEVBQ3hDLHNDQUFzQyxFQUN0Qyw2QkFBNkIsRUFDN0IsUUFBUSxFQUNSLFNBQVMsRUFDVCwyQkFBMkIsRUFDM0IsdUNBQXVDLEVBRXZDLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsVUFBVSxFQUVWLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBRTNFLE9B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
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQixrQkFBa0IsRUFBK0IsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRyxPQUFPLEVBQ0wsZ0JBQWdCLEVBQ2hCLHNCQUFzQixFQUN0QixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixFQUFFLEVBQ0YsR0FBRyxFQUlILGFBQWEsRUFDYixPQUFPLEVBQ1AsMkJBQTJCLEVBQzNCLHVDQUF1QyxFQUN2QywwQkFBMEIsRUFDMUIsd0JBQXdCLEVBQ3hCLHdCQUF3QixFQUN4QixzQkFBc0IsRUFDdEIsb0NBQW9DLEVBQ3BDLHVCQUF1QixFQUN2QixxQkFBcUIsRUFDckIsaURBQWlELEVBQ2pELG9DQUFvQyxFQUNwQyw4QkFBOEIsRUFDOUIsd0NBQXdDLEVBQ3hDLHNDQUFzQyxFQUN0Qyw2QkFBNkIsRUFDN0IsUUFBUSxFQUNSLFNBQVMsRUFDVCwyQkFBMkIsRUFDM0IsdUNBQXVDLEVBRXZDLGlCQUFpQixFQUNqQix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLHNCQUFzQixFQUN0QixXQUFXLEVBQ1gsVUFBVSxFQUVWLG1CQUFtQixFQUNuQixhQUFhLEVBQ2IscUJBQXFCLEVBQ3JCLG9CQUFvQixHQUNyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxxQkFBcUIsRUFBRSxrQkFBa0IsRUFBRSxZQUFZLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4SCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBRTNELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9B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
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@aztec/simulator",
3
- "version": "0.63.0",
3
+ "version": "0.64.0",
4
4
  "type": "module",
5
5
  "exports": {
6
6
  ".": "./dest/index.js",
7
- "./avm/fixtures": "./dest/avm/fixtures/index.js"
7
+ "./public/fixtures": "./dest/public/fixtures/index.js"
8
8
  },
9
9
  "typedocOptions": {
10
10
  "entryPoints": [
@@ -59,14 +59,14 @@
59
59
  ]
60
60
  },
61
61
  "dependencies": {
62
- "@aztec/circuit-types": "0.63.0",
63
- "@aztec/circuits.js": "0.63.0",
64
- "@aztec/foundation": "0.63.0",
65
- "@aztec/noir-protocol-circuits-types": "0.63.0",
66
- "@aztec/protocol-contracts": "0.63.0",
67
- "@aztec/telemetry-client": "0.63.0",
68
- "@aztec/types": "0.63.0",
69
- "@aztec/world-state": "0.63.0",
62
+ "@aztec/circuit-types": "0.64.0",
63
+ "@aztec/circuits.js": "0.64.0",
64
+ "@aztec/foundation": "0.64.0",
65
+ "@aztec/noir-protocol-circuits-types": "0.64.0",
66
+ "@aztec/protocol-contracts": "0.64.0",
67
+ "@aztec/telemetry-client": "0.64.0",
68
+ "@aztec/types": "0.64.0",
69
+ "@aztec/world-state": "0.64.0",
70
70
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
71
71
  "@noir-lang/noirc_abi": "portal:../../noir/packages/noirc_abi",
72
72
  "@noir-lang/types": "portal:../../noir/packages/types",
@@ -1,15 +1,52 @@
1
+ import { type SimulationError } from '@aztec/circuit-types';
2
+ import { Gas } from '@aztec/circuits.js';
1
3
  import { type Fr } from '@aztec/foundation/fields';
2
4
 
5
+ import { inspect } from 'util';
6
+
7
+ import { createSimulationError } from '../common/errors.js';
8
+ import { type Gas as AvmGas } from './avm_gas.js';
3
9
  import { type AvmRevertReason } from './errors.js';
4
10
 
5
11
  /**
6
12
  * Results of an contract call's execution in the AVM.
7
13
  */
8
14
  export class AvmContractCallResult {
9
- constructor(public reverted: boolean, public output: Fr[], public revertReason?: AvmRevertReason) {}
15
+ constructor(
16
+ public reverted: boolean,
17
+ public output: Fr[],
18
+ public gasLeft: AvmGas,
19
+ public revertReason?: AvmRevertReason,
20
+ ) {}
21
+
22
+ toString(): string {
23
+ let resultsStr = `reverted: ${this.reverted}, output: ${this.output}, gasLeft: ${inspect(this.gasLeft)}`;
24
+ if (this.revertReason) {
25
+ resultsStr += `, revertReason: ${this.revertReason}`;
26
+ }
27
+ return resultsStr;
28
+ }
29
+
30
+ finalize(): AvmFinalizedCallResult {
31
+ const revertReason = this.revertReason ? createSimulationError(this.revertReason, this.output) : undefined;
32
+ return new AvmFinalizedCallResult(this.reverted, this.output, Gas.from(this.gasLeft), revertReason);
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Similar to AvmContractCallResult, but with a SimulationError and standard Gas
38
+ * which are useful for consumption external to core AVM simulation.
39
+ */
40
+ export class AvmFinalizedCallResult {
41
+ constructor(
42
+ public reverted: boolean,
43
+ public output: Fr[],
44
+ public gasLeft: Gas,
45
+ public revertReason?: SimulationError,
46
+ ) {}
10
47
 
11
48
  toString(): string {
12
- let resultsStr = `reverted: ${this.reverted}, output: ${this.output}`;
49
+ let resultsStr = `reverted: ${this.reverted}, output: ${this.output}, gasLeft: ${inspect(this.gasLeft)}`;
13
50
  if (this.revertReason) {
14
51
  resultsStr += `, revertReason: ${this.revertReason}`;
15
52
  }
@@ -232,8 +232,8 @@ export class TaggedMemory implements TaggedMemoryInterface {
232
232
  // Whether to track and validate memory accesses for each instruction.
233
233
  static readonly TRACK_MEMORY_ACCESSES = process.env.NODE_ENV === 'test';
234
234
 
235
- // FIXME: memory should be 2^32, but TS doesn't allow for arrays that big.
236
- static readonly MAX_MEMORY_SIZE = Number((1n << 32n) - 2n);
235
+ // FIXME: memory should be 2^32, but TS max array size is: 2^32 - 1
236
+ static readonly MAX_MEMORY_SIZE = Number((1n << 32n) - 1n);
237
237
  private _mem: MemoryValue[];
238
238
 
239
239
  constructor() {
@@ -264,8 +264,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
264
264
  }
265
265
 
266
266
  public getSlice(offset: number, size: number): MemoryValue[] {
267
- assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
268
- assert(offset + size < TaggedMemory.MAX_MEMORY_SIZE);
267
+ assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
269
268
  const value = this._mem.slice(offset, offset + size);
270
269
  TaggedMemory.log.debug(`getSlice(${offset}, ${size}) = ${value}`);
271
270
  for (let i = 0; i < value.length; i++) {
@@ -278,14 +277,12 @@ export class TaggedMemory implements TaggedMemoryInterface {
278
277
  }
279
278
 
280
279
  public getSliceAs<T>(offset: number, size: number): T[] {
281
- assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
282
- assert(offset + size < TaggedMemory.MAX_MEMORY_SIZE);
280
+ assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
283
281
  return this.getSlice(offset, size) as T[];
284
282
  }
285
283
 
286
284
  public getSliceTags(offset: number, size: number): TypeTag[] {
287
- assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
288
- assert(offset + size < TaggedMemory.MAX_MEMORY_SIZE);
285
+ assert(offset + size <= TaggedMemory.MAX_MEMORY_SIZE);
289
286
  return this._mem.slice(offset, offset + size).map(TaggedMemory.getTag);
290
287
  }
291
288
 
@@ -296,8 +293,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
296
293
  }
297
294
 
298
295
  public setSlice(offset: number, vs: MemoryValue[]) {
299
- assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
300
- assert(offset + vs.length < TaggedMemory.MAX_MEMORY_SIZE);
296
+ assert(offset + vs.length <= TaggedMemory.MAX_MEMORY_SIZE);
301
297
  // We may need to extend the memory size, otherwise splice doesn't insert.
302
298
  if (offset + vs.length > this._mem.length) {
303
299
  this._mem.length = offset + vs.length;
@@ -1,20 +1,29 @@
1
- import { MAX_L2_GAS_PER_ENQUEUED_CALL } from '@aztec/circuits.js';
1
+ import {
2
+ type AztecAddress,
3
+ Fr,
4
+ type FunctionSelector,
5
+ type GlobalVariables,
6
+ MAX_L2_GAS_PER_ENQUEUED_CALL,
7
+ } from '@aztec/circuits.js';
2
8
  import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
3
9
 
4
10
  import { strict as assert } from 'assert';
5
11
 
6
12
  import { SideEffectLimitReachedError } from '../public/side_effect_errors.js';
7
- import type { AvmContext } from './avm_context.js';
13
+ import { AvmContext } from './avm_context.js';
8
14
  import { AvmContractCallResult } from './avm_contract_call_result.js';
15
+ import { AvmExecutionEnvironment } from './avm_execution_environment.js';
9
16
  import { type Gas } from './avm_gas.js';
17
+ import { AvmMachineState } from './avm_machine_state.js';
10
18
  import { isAvmBytecode } from './bytecode_utils.js';
11
19
  import {
12
20
  AvmExecutionError,
21
+ AvmRevertReason,
13
22
  InvalidProgramCounterError,
14
- NoBytecodeForContractError,
15
23
  revertReasonFromExceptionalHalt,
16
24
  revertReasonFromExplicitRevert,
17
25
  } from './errors.js';
26
+ import { type AvmPersistableStateManager } from './journal/journal.js';
18
27
  import { decodeInstructionFromBytecode } from './serialization/bytecode_serialization.js';
19
28
 
20
29
  type OpcodeTally = {
@@ -41,16 +50,57 @@ export class AvmSimulator {
41
50
  this.log = createDebugLogger(`aztec:avm_simulator:core(f:${context.environment.functionSelector.toString()})`);
42
51
  }
43
52
 
53
+ public static create(
54
+ stateManager: AvmPersistableStateManager,
55
+ address: AztecAddress,
56
+ sender: AztecAddress,
57
+ functionSelector: FunctionSelector, // may be temporary (#7224)
58
+ transactionFee: Fr,
59
+ globals: GlobalVariables,
60
+ isStaticCall: boolean,
61
+ calldata: Fr[],
62
+ allocatedGas: Gas,
63
+ ) {
64
+ const avmExecutionEnv = new AvmExecutionEnvironment(
65
+ address,
66
+ sender,
67
+ functionSelector,
68
+ /*contractCallDepth=*/ Fr.zero(),
69
+ transactionFee,
70
+ globals,
71
+ isStaticCall,
72
+ calldata,
73
+ );
74
+
75
+ const avmMachineState = new AvmMachineState(allocatedGas);
76
+ const avmContext = new AvmContext(stateManager, avmExecutionEnv, avmMachineState);
77
+ return new AvmSimulator(avmContext);
78
+ }
79
+
44
80
  /**
45
81
  * Fetch the bytecode and execute it in the current context.
46
82
  */
47
83
  public async execute(): Promise<AvmContractCallResult> {
48
84
  const bytecode = await this.context.persistableState.getBytecode(this.context.environment.address);
49
85
 
50
- // This assumes that we will not be able to send messages to accounts without code
51
- // Pending classes and instances impl details
52
86
  if (!bytecode) {
53
- throw new NoBytecodeForContractError(this.context.environment.address);
87
+ // revert, consuming all gas
88
+ const message = `No bytecode found at: ${this.context.environment.address}. Reverting...`;
89
+ const revertReason = new AvmRevertReason(
90
+ message,
91
+ /*failingFunction=*/ {
92
+ contractAddress: this.context.environment.address,
93
+ functionSelector: this.context.environment.functionSelector,
94
+ },
95
+ /*noirCallStack=*/ [],
96
+ );
97
+ this.log.warn(message);
98
+ return new AvmContractCallResult(
99
+ /*reverted=*/ true,
100
+ /*output=*/ [],
101
+ /*gasLeft=*/ { l2Gas: 0, daGas: 0 },
102
+ revertReason,
103
+ );
54
104
  }
55
105
 
56
106
  return await this.executeBytecode(bytecode);
@@ -119,7 +169,7 @@ export class AvmSimulator {
119
169
  const output = machineState.getOutput();
120
170
  const reverted = machineState.getReverted();
121
171
  const revertReason = reverted ? revertReasonFromExplicitRevert(output, this.context) : undefined;
122
- const results = new AvmContractCallResult(reverted, output, revertReason);
172
+ const results = new AvmContractCallResult(reverted, output, machineState.gasLeft, revertReason);
123
173
  this.log.debug(`Context execution results: ${results.toString()}`);
124
174
 
125
175
  this.printOpcodeTallies();
@@ -134,7 +184,7 @@ export class AvmSimulator {
134
184
 
135
185
  const revertReason = revertReasonFromExceptionalHalt(err, this.context);
136
186
  // Note: "exceptional halts" cannot return data, hence [].
137
- const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], revertReason);
187
+ const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], machineState.gasLeft, revertReason);
138
188
  this.log.debug(`Context execution results: ${results.toString()}`);
139
189
 
140
190
  this.printOpcodeTallies();
@@ -51,11 +51,10 @@ export class AvmEphemeralForest {
51
51
  constructor(
52
52
  public treeDb: MerkleTreeReadOperations,
53
53
  public treeMap: Map<MerkleTreeId, EphemeralAvmTree>,
54
- // This contains the preimage and the leaf index of leaf in the ephemeral tree that contains the lowest key (i.e. nullifier value or public data tree slot)
55
- public indexedTreeMin: Map<IndexedTreeId, [IndexedTreeLeafPreimage, bigint]>,
56
54
  // This contains the [leaf index,indexed leaf preimages] tuple that were updated or inserted in the ephemeral tree
57
55
  // This is needed since we have a sparse collection of keys sorted leaves in the ephemeral tree
58
56
  public indexedUpdates: Map<IndexedTreeId, Map<bigint, IndexedTreeLeafPreimage>>,
57
+ public indexedSortedKeys: Map<IndexedTreeId, [Fr, bigint][]>,
59
58
  ) {}
60
59
 
61
60
  static async create(treeDb: MerkleTreeReadOperations): Promise<AvmEphemeralForest> {
@@ -65,15 +64,18 @@ export class AvmEphemeralForest {
65
64
  const tree = await EphemeralAvmTree.create(treeInfo.size, treeInfo.depth, treeDb, treeType);
66
65
  treeMap.set(treeType, tree);
67
66
  }
68
- return new AvmEphemeralForest(treeDb, treeMap, new Map(), new Map());
67
+ const indexedSortedKeys = new Map<IndexedTreeId, [Fr, bigint][]>();
68
+ indexedSortedKeys.set(MerkleTreeId.NULLIFIER_TREE as IndexedTreeId, []);
69
+ indexedSortedKeys.set(MerkleTreeId.PUBLIC_DATA_TREE as IndexedTreeId, []);
70
+ return new AvmEphemeralForest(treeDb, treeMap, new Map(), indexedSortedKeys);
69
71
  }
70
72
 
71
73
  fork(): AvmEphemeralForest {
72
74
  return new AvmEphemeralForest(
73
75
  this.treeDb,
74
76
  cloneDeep(this.treeMap),
75
- cloneDeep(this.indexedTreeMin),
76
77
  cloneDeep(this.indexedUpdates),
78
+ cloneDeep(this.indexedSortedKeys),
77
79
  );
78
80
  }
79
81
 
@@ -166,7 +168,8 @@ export class AvmEphemeralForest {
166
168
  const insertionPath = tree.getSiblingPath(insertionIndex)!;
167
169
 
168
170
  // Even though we append an empty leaf into the tree as a part of update - it doesnt seem to impact future inserts...
169
- this._updateMinInfo(MerkleTreeId.PUBLIC_DATA_TREE, [updatedPreimage], [index]);
171
+ this._updateSortedKeys(treeId, [updatedPreimage.slot], [index]);
172
+
170
173
  return {
171
174
  leafIndex: insertionIndex,
172
175
  insertionPath,
@@ -193,8 +196,10 @@ export class AvmEphemeralForest {
193
196
  );
194
197
  const insertionPath = this.appendIndexedTree(treeId, index, updatedLowLeaf, newPublicDataLeaf);
195
198
 
196
- // Since we are appending, we might have a new minimum public data leaf
197
- this._updateMinInfo(MerkleTreeId.PUBLIC_DATA_TREE, [newPublicDataLeaf, updatedLowLeaf], [insertionIndex, index]);
199
+ // Even though the low leaf key is not updated, we still need to update the sorted keys in case we have
200
+ // not seen the low leaf before
201
+ this._updateSortedKeys(treeId, [newPublicDataLeaf.slot, updatedLowLeaf.slot], [insertionIndex, index]);
202
+
198
203
  return {
199
204
  leafIndex: insertionIndex,
200
205
  insertionPath: insertionPath,
@@ -208,28 +213,25 @@ export class AvmEphemeralForest {
208
213
  };
209
214
  }
210
215
 
211
- /**
212
- * This is just a helper to compare the preimages and update the minimum public data leaf
213
- * @param treeId - The tree to be queried for a sibling path.
214
- * @param T - The type of the preimage (PublicData or Nullifier)
215
- * @param preimages - The preimages to be compared
216
- * @param indices - The indices of the preimages
217
- */
218
- private _updateMinInfo<T extends IndexedTreeLeafPreimage>(
219
- treeId: IndexedTreeId,
220
- preimages: T[],
221
- indices: bigint[],
222
- ): void {
223
- let currentMin = this.getMinInfo(treeId);
224
- if (currentMin === undefined) {
225
- currentMin = { preimage: preimages[0], index: indices[0] };
226
- }
227
- for (let i = 0; i < preimages.length; i++) {
228
- if (preimages[i].getKey() <= currentMin.preimage.getKey()) {
229
- currentMin = { preimage: preimages[i], index: indices[i] };
216
+ private _updateSortedKeys(treeId: IndexedTreeId, keys: Fr[], index: bigint[]): void {
217
+ // This is a reference
218
+ const existingKeyVector = this.indexedSortedKeys.get(treeId)!;
219
+ // Should already be sorted so not need to re-sort if we just update or splice
220
+ for (let i = 0; i < keys.length; i++) {
221
+ const foundIndex = existingKeyVector.findIndex(x => x[1] === index[i]);
222
+ if (foundIndex === -1) {
223
+ // New element, we splice it into the correct location
224
+ const spliceIndex =
225
+ this.searchForKey(
226
+ keys[i],
227
+ existingKeyVector.map(x => x[0]),
228
+ ) + 1;
229
+ existingKeyVector.splice(spliceIndex, 0, [keys[i], index[i]]);
230
+ } else {
231
+ // Update the existing element
232
+ existingKeyVector[foundIndex][0] = keys[i];
230
233
  }
231
234
  }
232
- this.setMinInfo(treeId, currentMin.preimage, currentMin.index);
233
235
  }
234
236
 
235
237
  /**
@@ -258,8 +260,14 @@ export class AvmEphemeralForest {
258
260
  const newNullifierLeaf = new NullifierLeafPreimage(nullifier, preimage.nextNullifier, preimage.nextIndex);
259
261
  const insertionPath = this.appendIndexedTree(treeId, index, updatedLowNullifier, newNullifierLeaf);
260
262
 
261
- // Since we are appending, we might have a new minimum nullifier leaf
262
- this._updateMinInfo(MerkleTreeId.NULLIFIER_TREE, [newNullifierLeaf, updatedLowNullifier], [insertionIndex, index]);
263
+ // Even though the low nullifier key is not updated, we still need to update the sorted keys in case we have
264
+ // not seen the low nullifier before
265
+ this._updateSortedKeys(
266
+ treeId,
267
+ [newNullifierLeaf.nullifier, updatedLowNullifier.nullifier],
268
+ [insertionIndex, index],
269
+ );
270
+
263
271
  return {
264
272
  leafIndex: insertionIndex,
265
273
  insertionPath: insertionPath,
@@ -286,31 +294,6 @@ export class AvmEphemeralForest {
286
294
  return insertionPath!;
287
295
  }
288
296
 
289
- /**
290
- * This is wrapper around treeId to get the correct minimum leaf preimage
291
- */
292
- private getMinInfo<ID extends IndexedTreeId, T extends IndexedTreeLeafPreimage>(
293
- treeId: ID,
294
- ): { preimage: T; index: bigint } | undefined {
295
- const start = this.indexedTreeMin.get(treeId);
296
- if (start === undefined) {
297
- return undefined;
298
- }
299
- const [preimage, index] = start;
300
- return { preimage: preimage as T, index };
301
- }
302
-
303
- /**
304
- * This is wrapper around treeId to set the correct minimum leaf preimage
305
- */
306
- private setMinInfo<ID extends IndexedTreeId, T extends IndexedTreeLeafPreimage>(
307
- treeId: ID,
308
- preimage: T,
309
- index: bigint,
310
- ): void {
311
- this.indexedTreeMin.set(treeId, [preimage, index]);
312
- }
313
-
314
297
  /**
315
298
  * This is wrapper around treeId to set values in the indexedUpdates map
316
299
  */
@@ -353,6 +336,28 @@ export class AvmEphemeralForest {
353
336
  return updates.has(index);
354
337
  }
355
338
 
339
+ private searchForKey(key: Fr, arr: Fr[]): number {
340
+ // We are looking for the index of the largest element in the array that is less than the key
341
+ let start = 0;
342
+ let end = arr.length;
343
+ // Note that the easiest way is to increment the search key by 1 and then do a binary search
344
+ const searchKey = key.add(Fr.ONE);
345
+ while (start < end) {
346
+ const mid = Math.floor((start + end) / 2);
347
+ if (arr[mid].cmp(searchKey) < 0) {
348
+ // The key + 1 is greater than the arr element, so we can continue searching the top half
349
+ start = mid + 1;
350
+ } else {
351
+ // The key + 1 is LT or EQ the arr element, so we can continue searching the bottom half
352
+ end = mid;
353
+ }
354
+ }
355
+ // We either found key + 1 or start is now at the index of the largest element that we would have inserted key + 1
356
+ // Therefore start - 1 is the index of the element just below - note it can be -1 if the first element in the array is
357
+ // greater than the key
358
+ return start - 1;
359
+ }
360
+
356
361
  /**
357
362
  * This gets the low leaf preimage and the index of the low leaf in the indexed tree given a value (slot or nullifier value)
358
363
  * If the value is not found in the tree, it does an external lookup to the merkleDB
@@ -365,23 +370,42 @@ export class AvmEphemeralForest {
365
370
  treeId: ID,
366
371
  key: Fr,
367
372
  ): Promise<PreimageWitness<T>> {
373
+ const keyOrderedVector = this.indexedSortedKeys.get(treeId)!;
374
+
375
+ const vectorIndex = this.searchForKey(
376
+ key,
377
+ keyOrderedVector.map(x => x[0]),
378
+ );
379
+ // We have a match in our local updates
380
+ let minPreimage = undefined;
381
+
382
+ if (vectorIndex !== -1) {
383
+ const [_, leafIndex] = keyOrderedVector[vectorIndex];
384
+ minPreimage = {
385
+ preimage: this.getIndexedUpdates(treeId, leafIndex) as T,
386
+ index: leafIndex,
387
+ };
388
+ }
368
389
  // This can probably be done better, we want to say if the minInfo is undefined (because this is our first operation) we do the external lookup
369
- const minPreimage = this.getMinInfo(treeId);
370
390
  const start = minPreimage?.preimage;
371
391
  const bigIntKey = key.toBigInt();
372
- // If the first element we have is already greater than the value, we need to do an external lookup
373
- if (minPreimage === undefined || (start?.getKey() ?? 0n) >= key.toBigInt()) {
374
- // The low public data witness is in the previous tree
392
+
393
+ // If we don't have a first element or if that first element is already greater than the target key, we need to do an external lookup
394
+ // The low public data witness is in the previous tree
395
+ if (start === undefined || start.getKey() > key.toBigInt()) {
396
+ // This function returns the leaf index to the actual element if it exists or the leaf index to the low leaf otherwise
375
397
  const { index, alreadyPresent } = (await this.treeDb.getPreviousValueIndex(treeId, bigIntKey))!;
376
398
  const preimage = await this.treeDb.getLeafPreimage(treeId, index);
377
399
 
378
- // Since we have never seen this before - we should insert it into our tree
379
- const siblingPath = (await this.treeDb.getSiblingPath(treeId, index)).toFields();
400
+ // Since we have never seen this before - we should insert it into our tree, as we know we will modify this leaf node
401
+ const siblingPath = await this.getSiblingPath(treeId, index);
402
+ // const siblingPath = (await this.treeDb.getSiblingPath(treeId, index)).toFields();
380
403
 
381
- // Is it enough to just insert the sibling path without inserting the leaf? - right now probably since we will update this low nullifier index in append
404
+ // Is it enough to just insert the sibling path without inserting the leaf? - now probably since we will update this low nullifier index in append
382
405
  this.treeMap.get(treeId)!.insertSiblingPath(index, siblingPath);
383
406
 
384
407
  const lowPublicDataPreimage = preimage as T;
408
+
385
409
  return { preimage: lowPublicDataPreimage, index: index, update: alreadyPresent };
386
410
  }
387
411
 
@@ -392,18 +416,18 @@ export class AvmEphemeralForest {
392
416
  // (3) Max Condition: curr.next_index == 0 and curr.key < key
393
417
  // Note the min condition does not need to be handled since indexed trees are prefilled with at least the 0 element
394
418
  let found = false;
395
- let curr = minPreimage.preimage as T;
419
+ let curr = minPreimage!.preimage as T;
396
420
  let result: PreimageWitness<T> | undefined = undefined;
397
421
  // Temp to avoid infinite loops - the limit is the number of leaves we may have to read
398
422
  const LIMIT = 2n ** BigInt(getTreeHeight(treeId)) - 1n;
399
423
  let counter = 0n;
400
- let lowPublicDataIndex = minPreimage.index;
424
+ let lowPublicDataIndex = minPreimage!.index;
401
425
  while (!found && counter < LIMIT) {
402
426
  if (curr.getKey() === bigIntKey) {
403
427
  // We found an exact match - therefore this is an update
404
428
  found = true;
405
429
  result = { preimage: curr, index: lowPublicDataIndex, update: true };
406
- } else if (curr.getKey() < bigIntKey && (curr.getNextKey() === 0n || curr.getNextKey() > bigIntKey)) {
430
+ } else if (curr.getKey() < bigIntKey && (curr.getNextIndex() === 0n || curr.getNextKey() > bigIntKey)) {
407
431
  // We found it via sandwich or max condition, this is a low nullifier
408
432
  found = true;
409
433
  result = { preimage: curr, index: lowPublicDataIndex, update: false };
package/src/avm/errors.ts CHANGED
@@ -67,6 +67,17 @@ export class TagCheckError extends AvmExecutionError {
67
67
  }
68
68
  }
69
69
 
70
+ /**
71
+ * Error is thrown when a relative memory address resolved to an offset which
72
+ * is out of range, i.e, greater than maxUint32.
73
+ */
74
+ export class AddressOutOfRangeError extends AvmExecutionError {
75
+ constructor(baseAddr: number, relOffset: number) {
76
+ super(`Address out of range. Base address ${baseAddr}, relative offset ${relOffset}`);
77
+ this.name = 'AddressOutOfRangeError';
78
+ }
79
+ }
80
+
70
81
  /** Error thrown when out of gas. */
71
82
  export class OutOfGasError extends AvmExecutionError {
72
83
  constructor(dimensions: string[]) {
@@ -1,4 +1,4 @@
1
- import { type MerkleTreeWriteOperations, isNoirCallStackUnresolved } from '@aztec/circuit-types';
1
+ import { isNoirCallStackUnresolved } from '@aztec/circuit-types';
2
2
  import { GasFees, GlobalVariables, MAX_L2_GAS_PER_ENQUEUED_CALL } from '@aztec/circuits.js';
3
3
  import { type FunctionArtifact, FunctionSelector } from '@aztec/foundation/abi';
4
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
@@ -16,6 +16,7 @@ import { AvmContext } from '../avm_context.js';
16
16
  import { AvmExecutionEnvironment } from '../avm_execution_environment.js';
17
17
  import { AvmMachineState } from '../avm_machine_state.js';
18
18
  import { Field, Uint8, Uint32, Uint64 } from '../avm_memory_types.js';
19
+ import { type AvmEphemeralForest } from '../avm_tree.js';
19
20
  import { type AvmRevertReason } from '../errors.js';
20
21
  import { AvmPersistableStateManager } from '../journal/journal.js';
21
22
  import { NullifierManager } from '../journal/nullifiers.js';
@@ -43,7 +44,7 @@ export function initPersistableStateManager(overrides?: {
43
44
  publicStorage?: PublicStorage;
44
45
  nullifiers?: NullifierManager;
45
46
  doMerkleOperations?: boolean;
46
- merkleTrees?: MerkleTreeWriteOperations;
47
+ merkleTrees?: AvmEphemeralForest;
47
48
  }): AvmPersistableStateManager {
48
49
  const worldStateDB = overrides?.worldStateDB || mock<WorldStateDB>();
49
50
  return new AvmPersistableStateManager(
@@ -52,7 +53,7 @@ export function initPersistableStateManager(overrides?: {
52
53
  overrides?.publicStorage || new PublicStorage(worldStateDB),
53
54
  overrides?.nullifiers || new NullifierManager(worldStateDB),
54
55
  overrides?.doMerkleOperations || false,
55
- overrides?.merkleTrees || mock<MerkleTreeWriteOperations>(),
56
+ overrides?.merkleTrees || mock<AvmEphemeralForest>(),
56
57
  );
57
58
  }
58
59
 
package/src/avm/index.ts CHANGED
@@ -1,2 +1,3 @@
1
1
  export * from './avm_simulator.js';
2
2
  export * from './journal/index.js';
3
+ export * from './avm_tree.js';