@aztec/simulator 0.40.1 → 0.42.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 (234) hide show
  1. package/dest/acvm/acvm.d.ts +2 -2
  2. package/dest/acvm/acvm.d.ts.map +1 -1
  3. package/dest/acvm/acvm.js +3 -3
  4. package/dest/acvm/oracle/oracle.d.ts +6 -2
  5. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  6. package/dest/acvm/oracle/oracle.js +31 -19
  7. package/dest/acvm/oracle/typed_oracle.d.ts +8 -11
  8. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  9. package/dest/acvm/oracle/typed_oracle.js +17 -5
  10. package/dest/acvm/serialize.js +2 -2
  11. package/dest/avm/avm_execution_environment.d.ts +4 -3
  12. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  13. package/dest/avm/avm_execution_environment.js +7 -5
  14. package/dest/avm/avm_gas.d.ts +1 -5
  15. package/dest/avm/avm_gas.d.ts.map +1 -1
  16. package/dest/avm/avm_gas.js +67 -73
  17. package/dest/avm/avm_simulator.d.ts +5 -0
  18. package/dest/avm/avm_simulator.d.ts.map +1 -1
  19. package/dest/avm/avm_simulator.js +12 -4
  20. package/dest/avm/errors.d.ts +6 -0
  21. package/dest/avm/errors.d.ts.map +1 -1
  22. package/dest/avm/errors.js +10 -1
  23. package/dest/avm/fixtures/index.d.ts +3 -0
  24. package/dest/avm/fixtures/index.d.ts.map +1 -1
  25. package/dest/avm/fixtures/index.js +15 -3
  26. package/dest/avm/index.d.ts +2 -0
  27. package/dest/avm/index.d.ts.map +1 -0
  28. package/dest/avm/index.js +2 -0
  29. package/dest/avm/journal/host_storage.d.ts +1 -1
  30. package/dest/avm/journal/host_storage.d.ts.map +1 -1
  31. package/dest/avm/journal/journal.d.ts +4 -3
  32. package/dest/avm/journal/journal.d.ts.map +1 -1
  33. package/dest/avm/journal/journal.js +10 -11
  34. package/dest/avm/journal/nullifiers.d.ts +17 -5
  35. package/dest/avm/journal/nullifiers.d.ts.map +1 -1
  36. package/dest/avm/journal/nullifiers.js +27 -10
  37. package/dest/avm/journal/public_storage.d.ts +19 -6
  38. package/dest/avm/journal/public_storage.d.ts.map +1 -1
  39. package/dest/avm/journal/public_storage.js +30 -12
  40. package/dest/avm/journal/trace.d.ts +2 -0
  41. package/dest/avm/journal/trace.d.ts.map +1 -1
  42. package/dest/avm/journal/trace.js +7 -1
  43. package/dest/avm/journal/trace_types.d.ts +1 -0
  44. package/dest/avm/journal/trace_types.d.ts.map +1 -1
  45. package/dest/avm/journal/trace_types.js +1 -1
  46. package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
  47. package/dest/avm/opcodes/accrued_substate.js +6 -7
  48. package/dest/avm/opcodes/arithmetic.d.ts +1 -7
  49. package/dest/avm/opcodes/arithmetic.d.ts.map +1 -1
  50. package/dest/avm/opcodes/arithmetic.js +1 -12
  51. package/dest/avm/opcodes/conversion.js +2 -2
  52. package/dest/avm/opcodes/external_calls.d.ts +2 -2
  53. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  54. package/dest/avm/opcodes/external_calls.js +25 -13
  55. package/dest/avm/opcodes/instruction.d.ts +1 -1
  56. package/dest/avm/opcodes/instruction.d.ts.map +1 -1
  57. package/dest/avm/opcodes/instruction.js +6 -4
  58. package/dest/avm/opcodes/memory.d.ts +0 -4
  59. package/dest/avm/opcodes/memory.d.ts.map +1 -1
  60. package/dest/avm/opcodes/memory.js +1 -7
  61. package/dest/avm/opcodes/storage.d.ts +0 -12
  62. package/dest/avm/opcodes/storage.d.ts.map +1 -1
  63. package/dest/avm/opcodes/storage.js +3 -18
  64. package/dest/avm/serialization/bytecode_serialization.js +2 -2
  65. package/dest/client/client_execution_context.d.ts +30 -20
  66. package/dest/client/client_execution_context.d.ts.map +1 -1
  67. package/dest/client/client_execution_context.js +59 -39
  68. package/dest/client/db_oracle.d.ts +17 -12
  69. package/dest/client/db_oracle.d.ts.map +1 -1
  70. package/dest/client/execution_note_cache.js +2 -2
  71. package/dest/client/execution_result.d.ts +17 -2
  72. package/dest/client/execution_result.d.ts.map +1 -1
  73. package/dest/client/execution_result.js +32 -4
  74. package/dest/client/private_execution.d.ts +2 -3
  75. package/dest/client/private_execution.d.ts.map +1 -1
  76. package/dest/client/private_execution.js +22 -8
  77. package/dest/client/simulator.d.ts +0 -16
  78. package/dest/client/simulator.d.ts.map +1 -1
  79. package/dest/client/simulator.js +13 -30
  80. package/dest/client/unconstrained_execution.d.ts +2 -3
  81. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  82. package/dest/client/unconstrained_execution.js +5 -7
  83. package/dest/client/view_data_oracle.d.ts +12 -10
  84. package/dest/client/view_data_oracle.d.ts.map +1 -1
  85. package/dest/client/view_data_oracle.js +17 -11
  86. package/dest/common/index.d.ts +1 -0
  87. package/dest/common/index.d.ts.map +1 -1
  88. package/dest/common/index.js +2 -1
  89. package/dest/common/return_values.d.ts +11 -0
  90. package/dest/common/return_values.d.ts.map +1 -0
  91. package/dest/common/return_values.js +13 -0
  92. package/dest/index.d.ts +3 -1
  93. package/dest/index.d.ts.map +1 -1
  94. package/dest/index.js +4 -2
  95. package/dest/mocks/fixtures.d.ts +15 -10
  96. package/dest/mocks/fixtures.d.ts.map +1 -1
  97. package/dest/mocks/fixtures.js +22 -17
  98. package/dest/{simulator → providers}/acvm_native.d.ts.map +1 -1
  99. package/dest/{simulator → providers}/acvm_native.js +13 -14
  100. package/dest/providers/acvm_wasm.d.ts.map +1 -0
  101. package/dest/providers/acvm_wasm.js +15 -0
  102. package/dest/providers/index.d.ts.map +1 -0
  103. package/dest/{simulator → providers}/index.js +1 -1
  104. package/dest/{simulator → providers}/simulation_provider.d.ts.map +1 -1
  105. package/dest/{simulator → providers}/simulation_provider.js +1 -1
  106. package/dest/public/abstract_phase_manager.d.ts +43 -42
  107. package/dest/public/abstract_phase_manager.d.ts.map +1 -1
  108. package/dest/public/abstract_phase_manager.js +81 -103
  109. package/dest/public/app_logic_phase_manager.d.ts +7 -8
  110. package/dest/public/app_logic_phase_manager.d.ts.map +1 -1
  111. package/dest/public/app_logic_phase_manager.js +14 -14
  112. package/dest/public/{db.d.ts → db_interfaces.d.ts} +3 -3
  113. package/dest/public/db_interfaces.d.ts.map +1 -0
  114. package/dest/public/db_interfaces.js +2 -0
  115. package/dest/public/execution.d.ts +17 -14
  116. package/dest/public/execution.d.ts.map +1 -1
  117. package/dest/public/execution.js +1 -1
  118. package/dest/public/executor.d.ts +3 -30
  119. package/dest/public/executor.d.ts.map +1 -1
  120. package/dest/public/executor.js +32 -279
  121. package/dest/public/fee_payment.d.ts +11 -0
  122. package/dest/public/fee_payment.d.ts.map +1 -0
  123. package/dest/public/fee_payment.js +24 -0
  124. package/dest/public/hints_builder.d.ts +3 -2
  125. package/dest/public/hints_builder.d.ts.map +1 -1
  126. package/dest/public/hints_builder.js +8 -4
  127. package/dest/public/index.d.ts +4 -2
  128. package/dest/public/index.d.ts.map +1 -1
  129. package/dest/public/index.js +5 -3
  130. package/dest/public/phase_manager_factory.d.ts +1 -1
  131. package/dest/public/phase_manager_factory.d.ts.map +1 -1
  132. package/dest/public/{public_executor.d.ts → public_db_sources.d.ts} +3 -2
  133. package/dest/public/public_db_sources.d.ts.map +1 -0
  134. package/dest/public/public_db_sources.js +198 -0
  135. package/dest/public/public_kernel.js +14 -14
  136. package/dest/public/public_processor.d.ts +8 -6
  137. package/dest/public/public_processor.d.ts.map +1 -1
  138. package/dest/public/public_processor.js +48 -29
  139. package/dest/public/setup_phase_manager.d.ts +7 -9
  140. package/dest/public/setup_phase_manager.d.ts.map +1 -1
  141. package/dest/public/setup_phase_manager.js +11 -20
  142. package/dest/public/tail_phase_manager.d.ts +5 -11
  143. package/dest/public/tail_phase_manager.d.ts.map +1 -1
  144. package/dest/public/tail_phase_manager.js +16 -36
  145. package/dest/public/teardown_phase_manager.d.ts +7 -9
  146. package/dest/public/teardown_phase_manager.d.ts.map +1 -1
  147. package/dest/public/teardown_phase_manager.js +15 -21
  148. package/dest/public/transitional_adaptors.d.ts +3 -2
  149. package/dest/public/transitional_adaptors.d.ts.map +1 -1
  150. package/dest/public/transitional_adaptors.js +24 -8
  151. package/dest/public/utils.d.ts +2 -2
  152. package/dest/public/utils.d.ts.map +1 -1
  153. package/dest/public/utils.js +21 -14
  154. package/package.json +12 -9
  155. package/src/acvm/acvm.ts +0 -3
  156. package/src/acvm/oracle/oracle.ts +53 -27
  157. package/src/acvm/oracle/typed_oracle.ts +25 -16
  158. package/src/acvm/serialize.ts +1 -1
  159. package/src/avm/avm_execution_environment.ts +9 -5
  160. package/src/avm/avm_gas.ts +66 -73
  161. package/src/avm/avm_simulator.ts +14 -3
  162. package/src/avm/errors.ts +10 -0
  163. package/src/avm/fixtures/index.ts +22 -2
  164. package/src/avm/index.ts +1 -0
  165. package/src/avm/journal/host_storage.ts +1 -1
  166. package/src/avm/journal/journal.ts +15 -14
  167. package/src/avm/journal/nullifiers.ts +27 -14
  168. package/src/avm/journal/public_storage.ts +30 -16
  169. package/src/avm/journal/trace.ts +12 -0
  170. package/src/avm/journal/trace_types.ts +1 -0
  171. package/src/avm/opcodes/accrued_substate.ts +5 -6
  172. package/src/avm/opcodes/arithmetic.ts +1 -14
  173. package/src/avm/opcodes/conversion.ts +1 -1
  174. package/src/avm/opcodes/external_calls.ts +26 -10
  175. package/src/avm/opcodes/instruction.ts +5 -3
  176. package/src/avm/opcodes/memory.ts +1 -8
  177. package/src/avm/opcodes/storage.ts +3 -20
  178. package/src/avm/serialization/bytecode_serialization.ts +1 -1
  179. package/src/client/client_execution_context.ts +70 -44
  180. package/src/client/db_oracle.ts +18 -12
  181. package/src/client/execution_note_cache.ts +1 -1
  182. package/src/client/execution_result.ts +41 -3
  183. package/src/client/private_execution.ts +38 -20
  184. package/src/client/simulator.ts +11 -32
  185. package/src/client/unconstrained_execution.ts +9 -12
  186. package/src/client/view_data_oracle.ts +20 -12
  187. package/src/common/index.ts +1 -0
  188. package/src/common/return_values.ts +18 -0
  189. package/src/index.ts +3 -1
  190. package/src/mocks/fixtures.ts +31 -33
  191. package/src/{simulator → providers}/acvm_native.ts +21 -19
  192. package/src/{simulator → providers}/acvm_wasm.ts +2 -16
  193. package/src/public/abstract_phase_manager.ts +146 -207
  194. package/src/public/app_logic_phase_manager.ts +23 -39
  195. package/src/public/{db.ts → db_interfaces.ts} +2 -2
  196. package/src/public/execution.ts +17 -14
  197. package/src/public/executor.ts +51 -391
  198. package/src/public/fee_payment.ts +26 -0
  199. package/src/public/hints_builder.ts +17 -3
  200. package/src/public/index.ts +4 -2
  201. package/src/public/phase_manager_factory.ts +1 -1
  202. package/src/public/{public_executor.ts → public_db_sources.ts} +3 -2
  203. package/src/public/public_kernel.ts +24 -24
  204. package/src/public/public_processor.ts +82 -38
  205. package/src/public/setup_phase_manager.ts +20 -45
  206. package/src/public/tail_phase_manager.ts +18 -68
  207. package/src/public/teardown_phase_manager.ts +22 -41
  208. package/src/public/transitional_adaptors.ts +24 -13
  209. package/src/public/utils.ts +20 -14
  210. package/dest/client/logs_cache.d.ts +0 -33
  211. package/dest/client/logs_cache.d.ts.map +0 -1
  212. package/dest/client/logs_cache.js +0 -59
  213. package/dest/public/db.d.ts.map +0 -1
  214. package/dest/public/db.js +0 -2
  215. package/dest/public/public_execution_context.d.ts +0 -121
  216. package/dest/public/public_execution_context.d.ts.map +0 -1
  217. package/dest/public/public_execution_context.js +0 -214
  218. package/dest/public/public_executor.d.ts.map +0 -1
  219. package/dest/public/public_executor.js +0 -197
  220. package/dest/public/state_actions.d.ts +0 -39
  221. package/dest/public/state_actions.d.ts.map +0 -1
  222. package/dest/public/state_actions.js +0 -80
  223. package/dest/simulator/acvm_wasm.d.ts.map +0 -1
  224. package/dest/simulator/acvm_wasm.js +0 -22
  225. package/dest/simulator/index.d.ts.map +0 -1
  226. package/src/client/logs_cache.ts +0 -65
  227. package/src/public/public_execution_context.ts +0 -289
  228. package/src/public/state_actions.ts +0 -102
  229. /package/dest/{simulator → providers}/acvm_native.d.ts +0 -0
  230. /package/dest/{simulator → providers}/acvm_wasm.d.ts +0 -0
  231. /package/dest/{simulator → providers}/index.d.ts +0 -0
  232. /package/dest/{simulator → providers}/simulation_provider.d.ts +0 -0
  233. /package/src/{simulator → providers}/index.ts +0 -0
  234. /package/src/{simulator → providers}/simulation_provider.ts +0 -0
