@aztec/simulator 0.36.0 → 0.38.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 (118) hide show
  1. package/dest/acvm/acvm.d.ts +1 -1
  2. package/dest/acvm/acvm.d.ts.map +1 -1
  3. package/dest/acvm/acvm.js +2 -2
  4. package/dest/acvm/oracle/oracle.d.ts +6 -4
  5. package/dest/acvm/oracle/oracle.d.ts.map +1 -1
  6. package/dest/acvm/oracle/oracle.js +39 -8
  7. package/dest/acvm/oracle/typed_oracle.d.ts +5 -3
  8. package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
  9. package/dest/acvm/oracle/typed_oracle.js +9 -3
  10. package/dest/avm/avm_gas.d.ts.map +1 -1
  11. package/dest/avm/avm_gas.js +2 -1
  12. package/dest/avm/avm_memory_types.d.ts +1 -1
  13. package/dest/avm/avm_memory_types.d.ts.map +1 -1
  14. package/dest/avm/avm_simulator.d.ts.map +1 -1
  15. package/dest/avm/avm_simulator.js +3 -1
  16. package/dest/avm/journal/journal.d.ts +20 -1
  17. package/dest/avm/journal/journal.d.ts.map +1 -1
  18. package/dest/avm/journal/journal.js +69 -9
  19. package/dest/avm/journal/nullifiers.d.ts +3 -1
  20. package/dest/avm/journal/nullifiers.d.ts.map +1 -1
  21. package/dest/avm/journal/nullifiers.js +14 -6
  22. package/dest/avm/journal/public_storage.d.ts +10 -1
  23. package/dest/avm/journal/public_storage.d.ts.map +1 -1
  24. package/dest/avm/journal/public_storage.js +17 -2
  25. package/dest/avm/journal/trace.d.ts +1 -4
  26. package/dest/avm/journal/trace.d.ts.map +1 -1
  27. package/dest/avm/journal/trace.js +4 -5
  28. package/dest/avm/journal/trace_types.d.ts +1 -0
  29. package/dest/avm/journal/trace_types.d.ts.map +1 -1
  30. package/dest/avm/journal/trace_types.js +1 -1
  31. package/dest/avm/opcodes/bitwise.d.ts +4 -1
  32. package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
  33. package/dest/avm/opcodes/bitwise.js +14 -2
  34. package/dest/avm/opcodes/environment_getters.d.ts +5 -0
  35. package/dest/avm/opcodes/environment_getters.d.ts.map +1 -1
  36. package/dest/avm/opcodes/environment_getters.js +8 -1
  37. package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
  38. package/dest/avm/opcodes/external_calls.js +14 -13
  39. package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
  40. package/dest/avm/serialization/bytecode_serialization.js +3 -2
  41. package/dest/avm/serialization/instruction_serialization.d.ts +39 -38
  42. package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
  43. package/dest/avm/serialization/instruction_serialization.js +40 -39
  44. package/dest/client/client_execution_context.d.ts +31 -18
  45. package/dest/client/client_execution_context.d.ts.map +1 -1
  46. package/dest/client/client_execution_context.js +48 -31
  47. package/dest/client/db_oracle.d.ts +11 -4
  48. package/dest/client/db_oracle.d.ts.map +1 -1
  49. package/dest/client/execution_result.d.ts +19 -15
  50. package/dest/client/execution_result.d.ts.map +1 -1
  51. package/dest/client/execution_result.js +45 -12
  52. package/dest/client/logs_cache.d.ts +33 -0
  53. package/dest/client/logs_cache.d.ts.map +1 -0
  54. package/dest/client/logs_cache.js +59 -0
  55. package/dest/client/private_execution.d.ts +2 -2
  56. package/dest/client/private_execution.d.ts.map +1 -1
  57. package/dest/client/private_execution.js +3 -7
  58. package/dest/client/simulator.d.ts +3 -3
  59. package/dest/client/simulator.d.ts.map +1 -1
  60. package/dest/client/simulator.js +3 -2
  61. package/dest/client/unconstrained_execution.d.ts +2 -2
  62. package/dest/client/unconstrained_execution.d.ts.map +1 -1
  63. package/dest/client/unconstrained_execution.js +1 -1
  64. package/dest/client/view_data_oracle.d.ts +7 -0
  65. package/dest/client/view_data_oracle.d.ts.map +1 -1
  66. package/dest/client/view_data_oracle.js +10 -1
  67. package/dest/mocks/fixtures.d.ts.map +1 -1
  68. package/dest/mocks/fixtures.js +3 -1
  69. package/dest/public/abstract_phase_manager.d.ts +2 -0
  70. package/dest/public/abstract_phase_manager.d.ts.map +1 -1
  71. package/dest/public/abstract_phase_manager.js +13 -6
  72. package/dest/public/execution.d.ts +9 -0
  73. package/dest/public/execution.d.ts.map +1 -1
  74. package/dest/public/execution.js +1 -1
  75. package/dest/public/executor.d.ts +2 -2
  76. package/dest/public/executor.d.ts.map +1 -1
  77. package/dest/public/executor.js +34 -14
  78. package/dest/public/public_execution_context.d.ts +10 -4
  79. package/dest/public/public_execution_context.d.ts.map +1 -1
  80. package/dest/public/public_execution_context.js +19 -6
  81. package/dest/public/tail_phase_manager.d.ts +0 -1
  82. package/dest/public/tail_phase_manager.d.ts.map +1 -1
  83. package/dest/public/tail_phase_manager.js +3 -26
  84. package/dest/public/transitional_adaptors.d.ts +4 -17
  85. package/dest/public/transitional_adaptors.d.ts.map +1 -1
  86. package/dest/public/transitional_adaptors.js +27 -119
  87. package/package.json +8 -8
  88. package/src/acvm/acvm.ts +2 -2
  89. package/src/acvm/oracle/oracle.ts +63 -10
  90. package/src/acvm/oracle/typed_oracle.ts +12 -3
  91. package/src/avm/avm_gas.ts +1 -0
  92. package/src/avm/avm_memory_types.ts +1 -1
  93. package/src/avm/avm_simulator.ts +2 -0
  94. package/src/avm/journal/journal.ts +133 -9
  95. package/src/avm/journal/nullifiers.ts +19 -8
  96. package/src/avm/journal/public_storage.ts +23 -2
  97. package/src/avm/journal/trace.ts +3 -4
  98. package/src/avm/journal/trace_types.ts +1 -0
  99. package/src/avm/opcodes/bitwise.ts +18 -7
  100. package/src/avm/opcodes/environment_getters.ts +9 -0
  101. package/src/avm/opcodes/external_calls.ts +21 -16
  102. package/src/avm/serialization/bytecode_serialization.ts +2 -0
  103. package/src/avm/serialization/instruction_serialization.ts +1 -0
  104. package/src/client/client_execution_context.ts +55 -31
  105. package/src/client/db_oracle.ts +12 -10
  106. package/src/client/execution_result.ts +55 -24
  107. package/src/client/logs_cache.ts +65 -0
  108. package/src/client/private_execution.ts +4 -10
  109. package/src/client/simulator.ts +6 -4
  110. package/src/client/unconstrained_execution.ts +2 -2
  111. package/src/client/view_data_oracle.ts +10 -0
  112. package/src/mocks/fixtures.ts +2 -0
  113. package/src/public/abstract_phase_manager.ts +13 -5
  114. package/src/public/execution.ts +9 -0
  115. package/src/public/executor.ts +47 -10
  116. package/src/public/public_execution_context.ts +18 -4
  117. package/src/public/tail_phase_manager.ts +2 -34
  118. package/src/public/transitional_adaptors.ts +39 -178
