@aztec/simulator 0.33.0 → 0.34.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 (66) hide show
  1. package/dest/acvm/acvm.js +2 -2
  2. package/dest/acvm/oracle/oracle.d.ts +1 -1
  3. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  4. package/dest/acvm/oracle/oracle.js +3 -3
  5. package/dest/avm/avm_execution_environment.d.ts +4 -3
  6. package/dest/avm/avm_execution_environment.d.ts.map +1 -1
  7. package/dest/avm/avm_execution_environment.js +8 -7
  8. package/dest/avm/avm_memory_types.js +5 -5
  9. package/dest/avm/avm_simulator.js +6 -6
  10. package/dest/avm/fixtures/index.d.ts.map +1 -1
  11. package/dest/avm/fixtures/index.js +3 -3
  12. package/dest/avm/journal/journal.d.ts +14 -13
  13. package/dest/avm/journal/journal.d.ts.map +1 -1
  14. package/dest/avm/journal/journal.js +5 -5
  15. package/dest/avm/journal/trace.d.ts +8 -19
  16. package/dest/avm/journal/trace.d.ts.map +1 -1
  17. package/dest/avm/journal/trace.js +48 -116
  18. package/dest/avm/journal/trace_types.d.ts +23 -4
  19. package/dest/avm/journal/trace_types.d.ts.map +1 -1
  20. package/dest/avm/opcodes/accrued_substate.js +2 -2
  21. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  22. package/dest/avm/opcodes/external_calls.js +20 -5
  23. package/dest/client/client_execution_context.d.ts +2 -2
  24. package/dest/client/client_execution_context.d.ts.map +1 -1
  25. package/dest/client/client_execution_context.js +6 -6
  26. package/dest/client/private_execution.d.ts +1 -1
  27. package/dest/client/private_execution.d.ts.map +1 -1
  28. package/dest/client/private_execution.js +3 -3
  29. package/dest/client/unconstrained_execution.d.ts +1 -1
  30. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  31. package/dest/client/unconstrained_execution.js +2 -2
  32. package/dest/client/view_data_oracle.d.ts +2 -2
  33. package/dest/client/view_data_oracle.d.ts.map +1 -1
  34. package/dest/client/view_data_oracle.js +2 -2
  35. package/dest/public/executor.d.ts +1 -15
  36. package/dest/public/executor.d.ts.map +1 -1
  37. package/dest/public/executor.js +70 -77
  38. package/dest/public/public_execution_context.d.ts +6 -6
  39. package/dest/public/public_execution_context.d.ts.map +1 -1
  40. package/dest/public/public_execution_context.js +8 -12
  41. package/dest/public/transitional_adaptors.d.ts +32 -0
  42. package/dest/public/transitional_adaptors.d.ts.map +1 -0
  43. package/dest/public/transitional_adaptors.js +161 -0
  44. package/package.json +5 -5
  45. package/src/acvm/acvm.ts +1 -1
  46. package/src/acvm/oracle/oracle.ts +2 -2
  47. package/src/avm/avm_execution_environment.ts +9 -17
  48. package/src/avm/avm_memory_types.ts +4 -4
  49. package/src/avm/avm_simulator.ts +5 -5
  50. package/src/avm/fixtures/index.ts +2 -1
  51. package/src/avm/journal/journal.ts +24 -17
  52. package/src/avm/journal/trace.ts +59 -121
  53. package/src/avm/journal/trace_types.ts +39 -39
  54. package/src/avm/opcodes/accrued_substate.ts +1 -1
  55. package/src/avm/opcodes/external_calls.ts +24 -4
  56. package/src/client/client_execution_context.ts +5 -5
  57. package/src/client/private_execution.ts +2 -2
  58. package/src/client/unconstrained_execution.ts +1 -1
  59. package/src/client/view_data_oracle.ts +1 -1
  60. package/src/public/executor.ts +82 -87
  61. package/src/public/public_execution_context.ts +14 -19
  62. package/src/public/transitional_adaptors.ts +240 -0
  63. package/dest/avm/temporary_executor_migration.d.ts +0 -27
  64. package/dest/avm/temporary_executor_migration.d.ts.map +0 -1
  65. package/dest/avm/temporary_executor_migration.js +0 -94
  66. package/src/avm/temporary_executor_migration.ts +0 -136
