@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.
- package/dest/acvm/acvm.js +2 -2
- package/dest/acvm/oracle/oracle.d.ts +1 -1
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +3 -3
- 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 +8 -7
- package/dest/avm/avm_memory_types.js +5 -5
- package/dest/avm/avm_simulator.js +6 -6
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +3 -3
- package/dest/avm/journal/journal.d.ts +14 -13
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +5 -5
- package/dest/avm/journal/trace.d.ts +8 -19
- package/dest/avm/journal/trace.d.ts.map +1 -1
- package/dest/avm/journal/trace.js +48 -116
- package/dest/avm/journal/trace_types.d.ts +23 -4
- package/dest/avm/journal/trace_types.d.ts.map +1 -1
- package/dest/avm/opcodes/accrued_substate.js +2 -2
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +20 -5
- package/dest/client/client_execution_context.d.ts +2 -2
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +6 -6
- package/dest/client/private_execution.d.ts +1 -1
- package/dest/client/private_execution.d.ts.map +1 -1
- package/dest/client/private_execution.js +3 -3
- package/dest/client/unconstrained_execution.d.ts +1 -1
- package/dest/client/unconstrained_execution.d.ts.map +1 -1
- package/dest/client/unconstrained_execution.js +2 -2
- package/dest/client/view_data_oracle.d.ts +2 -2
- package/dest/client/view_data_oracle.d.ts.map +1 -1
- package/dest/client/view_data_oracle.js +2 -2
- package/dest/public/executor.d.ts +1 -15
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +70 -77
- package/dest/public/public_execution_context.d.ts +6 -6
- package/dest/public/public_execution_context.d.ts.map +1 -1
- package/dest/public/public_execution_context.js +8 -12
- package/dest/public/transitional_adaptors.d.ts +32 -0
- package/dest/public/transitional_adaptors.d.ts.map +1 -0
- package/dest/public/transitional_adaptors.js +161 -0
- package/package.json +5 -5
- package/src/acvm/acvm.ts +1 -1
- package/src/acvm/oracle/oracle.ts +2 -2
- package/src/avm/avm_execution_environment.ts +9 -17
- package/src/avm/avm_memory_types.ts +4 -4
- package/src/avm/avm_simulator.ts +5 -5
- package/src/avm/fixtures/index.ts +2 -1
- package/src/avm/journal/journal.ts +24 -17
- package/src/avm/journal/trace.ts +59 -121
- package/src/avm/journal/trace_types.ts +39 -39
- package/src/avm/opcodes/accrued_substate.ts +1 -1
- package/src/avm/opcodes/external_calls.ts +24 -4
- package/src/client/client_execution_context.ts +5 -5
- package/src/client/private_execution.ts +2 -2
- package/src/client/unconstrained_execution.ts +1 -1
- package/src/client/view_data_oracle.ts +1 -1
- package/src/public/executor.ts +82 -87
- package/src/public/public_execution_context.ts +14 -19
- package/src/public/transitional_adaptors.ts +240 -0
- package/dest/avm/temporary_executor_migration.d.ts +0 -27
- package/dest/avm/temporary_executor_migration.d.ts.map +0 -1
- package/dest/avm/temporary_executor_migration.js +0 -94
- 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.
|
|
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.
|
|
41
|
-
"@aztec/circuits.js": "0.
|
|
42
|
-
"@aztec/foundation": "0.
|
|
43
|
-
"@aztec/types": "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
|
-
|
|
51
|
+
targetAddress: AztecAddress,
|
|
63
52
|
calldata: Fr[],
|
|
64
53
|
temporaryFunctionSelector: FunctionSelector = FunctionSelector.empty(),
|
|
65
54
|
): AvmExecutionEnvironment {
|
|
66
55
|
return new AvmExecutionEnvironment(
|
|
67
|
-
|
|
68
|
-
/*storageAddress=*/
|
|
56
|
+
targetAddress,
|
|
57
|
+
/*storageAddress=*/ targetAddress,
|
|
69
58
|
this.origin,
|
|
70
|
-
this.
|
|
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 {
|
package/src/avm/avm_simulator.ts
CHANGED
|
@@ -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 {
|
|
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:
|
|
28
|
+
newNoteHashes: TracedNoteHash[];
|
|
18
29
|
nullifierChecks: TracedNullifierCheck[];
|
|
19
|
-
newNullifiers:
|
|
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
|
-
|
|
56
|
+
public publicStorage: PublicStorage;
|
|
50
57
|
/** Nullifier set, including cached/recently-emitted nullifiers */
|
|
51
|
-
|
|
58
|
+
public nullifiers: Nullifiers;
|
|
52
59
|
|
|
53
60
|
/** World State Access Trace */
|
|
54
|
-
|
|
61
|
+
public trace: WorldStateAccessTrace;
|
|
55
62
|
|
|
56
63
|
/** Accrued Substate **/
|
|
57
|
-
|
|
58
|
-
|
|
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 [
|
|
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(
|
|
129
|
+
public writeNoteHash(storageAddress: Fr, noteHash: Fr) {
|
|
130
|
+
this.trace.traceNewNoteHash(storageAddress, noteHash);
|
|
124
131
|
}
|
|
125
132
|
|
|
126
133
|
/**
|