@aztec/simulator 0.37.0 → 0.39.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.
- package/dest/acvm/acvm.d.ts +1 -1
- package/dest/acvm/acvm.d.ts.map +1 -1
- package/dest/acvm/acvm.js +2 -2
- package/dest/acvm/oracle/oracle.d.ts +6 -5
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +26 -30
- package/dest/acvm/oracle/typed_oracle.d.ts +5 -5
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +9 -9
- package/dest/avm/avm_execution_environment.d.ts +4 -3
- package/dest/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/avm/avm_execution_environment.js +17 -11
- package/dest/avm/avm_gas.d.ts.map +1 -1
- package/dest/avm/avm_gas.js +4 -1
- package/dest/avm/avm_machine_state.d.ts +5 -8
- package/dest/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/avm/avm_machine_state.js +10 -22
- package/dest/avm/avm_memory_types.d.ts +1 -1
- package/dest/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/avm/avm_message_call_result.d.ts +5 -8
- package/dest/avm/avm_message_call_result.d.ts.map +1 -1
- package/dest/avm/avm_message_call_result.js +1 -4
- package/dest/avm/avm_simulator.d.ts.map +1 -1
- package/dest/avm/avm_simulator.js +19 -13
- package/dest/avm/errors.d.ts +43 -2
- package/dest/avm/errors.d.ts.map +1 -1
- package/dest/avm/errors.js +86 -4
- package/dest/avm/journal/journal.d.ts +20 -1
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +70 -9
- package/dest/avm/journal/nullifiers.d.ts +3 -1
- package/dest/avm/journal/nullifiers.d.ts.map +1 -1
- package/dest/avm/journal/nullifiers.js +14 -6
- package/dest/avm/journal/public_storage.d.ts +10 -1
- package/dest/avm/journal/public_storage.d.ts.map +1 -1
- package/dest/avm/journal/public_storage.js +17 -2
- package/dest/avm/journal/trace.d.ts +1 -4
- package/dest/avm/journal/trace.d.ts.map +1 -1
- package/dest/avm/journal/trace.js +4 -5
- package/dest/avm/journal/trace_types.d.ts +1 -0
- package/dest/avm/journal/trace_types.d.ts.map +1 -1
- package/dest/avm/journal/trace_types.js +1 -1
- package/dest/avm/opcodes/bitwise.d.ts +4 -1
- package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/avm/opcodes/bitwise.js +14 -2
- package/dest/avm/opcodes/conversion.d.ts +16 -0
- package/dest/avm/opcodes/conversion.d.ts.map +1 -0
- package/dest/avm/opcodes/conversion.js +48 -0
- package/dest/avm/opcodes/environment_getters.d.ts +16 -12
- package/dest/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/avm/opcodes/environment_getters.js +19 -48
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +24 -13
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/bytecode_serialization.js +6 -2
- package/dest/avm/serialization/instruction_serialization.d.ts +40 -38
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/instruction_serialization.js +42 -39
- package/dest/client/client_execution_context.d.ts +59 -19
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +97 -45
- package/dest/client/db_oracle.d.ts +4 -11
- package/dest/client/db_oracle.d.ts.map +1 -1
- package/dest/client/execution_result.d.ts +22 -15
- package/dest/client/execution_result.d.ts.map +1 -1
- package/dest/client/execution_result.js +59 -13
- package/dest/client/logs_cache.d.ts +33 -0
- package/dest/client/logs_cache.d.ts.map +1 -0
- package/dest/client/logs_cache.js +59 -0
- package/dest/client/private_execution.d.ts +2 -2
- package/dest/client/private_execution.d.ts.map +1 -1
- package/dest/client/private_execution.js +5 -7
- package/dest/client/simulator.d.ts +4 -34
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +5 -43
- package/dest/client/unconstrained_execution.d.ts +2 -2
- package/dest/client/unconstrained_execution.d.ts.map +1 -1
- package/dest/client/unconstrained_execution.js +1 -1
- package/dest/client/view_data_oracle.d.ts +0 -7
- package/dest/client/view_data_oracle.d.ts.map +1 -1
- package/dest/client/view_data_oracle.js +1 -10
- package/dest/common/errors.d.ts +5 -0
- package/dest/common/errors.d.ts.map +1 -1
- package/dest/common/errors.js +6 -1
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +3 -1
- package/dest/public/abstract_phase_manager.d.ts +10 -4
- package/dest/public/abstract_phase_manager.d.ts.map +1 -1
- package/dest/public/abstract_phase_manager.js +50 -19
- package/dest/public/app_logic_phase_manager.d.ts +1 -0
- package/dest/public/app_logic_phase_manager.d.ts.map +1 -1
- package/dest/public/app_logic_phase_manager.js +3 -3
- package/dest/public/execution.d.ts +9 -0
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +1 -1
- package/dest/public/executor.d.ts +2 -2
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +34 -17
- package/dest/public/hints_builder.d.ts +3 -3
- package/dest/public/hints_builder.d.ts.map +1 -1
- package/dest/public/hints_builder.js +3 -3
- package/dest/public/public_execution_context.d.ts +10 -4
- package/dest/public/public_execution_context.d.ts.map +1 -1
- package/dest/public/public_execution_context.js +19 -6
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +5 -3
- package/dest/public/setup_phase_manager.d.ts +1 -0
- package/dest/public/setup_phase_manager.d.ts.map +1 -1
- package/dest/public/setup_phase_manager.js +3 -2
- package/dest/public/tail_phase_manager.d.ts +1 -1
- package/dest/public/tail_phase_manager.d.ts.map +1 -1
- package/dest/public/tail_phase_manager.js +4 -26
- package/dest/public/teardown_phase_manager.d.ts +1 -0
- package/dest/public/teardown_phase_manager.d.ts.map +1 -1
- package/dest/public/teardown_phase_manager.js +3 -2
- package/dest/public/transitional_adaptors.d.ts +4 -17
- package/dest/public/transitional_adaptors.d.ts.map +1 -1
- package/dest/public/transitional_adaptors.js +27 -119
- package/dest/rollup/index.d.ts +2 -0
- package/dest/rollup/index.d.ts.map +1 -0
- package/dest/rollup/index.js +2 -0
- package/dest/rollup/rollup.d.ts +77 -0
- package/dest/rollup/rollup.d.ts.map +1 -0
- package/dest/rollup/rollup.js +78 -0
- package/dest/stats/index.d.ts +2 -0
- package/dest/stats/index.d.ts.map +1 -0
- package/dest/stats/index.js +2 -0
- package/dest/stats/stats.d.ts +4 -0
- package/dest/stats/stats.d.ts.map +1 -0
- package/dest/stats/stats.js +11 -0
- package/package.json +8 -8
- package/src/acvm/acvm.ts +2 -2
- package/src/acvm/oracle/oracle.ts +62 -36
- package/src/acvm/oracle/typed_oracle.ts +19 -11
- package/src/avm/avm_execution_environment.ts +34 -42
- package/src/avm/avm_gas.ts +3 -0
- package/src/avm/avm_machine_state.ts +14 -25
- package/src/avm/avm_memory_types.ts +1 -1
- package/src/avm/avm_message_call_result.ts +3 -14
- package/src/avm/avm_simulator.ts +24 -12
- package/src/avm/errors.ts +94 -4
- package/src/avm/journal/journal.ts +134 -9
- package/src/avm/journal/nullifiers.ts +19 -8
- package/src/avm/journal/public_storage.ts +23 -2
- package/src/avm/journal/trace.ts +3 -4
- package/src/avm/journal/trace_types.ts +1 -0
- package/src/avm/opcodes/bitwise.ts +18 -7
- package/src/avm/opcodes/conversion.ts +59 -0
- package/src/avm/opcodes/environment_getters.ts +21 -65
- package/src/avm/opcodes/external_calls.ts +32 -16
- package/src/avm/serialization/bytecode_serialization.ts +5 -0
- package/src/avm/serialization/instruction_serialization.ts +3 -0
- package/src/client/client_execution_context.ts +142 -46
- package/src/client/db_oracle.ts +4 -18
- package/src/client/execution_result.ts +75 -25
- package/src/client/logs_cache.ts +65 -0
- package/src/client/private_execution.ts +6 -10
- package/src/client/simulator.ts +8 -84
- package/src/client/unconstrained_execution.ts +2 -2
- package/src/client/view_data_oracle.ts +0 -10
- package/src/common/errors.ts +5 -0
- package/src/index.ts +1 -0
- package/src/mocks/fixtures.ts +2 -0
- package/src/public/abstract_phase_manager.ts +59 -23
- package/src/public/app_logic_phase_manager.ts +2 -1
- package/src/public/execution.ts +9 -0
- package/src/public/executor.ts +47 -14
- package/src/public/hints_builder.ts +5 -5
- package/src/public/public_execution_context.ts +18 -4
- package/src/public/public_processor.ts +8 -2
- package/src/public/setup_phase_manager.ts +16 -8
- package/src/public/tail_phase_manager.ts +8 -35
- package/src/public/teardown_phase_manager.ts +16 -8
- package/src/public/transitional_adaptors.ts +39 -177
- package/src/rollup/index.ts +1 -0
- package/src/rollup/rollup.ts +160 -0
- package/src/stats/index.ts +1 -0
- package/src/stats/stats.ts +20 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aztec/simulator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.39.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.
|
|
49
|
-
"@aztec/circuits.js": "0.
|
|
50
|
-
"@aztec/foundation": "0.
|
|
51
|
-
"@aztec/noir-protocol-circuits-types": "0.
|
|
52
|
-
"@aztec/protocol-contracts": "0.
|
|
53
|
-
"@aztec/types": "0.
|
|
54
|
-
"@aztec/world-state": "0.
|
|
48
|
+
"@aztec/circuit-types": "0.39.0",
|
|
49
|
+
"@aztec/circuits.js": "0.39.0",
|
|
50
|
+
"@aztec/foundation": "0.39.0",
|
|
51
|
+
"@aztec/noir-protocol-circuits-types": "0.39.0",
|
|
52
|
+
"@aztec/protocol-contracts": "0.39.0",
|
|
53
|
+
"@aztec/types": "0.39.0",
|
|
54
|
+
"@aztec/world-state": "0.39.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 {
|
|
2
|
+
import { 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,14 +53,6 @@ export class Oracle {
|
|
|
53
53
|
];
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
// TODO: #5834 Nuke this
|
|
57
|
-
async getPublicKeyAndPartialAddress([address]: ACVMField[]) {
|
|
58
|
-
const { publicKey, partialAddress } = await this.typedOracle.getCompleteAddress(
|
|
59
|
-
AztecAddress.fromField(fromACVMField(address)),
|
|
60
|
-
);
|
|
61
|
-
return [publicKey.x, publicKey.y, partialAddress].map(toACVMField);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
56
|
async getContractInstance([address]: ACVMField[]) {
|
|
65
57
|
const instance = await this.typedOracle.getContractInstance(AztecAddress.fromField(fromACVMField(address)));
|
|
66
58
|
|
|
@@ -173,25 +165,10 @@ export class Oracle {
|
|
|
173
165
|
}
|
|
174
166
|
|
|
175
167
|
async getPublicKeysAndPartialAddress([address]: ACVMField[]): Promise<ACVMField[]> {
|
|
176
|
-
|
|
177
|
-
|
|
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
|
-
}
|
|
168
|
+
const parsedAddress = AztecAddress.fromField(fromACVMField(address));
|
|
169
|
+
const { publicKeys, partialAddress } = await this.typedOracle.getCompleteAddress(parsedAddress);
|
|
191
170
|
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
return [...acvmPublicKeys, partialAddress].map(toACVMField);
|
|
171
|
+
return [...publicKeys.toFields(), partialAddress].map(toACVMField);
|
|
195
172
|
}
|
|
196
173
|
|
|
197
174
|
async getNotes(
|
|
@@ -317,19 +294,34 @@ export class Oracle {
|
|
|
317
294
|
[publicKeyX]: ACVMField[],
|
|
318
295
|
[publicKeyY]: ACVMField[],
|
|
319
296
|
log: ACVMField[],
|
|
320
|
-
|
|
297
|
+
[counter]: ACVMField[],
|
|
298
|
+
): ACVMField[] {
|
|
321
299
|
const publicKey = new Point(fromACVMField(publicKeyX), fromACVMField(publicKeyY));
|
|
322
|
-
const
|
|
300
|
+
const encLog = this.typedOracle.emitEncryptedLog(
|
|
323
301
|
AztecAddress.fromString(contractAddress),
|
|
324
302
|
Fr.fromString(storageSlot),
|
|
325
303
|
Fr.fromString(noteTypeId),
|
|
326
304
|
publicKey,
|
|
327
305
|
log.map(fromACVMField),
|
|
306
|
+
+counter,
|
|
328
307
|
);
|
|
329
|
-
|
|
308
|
+
// TODO(1139): We should encrypt in the circuit, but instead we inject here
|
|
309
|
+
// encryption output is 112 + 32 * (N + 3) bytes, for log len N
|
|
310
|
+
// so split into N + 7 fields (gross but avoids 300+ ACVMFields)
|
|
311
|
+
const encLogFields = [];
|
|
312
|
+
for (let i = 0; i < Math.ceil(encLog.length / 31); i++) {
|
|
313
|
+
encLogFields.push(toACVMField(encLog.subarray(31 * i, Math.min(31 * (i + 1), encLog.length))));
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
return encLogFields;
|
|
330
317
|
}
|
|
331
318
|
|
|
332
|
-
emitUnencryptedLog(
|
|
319
|
+
emitUnencryptedLog(
|
|
320
|
+
[contractAddress]: ACVMField[],
|
|
321
|
+
[eventSelector]: ACVMField[],
|
|
322
|
+
message: ACVMField[],
|
|
323
|
+
[counter]: ACVMField[],
|
|
324
|
+
): ACVMField {
|
|
333
325
|
const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
|
|
334
326
|
const log = new UnencryptedL2Log(
|
|
335
327
|
AztecAddress.fromString(contractAddress),
|
|
@@ -337,18 +329,33 @@ export class Oracle {
|
|
|
337
329
|
logPayload,
|
|
338
330
|
);
|
|
339
331
|
|
|
340
|
-
|
|
332
|
+
this.typedOracle.emitUnencryptedLog(log, +counter);
|
|
333
|
+
return toACVMField(0);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
emitContractClassUnencryptedLog(
|
|
337
|
+
[contractAddress]: ACVMField[],
|
|
338
|
+
[eventSelector]: ACVMField[],
|
|
339
|
+
message: ACVMField[],
|
|
340
|
+
[counter]: ACVMField[],
|
|
341
|
+
): ACVMField {
|
|
342
|
+
const logPayload = Buffer.concat(message.map(fromACVMField).map(f => f.toBuffer()));
|
|
343
|
+
const log = new UnencryptedL2Log(
|
|
344
|
+
AztecAddress.fromString(contractAddress),
|
|
345
|
+
EventSelector.fromField(fromACVMField(eventSelector)),
|
|
346
|
+
logPayload,
|
|
347
|
+
);
|
|
348
|
+
|
|
349
|
+
const logHash = this.typedOracle.emitContractClassUnencryptedLog(log, +counter);
|
|
341
350
|
return toACVMField(logHash);
|
|
342
351
|
}
|
|
343
352
|
|
|
344
|
-
debugLog(...args: ACVMField[][]):
|
|
353
|
+
debugLog(...args: ACVMField[][]): void {
|
|
345
354
|
this.log.verbose(oracleDebugCallToFormattedStr(args));
|
|
346
|
-
return toACVMField(0);
|
|
347
355
|
}
|
|
348
356
|
|
|
349
|
-
debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]):
|
|
357
|
+
debugLogWithPrefix(arg0: ACVMField[], ...args: ACVMField[][]): void {
|
|
350
358
|
this.log.verbose(`${acvmFieldMessageToString(arg0)}: ${oracleDebugCallToFormattedStr(args)}`);
|
|
351
|
-
return toACVMField(0);
|
|
352
359
|
}
|
|
353
360
|
|
|
354
361
|
async callPrivateFunction(
|
|
@@ -408,6 +415,25 @@ export class Oracle {
|
|
|
408
415
|
return toAcvmEnqueuePublicFunctionResult(enqueuedRequest);
|
|
409
416
|
}
|
|
410
417
|
|
|
418
|
+
async setPublicTeardownFunctionCall(
|
|
419
|
+
[contractAddress]: ACVMField[],
|
|
420
|
+
[functionSelector]: ACVMField[],
|
|
421
|
+
[argsHash]: ACVMField[],
|
|
422
|
+
[sideEffectCounter]: ACVMField[],
|
|
423
|
+
[isStaticCall]: ACVMField[],
|
|
424
|
+
[isDelegateCall]: ACVMField[],
|
|
425
|
+
) {
|
|
426
|
+
const teardownRequest = await this.typedOracle.setPublicTeardownFunctionCall(
|
|
427
|
+
AztecAddress.fromString(contractAddress),
|
|
428
|
+
FunctionSelector.fromField(fromACVMField(functionSelector)),
|
|
429
|
+
fromACVMField(argsHash),
|
|
430
|
+
frToNumber(fromACVMField(sideEffectCounter)),
|
|
431
|
+
frToBoolean(fromACVMField(isStaticCall)),
|
|
432
|
+
frToBoolean(fromACVMField(isDelegateCall)),
|
|
433
|
+
);
|
|
434
|
+
return toAcvmEnqueuePublicFunctionResult(teardownRequest);
|
|
435
|
+
}
|
|
436
|
+
|
|
411
437
|
aes128Encrypt(input: ACVMField[], initializationVector: ACVMField[], key: ACVMField[]): ACVMField[] {
|
|
412
438
|
// Convert each field to a number and then to a buffer (1 byte is stored in 1 field)
|
|
413
439
|
const processedInput = Buffer.from(input.map(fromACVMField).map(f => f.toNumber()));
|
|
@@ -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
|
|
20
|
+
import { Fr } 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. */
|
|
@@ -93,10 +93,6 @@ export abstract class TypedOracle {
|
|
|
93
93
|
throw new OracleMethodNotAvailableError('getNullifierKeys');
|
|
94
94
|
}
|
|
95
95
|
|
|
96
|
-
getPublicKeyAndPartialAddress(_address: AztecAddress): Promise<Fr[] | undefined> {
|
|
97
|
-
throw new OracleMethodNotAvailableError('getPublicKeyAndPartialAddress');
|
|
98
|
-
}
|
|
99
|
-
|
|
100
96
|
getContractInstance(_address: AztecAddress): Promise<ContractInstance> {
|
|
101
97
|
throw new OracleMethodNotAvailableError('getContractInstance');
|
|
102
98
|
}
|
|
@@ -140,10 +136,6 @@ export abstract class TypedOracle {
|
|
|
140
136
|
throw new OracleMethodNotAvailableError('popCapsule');
|
|
141
137
|
}
|
|
142
138
|
|
|
143
|
-
getPublicKeysForAddress(_address: AztecAddress): Promise<Point[]> {
|
|
144
|
-
throw new OracleMethodNotAvailableError('getPublicKeysForAddress');
|
|
145
|
-
}
|
|
146
|
-
|
|
147
139
|
getNotes(
|
|
148
140
|
_storageSlot: Fr,
|
|
149
141
|
_numSelects: number,
|
|
@@ -197,14 +189,19 @@ export abstract class TypedOracle {
|
|
|
197
189
|
_noteTypeId: Fr,
|
|
198
190
|
_publicKey: PublicKey,
|
|
199
191
|
_log: Fr[],
|
|
200
|
-
|
|
192
|
+
_counter: number,
|
|
193
|
+
): Buffer {
|
|
201
194
|
throw new OracleMethodNotAvailableError('emitEncryptedLog');
|
|
202
195
|
}
|
|
203
196
|
|
|
204
|
-
emitUnencryptedLog(_log: UnencryptedL2Log):
|
|
197
|
+
emitUnencryptedLog(_log: UnencryptedL2Log, _counter: number): void {
|
|
205
198
|
throw new OracleMethodNotAvailableError('emitUnencryptedLog');
|
|
206
199
|
}
|
|
207
200
|
|
|
201
|
+
emitContractClassUnencryptedLog(_log: UnencryptedL2Log, _counter: number): Fr {
|
|
202
|
+
throw new OracleMethodNotAvailableError('emitContractClassUnencryptedLog');
|
|
203
|
+
}
|
|
204
|
+
|
|
208
205
|
callPrivateFunction(
|
|
209
206
|
_targetContractAddress: AztecAddress,
|
|
210
207
|
_functionSelector: FunctionSelector,
|
|
@@ -238,6 +235,17 @@ export abstract class TypedOracle {
|
|
|
238
235
|
throw new OracleMethodNotAvailableError('enqueuePublicFunctionCall');
|
|
239
236
|
}
|
|
240
237
|
|
|
238
|
+
setPublicTeardownFunctionCall(
|
|
239
|
+
_targetContractAddress: AztecAddress,
|
|
240
|
+
_functionSelector: FunctionSelector,
|
|
241
|
+
_argsHash: Fr,
|
|
242
|
+
_sideEffectCounter: number,
|
|
243
|
+
_isStaticCall: boolean,
|
|
244
|
+
_isDelegateCall: boolean,
|
|
245
|
+
): Promise<PublicCallRequest> {
|
|
246
|
+
throw new OracleMethodNotAvailableError('setPublicTeardownFunctionCall');
|
|
247
|
+
}
|
|
248
|
+
|
|
241
249
|
aes128Encrypt(_input: Buffer, _initializationVector: Buffer, _key: Buffer): Buffer {
|
|
242
250
|
throw new OracleMethodNotAvailableError('encrypt');
|
|
243
251
|
}
|
|
@@ -45,72 +45,64 @@ export class AvmExecutionEnvironment {
|
|
|
45
45
|
this.calldata = [...inputs.toFields(), ...calldata];
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
private deriveEnvironmentForNestedCallInternal(
|
|
49
49
|
targetAddress: AztecAddress,
|
|
50
50
|
calldata: Fr[],
|
|
51
|
-
|
|
52
|
-
|
|
51
|
+
functionSelector: FunctionSelector,
|
|
52
|
+
isStaticCall: boolean,
|
|
53
|
+
isDelegateCall: boolean,
|
|
54
|
+
) {
|
|
53
55
|
return new AvmExecutionEnvironment(
|
|
54
|
-
targetAddress,
|
|
56
|
+
/*address=*/ targetAddress,
|
|
55
57
|
/*storageAddress=*/ targetAddress,
|
|
56
|
-
this.address,
|
|
58
|
+
/*sender=*/ this.address,
|
|
57
59
|
this.feePerL2Gas,
|
|
58
60
|
this.feePerDaGas,
|
|
59
61
|
this.contractCallDepth,
|
|
60
62
|
this.header,
|
|
61
63
|
this.globals,
|
|
62
|
-
|
|
63
|
-
|
|
64
|
+
isStaticCall,
|
|
65
|
+
isDelegateCall,
|
|
64
66
|
calldata,
|
|
65
67
|
this.gasSettings,
|
|
66
68
|
this.transactionFee,
|
|
67
|
-
|
|
69
|
+
functionSelector,
|
|
68
70
|
);
|
|
69
71
|
}
|
|
70
72
|
|
|
71
|
-
public
|
|
72
|
-
|
|
73
|
+
public deriveEnvironmentForNestedCall(
|
|
74
|
+
targetAddress: AztecAddress,
|
|
73
75
|
calldata: Fr[],
|
|
74
|
-
|
|
76
|
+
functionSelector: FunctionSelector = FunctionSelector.empty(),
|
|
75
77
|
): AvmExecutionEnvironment {
|
|
76
|
-
return
|
|
77
|
-
|
|
78
|
-
/*storageAddress=*/ address,
|
|
79
|
-
this.sender,
|
|
80
|
-
this.feePerL2Gas,
|
|
81
|
-
this.feePerDaGas,
|
|
82
|
-
this.contractCallDepth,
|
|
83
|
-
this.header,
|
|
84
|
-
this.globals,
|
|
85
|
-
/*isStaticCall=*/ true,
|
|
86
|
-
this.isDelegateCall,
|
|
78
|
+
return this.deriveEnvironmentForNestedCallInternal(
|
|
79
|
+
targetAddress,
|
|
87
80
|
calldata,
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
81
|
+
functionSelector,
|
|
82
|
+
/*isStaticCall=*/ false,
|
|
83
|
+
/*isDelegateCall=*/ false,
|
|
91
84
|
);
|
|
92
85
|
}
|
|
93
86
|
|
|
94
|
-
public
|
|
95
|
-
|
|
87
|
+
public deriveEnvironmentForNestedStaticCall(
|
|
88
|
+
targetAddress: AztecAddress,
|
|
96
89
|
calldata: Fr[],
|
|
97
|
-
|
|
90
|
+
functionSelector: FunctionSelector,
|
|
98
91
|
): AvmExecutionEnvironment {
|
|
99
|
-
return
|
|
100
|
-
|
|
101
|
-
this.storageAddress,
|
|
102
|
-
this.sender,
|
|
103
|
-
this.feePerL2Gas,
|
|
104
|
-
this.feePerDaGas,
|
|
105
|
-
this.contractCallDepth,
|
|
106
|
-
this.header,
|
|
107
|
-
this.globals,
|
|
108
|
-
this.isStaticCall,
|
|
109
|
-
/*isDelegateCall=*/ true,
|
|
92
|
+
return this.deriveEnvironmentForNestedCallInternal(
|
|
93
|
+
targetAddress,
|
|
110
94
|
calldata,
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
95
|
+
functionSelector,
|
|
96
|
+
/*isStaticCall=*/ true,
|
|
97
|
+
/*isDelegateCall=*/ false,
|
|
114
98
|
);
|
|
115
99
|
}
|
|
100
|
+
|
|
101
|
+
public newDelegateCall(
|
|
102
|
+
_targetAddress: AztecAddress,
|
|
103
|
+
_calldata: Fr[],
|
|
104
|
+
_functionSelector: FunctionSelector,
|
|
105
|
+
): AvmExecutionEnvironment {
|
|
106
|
+
throw new Error('Delegate calls not supported!');
|
|
107
|
+
}
|
|
116
108
|
}
|
package/src/avm/avm_gas.ts
CHANGED
|
@@ -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,
|
|
@@ -122,6 +123,8 @@ export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
|
|
|
122
123
|
[Opcode.POSEIDON2]: TemporaryDefaultGasCost,
|
|
123
124
|
[Opcode.SHA256]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,
|
|
124
125
|
[Opcode.PEDERSEN]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,t
|
|
126
|
+
// Conversions
|
|
127
|
+
[Opcode.TORADIXLE]: TemporaryDefaultGasCost,
|
|
125
128
|
};
|
|
126
129
|
|
|
127
130
|
/** Returns the fixed base gas cost for a given opcode, or throws if set to dynamic. */
|
|
@@ -2,7 +2,6 @@ import { type Fr } from '@aztec/circuits.js';
|
|
|
2
2
|
|
|
3
3
|
import { type Gas, GasDimensions } from './avm_gas.js';
|
|
4
4
|
import { TaggedMemory } from './avm_memory_types.js';
|
|
5
|
-
import { AvmContractCallResults } from './avm_message_call_result.js';
|
|
6
5
|
import { OutOfGasError } from './errors.js';
|
|
7
6
|
|
|
8
7
|
/**
|
|
@@ -36,7 +35,7 @@ export class AvmMachineState {
|
|
|
36
35
|
* Signals that execution should end.
|
|
37
36
|
* AvmContext execution continues executing instructions until the machine state signals "halted"
|
|
38
37
|
*/
|
|
39
|
-
|
|
38
|
+
private halted: boolean = false;
|
|
40
39
|
/** Signals that execution has reverted normally (this does not cover exceptional halts) */
|
|
41
40
|
private reverted: boolean = false;
|
|
42
41
|
/** Output data must NOT be modified once it is set */
|
|
@@ -118,34 +117,24 @@ export class AvmMachineState {
|
|
|
118
117
|
this.output = output;
|
|
119
118
|
}
|
|
120
119
|
|
|
120
|
+
public getHalted(): boolean {
|
|
121
|
+
return this.halted;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
public getReverted(): boolean {
|
|
125
|
+
return this.reverted;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
public getOutput(): Fr[] {
|
|
129
|
+
return this.output;
|
|
130
|
+
}
|
|
131
|
+
|
|
121
132
|
/**
|
|
122
133
|
* Flag an exceptional halt. Clears gas left and sets the reverted flag. No output data.
|
|
123
134
|
*/
|
|
124
|
-
|
|
135
|
+
private exceptionalHalt() {
|
|
125
136
|
GasDimensions.forEach(dimension => (this[`${dimension}Left`] = 0));
|
|
126
137
|
this.reverted = true;
|
|
127
138
|
this.halted = true;
|
|
128
139
|
}
|
|
129
|
-
|
|
130
|
-
/**
|
|
131
|
-
* Get a summary of execution results for a halted machine state
|
|
132
|
-
* @returns summary of execution results
|
|
133
|
-
*/
|
|
134
|
-
public getResults(): AvmContractCallResults {
|
|
135
|
-
if (!this.halted) {
|
|
136
|
-
throw new Error('Execution results are not ready! Execution is ongoing.');
|
|
137
|
-
}
|
|
138
|
-
let revertReason = undefined;
|
|
139
|
-
if (this.reverted && this.output.length > 0) {
|
|
140
|
-
try {
|
|
141
|
-
// Try to interpret the output as a text string.
|
|
142
|
-
revertReason = new Error(
|
|
143
|
-
'Reverted with output: ' + String.fromCharCode(...this.output.slice(1).map(fr => fr.toNumber())),
|
|
144
|
-
);
|
|
145
|
-
} catch (e) {
|
|
146
|
-
revertReason = new Error('Reverted with non-string output');
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
return new AvmContractCallResults(this.reverted, this.output, revertReason);
|
|
150
|
-
}
|
|
151
140
|
}
|
|
@@ -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
|
|
|
@@ -1,24 +1,13 @@
|
|
|
1
1
|
import { type Fr } from '@aztec/foundation/fields';
|
|
2
2
|
|
|
3
|
+
import { type AvmRevertReason } from './errors.js';
|
|
4
|
+
|
|
3
5
|
/**
|
|
4
6
|
* Results of an contract call's execution in the AVM.
|
|
5
7
|
*/
|
|
6
8
|
export class AvmContractCallResults {
|
|
7
|
-
public
|
|
8
|
-
public readonly output: Fr[];
|
|
9
|
-
|
|
10
|
-
/** For exceptional halts */
|
|
11
|
-
public readonly revertReason: Error | undefined;
|
|
12
|
-
|
|
13
|
-
constructor(reverted: boolean, output: Fr[], revertReason?: Error) {
|
|
14
|
-
this.reverted = reverted;
|
|
15
|
-
this.output = output;
|
|
16
|
-
this.revertReason = revertReason;
|
|
17
|
-
}
|
|
9
|
+
constructor(public reverted: boolean, public output: Fr[], public revertReason?: AvmRevertReason) {}
|
|
18
10
|
|
|
19
|
-
/**
|
|
20
|
-
* Generate a string representation of call results.
|
|
21
|
-
*/
|
|
22
11
|
toString(): string {
|
|
23
12
|
let resultsStr = `reverted: ${this.reverted}, output: ${this.output}`;
|
|
24
13
|
if (this.revertReason) {
|
package/src/avm/avm_simulator.ts
CHANGED
|
@@ -2,9 +2,16 @@ 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
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
AvmExecutionError,
|
|
10
|
+
InvalidProgramCounterError,
|
|
11
|
+
NoBytecodeForContractError,
|
|
12
|
+
revertReasonFromExceptionalHalt,
|
|
13
|
+
revertReasonFromExplicitRevert,
|
|
14
|
+
} from './errors.js';
|
|
8
15
|
import type { Instruction } from './opcodes/index.js';
|
|
9
16
|
import { decodeFromBytecode } from './serialization/bytecode_serialization.js';
|
|
10
17
|
|
|
@@ -32,6 +39,7 @@ export class AvmSimulator {
|
|
|
32
39
|
if (!bytecode) {
|
|
33
40
|
throw new NoBytecodeForContractError(this.context.environment.address);
|
|
34
41
|
}
|
|
42
|
+
assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
35
43
|
|
|
36
44
|
return await this.executeBytecode(bytecode);
|
|
37
45
|
}
|
|
@@ -54,7 +62,7 @@ export class AvmSimulator {
|
|
|
54
62
|
try {
|
|
55
63
|
// Execute instruction pointed to by the current program counter
|
|
56
64
|
// continuing until the machine state signifies a halt
|
|
57
|
-
while (!machineState.
|
|
65
|
+
while (!machineState.getHalted()) {
|
|
58
66
|
const instruction = instructions[machineState.pc];
|
|
59
67
|
assert(
|
|
60
68
|
!!instruction,
|
|
@@ -74,21 +82,25 @@ export class AvmSimulator {
|
|
|
74
82
|
}
|
|
75
83
|
}
|
|
76
84
|
|
|
77
|
-
|
|
78
|
-
const
|
|
85
|
+
const output = machineState.getOutput();
|
|
86
|
+
const reverted = machineState.getReverted();
|
|
87
|
+
const revertReason = reverted ? revertReasonFromExplicitRevert(output, this.context) : undefined;
|
|
88
|
+
const results = new AvmContractCallResults(reverted, output, revertReason);
|
|
79
89
|
this.log.debug(`Context execution results: ${results.toString()}`);
|
|
90
|
+
// Return results for processing by calling context
|
|
80
91
|
return results;
|
|
81
|
-
} catch (
|
|
82
|
-
this.log.verbose('Exceptional halt');
|
|
83
|
-
if (!(
|
|
84
|
-
this.log.verbose(`Unknown error thrown by
|
|
85
|
-
throw
|
|
92
|
+
} catch (err: any) {
|
|
93
|
+
this.log.verbose('Exceptional halt (revert by something other than REVERT opcode)');
|
|
94
|
+
if (!(err instanceof AvmExecutionError)) {
|
|
95
|
+
this.log.verbose(`Unknown error thrown by AVM: ${err}`);
|
|
96
|
+
throw err;
|
|
86
97
|
}
|
|
87
98
|
|
|
88
|
-
|
|
89
|
-
// Note: "exceptional halts" cannot return data
|
|
90
|
-
const results = new AvmContractCallResults(/*reverted=*/ true, /*output=*/ [],
|
|
99
|
+
const revertReason = revertReasonFromExceptionalHalt(err, this.context);
|
|
100
|
+
// Note: "exceptional halts" cannot return data, hence []
|
|
101
|
+
const results = new AvmContractCallResults(/*reverted=*/ true, /*output=*/ [], revertReason);
|
|
91
102
|
this.log.debug(`Context execution results: ${results.toString()}`);
|
|
103
|
+
// Return results for processing by calling context
|
|
92
104
|
return results;
|
|
93
105
|
}
|
|
94
106
|
}
|