@aztec/simulator 0.52.0 → 0.54.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 (92) hide show
  1. package/dest/acvm/acvm.d.ts +7 -0
  2. package/dest/acvm/acvm.d.ts.map +1 -1
  3. package/dest/acvm/acvm.js +17 -1
  4. package/dest/avm/avm_execution_environment.d.ts +2 -2
  5. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  6. package/dest/avm/avm_execution_environment.js +5 -6
  7. package/dest/avm/avm_gas.d.ts.map +1 -1
  8. package/dest/avm/avm_gas.js +73 -43
  9. package/dest/avm/avm_memory_types.d.ts +1 -1
  10. package/dest/avm/avm_memory_types.d.ts.map +1 -1
  11. package/dest/avm/avm_memory_types.js +5 -3
  12. package/dest/avm/bytecode_utils.js +5 -5
  13. package/dest/avm/errors.js +2 -2
  14. package/dest/avm/fixtures/index.d.ts +2 -0
  15. package/dest/avm/fixtures/index.d.ts.map +1 -1
  16. package/dest/avm/fixtures/index.js +18 -2
  17. package/dest/avm/journal/journal.d.ts +1 -1
  18. package/dest/avm/journal/journal.d.ts.map +1 -1
  19. package/dest/avm/journal/journal.js +13 -8
  20. package/dest/avm/opcodes/arithmetic.d.ts +9 -16
  21. package/dest/avm/opcodes/arithmetic.d.ts.map +1 -1
  22. package/dest/avm/opcodes/arithmetic.js +12 -37
  23. package/dest/avm/opcodes/bitwise.d.ts +5 -5
  24. package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
  25. package/dest/avm/opcodes/bitwise.js +6 -6
  26. package/dest/avm/opcodes/comparators.d.ts +3 -3
  27. package/dest/avm/opcodes/comparators.d.ts.map +1 -1
  28. package/dest/avm/opcodes/comparators.js +4 -4
  29. package/dest/avm/opcodes/control_flow.d.ts.map +1 -1
  30. package/dest/avm/opcodes/control_flow.js +6 -6
  31. package/dest/avm/opcodes/instruction.d.ts +18 -12
  32. package/dest/avm/opcodes/instruction.d.ts.map +1 -1
  33. package/dest/avm/opcodes/instruction.js +36 -19
  34. package/dest/avm/opcodes/instruction_impl.d.ts +4 -2
  35. package/dest/avm/opcodes/instruction_impl.d.ts.map +1 -1
  36. package/dest/avm/opcodes/instruction_impl.js +15 -7
  37. package/dest/avm/opcodes/memory.d.ts +11 -12
  38. package/dest/avm/opcodes/memory.d.ts.map +1 -1
  39. package/dest/avm/opcodes/memory.js +68 -68
  40. package/dest/avm/serialization/bytecode_serialization.d.ts +7 -8
  41. package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  42. package/dest/avm/serialization/bytecode_serialization.js +83 -67
  43. package/dest/avm/serialization/instruction_serialization.d.ts +84 -68
  44. package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
  45. package/dest/avm/serialization/instruction_serialization.js +102 -71
  46. package/dest/avm/test_utils.d.ts +1 -1
  47. package/dest/avm/test_utils.d.ts.map +1 -1
  48. package/dest/avm/test_utils.js +11 -3
  49. package/dest/public/abstract_phase_manager.d.ts.map +1 -1
  50. package/dest/public/abstract_phase_manager.js +4 -4
  51. package/dest/public/db_interfaces.d.ts +6 -0
  52. package/dest/public/db_interfaces.d.ts.map +1 -1
  53. package/dest/public/execution.d.ts +3 -3
  54. package/dest/public/execution.d.ts.map +1 -1
  55. package/dest/public/execution.js +1 -1
  56. package/dest/public/hints_builder.d.ts +6 -4
  57. package/dest/public/hints_builder.d.ts.map +1 -1
  58. package/dest/public/hints_builder.js +20 -5
  59. package/dest/public/public_db_sources.d.ts +1 -0
  60. package/dest/public/public_db_sources.d.ts.map +1 -1
  61. package/dest/public/public_db_sources.js +11 -1
  62. package/dest/public/side_effect_trace.d.ts +2 -2
  63. package/dest/public/side_effect_trace.d.ts.map +1 -1
  64. package/dest/public/side_effect_trace.js +10 -12
  65. package/dest/public/tail_phase_manager.d.ts.map +1 -1
  66. package/dest/public/tail_phase_manager.js +4 -3
  67. package/package.json +9 -9
  68. package/src/acvm/acvm.ts +22 -0
  69. package/src/avm/avm_execution_environment.ts +3 -4
  70. package/src/avm/avm_gas.ts +72 -42
  71. package/src/avm/avm_memory_types.ts +4 -2
  72. package/src/avm/bytecode_utils.ts +4 -4
  73. package/src/avm/errors.ts +1 -1
  74. package/src/avm/fixtures/index.ts +32 -2
  75. package/src/avm/journal/journal.ts +14 -8
  76. package/src/avm/opcodes/arithmetic.ts +12 -41
  77. package/src/avm/opcodes/bitwise.ts +5 -5
  78. package/src/avm/opcodes/comparators.ts +3 -3
  79. package/src/avm/opcodes/control_flow.ts +5 -5
  80. package/src/avm/opcodes/instruction.ts +41 -19
  81. package/src/avm/opcodes/instruction_impl.ts +14 -6
  82. package/src/avm/opcodes/memory.ts +76 -74
  83. package/src/avm/serialization/bytecode_serialization.ts +93 -77
  84. package/src/avm/serialization/instruction_serialization.ts +58 -25
  85. package/src/avm/test_utils.ts +9 -2
  86. package/src/public/abstract_phase_manager.ts +3 -2
  87. package/src/public/db_interfaces.ts +7 -0
  88. package/src/public/execution.ts +3 -2
  89. package/src/public/hints_builder.ts +48 -13
  90. package/src/public/public_db_sources.ts +11 -0
  91. package/src/public/side_effect_trace.ts +11 -12
  92. package/src/public/tail_phase_manager.ts +10 -7