@@ -1,13 +1,10 @@
1
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, Gas, L2ToL1Message, NoteHash, Nullifier, ReadRequest, SideEffect, } from '@aztec/circuits.js';
2
+ import { UnencryptedFunctionL2Logs } from '@aztec/circuit-types';
3
+ import { CallContext, FunctionData, } from '@aztec/circuits.js';
4
4
  import { Fr } from '@aztec/foundation/fields';
5
5
  import { AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
6
- import { AvmContractCallResults } from '../avm/avm_message_call_result.js';
7
6
  import { Mov } from '../avm/opcodes/memory.js';
8
7
  import { createSimulationError } from '../common/errors.js';
9
- import { PackedValuesCache, SideEffectCounter } from '../index.js';
10
- import { PublicExecutionContext } from './public_execution_context.js';
11
8
  /**
12
9
  * Convert a PublicExecution(Environment) object to an AvmExecutionEnvironment
13
10
  *
@@ -19,131 +16,42 @@ export function createAvmExecutionEnvironment(current, header, globalVariables,
19
16
  return new AvmExecutionEnvironment(current.contractAddress, current.callContext.storageContractAddress, current.callContext.msgSender, globalVariables.gasFees.feePerL2Gas, globalVariables.gasFees.feePerDaGas,
20
17
  /*contractCallDepth=*/ Fr.zero(), header, globalVariables, current.callContext.isStaticCall, current.callContext.isDelegateCall, current.args, gasSettings, transactionFee, current.functionData.selector);