@@ -0,0 +1,161 @@
1
+ // All code in this file needs to die once the public executor is phased out in favor of the AVM.
2
+ import { UnencryptedFunctionL2Logs, UnencryptedL2Log } from '@aztec/circuit-types';
3
+ import { CallContext, ContractStorageRead, ContractStorageUpdateRequest, FunctionData, L2ToL1Message, ReadRequest, SideEffect, SideEffectLinkedToNoteHash, } from '@aztec/circuits.js';
4
+ import { Fr } from '@aztec/foundation/fields';
5
+ import { AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
6
+ import { AvmContractCallResults } from '../avm/avm_message_call_result.js';
7
+ import { Mov } from '../avm/opcodes/memory.js';
8
+ import { createSimulationError } from '../common/errors.js';
9
+ import { PackedArgsCache, SideEffectCounter } from '../index.js';
10
+ import { PublicExecutionContext } from './public_execution_context.js';
11
+ /**
12
+ * Convert a PublicExecution(Environment) object to an AvmExecutionEnvironment
13
+ *
14
+ * @param current
15
+ * @param globalVariables
16
+ * @returns
17
+ */
18
+ export function createAvmExecutionEnvironment(current, header, globalVariables) {
19
+ return new AvmExecutionEnvironment(current.contractAddress, current.callContext.storageContractAddress, current.callContext.msgSender, // TODO: origin is not available
20
+ current.callContext.msgSender, current.callContext.portalContractAddress,
21
+ /*feePerL1Gas=*/ Fr.zero(),
22
+ /*feePerL2Gas=*/ Fr.zero(),
23
+ /*feePerDaGas=*/ Fr.zero(),
24
+ /*contractCallDepth=*/ Fr.zero(), header, globalVariables, current.callContext.isStaticCall, current.callContext.isDelegateCall, current.args, current.functionData.selector);
25
+ }
26
+ export function createPublicExecutionContext(avmContext, calldata) {
27
+ const sideEffectCounter = avmContext.persistableState.trace.accessCounter;
28
+ const callContext = CallContext.from({
29
+ msgSender: avmContext.environment.sender,
30
+ storageContractAddress: avmContext.environment.storageAddress,
31
+ portalContractAddress: avmContext.environment.portal,
32
+ functionSelector: avmContext.environment.temporaryFunctionSelector,
33
+ isDelegateCall: avmContext.environment.isDelegateCall,
34
+ isStaticCall: avmContext.environment.isStaticCall,
35
+ sideEffectCounter: sideEffectCounter,
36
+ });
37
+ const functionData = new FunctionData(avmContext.environment.temporaryFunctionSelector, /*isPrivate=*/ false);
38
+ const execution = {
39
+ contractAddress: avmContext.environment.address,
40
+ callContext,
41
+ args: calldata,
42
+ functionData,
43
+ };
44
+ const packedArgs = PackedArgsCache.create([]);
45
+ const context = new PublicExecutionContext(execution, avmContext.environment.header, avmContext.environment.globals, packedArgs, new SideEffectCounter(sideEffectCounter), avmContext.persistableState.hostStorage.publicStateDb, avmContext.persistableState.hostStorage.contractsDb, avmContext.persistableState.hostStorage.commitmentsDb);
46
+ return context;
47
+ }
48
+ /**
49
+ * Convert the result of an AVM contract call to a PublicExecutionResult for the public kernel
50
+ *
51
+ * @param execution
52
+ * @param newWorldState
53
+ * @param result
54
+ * @returns
55
+ */
56
+ export async function convertAvmResults(executionContext, newWorldState, result) {
57
+ const execution = executionContext.execution;
58
+ const contractStorageReads = newWorldState.storageReads.map(read => new ContractStorageRead(read.slot, read.value, read.counter.toNumber()));
59
+ const contractStorageUpdateRequests = newWorldState.storageWrites.map(write => new ContractStorageUpdateRequest(write.slot, write.value, write.counter.toNumber()));
60
+ // We need to write the storage updates to the DB, because that's what the ACVM expects.
61
+ // Assumes the updates are in the right order.
62
+ for (const write of newWorldState.storageWrites) {
63
+ await executionContext.stateDb.storageWrite(write.storageAddress, write.slot, write.value);
64
+ }
65
+ const newNoteHashes = newWorldState.newNoteHashes.map(noteHash => new SideEffect(noteHash.noteHash, noteHash.counter));
66
+ const nullifierReadRequests = newWorldState.nullifierChecks
67
+ .filter(nullifierCheck => nullifierCheck.exists)
68
+ .map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
69
+ const nullifierNonExistentReadRequests = newWorldState.nullifierChecks
70
+ .filter(nullifierCheck => !nullifierCheck.exists)
71
+ .map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
72
+ const newNullifiers = newWorldState.newNullifiers.map(tracedNullifier => new SideEffectLinkedToNoteHash(
73
+ /*value=*/ tracedNullifier.nullifier,
74
+ /*noteHash=*/ Fr.ZERO, // NEEDED?
75
+ tracedNullifier.counter));
76
+ const unencryptedLogs = new UnencryptedFunctionL2Logs(newWorldState.newLogs.map(log => new UnencryptedL2Log(log.contractAddress, log.selector, log.data)));
77
+ const newL2ToL1Messages = newWorldState.newL1Messages.map(m => new L2ToL1Message(m.recipient, m.content));
78
+ const returnValues = result.output;
79
+ // TODO: Support nested executions.
80
+ const nestedExecutions = [];
81
+ // TODO keep track of side effect counters
82
+ const startSideEffectCounter = Fr.ZERO;
83
+ const endSideEffectCounter = Fr.ZERO;
84
+ return {
85
+ execution,
86
+ nullifierReadRequests,
87
+ nullifierNonExistentReadRequests,
88
+ newNoteHashes,
89
+ newL2ToL1Messages,
90
+ startSideEffectCounter,
91
+ endSideEffectCounter,
92
+ newNullifiers,
93
+ contractStorageReads,
94
+ contractStorageUpdateRequests,
95
+ returnValues,
96
+ nestedExecutions,
97
+ unencryptedLogs,
98
+ reverted: result.reverted,
99
+ revertReason: result.revertReason ? createSimulationError(result.revertReason) : undefined,
100
+ };
101
+ }
102
+ export function convertPublicExecutionResult(res) {
103
+ return new AvmContractCallResults(res.reverted, res.returnValues, res.revertReason);
104
+ }
105
+ export function updateAvmContextFromPublicExecutionResult(ctx, result) {
106
+ // We have to push these manually and not use the trace* functions
107
+ // so that we respect the side effect counters.
108
+ for (const readRequest of result.contractStorageReads) {
109
+ ctx.persistableState.trace.publicStorageReads.push({
110
+ storageAddress: ctx.environment.storageAddress,
111
+ exists: true, // FIXME
112
+ slot: readRequest.storageSlot,
113
+ value: readRequest.currentValue,
114
+ counter: new Fr(readRequest.sideEffectCounter ?? Fr.ZERO),
115
+ });
116
+ }
117
+ for (const updateRequest of result.contractStorageUpdateRequests) {
118
+ ctx.persistableState.trace.publicStorageWrites.push({
119
+ storageAddress: ctx.environment.storageAddress,
120
+ slot: updateRequest.storageSlot,
121
+ value: updateRequest.newValue,
122
+ counter: new Fr(updateRequest.sideEffectCounter ?? Fr.ZERO),
123
+ });
124
+ // We need to manually populate the cache.
125
+ ctx.persistableState.publicStorage.write(ctx.environment.storageAddress, updateRequest.storageSlot, updateRequest.newValue);
126
+ }
127
+ for (const nullifier of result.newNullifiers) {
128
+ ctx.persistableState.trace.newNullifiers.push({
129
+ storageAddress: ctx.environment.storageAddress,
130
+ nullifier: nullifier.value,
131
+ counter: nullifier.counter,
132
+ });
133
+ }
134
+ for (const noteHash of result.newNoteHashes) {
135
+ ctx.persistableState.trace.newNoteHashes.push({
136
+ storageAddress: ctx.environment.storageAddress,
137
+ noteHash: noteHash.value,
138
+ counter: noteHash.counter,
139
+ });
140
+ }
141
+ for (const message of result.newL2ToL1Messages) {
142
+ ctx.persistableState.newL1Messages.push(message);
143
+ }
144
+ for (const log of result.unencryptedLogs.logs) {
145
+ ctx.persistableState.newLogs.push(new UnencryptedL2Log(log.contractAddress, log.selector, log.data));
146
+ }
147
+ }
148
+ const AVM_MAGIC_SUFFIX = Buffer.from([
149
+ Mov.opcode, // opcode
150
+ 0x00, // indirect
151
+ ...Buffer.from('000018ca', 'hex'), // srcOffset
152
+ ...Buffer.from('000018ca', 'hex'), // dstOffset
153
+ ]);
154
+ export function markBytecodeAsAvm(bytecode) {
155
+ return Buffer.concat([bytecode, AVM_MAGIC_SUFFIX]);
156
+ }
157
+ export function isAvmBytecode(bytecode) {
158
+ const magicSize = AVM_MAGIC_SUFFIX.length;
159
+ return bytecode.subarray(-magicSize).equals(AVM_MAGIC_SUFFIX);
160
+ }
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUdBQWlHO0FBQ2pHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25GLE9BQU8sRUFDTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixZQUFZLEVBR1osYUFBYSxFQUNiLFdBQVcsRUFDWCxVQUFVLEVBQ1YsMEJBQTBCLEdBQzNCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzlDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG1DQUFtQyxDQUFDO0FBRTNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBRXZFOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDM0MsT0FBd0IsRUFDeEIsTUFBYyxFQUNkLGVBQWdDO0lBRWhDLE9BQU8sSUFBSSx1QkFBdUIsQ0FDaEMsT0FBTyxDQUFDLGVBQWUsRUFDdkIsT0FBTyxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFDMUMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsZ0NBQWdDO0lBQy9ELE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUM3QixPQUFPLENBQUMsV0FBVyxDQUFD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/simulator",
3
- "version": "0.33.0",
3
+ "version": "0.34.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -37,10 +37,10 @@
37
37
  ]