@@ -1,33 +1,48 @@
1
1
  import { type IndexedTreeId, MerkleTreeId } from '@aztec/circuit-types';
2
2
  import {
3
3
  type Fr,
4
+ L1_TO_L2_MSG_TREE_HEIGHT,
5
+ MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX,
6
+ MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
4
7
  type MAX_NULLIFIERS_PER_TX,
5
8
  type MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX,
6
9
  MAX_NULLIFIER_READ_REQUESTS_PER_TX,
7
- type MAX_PUBLIC_DATA_HINTS,
8
10
  type MAX_PUBLIC_DATA_READS_PER_TX,
9
11
  type MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX,
10
12
  MembershipWitness,
13
+ NOTE_HASH_TREE_HEIGHT,
11
14
  NULLIFIER_TREE_HEIGHT,
12
15
  type Nullifier,
13
16
  PUBLIC_DATA_TREE_HEIGHT,
14
- type PublicDataHint,
15
17
  type PublicDataRead,
16
18
  type PublicDataTreeLeafPreimage,
17
19
  type PublicDataUpdateRequest,
18
20
  type ScopedReadRequest,
21
+ type TreeLeafReadRequest,
22
+ TreeLeafReadRequestHint,
19
23
  buildNullifierNonExistentReadRequestHints,
20
24
  buildPublicDataHint,
21
25
  buildPublicDataHints,
22
- buildPublicDataReadRequestHints,
23
26
  buildSiloedNullifierReadRequestHints,
24
27
  } from '@aztec/circuits.js';
28
+ import { makeTuple } from '@aztec/foundation/array';
25
29
  import { type Tuple } from '@aztec/foundation/serialize';
26
30
  import { type MerkleTreeOperations } from '@aztec/world-state';
27
31
 