21
18
  }
22
- export function createPublicExecutionContext(avmContext, calldata) {
23
- const sideEffectCounter = avmContext.persistableState.trace.accessCounter;
19
+ export function createPublicExecution(startSideEffectCounter, avmEnvironment, calldata) {
24
20
  const callContext = CallContext.from({
25
- msgSender: avmContext.environment.sender,
26
- storageContractAddress: avmContext.environment.storageAddress,
27
- functionSelector: avmContext.environment.temporaryFunctionSelector,
28
- isDelegateCall: avmContext.environment.isDelegateCall,
29
- isStaticCall: avmContext.environment.isStaticCall,
30
- sideEffectCounter: sideEffectCounter,
21
+ msgSender: avmEnvironment.sender,
22
+ storageContractAddress: avmEnvironment.storageAddress,
23
+ functionSelector: avmEnvironment.temporaryFunctionSelector,
24
+ isDelegateCall: avmEnvironment.isDelegateCall,
25
+ isStaticCall: avmEnvironment.isStaticCall,
26
+ sideEffectCounter: startSideEffectCounter,
31
27
  });
32
- const functionData = new FunctionData(avmContext.environment.temporaryFunctionSelector, /*isPrivate=*/ false);
28
+ const functionData = new FunctionData(avmEnvironment.temporaryFunctionSelector, /*isPrivate=*/ false);
33
29
  const execution = {
34
- contractAddress: avmContext.environment.address,
30
+ contractAddress: avmEnvironment.address,
35
31
  callContext,
36
32
  args: calldata,
37
33
  functionData,
38
34
  };
39
- const packedArgs = PackedValuesCache.create([]);
40
- 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, Gas.from(avmContext.machineState.gasLeft), avmContext.environment.transactionFee, avmContext.environment.gasSettings);
41
- return context;
35
+ return execution;
42
36
  }