38
38
  },
39
39
  "dependencies": {
40
- "@aztec/circuit-types": "0.33.0",
41
- "@aztec/circuits.js": "0.33.0",
42
- "@aztec/foundation": "0.33.0",
43
- "@aztec/types": "0.33.0",
40
+ "@aztec/circuit-types": "0.34.0",
41
+ "@aztec/circuits.js": "0.34.0",
42
+ "@aztec/foundation": "0.34.0",
43
+ "@aztec/types": "0.34.0",
44
44
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
45
45
  "@noir-lang/types": "portal:../../noir/packages/types",
46
46
  "levelup": "^5.1.1",
package/src/acvm/acvm.ts CHANGED
@@ -95,7 +95,7 @@ export async function acvm(
95
95
  initialWitness,
96
96
  async (name: string, args: ForeignCallInput[]) => {
97
97
  try {
98
- logger(`Oracle callback ${name}`);
98
+ logger.verbose(`Oracle callback ${name}`);
99
99
  const oracleFunction = callback[name as ORACLE_NAMES];
100
100
  if (!oracleFunction) {
101
101
  throw new Error(`Oracle callback ${name} not found`);
@@ -304,12 +304,12 @@ export class Oracle {
304
304
  }
305
305
 
306
306
  debugLog(...args: ACVMField[][]): ACVMField {
307
- this.log(oracleDebugCallToFormattedStr(args));
307
+ this.log.verbose(oracleDebugCallToFormattedStr(args));
308
308
  return toACVMField(0);
309
309
  }
310
310
 
311
311
  debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): ACVMField {
312
- this.log(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
312
+ this.log.verbose(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
313
313
  return toACVMField(0);
314
314
  }
315
315
 
@@ -1,4 +1,4 @@
1
- import { FunctionSelector, type GlobalVariables } from '@aztec/circuits.js';
1
+ import { FunctionSelector, 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
4
  import { type EthAddress } from '@aztec/foundation/eth-address';
@@ -22,29 +22,18 @@ export class AvmContextInputs {
22
22
  export class AvmExecutionEnvironment {
23
23
  constructor(
24
24
  public readonly address: AztecAddress,
25
-
26
25
  public readonly storageAddress: AztecAddress,
27
-
28
26
  public readonly origin: AztecAddress,
29
-
30
27
  public readonly sender: AztecAddress,
31
-
32
28
  public readonly portal: EthAddress,
33
-
34
29
  public readonly feePerL1Gas: Fr,
35
-
36
30
  public readonly feePerL2Gas: Fr,
37
-
38
31
  public readonly feePerDaGas: Fr,
39
-
40
32
  public readonly contractCallDepth: Fr,
41
-
33
+ public readonly header: Header,
42
34
  public readonly globals: GlobalVariables,
43
-
44
35
  public readonly isStaticCall: boolean,
45
-
46
36
  public readonly isDelegateCall: boolean,
47
-
48
37
  public readonly calldata: Fr[],
49
38
 
50
39
  // Function selector is temporary since eventually public contract bytecode will be one blob
@@ -59,20 +48,21 @@ export class AvmExecutionEnvironment {
59
48
  }
60
49
 
61
50
  public deriveEnvironmentForNestedCall(
62
- address: AztecAddress,
51
+ targetAddress: AztecAddress,
63
52
  calldata: Fr[],
64
53
  temporaryFunctionSelector: FunctionSelector = FunctionSelector.empty(),
65
54
  ): AvmExecutionEnvironment {
66
55
  return new AvmExecutionEnvironment(
67
- address,
68
- /*storageAddress=*/ address,
56
+ targetAddress,
57
+ /*storageAddress=*/ targetAddress,
69
58
  this.origin,
70
- this.sender,
59
+ this.address,
71
60
  this.portal,
72
61
  this.feePerL1Gas,
73
62
  this.feePerL2Gas,
74
63
  this.feePerDaGas,
75
64
  this.contractCallDepth,
65
+ this.header,
76
66
  this.globals,
77
67
  this.isStaticCall,
78
68
  this.isDelegateCall,
@@ -96,6 +86,7 @@ export class AvmExecutionEnvironment {
96
86
  this.feePerL2Gas,
97
87
  this.feePerDaGas,
98
88
  this.contractCallDepth,
89
+ this.header,
99
90
  this.globals,
100
91
  /*isStaticCall=*/ true,
101
92
  this.isDelegateCall,
@@ -119,6 +110,7 @@ export class AvmExecutionEnvironment {
119
110
  this.feePerL2Gas,
120
111
  this.feePerDaGas,
121
112
  this.contractCallDepth,
113
+ this.header,
122
114
  this.globals,
123
115
  this.isStaticCall,
124
116
  /*isDelegateCall=*/ true,
@@ -238,7 +238,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
238
238
  public getAs<T>(offset: number): T {
239
239
  assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
240
240
  const word = this._mem[offset];
241
- TaggedMemory.log(`get(${offset}) = ${word}`);
241
+ TaggedMemory.log.debug(`get(${offset}) = ${word}`);
242
242
  if (word === undefined) {
243
243
  TaggedMemory.log.warn(`Memory at offset ${offset} is undefined! This might be OK if it's stack dumping.`);
244
244
  }
@@ -249,7 +249,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
249
249
  assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
250
250
  assert(offset + size < TaggedMemory.MAX_MEMORY_SIZE);
251
251
  const value = this._mem.slice(offset, offset + size);
252
- TaggedMemory.log(`getSlice(${offset}, ${size}) = ${value}`);
252
+ TaggedMemory.log.debug(`getSlice(${offset}, ${size}) = ${value}`);
253
253
  assert(!value.some(e => e === undefined), 'Memory slice contains undefined values.');
254
254
  assert(value.length === size, `Expected slice of size ${size}, got ${value.length}.`);
255
255
  return value;
@@ -270,7 +270,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
270
270
  public set(offset: number, v: MemoryValue) {
271
271
  assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
272
272
  this._mem[offset] = v;
273
- TaggedMemory.log(`set(${offset}, ${v})`);
273
+ TaggedMemory.log.debug(`set(${offset}, ${v})`);
274
274
  }
275
275
 
276
276
  public setSlice(offset: number, vs: MemoryValue[]) {
@@ -281,7 +281,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
281
281
  this._mem.length = offset + vs.length;
282
282
  }
283
283
  this._mem.splice(offset, vs.length, ...vs);
284
- TaggedMemory.log(`setSlice(${offset}, ${vs})`);
284
+ TaggedMemory.log.debug(`setSlice(${offset}, ${vs})`);
285
285
  }
286
286
 
287
287
  public getTag(offset: number): TypeTag {
@@ -69,26 +69,26 @@ export class AvmSimulator {
69
69
  await instruction.execute(this.context);
70
70
 
71
71
  if (machineState.pc >= instructions.length) {
72
- this.log('Passed end of program!');
72
+ this.log.warn('Passed end of program');
73
73
  throw new InvalidProgramCounterError(machineState.pc, /*max=*/ instructions.length);
74
74
  }
75
75
  }
76
76
 
77
77
  // Return results for processing by calling context
78
78
  const results = machineState.getResults();
79
- this.log(`Context execution results: ${results.toString()}`);
79
+ this.log.debug(`Context execution results: ${results.toString()}`);
80
80
  return results;
81
81
  } catch (e) {
82
- this.log('Exceptional halt');
82
+ this.log.verbose('Exceptional halt');
83
83
  if (!(e instanceof AvmExecutionError)) {
84
- this.log(`Unknown error thrown by avm: ${e}`);
84
+ this.log.verbose(`Unknown error thrown by avm: ${e}`);
85
85
  throw e;
86
86
  }
87
87
 
88
88
  // Return results for processing by calling context
89
89
  // Note: "exceptional halts" cannot return data
90
90
  const results = new AvmContractCallResults(/*reverted=*/ true, /*output=*/ [], /*revertReason=*/ e);
91
- this.log(`Context execution results: ${results.toString()}`);
91
+ this.log.debug(`Context execution results: ${results.toString()}`);
92
92
  return results;
93
93
  }
94
94
  }
@@ -1,5 +1,5 @@
1
1
  import { SiblingPath } from '@aztec/circuit-types';
2
- import { GlobalVariables, L1_TO_L2_MSG_TREE_HEIGHT } from '@aztec/circuits.js';
2
+ import { GlobalVariables, Header, L1_TO_L2_MSG_TREE_HEIGHT } from '@aztec/circuits.js';
3
3
  import { FunctionSelector } from '@aztec/foundation/abi';
4
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
5
5
  import { EthAddress } from '@aztec/foundation/eth-address';
@@ -67,6 +67,7 @@ export function initExecutionEnvironment(overrides?: Partial<AvmExecutionEnviron
67
67
  overrides?.feePerL2Gas ?? Fr.zero(),
68
68
  overrides?.feePerDaGas ?? Fr.zero(),
69
69
  overrides?.contractCallDepth ?? Fr.zero(),
70
+ overrides?.header ?? Header.empty(),
70
71
  overrides?.globals ?? GlobalVariables.empty(),
71
72
  overrides?.isStaticCall ?? false,
72
73
  overrides?.isDelegateCall ?? false,
@@ -7,16 +7,27 @@ import { type HostStorage } from './host_storage.js';
7
7
  import { Nullifiers } from './nullifiers.js';
8
8
  import { PublicStorage } from './public_storage.js';
9
9
  import { WorldStateAccessTrace } from './trace.js';
10
- import { type TracedL1toL2MessageCheck, type TracedNoteHashCheck, type TracedNullifierCheck } from './trace_types.js';
10
+ import {
11
+ type TracedL1toL2MessageCheck,
12
+ type TracedNoteHash,
13
+ type TracedNoteHashCheck,
14
+ type TracedNullifier,
15
+ type TracedNullifierCheck,
16
+ type TracedPublicStorageRead,
17
+ type TracedPublicStorageWrite,
18
+ } from './trace_types.js';
11
19
 
12
20
  /**
13
21
  * Data held within the journal
14
22
  */
15
23
  export type JournalData = {
24
+ storageWrites: TracedPublicStorageWrite[];
25
+ storageReads: TracedPublicStorageRead[];
26
+
16
27
  noteHashChecks: TracedNoteHashCheck[];
17
- newNoteHashes: Fr[];
28
+ newNoteHashes: TracedNoteHash[];
18
29
  nullifierChecks: TracedNullifierCheck[];
19
- newNullifiers: Fr[];
30
+ newNullifiers: TracedNullifier[];
20
31
  l1ToL2MessageChecks: TracedL1toL2MessageCheck[];
21
32
 
22
33
  newL1Messages: L2ToL1Message[];
@@ -24,11 +35,6 @@ export type JournalData = {
24
35
 
25
36
  /** contract address -\> key -\> value */
26
37
  currentStorageValue: Map<bigint, Map<bigint, Fr>>;
27
-
28
- /** contract address -\> key -\> value[] (stored in order of access) */
29
- storageWrites: Map<bigint, Map<bigint, Fr[]>>;
30
- /** contract address -\> key -\> value[] (stored in order of access) */
31
- storageReads: Map<bigint, Map<bigint, Fr[]>>;
32
38
  };
33
39
 
34
40
  /**
@@ -44,18 +50,19 @@ export class AvmPersistableStateManager {
44
50
  /** Reference to node storage */
45
51
  public readonly hostStorage: HostStorage;
46
52
 
53
+ // TODO: make members private once this is not used in transitional_adaptors.ts.
47
54
  /** World State */
48
55
  /** Public storage, including cached writes */
49
- private publicStorage: PublicStorage;
56
+ public publicStorage: PublicStorage;
50
57
  /** Nullifier set, including cached/recently-emitted nullifiers */
51
- private nullifiers: Nullifiers;
58
+ public nullifiers: Nullifiers;
52
59
 
53
60
  /** World State Access Trace */
54
- private trace: WorldStateAccessTrace;
61
+ public trace: WorldStateAccessTrace;
55
62
 
56
63
  /** Accrued Substate **/
57
- private newL1Messages: L2ToL1Message[] = [];
58
- private newLogs: UnencryptedL2Log[] = [];
64
+ public newL1Messages: L2ToL1Message[] = [];
65
+ public newLogs: UnencryptedL2Log[] = [];
59
66
 
60
67
  constructor(hostStorage: HostStorage, parent?: AvmPersistableStateManager) {
61
68
  this.hostStorage = hostStorage;
@@ -93,9 +100,9 @@ export class AvmPersistableStateManager {
93
100
  * @returns the latest value written to slot, or 0 if never written to before
94
101
  */
95
102
  public async readStorage(storageAddress: Fr, slot: Fr): Promise<Fr> {
96
- const [_exists, value] = await this.publicStorage.read(storageAddress, slot);
103
+ const [exists, value] = await this.publicStorage.read(storageAddress, slot);
97
104
  // We want to keep track of all performed reads (even reverted ones)
98
- this.trace.tracePublicStorageRead(storageAddress, slot, value);
105
+ this.trace.tracePublicStorageRead(storageAddress, slot, value, exists);
99
106
  return Promise.resolve(value);
100
107
  }
101
108
 
@@ -119,8 +126,8 @@ export class AvmPersistableStateManager {
119
126
  * Write a note hash, trace the write.
120
127
  * @param noteHash - the unsiloed note hash to write
121
128
  */
122
- public writeNoteHash(noteHash: Fr) {
123
- this.trace.traceNewNoteHash(/*storageAddress*/ Fr.ZERO, noteHash);
129
+ public writeNoteHash(storageAddress: Fr, noteHash: Fr) {
130
+ this.trace.traceNewNoteHash(storageAddress, noteHash);
124
131
  }
125
132
 
126
133
  /**