@@ -1,4 +1,5 @@
1
1
  import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
2
+ import { KeyValidationRequest } from '@aztec/circuits.js';
2
3
  import { EventSelector, FunctionSelector } from '@aztec/foundation/abi';
3
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
4
5
  import { Fr, Point } from '@aztec/foundation/fields';
@@ -40,15 +41,18 @@ export class Oracle {
40
41
  return unpacked.map(toACVMField);
41
42
  }
42
43
 
43
- async getNullifierKeys([accountAddress]: ACVMField[]): Promise<ACVMField[]> {
44
- const { masterNullifierPublicKey, appNullifierSecretKey } = await this.typedOracle.getNullifierKeys(
45
- fromACVMField(accountAddress),
46
- );
47
- return [
48
- toACVMField(masterNullifierPublicKey.x),
49
- toACVMField(masterNullifierPublicKey.y),
50
- toACVMField(appNullifierSecretKey),
51
- ];
44
+ async getBlockNumber(): Promise<ACVMField> {
45
+ return toACVMField(await this.typedOracle.getBlockNumber());
46
+ }
47
+
48
+ async getContractAddress(): Promise<ACVMField> {
49
+ return toACVMField(await this.typedOracle.getContractAddress());
50
+ }
51
+
52
+ async getKeyValidationRequest([pkMHash]: ACVMField[]): Promise<ACVMField[]> {
53
+ const { pkM, skApp } = await this.typedOracle.getKeyValidationRequest(fromACVMField(pkMHash));
54
+
55
+ return [toACVMField(pkM.x), toACVMField(pkM.y), toACVMField(skApp)];
52
56
  }
53
57
 
54
58
  async getContractInstance([address]: ACVMField[]) {
@@ -286,32 +290,54 @@ export class Oracle {
286
290
  }
287
291
 
288
292
  emitEncryptedLog(
293
+ [contractAddress]: ACVMField[],
294
+ [randomness]: ACVMField[],
295
+ encryptedLog: ACVMField[],
296
+ [counter]: ACVMField[],
297
+ ): void {
298
+ // Convert each field to a number and then to a buffer (1 byte is stored in 1 field)
299
+ const processedInput = Buffer.from(encryptedLog.map(fromACVMField).map(f => f.toNumber()));
300
+ this.typedOracle.emitEncryptedLog(
301
+ AztecAddress.fromString(contractAddress),
302
+ Fr.fromString(randomness),
303
+ processedInput,
304
+ +counter,
305
+ );
306
+ }
307
+
308
+ emitEncryptedNoteLog([noteHashCounter]: ACVMField[], encryptedNote: ACVMField[], [counter]: ACVMField[]): void {
309
+ // Convert each field to a number and then to a buffer (1 byte is stored in 1 field)
310
+ const processedInput = Buffer.from(encryptedNote.map(fromACVMField).map(f => f.toNumber()));
311
+ this.typedOracle.emitEncryptedNoteLog(+noteHashCounter, processedInput, +counter);
312
+ }
313
+
314
+ computeEncryptedLog(
289
315
  [contractAddress]: ACVMField[],
290
316
  [storageSlot]: ACVMField[],
291
317
  [noteTypeId]: ACVMField[],
292
- [publicKeyX]: ACVMField[],
293
- [publicKeyY]: ACVMField[],
294
- log: ACVMField[],
295
- [counter]: ACVMField[],
318
+ [ovskApp]: ACVMField[],
319
+ [ovpkMX]: ACVMField[],
320
+ [ovpkMY]: ACVMField[],
321
+ [ivpkMX]: ACVMField[],
322
+ [ivpkMY]: ACVMField[],
323
+ preimage: ACVMField[],
296
324
  ): ACVMField[] {
297
- const publicKey = new Point(fromACVMField(publicKeyX), fromACVMField(publicKeyY));
298
- const encLog = this.typedOracle.emitEncryptedLog(
325
+ const ovpkM = new Point(fromACVMField(ovpkMX), fromACVMField(ovpkMY));
326
+ const ovKeys = new KeyValidationRequest(ovpkM, Fr.fromString(ovskApp));
327
+ const ivpkM = new Point(fromACVMField(ivpkMX), fromACVMField(ivpkMY));
328
+ const encLog = this.typedOracle.computeEncryptedLog(
299
329
  AztecAddress.fromString(contractAddress),
300
330
  Fr.fromString(storageSlot),
301
331
  Fr.fromString(noteTypeId),
302
- publicKey,
303
- log.map(fromACVMField),
304
- +counter,
332
+ ovKeys,
333
+ ivpkM,
334
+ preimage.map(fromACVMField),
305
335
  );
306
- // TODO(1139): We should encrypt in the circuit, but instead we inject here
307
- // encryption output is 112 + 32 * (N + 3) bytes, for log len N
308
- // so split into N + 7 fields (gross but avoids 300+ ACVMFields)
309
- const encLogFields = [];
310
- for (let i = 0; i < Math.ceil(encLog.length / 31); i++) {
311
- encLogFields.push(toACVMField(encLog.subarray(31 * i, Math.min(31 * (i + 1), encLog.length))));
312
- }
313
-
314
- return encLogFields;
336
+ const bytes: ACVMField[] = [];
337
+ encLog.forEach(v => {
338
+ bytes.push(toACVMField(v));
339
+ });
340
+ return bytes;
315
341
  }
316
342
 
317
343
  emitUnencryptedLog(
@@ -11,6 +11,7 @@ import {
11
11
  } from '@aztec/circuit-types';
12
12
  import {
13
13
  type Header,
14
+ type KeyValidationRequest,
14
15
  type L1_TO_L2_MSG_TREE_HEIGHT,
15
16
  type PrivateCallStackItem,
16
17
  type PublicCallRequest,
@@ -20,14 +21,6 @@ import { type AztecAddress } from '@aztec/foundation/aztec-address';
20
21
  import { Fr } from '@aztec/foundation/fields';
21
22
  import { type ContractInstance } from '@aztec/types/contracts';
22
23
 
23
- /** Nullifier keys which both correspond to the same master nullifier secret key. */
24
- export interface NullifierKeys {
25
- /** Master nullifier public key. */
26
- masterNullifierPublicKey: PublicKey;
27
- /** App nullifier secret key. */
28
- appNullifierSecretKey: Fr;
29
- }
30
-
31
24
  /**
32
25
  * Information about a note needed during execution.
33
26
  */
@@ -89,8 +82,16 @@ export abstract class TypedOracle {
89
82
  throw new OracleMethodNotAvailableError('unpackReturns');
90
83
  }
91
84
 
92
- getNullifierKeys(_accountAddress: AztecAddress): Promise<NullifierKeys> {
93
- throw new OracleMethodNotAvailableError('getNullifierKeys');
85
+ getBlockNumber(): Promise<number> {
86
+ throw new OracleMethodNotAvailableError('getBlockNumber');
87
+ }
88
+
89
+ getContractAddress(): Promise<AztecAddress> {
90
+ throw new OracleMethodNotAvailableError('getContractAddress');
91
+ }
92
+
93
+ getKeyValidationRequest(_pkMHash: Fr): Promise<KeyValidationRequest> {
94
+ throw new OracleMethodNotAvailableError('getKeyValidationRequest');
94
95
  }
95
96
 
96
97
  getContractInstance(_address: AztecAddress): Promise<ContractInstance> {
@@ -124,7 +125,7 @@ export abstract class TypedOracle {
124
125
  throw new OracleMethodNotAvailableError('getHeader');
125
126
  }
126
127
 
127
- getCompleteAddress(_address: AztecAddress): Promise<CompleteAddress> {
128
+ getCompleteAddress(_account: AztecAddress): Promise<CompleteAddress> {
128
129
  throw new OracleMethodNotAvailableError('getCompleteAddress');
129
130
  }
130
131
 
@@ -183,15 +184,23 @@ export abstract class TypedOracle {
183
184
  throw new OracleMethodNotAvailableError('storageWrite');
184
185
  }
185
186
 
186
- emitEncryptedLog(
187
+ emitEncryptedLog(_contractAddress: AztecAddress, _randomness: Fr, _encryptedNote: Buffer, _counter: number): void {
188
+ throw new OracleMethodNotAvailableError('emitEncryptedLog');
189
+ }
190
+
191
+ emitEncryptedNoteLog(_noteHashCounter: number, _encryptedNote: Buffer, _counter: number): void {
192
+ throw new OracleMethodNotAvailableError('emitEncryptedNoteLog');
193
+ }
194
+
195
+ computeEncryptedLog(
187
196
  _contractAddress: AztecAddress,
188
197
  _storageSlot: Fr,
189
198
  _noteTypeId: Fr,
190
- _publicKey: PublicKey,
191
- _log: Fr[],
192
- _counter: number,
199
+ _ovKeys: KeyValidationRequest,
200
+ _ivpkM: PublicKey,
201
+ _preimage: Fr[],
193
202
  ): Buffer {
194
- throw new OracleMethodNotAvailableError('emitEncryptedLog');
203
+ throw new OracleMethodNotAvailableError('computeEncryptedLog');
195
204
  }
196
205
 
197
206
  emitUnencryptedLog(_log: UnencryptedL2Log, _counter: number): void {
@@ -55,7 +55,7 @@ export function toACVMField(
55
55
  export function toAcvmEnqueuePublicFunctionResult(item: PublicCallRequest): ACVMField[] {
56
56
  const fields = [
57
57
  item.contractAddress.toField(),
58
- ...item.functionData.toFields(),
58
+ item.functionSelector.toField(),
59
59
  ...item.callContext.toFields(),
60
60
  item.getArgsHash(),
61
61
  ];
@@ -1,15 +1,15 @@
1
1
  import { FunctionSelector, type GasSettings, type GlobalVariables, type Header } from '@aztec/circuits.js';
2
2
  import { computeVarArgsHash } from '@aztec/circuits.js/hash';
3
3
  import { type AztecAddress } from '@aztec/foundation/aztec-address';
4
- import { type Fr } from '@aztec/foundation/fields';
4
+ import { Fr } from '@aztec/foundation/fields';
5
5
 
6
6
  export class AvmContextInputs {
7
- static readonly SIZE = 2;
7
+ static readonly SIZE = 3;
8
8
 
9
- constructor(private selector: Fr, private argsHash: Fr) {}
9
+ constructor(private selector: Fr, private argsHash: Fr, private isStaticCall: boolean) {}
10
10
 
11
11
  public toFields(): Fr[] {
12
- return [this.selector, this.argsHash];
12
+ return [this.selector, this.argsHash, new Fr(this.isStaticCall)];
13
13
  }
14
14
  }
15
15
 
@@ -41,7 +41,11 @@ export class AvmExecutionEnvironment {
41
41
  ) {
42
42
  // We encode some extra inputs (AvmContextInputs) in calldata.
43
43
  // This will have to go once we move away from one proof per call.
44
- const inputs = new AvmContextInputs(temporaryFunctionSelector.toField(), computeVarArgsHash(calldata));
44
+ const inputs = new AvmContextInputs(
45
+ temporaryFunctionSelector.toField(),
46
+ computeVarArgsHash(calldata),
47
+ isStaticCall,
48
+ );
45
49
  this.calldata = [...inputs.toFields(), ...calldata];
46
50
  }
47
51
 
@@ -49,93 +49,86 @@ export const EmptyGas: Gas = {
49
49
  /** Dimensions of gas usage: L1, L2, and DA. */
50
50
  export const GasDimensions = ['l2Gas', 'daGas'] as const;
51
51
 
52
- /** Null object to represent a gas cost that's dynamic instead of fixed for a given instruction. */
53
- export const DynamicGasCost = Symbol('DynamicGasCost');
54
-
55
- /** Temporary default gas cost. We should eventually remove all usage of this variable in favor of actual gas for each opcode. */
56
- const TemporaryDefaultGasCost = { l2Gas: 10, daGas: 0 };
52
+ /** Default gas cost for an opcode. */
53
+ const DefaultBaseGasCost: Gas = { l2Gas: 10, daGas: 0 };
57
54
 
58
55
  /** Base gas costs for each instruction. Additional gas cost may be added on top due to memory or storage accesses, etc. */
59
- export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
60
- [Opcode.ADD]: TemporaryDefaultGasCost,
61
- [Opcode.SUB]: TemporaryDefaultGasCost,
62
- [Opcode.MUL]: TemporaryDefaultGasCost,
63
- [Opcode.DIV]: TemporaryDefaultGasCost,
64
- [Opcode.FDIV]: TemporaryDefaultGasCost,
65
- [Opcode.EQ]: TemporaryDefaultGasCost,
66
- [Opcode.LT]: TemporaryDefaultGasCost,
67
- [Opcode.LTE]: TemporaryDefaultGasCost,
68
- [Opcode.AND]: TemporaryDefaultGasCost,
69
- [Opcode.OR]: TemporaryDefaultGasCost,
70
- [Opcode.XOR]: TemporaryDefaultGasCost,
71
- [Opcode.NOT]: TemporaryDefaultGasCost,
72
- [Opcode.SHL]: TemporaryDefaultGasCost,
73
- [Opcode.SHR]: TemporaryDefaultGasCost,
74
- [Opcode.CAST]: TemporaryDefaultGasCost,
56
+ const BaseGasCosts: Record<Opcode, Gas> = {
57
+ [Opcode.ADD]: DefaultBaseGasCost,
58
+ [Opcode.SUB]: DefaultBaseGasCost,
59
+ [Opcode.MUL]: DefaultBaseGasCost,
60
+ [Opcode.DIV]: DefaultBaseGasCost,
61
+ [Opcode.FDIV]: DefaultBaseGasCost,
62
+ [Opcode.EQ]: DefaultBaseGasCost,
63
+ [Opcode.LT]: DefaultBaseGasCost,
64
+ [Opcode.LTE]: DefaultBaseGasCost,
65
+ [Opcode.AND]: DefaultBaseGasCost,
66
+ [Opcode.OR]: DefaultBaseGasCost,
67
+ [Opcode.XOR]: DefaultBaseGasCost,
68
+ [Opcode.NOT]: DefaultBaseGasCost,
69
+ [Opcode.SHL]: DefaultBaseGasCost,
70
+ [Opcode.SHR]: DefaultBaseGasCost,
71
+ [Opcode.CAST]: DefaultBaseGasCost,
75
72
  // Execution environment
76
- [Opcode.ADDRESS]: TemporaryDefaultGasCost,
77
- [Opcode.STORAGEADDRESS]: TemporaryDefaultGasCost,
78
- [Opcode.SENDER]: TemporaryDefaultGasCost,
79
- [Opcode.FEEPERL2GAS]: TemporaryDefaultGasCost,
80
- [Opcode.FEEPERDAGAS]: TemporaryDefaultGasCost,
81
- [Opcode.TRANSACTIONFEE]: TemporaryDefaultGasCost,
82
- [Opcode.CONTRACTCALLDEPTH]: TemporaryDefaultGasCost,
83
- [Opcode.CHAINID]: TemporaryDefaultGasCost,
84
- [Opcode.VERSION]: TemporaryDefaultGasCost,
85
- [Opcode.BLOCKNUMBER]: TemporaryDefaultGasCost,
86
- [Opcode.TIMESTAMP]: TemporaryDefaultGasCost,
87
- [Opcode.COINBASE]: TemporaryDefaultGasCost,
88
- [Opcode.BLOCKL2GASLIMIT]: TemporaryDefaultGasCost,
89
- [Opcode.BLOCKDAGASLIMIT]: TemporaryDefaultGasCost,
90
- [Opcode.CALLDATACOPY]: TemporaryDefaultGasCost,
73
+ [Opcode.ADDRESS]: DefaultBaseGasCost,
74
+ [Opcode.STORAGEADDRESS]: DefaultBaseGasCost,
75
+ [Opcode.SENDER]: DefaultBaseGasCost,
76
+ [Opcode.FEEPERL2GAS]: DefaultBaseGasCost,
77
+ [Opcode.FEEPERDAGAS]: DefaultBaseGasCost,
78
+ [Opcode.TRANSACTIONFEE]: DefaultBaseGasCost,
79
+ [Opcode.CONTRACTCALLDEPTH]: DefaultBaseGasCost,
80
+ [Opcode.CHAINID]: DefaultBaseGasCost,
81
+ [Opcode.VERSION]: DefaultBaseGasCost,
82
+ [Opcode.BLOCKNUMBER]: DefaultBaseGasCost,
83
+ [Opcode.TIMESTAMP]: DefaultBaseGasCost,
84
+ [Opcode.COINBASE]: DefaultBaseGasCost,
85
+ [Opcode.BLOCKL2GASLIMIT]: DefaultBaseGasCost,
86
+ [Opcode.BLOCKDAGASLIMIT]: DefaultBaseGasCost,
87
+ [Opcode.CALLDATACOPY]: DefaultBaseGasCost,
91
88
  // Gas
92
- [Opcode.L2GASLEFT]: TemporaryDefaultGasCost,
93
- [Opcode.DAGASLEFT]: TemporaryDefaultGasCost,
89
+ [Opcode.L2GASLEFT]: DefaultBaseGasCost,
90
+ [Opcode.DAGASLEFT]: DefaultBaseGasCost,
94
91
  // Control flow
95
- [Opcode.JUMP]: TemporaryDefaultGasCost,
96
- [Opcode.JUMPI]: TemporaryDefaultGasCost,
97
- [Opcode.INTERNALCALL]: TemporaryDefaultGasCost,
98
- [Opcode.INTERNALRETURN]: TemporaryDefaultGasCost,
92
+ [Opcode.JUMP]: DefaultBaseGasCost,
93
+ [Opcode.JUMPI]: DefaultBaseGasCost,
94
+ [Opcode.INTERNALCALL]: DefaultBaseGasCost,
95
+ [Opcode.INTERNALRETURN]: DefaultBaseGasCost,
99
96
  // Memory
100
- [Opcode.SET]: TemporaryDefaultGasCost,
101
- [Opcode.MOV]: TemporaryDefaultGasCost,
102
- [Opcode.CMOV]: TemporaryDefaultGasCost,
97
+ [Opcode.SET]: DefaultBaseGasCost,
98
+ [Opcode.MOV]: DefaultBaseGasCost,
99
+ [Opcode.CMOV]: DefaultBaseGasCost,
103
100
  // World state
104
- [Opcode.SLOAD]: TemporaryDefaultGasCost,
105
- [Opcode.SSTORE]: TemporaryDefaultGasCost,
106
- [Opcode.NOTEHASHEXISTS]: TemporaryDefaultGasCost,
107
- [Opcode.EMITNOTEHASH]: TemporaryDefaultGasCost,
108
- [Opcode.NULLIFIEREXISTS]: TemporaryDefaultGasCost,
109
- [Opcode.EMITNULLIFIER]: TemporaryDefaultGasCost,
110
- [Opcode.L1TOL2MSGEXISTS]: TemporaryDefaultGasCost,
111
- [Opcode.HEADERMEMBER]: TemporaryDefaultGasCost,
112
- [Opcode.EMITUNENCRYPTEDLOG]: TemporaryDefaultGasCost,
113
- [Opcode.SENDL2TOL1MSG]: TemporaryDefaultGasCost,
114
- [Opcode.GETCONTRACTINSTANCE]: TemporaryDefaultGasCost,
101
+ [Opcode.SLOAD]: DefaultBaseGasCost,
102
+ [Opcode.SSTORE]: DefaultBaseGasCost,
103
+ [Opcode.NOTEHASHEXISTS]: DefaultBaseGasCost,
104
+ [Opcode.EMITNOTEHASH]: DefaultBaseGasCost,
105
+ [Opcode.NULLIFIEREXISTS]: DefaultBaseGasCost,
106
+ [Opcode.EMITNULLIFIER]: DefaultBaseGasCost,
107
+ [Opcode.L1TOL2MSGEXISTS]: DefaultBaseGasCost,
108
+ [Opcode.HEADERMEMBER]: DefaultBaseGasCost,
109
+ [Opcode.EMITUNENCRYPTEDLOG]: DefaultBaseGasCost,
110
+ [Opcode.SENDL2TOL1MSG]: DefaultBaseGasCost,
111
+ [Opcode.GETCONTRACTINSTANCE]: DefaultBaseGasCost,
115
112
  // External calls
116
- [Opcode.CALL]: TemporaryDefaultGasCost,
117
- [Opcode.STATICCALL]: TemporaryDefaultGasCost,
118
- [Opcode.DELEGATECALL]: TemporaryDefaultGasCost,
119
- [Opcode.RETURN]: TemporaryDefaultGasCost,
120
- [Opcode.REVERT]: TemporaryDefaultGasCost,
113
+ [Opcode.CALL]: DefaultBaseGasCost,
114
+ [Opcode.STATICCALL]: DefaultBaseGasCost,
115
+ [Opcode.DELEGATECALL]: DefaultBaseGasCost,
116
+ [Opcode.RETURN]: DefaultBaseGasCost,
117
+ [Opcode.REVERT]: DefaultBaseGasCost,
121
118
  // Misc
122
- [Opcode.DEBUGLOG]: TemporaryDefaultGasCost,
119
+ [Opcode.DEBUGLOG]: DefaultBaseGasCost,
123
120
  // Gadgets
124
- [Opcode.KECCAK]: TemporaryDefaultGasCost,
125
- [Opcode.POSEIDON2]: TemporaryDefaultGasCost,
126
- [Opcode.SHA256]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,
127
- [Opcode.PEDERSEN]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,t
121
+ [Opcode.KECCAK]: DefaultBaseGasCost,
122
+ [Opcode.POSEIDON2]: DefaultBaseGasCost,
123
+ [Opcode.SHA256]: DefaultBaseGasCost,
124
+ [Opcode.PEDERSEN]: DefaultBaseGasCost,
128
125
  // Conversions
129
- [Opcode.TORADIXLE]: TemporaryDefaultGasCost,
126
+ [Opcode.TORADIXLE]: DefaultBaseGasCost,
130
127
  };
131
128
 
132
- /** Returns the fixed base gas cost for a given opcode, or throws if set to dynamic. */
129
+ /** Returns the fixed base gas cost for a given opcode. */
133
130
  export function getBaseGasCost(opcode: Opcode): Gas {
134
- const cost = GasCosts[opcode];
135
- if (cost === DynamicGasCost) {
136
- throw new Error(`Opcode ${Opcode[opcode]} has dynamic gas cost`);
137
- }
138
- return cost;
131
+ return BaseGasCosts[opcode];
139
132
  }
140
133
 
141
134
  /** Returns the gas cost associated with the memory operations performed. */
@@ -2,7 +2,7 @@ import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
2
2
 
3
3
  import { strict as assert } from 'assert';
4
4
 
5
- import { isAvmBytecode } from '../public/transitional_adaptors.js';
5
+ import { decompressBytecodeIfCompressed, isAvmBytecode } from '../public/transitional_adaptors.js';
6
6
  import type { AvmContext } from './avm_context.js';
7
7
  import { AvmContractCallResults } from './avm_message_call_result.js';
8
8
  import {
@@ -17,6 +17,7 @@ import { decodeFromBytecode } from './serialization/bytecode_serialization.js';
17
17
 
18
18
  export class AvmSimulator {
19
19
  private log: DebugLogger;
20
+ private bytecode: Buffer | undefined;
20
21
 
21
22
  constructor(private context: AvmContext) {
22
23
  this.log = createDebugLogger(
@@ -39,17 +40,27 @@ export class AvmSimulator {
39
40
  if (!bytecode) {
40
41
  throw new NoBytecodeForContractError(this.context.environment.address);
41
42
  }
42
- assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
43
43
 
44
44
  return await this.executeBytecode(bytecode);
45
45
  }
46
46
 
47
+ /**
48
+ * Return the bytecode used for execution, if any.
49
+ */
50
+ public getBytecode(): Buffer | undefined {
51
+ return this.bytecode;
52
+ }
53
+
47
54
  /**
48
55
  * Executes the provided bytecode in the current context.
49
56
  * This method is useful for testing and debugging.
50
57
  */
51
58
  public async executeBytecode(bytecode: Buffer): Promise<AvmContractCallResults> {
52
- return await this.executeInstructions(decodeFromBytecode(bytecode));
59
+ const decompressedBytecode = await decompressBytecodeIfCompressed(bytecode);
60
+ assert(isAvmBytecode(decompressedBytecode), "AVM simulator can't execute non-AVM bytecode");
61
+
62
+ this.bytecode = decompressedBytecode;
63
+ return await this.executeInstructions(decodeFromBytecode(decompressedBytecode));
53
64
  }
54
65
 
55
66
  /**
package/src/avm/errors.ts CHANGED
@@ -68,6 +68,16 @@ export class OutOfGasError extends AvmExecutionError {
68
68
  }
69
69
  }
70
70
 
71
+ /**
72
+ * Error is thrown when a static call attempts to alter some state
73
+ */
74
+ export class StaticCallAlterationError extends InstructionExecutionError {
75
+ constructor() {
76
+ super('Static call cannot update the state, emit L2->L1 messages or generate logs');
77
+ this.name = 'StaticCallAlterationError';
78
+ }
79
+ }
80
+
71
81
  /**
72
82
  * Error thrown to propagate a nested call's revert.
73
83
  * @param message - the error's message
@@ -3,7 +3,9 @@ import { FunctionSelector } from '@aztec/foundation/abi';
3
3
  import { AztecAddress } from '@aztec/foundation/aztec-address';
4
4
  import { EthAddress } from '@aztec/foundation/eth-address';
5
5
  import { Fr } from '@aztec/foundation/fields';
6
+ import { AvmNestedCallsTestContractArtifact, AvmTestContractArtifact } from '@aztec/noir-contracts.js';
6
7
 
8
+ import { strict as assert } from 'assert';
7
9
  import { mock } from 'jest-mock-extended';
8
10
  import merge from 'lodash.merge';
9
11
 
@@ -90,8 +92,8 @@ export function initGlobalVariables(overrides?: Partial<GlobalVariables>): Globa
90
92
  */
91
93
  export function initMachineState(overrides?: Partial<AvmMachineState>): AvmMachineState {
92
94
  return AvmMachineState.fromState({
93
- l2GasLeft: overrides?.l2GasLeft ?? 100e6,
94
- daGasLeft: overrides?.daGasLeft ?? 100e6,
95
+ l2GasLeft: overrides?.l2GasLeft ?? 1e8,
96
+ daGasLeft: overrides?.daGasLeft ?? 1e8,
95
97
  });
96
98
  }
97
99
 
@@ -125,3 +127,21 @@ export function randomMemoryBytes(length: number): Uint8[] {
125
127
  export function randomMemoryFields(length: number): Field[] {
126
128
  return [...Array(length)].map(_ => new Field(Fr.random()));
127
129
  }
130
+
131
+ export function getAvmTestContractBytecode(functionName: string): Buffer {
132
+ const artifact = AvmTestContractArtifact.functions.find(f => f.name === functionName)!;
133
+ assert(
134
+ !!artifact?.bytecode,
135
+ `No bytecode found for function ${functionName}. Try re-running bootstrap.sh on the repository root.`,
136
+ );
137
+ return artifact.bytecode;
138
+ }
139
+
140
+ export function getAvmNestedCallsTestContractBytecode(functionName: string): Buffer {
141
+ const artifact = AvmNestedCallsTestContractArtifact.functions.find(f => f.name === functionName)!;
142
+ assert(
143
+ !!artifact?.bytecode,
144
+ `No bytecode found for function ${functionName}. Try re-running bootstrap.sh on the repository root.`,
145
+ );
146
+ return artifact.bytecode;
147
+ }
@@ -0,0 +1 @@
1
+ export * from './avm_simulator.js';
@@ -1,4 +1,4 @@
1
- import { type CommitmentsDB, type PublicContractsDB, type PublicStateDB } from '../../public/db.js';
1
+ import { type CommitmentsDB, type PublicContractsDB, type PublicStateDB } from '../../public/db_interfaces.js';
2
2
 
3
3
  /**
4
4
  * Host storage
@@ -6,10 +6,10 @@ import {
6
6
  ContractStorageUpdateRequest,
7
7
  EthAddress,
8
8
  L2ToL1Message,
9
+ LogHash,
9
10
  NoteHash,
10
11
  Nullifier,
11
12
  ReadRequest,
12
- SideEffect,
13
13
  } from '@aztec/circuits.js';
14
14
  import { EventSelector } from '@aztec/foundation/abi';
15
15
  import { Fr } from '@aztec/foundation/fields';
@@ -56,17 +56,18 @@ export type JournalData = {
56
56
 
57
57
  // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
58
58
  type PartialPublicExecutionResult = {
59
+ noteHashReadRequests: ReadRequest[];
59
60
  nullifierReadRequests: ReadRequest[];
60
61
  nullifierNonExistentReadRequests: ReadRequest[];
62
+ l1ToL2MsgReadRequests: ReadRequest[];
61
63
  newNoteHashes: NoteHash[];
62
64
  newL2ToL1Messages: L2ToL1Message[];
63
65
  startSideEffectCounter: number;
64
66
  newNullifiers: Nullifier[];
65
67
  contractStorageReads: ContractStorageRead[];
66
68
  contractStorageUpdateRequests: ContractStorageUpdateRequest[];
67
- unencryptedLogsHashes: SideEffect[];
69
+ unencryptedLogsHashes: LogHash[];
68
70
  unencryptedLogs: UnencryptedL2Log[];
69
- unencryptedLogPreimagesLength: Fr;
70
71
  allUnencryptedLogs: UnencryptedL2Log[];
71
72
  nestedExecutions: PublicExecutionResult[];
72
73
  };
@@ -109,8 +110,10 @@ export class AvmPersistableStateManager {
109
110
  this.trace = new WorldStateAccessTrace(parent?.trace);
110
111
 
111
112
  this.transitionalExecutionResult = {
113
+ noteHashReadRequests: [],
112
114
  nullifierReadRequests: [],
113
115
  nullifierNonExistentReadRequests: [],
116
+ l1ToL2MsgReadRequests: [],
114
117
  newNoteHashes: [],
115
118
  newL2ToL1Messages: [],
116
119
  startSideEffectCounter: this.trace.accessCounter,
@@ -119,8 +122,6 @@ export class AvmPersistableStateManager {
119
122
  contractStorageUpdateRequests: [],
120
123
  unencryptedLogsHashes: [],
121
124
  unencryptedLogs: [],
122
- // The length starts at 4 because it will always include the size.
123
- unencryptedLogPreimagesLength: new Fr(4),
124
125
  allUnencryptedLogs: [],
125
126
  nestedExecutions: [],
126
127
  };
@@ -141,7 +142,7 @@ export class AvmPersistableStateManager {
141
142
  * @param value - the value being written to the slot
142
143
  */
143
144
  public writeStorage(storageAddress: Fr, slot: Fr, value: Fr) {
144
- this.log.debug(`storage(${storageAddress})@${slot} <- ${value}`);
145
+ this.log.debug(`Storage write (address=${storageAddress}, slot=${slot}): value=${value}`);
145
146
  // Cache storage writes for later reference/reads
146
147
  this.publicStorage.write(storageAddress, slot, value);
147
148
 
@@ -172,7 +173,9 @@ export class AvmPersistableStateManager {
172
173
  */
173
174
  public async readStorage(storageAddress: Fr, slot: Fr): Promise<Fr> {
174
175
  const { value, exists, cached } = await this.publicStorage.read(storageAddress, slot);
175
- this.log.debug(`storage(${storageAddress})@${slot} ?? value: ${value}, exists: ${exists}, cached: ${cached}.`);
176
+ this.log.debug(
177
+ `Storage read (address=${storageAddress}, slot=${slot}): value=${value}, exists=${exists}, cached=${cached}`,
178
+ );
176
179
 
177
180
  // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
178
181
  // The current info to the kernel kernel does not consider cached reads.
@@ -253,7 +256,9 @@ export class AvmPersistableStateManager {
253
256
  */
254
257
  public async writeNullifier(storageAddress: Fr, nullifier: Fr) {
255
258
  // TRANSITIONAL: This should be removed once the kernel handles and entire enqueued call per circuit
256
- this.transitionalExecutionResult.newNullifiers.push(new Nullifier(nullifier, this.trace.accessCounter, Fr.ZERO));
259
+ this.transitionalExecutionResult.newNullifiers.push(
260
+ new Nullifier(nullifier, this.trace.accessCounter, /*noteHash=*/ Fr.ZERO),
261
+ );
257
262
 
258
263
  this.log.debug(`nullifiers(${storageAddress}) += ${nullifier}.`);
259
264
  // Cache pending nullifiers for later access
@@ -307,12 +312,8 @@ export class AvmPersistableStateManager {
307
312
  this.transitionalExecutionResult.allUnencryptedLogs.push(ulog);
308
313
  // this duplicates exactly what happens in the trace just for the purpose of transitional integration with the kernel
309
314
  this.transitionalExecutionResult.unencryptedLogsHashes.push(
310
- new SideEffect(logHash, new Fr(this.trace.accessCounter)),
311
- );
312
- // Duplicates computation performed in public_context.nr::emit_unencrypted_log
313
- // 44 = addr (32) + selector (4) + raw log len (4) + processed log len (4).
314
- this.transitionalExecutionResult.unencryptedLogPreimagesLength = new Fr(
315
- this.transitionalExecutionResult.unencryptedLogPreimagesLength.toNumber() + 44 + log.length * Fr.SIZE_IN_BYTES,
315
+ // TODO(6578): explain magic number 4 here
316
+ new LogHash(logHash, this.trace.accessCounter, new Fr(ulog.length + 4)),
316
317
  );
317
318
  // TODO(6206): likely need to track this here and not just in the transitional logic.
318
319