28
32
  export class HintsBuilder {
29
33
  constructor(private db: MerkleTreeOperations) {}
30
34
 
35
+ async getNoteHashReadRequestsHints(
36
+ readRequests: Tuple<TreeLeafReadRequest, typeof MAX_NOTE_HASH_READ_REQUESTS_PER_TX>,
37
+ ) {
38
+ return await this.getTreeLeafReadRequestsHints(
39
+ readRequests,
40
+ MAX_NOTE_HASH_READ_REQUESTS_PER_TX,
41
+ NOTE_HASH_TREE_HEIGHT,
42
+ MerkleTreeId.NOTE_HASH_TREE,
43
+ );
44
+ }
45
+
31
46
  async getNullifierReadRequestHints(
32
47
  nullifierReadRequests: Tuple<ScopedReadRequest, typeof MAX_NULLIFIER_READ_REQUESTS_PER_TX>,
33
48
  pendingNullifiers: Tuple<Nullifier, typeof MAX_NULLIFIERS_PER_TX>,
@@ -50,6 +65,17 @@ export class HintsBuilder {
50
65
  return buildNullifierNonExistentReadRequestHints(this, nullifierNonExistentReadRequests, pendingNullifiers);
51
66
  }
52
67
 
68
+ async getL1ToL2MsgReadRequestsHints(
69
+ readRequests: Tuple<TreeLeafReadRequest, typeof MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX>,
70
+ ) {
71
+ return await this.getTreeLeafReadRequestsHints(
72
+ readRequests,
73
+ MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX,
74
+ L1_TO_L2_MSG_TREE_HEIGHT,
75
+ MerkleTreeId.L1_TO_L2_MESSAGE_TREE,
76
+ );
77
+ }
78
+
53
79
  getPublicDataHints(
54
80
  publicDataReads: Tuple<PublicDataRead, typeof MAX_PUBLIC_DATA_READS_PER_TX>,
55
81
  publicDataUpdateRequests: Tuple<PublicDataUpdateRequest, typeof MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX>,
@@ -62,14 +88,6 @@ export class HintsBuilder {
62
88
  return buildPublicDataHint(this, slot);
63
89
  }
64
90
 
65
- getPublicDataReadRequestHints(
66
- publicDataReads: Tuple<PublicDataRead, typeof MAX_PUBLIC_DATA_READS_PER_TX>,
67
- publicDataUpdateRequests: Tuple<PublicDataUpdateRequest, typeof MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX>,
68
- publicDataHints: Tuple<PublicDataHint, typeof MAX_PUBLIC_DATA_HINTS>,
69
- ) {
70
- return buildPublicDataReadRequestHints(publicDataReads, publicDataUpdateRequests, publicDataHints);
71
- }
72
-
73
91
  async getNullifierMembershipWitness(nullifier: Fr) {
74
92
  const index = await this.db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
75
93
  if (index === undefined) {
@@ -120,8 +138,8 @@ export class HintsBuilder {
120
138
  treeHeight: TREE_HEIGHT,
121
139
  index: bigint,
122
140
  ) {
123
- const siblingPath = await this.db.getSiblingPath(treeId, index);
124
- const membershipWitness = new MembershipWitness<TREE_HEIGHT>(treeHeight, index, siblingPath.toTuple());
141
+ const siblingPath = await this.db.getSiblingPath<TREE_HEIGHT>(treeId, index);
142
+ const membershipWitness = new MembershipWitness(treeHeight, index, siblingPath.toTuple());
125
143
 
126
144
  const leafPreimage = await this.db.getLeafPreimage(treeId, index);
127
145
  if (!leafPreimage) {
@@ -130,4 +148,21 @@ export class HintsBuilder {
130
148
 
131
149
  return { membershipWitness, leafPreimage };
132
150
  }
151
+
152
+ private async getTreeLeafReadRequestsHints<N extends number, TREE_HEIGHT extends number>(
153
+ readRequests: Tuple<TreeLeafReadRequest, N>,
154
+ size: N,
155
+ treeHeight: TREE_HEIGHT,
156
+ treeId: MerkleTreeId,
157
+ ): Promise<Tuple<TreeLeafReadRequestHint<TREE_HEIGHT>, N>> {
158
+ const hints = makeTuple(size, () => TreeLeafReadRequestHint.empty(treeHeight));
159
+ for (let i = 0; i < readRequests.length; i++) {
160
+ const request = readRequests[i];
161
+ if (!request.isEmpty()) {
162
+ const siblingPath = await this.db.getSiblingPath<typeof treeHeight>(treeId, request.leafIndex.toBigInt());
163
+ hints[i] = new TreeLeafReadRequestHint(treeHeight, siblingPath.toTuple());
164
+ }
165
+ }
166
+ return hints;
167
+ }
133
168
  }
@@ -308,6 +308,17 @@ export class WorldStateDB implements CommitmentsDB {
308
308
  return index;
309
309
  }
310
310
 
311
+ public async getCommitmentValue(leafIndex: bigint): Promise<Fr | undefined> {
312
+ const timer = new Timer();
313
+ const leafValue = await this.db.getLeafValue(MerkleTreeId.NOTE_HASH_TREE, leafIndex);
314
+ this.log.debug(`[DB] Fetched commitment leaf value`, {
315
+ eventName: 'public-db-access',
316
+ duration: timer.ms(),
317
+ operation: 'get-commitment-leaf-value',
318
+ } satisfies PublicDBAccessStats);
319
+ return leafValue;
320
+ }
321
+
311
322
  public async getNullifierIndex(nullifier: Fr): Promise<bigint | undefined> {
312
323
  const timer = new Timer();
313
324
  const index = await this.db.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
@@ -16,6 +16,7 @@ import {
16
16
  Nullifier,
17
17
  type PublicCallRequest,
18
18
  ReadRequest,
19
+ TreeLeafReadRequest,
19
20
  } from '@aztec/circuits.js';
20
21
  import { Fr } from '@aztec/foundation/fields';
21
22
  import { createDebugLogger } from '@aztec/foundation/log';
@@ -38,14 +39,14 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface {
38
39
  private contractStorageReads: ContractStorageRead[] = [];
39
40
  private contractStorageUpdateRequests: ContractStorageUpdateRequest[] = [];
40
41
 
41
- private noteHashReadRequests: ReadRequest[] = [];
42
+ private noteHashReadRequests: TreeLeafReadRequest[] = [];
42
43
  private noteHashes: NoteHash[] = [];
43
44
 
44
45
  private nullifierReadRequests: ReadRequest[] = [];
45
46
  private nullifierNonExistentReadRequests: ReadRequest[] = [];
46
47
  private nullifiers: Nullifier[] = [];
47
48
 
48
- private l1ToL2MsgReadRequests: ReadRequest[] = [];
49
+ private l1ToL2MsgReadRequests: TreeLeafReadRequest[] = [];
49
50
  private newL2ToL1Messages: L2ToL1Message[] = [];
50
51
 
51
52
  private unencryptedLogs: UnencryptedL2Log[] = [];
@@ -104,17 +105,16 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface {
104
105
  this.incrementSideEffectCounter();
105
106
  }
106
107
 
107
- public traceNoteHashCheck(_storageAddress: Fr, noteHash: Fr, _leafIndex: Fr, exists: boolean) {
108
+ // TODO(8287): _exists can be removed once we have the vm properly handling the equality check
109
+ public traceNoteHashCheck(_storageAddress: Fr, noteHash: Fr, leafIndex: Fr, exists: boolean) {
108
110
  // TODO(4805): check if some threshold is reached for max note hash checks
109
111
  // NOTE: storageAddress is unused but will be important when an AVM circuit processes an entire enqueued call
110
112
  // TODO(dbanks12): leafIndex is unused for now but later must be used by kernel to constrain that the kernel
111
113
  // is in fact checking the leaf indicated by the user
112
- this.noteHashReadRequests.push(new ReadRequest(noteHash, this.sideEffectCounter));
114
+ this.noteHashReadRequests.push(new TreeLeafReadRequest(noteHash, leafIndex));
113
115
  this.avmCircuitHints.noteHashExists.items.push(
114
- new AvmKeyValueHint(/*key=*/ new Fr(this.sideEffectCounter), /*value=*/ new Fr(exists ? 1 : 0)),
116
+ new AvmKeyValueHint(/*key=*/ new Fr(leafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO),
115
117
  );
116
- this.logger.debug(`NOTE_HASH_CHECK cnt: ${this.sideEffectCounter}`);
117
- this.incrementSideEffectCounter();
118
118
  }
119
119
 
120
120
  public traceNewNoteHash(_storageAddress: Fr, noteHash: Fr) {
@@ -154,17 +154,16 @@ export class PublicSideEffectTrace implements PublicSideEffectTraceInterface {
154
154
  this.incrementSideEffectCounter();
155
155
  }
156
156
 
157
- public traceL1ToL2MessageCheck(_contractAddress: Fr, msgHash: Fr, _msgLeafIndex: Fr, exists: boolean) {
157
+ // TODO(8287): _exists can be removed once we have the vm properly handling the equality check
158
+ public traceL1ToL2MessageCheck(_contractAddress: Fr, msgHash: Fr, msgLeafIndex: Fr, exists: boolean) {
158
159
  // TODO(4805): check if some threshold is reached for max message reads
159
160
  // NOTE: contractAddress is unused but will be important when an AVM circuit processes an entire enqueued call
160
161
  // TODO(dbanks12): leafIndex is unused for now but later must be used by kernel to constrain that the kernel
161
162
  // is in fact checking the leaf indicated by the user
162
- this.l1ToL2MsgReadRequests.push(new ReadRequest(msgHash, this.sideEffectCounter));
163
+ this.l1ToL2MsgReadRequests.push(new TreeLeafReadRequest(msgHash, msgLeafIndex));
163
164
  this.avmCircuitHints.l1ToL2MessageExists.items.push(
164
- new AvmKeyValueHint(/*key=*/ new Fr(this.sideEffectCounter), /*value=*/ new Fr(exists ? 1 : 0)),
165
+ new AvmKeyValueHint(/*key=*/ new Fr(msgLeafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO),
165
166
  );
166
- this.logger.debug(`L1_TO_L2_MSG_CHECK cnt: ${this.sideEffectCounter}`);
167
- this.incrementSideEffectCounter();
168
167
  }
169
168
 
170
169
  public traceNewL2ToL1Message(recipient: Fr, content: Fr) {
@@ -77,6 +77,10 @@ export class TailPhaseManager extends AbstractPhaseManager {
77
77
 
78
78
  const { validationRequests, endNonRevertibleData: nonRevertibleData, end: revertibleData } = previousOutput;
79
79
 
80
+ const noteHashReadRequestHints = await this.hintsBuilder.getNoteHashReadRequestsHints(
81
+ validationRequests.noteHashReadRequests,
82
+ );
83
+
80
84
  const pendingNullifiers = mergeAccumulatedData(
81
85
  nonRevertibleData.nullifiers,
82
86
  revertibleData.nullifiers,
@@ -93,6 +97,10 @@ export class TailPhaseManager extends AbstractPhaseManager {
93
97
  pendingNullifiers,
94
98
  );
95
99
 
100
+ const l1ToL2MsgReadRequestHints = await this.hintsBuilder.getL1ToL2MsgReadRequestsHints(
101
+ validationRequests.l1ToL2MsgReadRequests,
102
+ );
103
+
96
104
  const pendingPublicDataWrites = mergeAccumulatedData(
97
105
  nonRevertibleData.publicDataUpdateRequests,
98
106
  revertibleData.publicDataUpdateRequests,
@@ -104,20 +112,15 @@ export class TailPhaseManager extends AbstractPhaseManager {
104
112
  pendingPublicDataWrites,
105
113
  );
106
114
 
107
- const publicDataReadRequestHints = this.hintsBuilder.getPublicDataReadRequestHints(
108
- validationRequests.publicDataReads,
109
- pendingPublicDataWrites,
110
- publicDataHints,
111
- );
112
-
113
115
  const currentState = await this.db.getStateReference();
114
116
 
115
117
  return new PublicKernelTailCircuitPrivateInputs(
116
118
  previousKernel,
119
+ noteHashReadRequestHints,
117
120
  nullifierReadRequestHints,
118
121
  nullifierNonExistentReadRequestHints,
122
+ l1ToL2MsgReadRequestHints,
119
123
  publicDataHints,
120
- publicDataReadRequestHints,
121
124
  currentState.partial,
122
125
  );
123
126
  }