43
- /**
44
- * Convert the result of an AVM contract call to a PublicExecutionResult for the public kernel
45
- *
46
- * @param execution
47
- * @param newWorldState
48
- * @param result
49
- * @returns
50
- */
51
- export async function convertAvmResults(executionContext, newWorldState, result, endMachineState) {
52
- const execution = executionContext.execution;
53
- const contractStorageReads = newWorldState.storageReads.map(read => new ContractStorageRead(read.slot, read.value, read.counter.toNumber(), read.storageAddress));
54
- const contractStorageUpdateRequests = newWorldState.storageWrites.map(write => new ContractStorageUpdateRequest(write.slot, write.value, write.counter.toNumber(), write.storageAddress));
55
- // We need to write the storage updates to the DB, because that's what the ACVM expects.
56
- // Assumes the updates are in the right order.
57
- for (const write of newWorldState.storageWrites) {
58
- await executionContext.stateDb.storageWrite(write.storageAddress, write.slot, write.value);
59
- }
60
- const newNoteHashes = newWorldState.newNoteHashes.map(noteHash => new NoteHash(noteHash.noteHash, noteHash.counter.toNumber()));
61
- const nullifierReadRequests = newWorldState.nullifierChecks
62
- .filter(nullifierCheck => nullifierCheck.exists)
63
- .map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
64
- const nullifierNonExistentReadRequests = newWorldState.nullifierChecks
65
- .filter(nullifierCheck => !nullifierCheck.exists)
66
- .map(nullifierCheck => new ReadRequest(nullifierCheck.nullifier, nullifierCheck.counter.toNumber()));
67
- const newNullifiers = newWorldState.newNullifiers.map(tracedNullifier => new Nullifier(
68
- /*value=*/ tracedNullifier.nullifier, tracedNullifier.counter.toNumber(),
69
- /*noteHash=*/ Fr.ZERO));
70
- const unencryptedLogs = new UnencryptedFunctionL2Logs(newWorldState.newLogs.map(log => new UnencryptedL2Log(log.contractAddress, log.selector, log.data)));
71
- const unencryptedLogsHashes = newWorldState.newLogsHashes.map(logHash => new SideEffect(logHash.logHash, logHash.counter));
72
- const newL2ToL1Messages = newWorldState.newL1Messages.map(m => new L2ToL1Message(m.recipient, m.content));
73
- const returnValues = result.output;
74
- // TODO: Support nested executions.
75
- const nestedExecutions = [];
76
- // TODO keep track of side effect counters
77
- const startSideEffectCounter = Fr.ZERO;
78
- const endSideEffectCounter = Fr.ZERO;
37
+ export function convertAvmResultsToPxResult(avmResult, startSideEffectCounter, fromPx, startGas, endAvmContext) {
38
+ const endPersistableState = endAvmContext.persistableState;
39
+ const endMachineState = endAvmContext.machineState;
79
40
  return {
80
- execution,
81
- nullifierReadRequests,
82
- nullifierNonExistentReadRequests,
83
- newNoteHashes,
84
- newL2ToL1Messages,
85
- startSideEffectCounter,
86
- endSideEffectCounter,
87
- newNullifiers,
88
- contractStorageReads,
89
- contractStorageUpdateRequests,
90
- returnValues,
91
- nestedExecutions,
92
- unencryptedLogsHashes,
93
- unencryptedLogs,
94
- reverted: result.reverted,
95
- revertReason: result.revertReason ? createSimulationError(result.revertReason) : undefined,
96
- startGasLeft: executionContext.availableGas,
41
+ ...endPersistableState.transitionalExecutionResult, // includes nestedExecutions
42
+ execution: fromPx,
43
+ returnValues: avmResult.output,
44
+ startSideEffectCounter: new Fr(startSideEffectCounter),
45
+ endSideEffectCounter: new Fr(endPersistableState.trace.accessCounter),
46
+ unencryptedLogs: new UnencryptedFunctionL2Logs(endPersistableState.transitionalExecutionResult.unencryptedLogs),
47
+ allUnencryptedLogs: new UnencryptedFunctionL2Logs(endPersistableState.transitionalExecutionResult.allUnencryptedLogs),
48
+ reverted: avmResult.reverted,
49
+ revertReason: avmResult.revertReason ? createSimulationError(avmResult.revertReason) : undefined,
50
+ startGasLeft: startGas,
97
51
  endGasLeft: endMachineState.gasLeft,
98
- transactionFee: executionContext.transactionFee,
52
+ transactionFee: endAvmContext.environment.transactionFee,
99
53
  };
100
54
  }
101
- export function convertPublicExecutionResult(res) {
102
- return new AvmContractCallResults(res.reverted, res.returnValues, res.revertReason);
103
- }
104
- export function updateAvmContextFromPublicExecutionResult(ctx, result) {
105
- // We have to push these manually and not use the trace* functions
106
- // so that we respect the side effect counters.
107
- for (const readRequest of result.contractStorageReads) {
108
- ctx.persistableState.trace.publicStorageReads.push({
109
- storageAddress: ctx.environment.storageAddress,
110
- exists: true, // FIXME
111
- slot: readRequest.storageSlot,
112
- value: readRequest.currentValue,
113
- counter: new Fr(readRequest.sideEffectCounter ?? Fr.ZERO),
114
- });
115
- }
116
- for (const updateRequest of result.contractStorageUpdateRequests) {
117
- ctx.persistableState.trace.publicStorageWrites.push({
118
- storageAddress: ctx.environment.storageAddress,
119
- slot: updateRequest.storageSlot,
120
- value: updateRequest.newValue,
121
- counter: new Fr(updateRequest.sideEffectCounter ?? Fr.ZERO),
122
- });
123
- // We need to manually populate the cache.
124
- ctx.persistableState.publicStorage.write(ctx.environment.storageAddress, updateRequest.storageSlot, updateRequest.newValue);
125
- }
126
- for (const nullifier of result.newNullifiers) {
127
- ctx.persistableState.trace.newNullifiers.push({
128
- storageAddress: ctx.environment.storageAddress,
129
- nullifier: nullifier.value,
130
- counter: new Fr(nullifier.counter),
131
- });
132
- }
133
- for (const noteHash of result.newNoteHashes) {
134
- ctx.persistableState.trace.newNoteHashes.push({
135
- storageAddress: ctx.environment.storageAddress,
136
- noteHash: noteHash.value,
137
- counter: new Fr(noteHash.counter),
138
- });
139
- }
140
- for (const message of result.newL2ToL1Messages) {
141
- ctx.persistableState.newL1Messages.push(message);
142
- }
143
- for (const log of result.unencryptedLogs.logs) {
144
- ctx.persistableState.newLogs.push(new UnencryptedL2Log(log.contractAddress, log.selector, log.data));
145
- }
146
- }
147
55
  const AVM_MAGIC_SUFFIX = Buffer.from([
148
56
  Mov.opcode, // opcode
149
57
  0x00, // indirect
@@ -157,4 +65,4 @@ export function isAvmBytecode(bytecode) {
157
65
  const magicSize = AVM_MAGIC_SUFFIX.length;
158
66
  return bytecode.subarray(-magicSize).equals(AVM_MAGIC_SUFFIX);
159
67
  }
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUdBQWlHO0FBQ2pHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ25GLE9BQU8sRUFDTCxXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLDRCQUE0QixFQUM1QixZQUFZLEVBQ1osR0FBRyxFQUlILGFBQWEsRUFDYixRQUFRLEVBQ1IsU0FBUyxFQUNULFdBQVcsRUFDWCxVQUFVLEdBQ1gsTUFBTSxvQkFBb0IsQ0FBQztBQUM1QixPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFHOUMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFFOUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFM0UsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVuRSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUV2RTs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLE9BQXdCLEVBQ3hCLE1BQWMsRUFDZCxlQUFnQyxFQUNoQyxXQUF3QixFQUN4QixjQUFrQjtJQUVsQixPQUFPLElBQUksdUJBQXVCLENBQ2hDLE9BQU8sQ0FBQyxlQUFlLEVBQ3ZCLE9BQU8sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQzFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUM3QixlQUFlLENBQUMsT0FBTyxDQUFD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
68
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNpdGlvbmFsX2FkYXB0b3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3B1YmxpYy90cmFuc2l0aW9uYWxfYWRhcHRvcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsaUdBQWlHO0FBQ2pHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2pFLE9BQU8sRUFDTCxXQUFXLEVBQ1gsWUFBWSxHQUtiLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRzlDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRTlFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUMvQyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUc1RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsNkJBQTZCLENBQzNDLE9BQXdCLEVBQ3hCLE1BQWMsRUFDZCxlQUFnQyxFQUNoQyxXQUF3QixFQUN4QixjQUFrQjtJQUVsQixPQUFPLElBQUksdUJBQXVCLENBQ2hDLE9BQU8sQ0FBQyxlQUFlLEVBQ3ZCLE9BQU8sQ0FBQyxXQUFXLENBQUMsc0JBQXNCLEVBQzFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUM3QixlQUFlLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFDbkMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxXQUFXO0lBQ25DLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFDaEMsTUFBTSxFQUNOLGVBQWUsRUFDZixPQUFPLENBQUMsV0FBVyxDQUFDLFlBQVksRUFDaEMsT0FBTyxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQ2xDLE9BQU8sQ0FBQyxJQUFJLEVBQ1osV0FBVyxFQUNYLGNBQWMsRUFDZCxPQUFPLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDOUIsQ0FBQztBQUNK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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/simulator",
3
- "version": "0.36.0",
3
+ "version": "0.38.0",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "typedocOptions": {
@@ -45,13 +45,13 @@
45
45
  ]
46
46
  },
47
47
  "dependencies": {
48
- "@aztec/circuit-types": "0.36.0",
49
- "@aztec/circuits.js": "0.36.0",
50
- "@aztec/foundation": "0.36.0",
51
- "@aztec/noir-protocol-circuits-types": "0.36.0",
52
- "@aztec/protocol-contracts": "0.36.0",
53
- "@aztec/types": "0.36.0",
54
- "@aztec/world-state": "0.36.0",
48
+ "@aztec/circuit-types": "0.38.0",
49
+ "@aztec/circuits.js": "0.38.0",
50
+ "@aztec/foundation": "0.38.0",
51
+ "@aztec/noir-protocol-circuits-types": "0.38.0",
52
+ "@aztec/protocol-contracts": "0.38.0",
53
+ "@aztec/types": "0.38.0",
54
+ "@aztec/world-state": "0.38.0",
55
55
  "@noir-lang/acvm_js": "portal:../../noir/packages/acvm_js",
56
56
  "@noir-lang/types": "portal:../../noir/packages/types",
57
57
  "levelup": "^5.1.1",
package/src/acvm/acvm.ts CHANGED
@@ -19,7 +19,7 @@ import { type ORACLE_NAMES } from './oracle/index.js';
19
19
  */
20
20
  type ACIRCallback = Record<
21
21
  ORACLE_NAMES,
22
- (...args: ForeignCallInput[]) => ForeignCallOutput | Promise<ForeignCallOutput>
22
+ (...args: ForeignCallInput[]) => void | ForeignCallOutput | Promise<ForeignCallOutput>
23
23
  >;
24
24
 
25
25
  /**
@@ -105,7 +105,7 @@ export async function acvm(
105
105
  }
106
106
 
107
107
  const result = await oracleFunction.call(callback, ...args);
108
- return [result];
108
+ return typeof result === 'undefined' ? [] : [result];
109
109
  } catch (err) {
110
110
  let typedError: Error;
111
111
  if (err instanceof Error) {
@@ -1,5 +1,5 @@
1
1
  import { MerkleTreeId, UnencryptedL2Log } from '@aztec/circuit-types';
2
- import { acvmFieldMessageToString, oracleDebugCallToFormattedStr } from '@aztec/circuits.js';
2
+ import { type PartialAddress, acvmFieldMessageToString, oracleDebugCallToFormattedStr } from '@aztec/circuits.js';
3
3
  import { EventSelector, FunctionSelector } from '@aztec/foundation/abi';
4
4
  import { AztecAddress } from '@aztec/foundation/aztec-address';
5
5
  import { Fr, Point } from '@aztec/foundation/fields';
@@ -53,6 +53,7 @@ export class Oracle {
53
53
  ];
54
54
  }
55
55
 
56
+ // TODO: #5834 Nuke this
56
57
  async getPublicKeyAndPartialAddress([address]: ACVMField[]) {
57
58
  const { publicKey, partialAddress } = await this.typedOracle.getCompleteAddress(
58
59
  AztecAddress.fromField(fromACVMField(address)),
@@ -171,6 +172,28 @@ export class Oracle {
171
172
  return capsule.map(toACVMField);
172
173
  }
173
174
 
175
+ async getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[]> {
176
+ let publicKeys: Point[] | undefined;
177
+ let partialAddress: PartialAddress;
178
+
179
+ // TODO #5834: This should be reworked to return the public keys as well
180
+ try {
181
+ ({ partialAddress } = await this.typedOracle.getCompleteAddress(AztecAddress.fromField(fromACVMField(address))));
182
+ } catch (err) {
183
+ partialAddress = Fr.ZERO;
184
+ }
185
+
186
+ try {
187
+ publicKeys = await this.typedOracle.getPublicKeysForAddress(AztecAddress.fromField(fromACVMField(address)));
188
+ } catch (err) {
189
+ publicKeys = Array(4).fill(Point.ZERO);
190
+ }
191
+
192
+ const acvmPublicKeys = publicKeys.flatMap(key => key.toFields());
193
+
194
+ return [...acvmPublicKeys, partialAddress].map(toACVMField);
195
+ }
196
+
174
197
  async getNotes(
175
198
  [storageSlot]: ACVMField[],
176
199
  [numSelects]: ACVMField[],
@@ -294,19 +317,51 @@ export class Oracle {
294
317
  [publicKeyX]: ACVMField[],
295
318
  [publicKeyY]: ACVMField[],
296
319
  log: ACVMField[],
297
- ): ACVMField {
320
+ [counter]: ACVMField[],
321
+ ): ACVMField[] {
298
322
  const publicKey = new Point(fromACVMField(publicKeyX), fromACVMField(publicKeyY));
299
- const logHash = this.typedOracle.emitEncryptedLog(
323
+ const encLog = this.typedOracle.emitEncryptedLog(
300
324
  AztecAddress.fromString(contractAddress),
301
325
  Fr.fromString(storageSlot),
302
326
  Fr.fromString(noteTypeId),
303
327
  publicKey,
304
328
  log.map(fromACVMField),
329
+ +counter,
305
330
  );
306
- return toACVMField(logHash);
331
+ // TODO(1139): We should encrypt in the circuit, but instead we inject here
332
+ // encryption output is 112 + 32 * (N + 3) bytes, for log len N
333
+ // so split into N + 7 fields (gross but avoids 300+ ACVMFields)
334
+ const encLogFields = [];
335
+ for (let i = 0; i < Math.ceil(encLog.length / 31); i++) {
336
+ encLogFields.push(toACVMField(encLog.subarray(31 * i, Math.min(31 * (i + 1), encLog.length))));
337
+ }
338
+
339
+ return encLogFields;
340
+ }
341
+
342
+ emitUnencryptedLog(
343
+ [contractAddress]: ACVMField[],
344
+ [eventSelector]: ACVMField[],
345
+ message: ACVMField[],
346
+ [counter]: ACVMField[],
347
+ ): ACVMField {
348
+ const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
349
+ const log = new UnencryptedL2Log(
350
+ AztecAddress.fromString(contractAddress),
351
+ EventSelector.fromField(fromACVMField(eventSelector)),
352
+ logPayload,
353
+ );
354
+
355
+ this.typedOracle.emitUnencryptedLog(log, +counter);
356
+ return toACVMField(0);
307
357
  }
308
358
 
309
- emitUnencryptedLog([contractAddress]: ACVMField[], [eventSelector]: ACVMField[], message: ACVMField[]): ACVMField {
359
+ emitContractClassUnencryptedLog(
360
+ [contractAddress]: ACVMField[],
361
+ [eventSelector]: ACVMField[],
362
+ message: ACVMField[],
363
+ [counter]: ACVMField[],
364
+ ): ACVMField {
310
365
  const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
311
366
  const log = new UnencryptedL2Log(
312
367
  AztecAddress.fromString(contractAddress),
@@ -314,18 +369,16 @@ export class Oracle {
314
369
  logPayload,
315
370
  );
316
371
 
317
- const logHash = this.typedOracle.emitUnencryptedLog(log);
372
+ const logHash = this.typedOracle.emitContractClassUnencryptedLog(log, +counter);
318
373
  return toACVMField(logHash);
319
374
  }
320
375
 
321
- debugLog(...args: ACVMField[][]): ACVMField {
376
+ debugLog(...args: ACVMField[][]): void {
322
377
  this.log.verbose(oracleDebugCallToFormattedStr(args));
323
- return toACVMField(0);
324
378
  }
325
379
 
326
- debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): ACVMField {
380
+ debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): void {
327
381
  this.log.verbose(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
328
- return toACVMField(0);
329
382
  }
330
383
 
331
384
  async callPrivateFunction(
@@ -17,7 +17,7 @@ import {
17
17
  } from '@aztec/circuits.js';
18
18
  import { type FunctionSelector } from '@aztec/foundation/abi';
19
19
  import { type AztecAddress } from '@aztec/foundation/aztec-address';
20
- import { Fr } from '@aztec/foundation/fields';
20
+ import { Fr, type Point } from '@aztec/foundation/fields';
21
21
  import { type ContractInstance } from '@aztec/types/contracts';
22
22
 
23
23
  /** Nullifier keys which both correspond to the same master nullifier secret key. */
@@ -140,6 +140,10 @@ export abstract class TypedOracle {
140
140
  throw new OracleMethodNotAvailableError('popCapsule');
141
141
  }
142
142
 
143
+ getPublicKeysForAddress(_address: AztecAddress): Promise<Point[]> {
144
+ throw new OracleMethodNotAvailableError('getPublicKeysForAddress');
145
+ }
146
+
143
147
  getNotes(
144
148
  _storageSlot: Fr,
145
149
  _numSelects: number,
@@ -193,14 +197,19 @@ export abstract class TypedOracle {
193
197
  _noteTypeId: Fr,
194
198
  _publicKey: PublicKey,
195
199
  _log: Fr[],
196
- ): Fr {
200
+ _counter: number,
201
+ ): Buffer {
197
202
  throw new OracleMethodNotAvailableError('emitEncryptedLog');
198
203
  }
199
204
 
200
- emitUnencryptedLog(_log: UnencryptedL2Log): Fr {
205
+ emitUnencryptedLog(_log: UnencryptedL2Log, _counter: number): void {
201
206
  throw new OracleMethodNotAvailableError('emitUnencryptedLog');
202
207
  }
203
208
 
209
+ emitContractClassUnencryptedLog(_log: UnencryptedL2Log, _counter: number): Fr {
210
+ throw new OracleMethodNotAvailableError('emitContractClassUnencryptedLog');
211
+ }
212
+
204
213
  callPrivateFunction(
205
214
  _targetContractAddress: AztecAddress,
206
215
  _functionSelector: FunctionSelector,
@@ -78,6 +78,7 @@ export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
78
78
  [Opcode.SENDER]: TemporaryDefaultGasCost,
79
79
  [Opcode.FEEPERL2GAS]: TemporaryDefaultGasCost,
80
80
  [Opcode.FEEPERDAGAS]: TemporaryDefaultGasCost,
81
+ [Opcode.TRANSACTIONFEE]: TemporaryDefaultGasCost,
81
82
  [Opcode.CONTRACTCALLDEPTH]: TemporaryDefaultGasCost,
82
83
  [Opcode.CHAINID]: TemporaryDefaultGasCost,
83
84
  [Opcode.VERSION]: TemporaryDefaultGasCost,
@@ -225,7 +225,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
225
225
  }
226
226
 
227
227
  /** Returns a MeteredTaggedMemory instance to track the number of reads and writes if TRACK_MEMORY_ACCESSES is set. */
228
- public track(type: string = 'instruction') {
228
+ public track(type: string = 'instruction'): TaggedMemoryInterface {
229
229
  return TaggedMemory.TRACK_MEMORY_ACCESSES ? new MeteredTaggedMemory(this, type) : this;
230
230
  }
231
231
 
@@ -2,6 +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
6
  import type { AvmContext } from './avm_context.js';
6
7
  import { AvmContractCallResults } from './avm_message_call_result.js';
7
8
  import { AvmExecutionError, InvalidProgramCounterError, NoBytecodeForContractError } from './errors.js';
@@ -32,6 +33,7 @@ export class AvmSimulator {
32
33
  if (!bytecode) {
33
34
  throw new NoBytecodeForContractError(this.context.environment.address);
34
35
  }
36
+ assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
35
37
 
36
38
  return await this.executeBytecode(bytecode);
37
39
  }