@aztec/simulator 0.33.0 → 0.35.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 +4 -1
- package/dest/acvm/acvm.d.ts.map +1 -1
- package/dest/acvm/acvm.js +5 -5
- package/dest/acvm/deserialize.d.ts +3 -5
- package/dest/acvm/deserialize.d.ts.map +1 -1
- package/dest/acvm/deserialize.js +6 -9
- package/dest/acvm/oracle/oracle.d.ts +3 -1
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +14 -6
- package/dest/acvm/oracle/typed_oracle.d.ts +2 -0
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +7 -1
- package/dest/avm/avm_execution_environment.d.ts +6 -3
- package/dest/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/avm/avm_execution_environment.js +12 -9
- package/dest/avm/avm_gas.js +2 -2
- package/dest/avm/avm_machine_state.d.ts +2 -0
- package/dest/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/avm/avm_machine_state.js +24 -6
- package/dest/avm/avm_memory_types.js +6 -6
- package/dest/avm/avm_simulator.js +7 -7
- package/dest/avm/fixtures/index.d.ts +3 -0
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +11 -4
- package/dest/avm/journal/journal.d.ts +15 -13
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +16 -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.d.ts +2 -1
- package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/avm/opcodes/accrued_substate.js +14 -6
- package/dest/avm/opcodes/context_getters.js +2 -2
- package/dest/avm/opcodes/external_calls.d.ts +2 -2
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +26 -10
- package/dest/avm/opcodes/hashing.d.ts +8 -8
- package/dest/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/avm/opcodes/hashing.js +35 -43
- package/dest/avm/serialization/instruction_serialization.d.ts +1 -1
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/instruction_serialization.js +2 -2
- package/dest/client/client_execution_context.d.ts +14 -4
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +28 -13
- 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 +10 -8
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +6 -5
- 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 +6 -5
- 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/common/index.d.ts +1 -1
- package/dest/common/index.d.ts.map +1 -1
- package/dest/common/index.js +2 -2
- package/dest/common/packed_values_cache.d.ts +28 -0
- package/dest/common/packed_values_cache.d.ts.map +1 -0
- package/dest/common/packed_values_cache.js +50 -0
- 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 +42 -0
- package/dest/mocks/fixtures.d.ts.map +1 -0
- package/dest/mocks/fixtures.js +84 -0
- package/dest/mocks/index.d.ts +2 -0
- package/dest/mocks/index.d.ts.map +1 -0
- package/dest/mocks/index.js +2 -0
- package/dest/public/abstract_phase_manager.d.ts +82 -0
- package/dest/public/abstract_phase_manager.d.ts.map +1 -0
- package/dest/public/abstract_phase_manager.js +320 -0
- package/dest/public/app_logic_phase_manager.d.ts +29 -0
- package/dest/public/app_logic_phase_manager.d.ts.map +1 -0
- package/dest/public/app_logic_phase_manager.js +50 -0
- package/dest/public/execution.d.ts +3 -0
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +1 -1
- package/dest/public/executor.d.ts +1 -15
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +80 -83
- package/dest/public/hints_builder.d.ts +23 -0
- package/dest/public/hints_builder.d.ts.map +1 -0
- package/dest/public/hints_builder.js +62 -0
- package/dest/public/index.d.ts +5 -0
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +6 -1
- package/dest/public/phase_manager_factory.d.ts +18 -0
- package/dest/public/phase_manager_factory.d.ts.map +1 -0
- package/dest/public/phase_manager_factory.js +56 -0
- package/dest/public/public_execution_context.d.ts +20 -10
- package/dest/public/public_execution_context.d.ts.map +1 -1
- package/dest/public/public_execution_context.js +35 -23
- package/dest/public/public_executor.d.ts +79 -0
- package/dest/public/public_executor.d.ts.map +1 -0
- package/dest/public/public_executor.js +198 -0
- package/dest/public/public_kernel.d.ts +37 -0
- package/dest/public/public_kernel.d.ts.map +1 -0
- package/dest/public/public_kernel.js +97 -0
- package/dest/public/public_kernel_circuit_simulator.d.ts +31 -0
- package/dest/public/public_kernel_circuit_simulator.d.ts.map +1 -0
- package/dest/public/public_kernel_circuit_simulator.js +2 -0
- package/dest/public/public_processor.d.ts +53 -0
- package/dest/public/public_processor.d.ts.map +1 -0
- package/dest/public/public_processor.js +144 -0
- package/dest/public/setup_phase_manager.d.ts +30 -0
- package/dest/public/setup_phase_manager.d.ts.map +1 -0
- package/dest/public/setup_phase_manager.js +46 -0
- package/dest/public/tail_phase_manager.d.ts +30 -0
- package/dest/public/tail_phase_manager.d.ts.map +1 -0
- package/dest/public/tail_phase_manager.js +60 -0
- package/dest/public/teardown_phase_manager.d.ts +30 -0
- package/dest/public/teardown_phase_manager.d.ts.map +1 -0
- package/dest/public/teardown_phase_manager.js +46 -0
- package/dest/public/transitional_adaptors.d.ts +33 -0
- package/dest/public/transitional_adaptors.d.ts.map +1 -0
- package/dest/public/transitional_adaptors.js +162 -0
- package/dest/public/utils.d.ts +8 -0
- package/dest/public/utils.d.ts.map +1 -0
- package/dest/public/utils.js +29 -0
- package/dest/simulator/acvm_native.d.ts +19 -3
- package/dest/simulator/acvm_native.d.ts.map +1 -1
- package/dest/simulator/acvm_native.js +75 -48
- package/dest/simulator/acvm_wasm.d.ts.map +1 -1
- package/dest/simulator/acvm_wasm.js +3 -4
- package/package.json +8 -5
- package/src/acvm/acvm.ts +8 -5
- package/src/acvm/deserialize.ts +5 -9
- package/src/acvm/oracle/oracle.ts +15 -5
- package/src/acvm/oracle/typed_oracle.ts +8 -0
- package/src/avm/avm_execution_environment.ts +17 -17
- package/src/avm/avm_gas.ts +1 -1
- package/src/avm/avm_machine_state.ts +26 -5
- package/src/avm/avm_memory_types.ts +5 -5
- package/src/avm/avm_simulator.ts +6 -6
- package/src/avm/fixtures/index.ts +14 -1
- package/src/avm/journal/journal.ts +37 -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 +17 -5
- package/src/avm/opcodes/context_getters.ts +1 -1
- package/src/avm/opcodes/external_calls.ts +32 -9
- package/src/avm/opcodes/hashing.ts +38 -54
- package/src/avm/serialization/instruction_serialization.ts +1 -1
- package/src/client/client_execution_context.ts +30 -11
- package/src/client/private_execution.ts +9 -8
- package/src/client/simulator.ts +7 -3
- package/src/client/unconstrained_execution.ts +5 -4
- package/src/client/view_data_oracle.ts +1 -1
- package/src/common/index.ts +1 -1
- package/src/common/packed_values_cache.ts +55 -0
- package/src/index.ts +1 -0
- package/src/mocks/fixtures.ts +169 -0
- package/src/mocks/index.ts +1 -0
- package/src/public/abstract_phase_manager.ts +571 -0
- package/src/public/app_logic_phase_manager.ts +76 -0
- package/src/public/execution.ts +4 -0
- package/src/public/executor.ts +93 -93
- package/src/public/hints_builder.ts +119 -0
- package/src/public/index.ts +5 -0
- package/src/public/phase_manager_factory.ts +126 -0
- package/src/public/public_execution_context.ts +43 -37
- package/src/public/public_executor.ts +267 -0
- package/src/public/public_kernel.ts +139 -0
- package/src/public/public_kernel_circuit_simulator.ts +36 -0
- package/src/public/public_processor.ts +212 -0
- package/src/public/setup_phase_manager.ts +66 -0
- package/src/public/tail_phase_manager.ts +120 -0
- package/src/public/teardown_phase_manager.ts +66 -0
- package/src/public/transitional_adaptors.ts +249 -0
- package/src/public/utils.ts +31 -0
- package/src/simulator/acvm_native.ts +94 -47
- package/src/simulator/acvm_wasm.ts +7 -3
- 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/dest/common/packed_args_cache.d.ts +0 -28
- package/dest/common/packed_args_cache.d.ts.map +0 -1
- package/dest/common/packed_args_cache.js +0 -50
- package/src/avm/temporary_executor_migration.ts +0 -136
- package/src/common/packed_args_cache.ts +0 -55
|
@@ -89,6 +89,14 @@ export abstract class TypedOracle {
|
|
|
89
89
|
throw new OracleMethodNotAvailableError('packArguments');
|
|
90
90
|
}
|
|
91
91
|
|
|
92
|
+
packReturns(_returns: Fr[]): Promise<Fr> {
|
|
93
|
+
throw new OracleMethodNotAvailableError('packReturns');
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
unpackReturns(_returnsHash: Fr): Promise<Fr[]> {
|
|
97
|
+
throw new OracleMethodNotAvailableError('unpackReturns');
|
|
98
|
+
}
|
|
99
|
+
|
|
92
100
|
getNullifierKeyPair(_accountAddress: AztecAddress): Promise<KeyPair> {
|
|
93
101
|
throw new OracleMethodNotAvailableError('getNullifierKeyPair');
|
|
94
102
|
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FunctionSelector, type GlobalVariables } from '@aztec/circuits.js';
|
|
1
|
+
import { FunctionSelector, type GasSettings, type GlobalVariables, type Header } from '@aztec/circuits.js';
|
|
2
2
|
import { computeVarArgsHash } from '@aztec/circuits.js/hash';
|
|
3
3
|
import { type AztecAddress } from '@aztec/foundation/aztec-address';
|
|
4
4
|
import { type EthAddress } from '@aztec/foundation/eth-address';
|
|
@@ -22,30 +22,21 @@ 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[],
|
|
38
|
+
public readonly gasSettings: GasSettings,
|
|
39
|
+
public readonly transactionFee: Fr,
|
|
49
40
|
|
|
50
41
|
// Function selector is temporary since eventually public contract bytecode will be one blob
|
|
51
42
|
// containing all functions, and function selector will become an application-level mechanism
|
|
@@ -59,24 +50,27 @@ export class AvmExecutionEnvironment {
|
|
|
59
50
|
}
|
|
60
51
|
|
|
61
52
|
public deriveEnvironmentForNestedCall(
|
|
62
|
-
|
|
53
|
+
targetAddress: AztecAddress,
|
|
63
54
|
calldata: Fr[],
|
|
64
55
|
temporaryFunctionSelector: FunctionSelector = FunctionSelector.empty(),
|
|
65
56
|
): AvmExecutionEnvironment {
|
|
66
57
|
return new AvmExecutionEnvironment(
|
|
67
|
-
|
|
68
|
-
/*storageAddress=*/
|
|
58
|
+
targetAddress,
|
|
59
|
+
/*storageAddress=*/ targetAddress,
|
|
69
60
|
this.origin,
|
|
70
|
-
this.
|
|
61
|
+
this.address,
|
|
71
62
|
this.portal,
|
|
72
63
|
this.feePerL1Gas,
|
|
73
64
|
this.feePerL2Gas,
|
|
74
65
|
this.feePerDaGas,
|
|
75
66
|
this.contractCallDepth,
|
|
67
|
+
this.header,
|
|
76
68
|
this.globals,
|
|
77
69
|
this.isStaticCall,
|
|
78
70
|
this.isDelegateCall,
|
|
79
71
|
calldata,
|
|
72
|
+
this.gasSettings,
|
|
73
|
+
this.transactionFee,
|
|
80
74
|
temporaryFunctionSelector,
|
|
81
75
|
);
|
|
82
76
|
}
|
|
@@ -96,10 +90,13 @@ export class AvmExecutionEnvironment {
|
|
|
96
90
|
this.feePerL2Gas,
|
|
97
91
|
this.feePerDaGas,
|
|
98
92
|
this.contractCallDepth,
|
|
93
|
+
this.header,
|
|
99
94
|
this.globals,
|
|
100
95
|
/*isStaticCall=*/ true,
|
|
101
96
|
this.isDelegateCall,
|
|
102
97
|
calldata,
|
|
98
|
+
this.gasSettings,
|
|
99
|
+
this.transactionFee,
|
|
103
100
|
temporaryFunctionSelector,
|
|
104
101
|
);
|
|
105
102
|
}
|
|
@@ -119,10 +116,13 @@ export class AvmExecutionEnvironment {
|
|
|
119
116
|
this.feePerL2Gas,
|
|
120
117
|
this.feePerDaGas,
|
|
121
118
|
this.contractCallDepth,
|
|
119
|
+
this.header,
|
|
122
120
|
this.globals,
|
|
123
121
|
this.isStaticCall,
|
|
124
122
|
/*isDelegateCall=*/ true,
|
|
125
123
|
calldata,
|
|
124
|
+
this.gasSettings,
|
|
125
|
+
this.transactionFee,
|
|
126
126
|
temporaryFunctionSelector,
|
|
127
127
|
);
|
|
128
128
|
}
|
package/src/avm/avm_gas.ts
CHANGED
|
@@ -127,7 +127,7 @@ export const GasCosts: Record<Opcode, Gas | typeof DynamicGasCost> = {
|
|
|
127
127
|
[Opcode.REVERT]: TemporaryDefaultGasCost,
|
|
128
128
|
// Gadgets
|
|
129
129
|
[Opcode.KECCAK]: TemporaryDefaultGasCost,
|
|
130
|
-
[Opcode.
|
|
130
|
+
[Opcode.POSEIDON2]: TemporaryDefaultGasCost,
|
|
131
131
|
[Opcode.SHA256]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,
|
|
132
132
|
[Opcode.PEDERSEN]: TemporaryDefaultGasCost, // temp - may be removed, but alot of contracts rely on i: TemporaryDefaultGasCost,t
|
|
133
133
|
};
|
|
@@ -44,10 +44,20 @@ export class AvmMachineState {
|
|
|
44
44
|
/** Output data must NOT be modified once it is set */
|
|
45
45
|
private output: Fr[] = [];
|
|
46
46
|
|
|
47
|
-
constructor(
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
47
|
+
constructor(gasLeft: Gas);
|
|
48
|
+
constructor(l1GasLeft: number, l2GasLeft: number, daGasLeft: number);
|
|
49
|
+
constructor(gasLeftOrL1GasLeft: Gas | number, l2GasLeft?: number, daGasLeft?: number) {
|
|
50
|
+
if (typeof gasLeftOrL1GasLeft === 'object') {
|
|
51
|
+
({ l1Gas: this.l1GasLeft, l2Gas: this.l2GasLeft, daGas: this.daGasLeft } = gasLeftOrL1GasLeft);
|
|
52
|
+
} else {
|
|
53
|
+
this.l1GasLeft = gasLeftOrL1GasLeft;
|
|
54
|
+
this.l2GasLeft = l2GasLeft!;
|
|
55
|
+
this.daGasLeft = daGasLeft!;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
public get gasLeft(): Gas {
|
|
60
|
+
return { l1Gas: this.l1GasLeft, l2Gas: this.l2GasLeft, daGas: this.daGasLeft };
|
|
51
61
|
}
|
|
52
62
|
|
|
53
63
|
public static fromState(state: InitialAvmMachineState): AvmMachineState {
|
|
@@ -128,6 +138,17 @@ export class AvmMachineState {
|
|
|
128
138
|
if (!this.halted) {
|
|
129
139
|
throw new Error('Execution results are not ready! Execution is ongoing.');
|
|
130
140
|
}
|
|
131
|
-
|
|
141
|
+
let revertReason = undefined;
|
|
142
|
+
if (this.reverted && this.output.length > 0) {
|
|
143
|
+
try {
|
|
144
|
+
// Try to interpret the output as a text string.
|
|
145
|
+
revertReason = new Error(
|
|
146
|
+
'Reverted with output: ' + String.fromCharCode(...this.output.map(fr => fr.toNumber())),
|
|
147
|
+
);
|
|
148
|
+
} catch (e) {
|
|
149
|
+
revertReason = new Error('Reverted with non-string output');
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return new AvmContractCallResults(this.reverted, this.output, revertReason);
|
|
132
153
|
}
|
|
133
154
|
}
|
|
@@ -238,9 +238,9 @@ 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
|
-
TaggedMemory.log.
|
|
243
|
+
TaggedMemory.log.debug(`WARNING: Memory at offset ${offset} is undefined!`);
|
|
244
244
|
}
|
|
245
245
|
return word as T;
|
|
246
246
|
}
|
|
@@ -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
|
@@ -62,33 +62,33 @@ export class AvmSimulator {
|
|
|
62
62
|
);
|
|
63
63
|
|
|
64
64
|
const gasLeft = `l1=${machineState.l1GasLeft} l2=${machineState.l2GasLeft} da=${machineState.daGasLeft}`;
|
|
65
|
-
this.log.debug(`@${machineState.pc}
|
|
65
|
+
this.log.debug(`@${machineState.pc} ${instruction.toString()} (${gasLeft})`);
|
|
66
66
|
// Execute the instruction.
|
|
67
67
|
// Normal returns and reverts will return normally here.
|
|
68
68
|
// "Exceptional halts" will throw.
|
|
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 { GasFees, GasSettings, 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';
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
import { AvmContext } from '../avm_context.js';
|
|
18
18
|
import { AvmContextInputs, AvmExecutionEnvironment } from '../avm_execution_environment.js';
|
|
19
19
|
import { AvmMachineState } from '../avm_machine_state.js';
|
|
20
|
+
import { Field, Uint8 } from '../avm_memory_types.js';
|
|
20
21
|
import { HostStorage } from '../journal/host_storage.js';
|
|
21
22
|
import { AvmPersistableStateManager } from '../journal/journal.js';
|
|
22
23
|
|
|
@@ -67,10 +68,13 @@ export function initExecutionEnvironment(overrides?: Partial<AvmExecutionEnviron
|
|
|
67
68
|
overrides?.feePerL2Gas ?? Fr.zero(),
|
|
68
69
|
overrides?.feePerDaGas ?? Fr.zero(),
|
|
69
70
|
overrides?.contractCallDepth ?? Fr.zero(),
|
|
71
|
+
overrides?.header ?? Header.empty(),
|
|
70
72
|
overrides?.globals ?? GlobalVariables.empty(),
|
|
71
73
|
overrides?.isStaticCall ?? false,
|
|
72
74
|
overrides?.isDelegateCall ?? false,
|
|
73
75
|
overrides?.calldata ?? [],
|
|
76
|
+
overrides?.gasSettings ?? GasSettings.empty(),
|
|
77
|
+
overrides?.transactionFee ?? Fr.ZERO,
|
|
74
78
|
overrides?.temporaryFunctionSelector ?? FunctionSelector.empty(),
|
|
75
79
|
);
|
|
76
80
|
}
|
|
@@ -86,6 +90,7 @@ export function initGlobalVariables(overrides?: Partial<GlobalVariables>): Globa
|
|
|
86
90
|
overrides?.timestamp ?? Fr.zero(),
|
|
87
91
|
overrides?.coinbase ?? EthAddress.ZERO,
|
|
88
92
|
overrides?.feeRecipient ?? AztecAddress.zero(),
|
|
93
|
+
overrides?.gasFees ?? GasFees.empty(),
|
|
89
94
|
);
|
|
90
95
|
}
|
|
91
96
|
|
|
@@ -134,3 +139,11 @@ export function anyAvmContextInputs() {
|
|
|
134
139
|
}
|
|
135
140
|
return tv;
|
|
136
141
|
}
|
|
142
|
+
|
|
143
|
+
export function randomMemoryBytes(length: number): Uint8[] {
|
|
144
|
+
return [...Array(length)].map(_ => new Uint8(Math.floor(Math.random() * 255)));
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export function randomMemoryFields(length: number): Field[] {
|
|
148
|
+
return [...Array(length)].map(_ => new Field(Fr.random()));
|
|
149
|
+
}
|
|
@@ -2,21 +2,33 @@ import { UnencryptedL2Log } from '@aztec/circuit-types';
|
|
|
2
2
|
import { AztecAddress, EthAddress, L2ToL1Message } from '@aztec/circuits.js';
|
|
3
3
|
import { EventSelector } from '@aztec/foundation/abi';
|
|
4
4
|
import { Fr } from '@aztec/foundation/fields';
|
|
5
|
+
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
5
6
|
|
|
6
7
|
import { type HostStorage } from './host_storage.js';
|
|
7
8
|
import { Nullifiers } from './nullifiers.js';
|
|
8
9
|
import { PublicStorage } from './public_storage.js';
|
|
9
10
|
import { WorldStateAccessTrace } from './trace.js';
|
|
10
|
-
import {
|
|
11
|
+
import {
|
|
12
|
+
type TracedL1toL2MessageCheck,
|
|
13
|
+
type TracedNoteHash,
|
|
14
|
+
type TracedNoteHashCheck,
|
|
15
|
+
type TracedNullifier,
|
|
16
|
+
type TracedNullifierCheck,
|
|
17
|
+
type TracedPublicStorageRead,
|
|
18
|
+
type TracedPublicStorageWrite,
|
|
19
|
+
} from './trace_types.js';
|
|
11
20
|
|
|
12
21
|
/**
|
|
13
22
|
* Data held within the journal
|
|
14
23
|
*/
|
|
15
24
|
export type JournalData = {
|
|
25
|
+
storageWrites: TracedPublicStorageWrite[];
|
|
26
|
+
storageReads: TracedPublicStorageRead[];
|
|
27
|
+
|
|
16
28
|
noteHashChecks: TracedNoteHashCheck[];
|
|
17
|
-
newNoteHashes:
|
|
29
|
+
newNoteHashes: TracedNoteHash[];
|
|
18
30
|
nullifierChecks: TracedNullifierCheck[];
|
|
19
|
-
newNullifiers:
|
|
31
|
+
newNullifiers: TracedNullifier[];
|
|
20
32
|
l1ToL2MessageChecks: TracedL1toL2MessageCheck[];
|
|
21
33
|
|
|
22
34
|
newL1Messages: L2ToL1Message[];
|
|
@@ -24,11 +36,6 @@ export type JournalData = {
|
|
|
24
36
|
|
|
25
37
|
/** contract address -\> key -\> value */
|
|
26
38
|
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
39
|
};
|
|
33
40
|
|
|
34
41
|
/**
|
|
@@ -41,21 +48,23 @@ export type JournalData = {
|
|
|
41
48
|
* Manages merging of successful/reverted child state into current state.
|
|
42
49
|
*/
|
|
43
50
|
export class AvmPersistableStateManager {
|
|
51
|
+
private readonly log: DebugLogger = createDebugLogger('aztec:avm_simulator:state_manager');
|
|
44
52
|
/** Reference to node storage */
|
|
45
53
|
public readonly hostStorage: HostStorage;
|
|
46
54
|
|
|
55
|
+
// TODO: make members private once this is not used in transitional_adaptors.ts.
|
|
47
56
|
/** World State */
|
|
48
57
|
/** Public storage, including cached writes */
|
|
49
|
-
|
|
58
|
+
public publicStorage: PublicStorage;
|
|
50
59
|
/** Nullifier set, including cached/recently-emitted nullifiers */
|
|
51
|
-
|
|
60
|
+
public nullifiers: Nullifiers;
|
|
52
61
|
|
|
53
62
|
/** World State Access Trace */
|
|
54
|
-
|
|
63
|
+
public trace: WorldStateAccessTrace;
|
|
55
64
|
|
|
56
65
|
/** Accrued Substate **/
|
|
57
|
-
|
|
58
|
-
|
|
66
|
+
public newL1Messages: L2ToL1Message[] = [];
|
|
67
|
+
public newLogs: UnencryptedL2Log[] = [];
|
|
59
68
|
|
|
60
69
|
constructor(hostStorage: HostStorage, parent?: AvmPersistableStateManager) {
|
|
61
70
|
this.hostStorage = hostStorage;
|
|
@@ -79,6 +88,7 @@ export class AvmPersistableStateManager {
|
|
|
79
88
|
* @param value - the value being written to the slot
|
|
80
89
|
*/
|
|
81
90
|
public writeStorage(storageAddress: Fr, slot: Fr, value: Fr) {
|
|
91
|
+
this.log.debug(`storage(${storageAddress})@${slot} <- ${value}`);
|
|
82
92
|
// Cache storage writes for later reference/reads
|
|
83
93
|
this.publicStorage.write(storageAddress, slot, value);
|
|
84
94
|
// Trace all storage writes (even reverted ones)
|
|
@@ -93,9 +103,10 @@ export class AvmPersistableStateManager {
|
|
|
93
103
|
* @returns the latest value written to slot, or 0 if never written to before
|
|
94
104
|
*/
|
|
95
105
|
public async readStorage(storageAddress: Fr, slot: Fr): Promise<Fr> {
|
|
96
|
-
const [
|
|
106
|
+
const [exists, value] = await this.publicStorage.read(storageAddress, slot);
|
|
107
|
+
this.log.debug(`storage(${storageAddress})@${slot} ?? value: ${value}, exists: ${exists}.`);
|
|
97
108
|
// We want to keep track of all performed reads (even reverted ones)
|
|
98
|
-
this.trace.tracePublicStorageRead(storageAddress, slot, value);
|
|
109
|
+
this.trace.tracePublicStorageRead(storageAddress, slot, value, exists);
|
|
99
110
|
return Promise.resolve(value);
|
|
100
111
|
}
|
|
101
112
|
|
|
@@ -111,6 +122,7 @@ export class AvmPersistableStateManager {
|
|
|
111
122
|
public async checkNoteHashExists(storageAddress: Fr, noteHash: Fr, leafIndex: Fr): Promise<boolean> {
|
|
112
123
|
const gotLeafIndex = await this.hostStorage.commitmentsDb.getCommitmentIndex(noteHash);
|
|
113
124
|
const exists = gotLeafIndex === leafIndex.toBigInt();
|
|
125
|
+
this.log.debug(`noteHashes(${storageAddress})@${noteHash} ?? leafIndex: ${leafIndex}, exists: ${exists}.`);
|
|
114
126
|
this.trace.traceNoteHashCheck(storageAddress, noteHash, exists, leafIndex);
|
|
115
127
|
return Promise.resolve(exists);
|
|
116
128
|
}
|
|
@@ -119,8 +131,9 @@ export class AvmPersistableStateManager {
|
|
|
119
131
|
* Write a note hash, trace the write.
|
|
120
132
|
* @param noteHash - the unsiloed note hash to write
|
|
121
133
|
*/
|
|
122
|
-
public writeNoteHash(noteHash: Fr) {
|
|
123
|
-
this.
|
|
134
|
+
public writeNoteHash(storageAddress: Fr, noteHash: Fr) {
|
|
135
|
+
this.log.debug(`noteHashes(${storageAddress}) += @${noteHash}.`);
|
|
136
|
+
this.trace.traceNewNoteHash(storageAddress, noteHash);
|
|
124
137
|
}
|
|
125
138
|
|
|
126
139
|
/**
|
|
@@ -131,6 +144,9 @@ export class AvmPersistableStateManager {
|
|
|
131
144
|
*/
|
|
132
145
|
public async checkNullifierExists(storageAddress: Fr, nullifier: Fr): Promise<boolean> {
|
|
133
146
|
const [exists, isPending, leafIndex] = await this.nullifiers.checkExists(storageAddress, nullifier);
|
|
147
|
+
this.log.debug(
|
|
148
|
+
`nullifiers(${storageAddress})@${nullifier} ?? leafIndex: ${leafIndex}, pending: ${isPending}, exists: ${exists}.`,
|
|
149
|
+
);
|
|
134
150
|
this.trace.traceNullifierCheck(storageAddress, nullifier, exists, isPending, leafIndex);
|
|
135
151
|
return Promise.resolve(exists);
|
|
136
152
|
}
|
|
@@ -141,6 +157,7 @@ export class AvmPersistableStateManager {
|
|
|
141
157
|
* @param nullifier - the unsiloed nullifier to write
|
|
142
158
|
*/
|
|
143
159
|
public async writeNullifier(storageAddress: Fr, nullifier: Fr) {
|
|
160
|
+
this.log.debug(`nullifiers(${storageAddress}) += ${nullifier}.`);
|
|
144
161
|
// Cache pending nullifiers for later access
|
|
145
162
|
await this.nullifiers.append(storageAddress, nullifier);
|
|
146
163
|
// Trace all nullifier creations (even reverted ones)
|
|
@@ -171,6 +188,7 @@ export class AvmPersistableStateManager {
|
|
|
171
188
|
// error getting message - doesn't exist!
|
|
172
189
|
exists = false;
|
|
173
190
|
}
|
|
191
|
+
this.log.debug(`l1ToL2Messages(${msgHash})@${msgLeafIndex} ?? exists: ${exists}.`);
|
|
174
192
|
this.trace.traceL1ToL2MessageCheck(msgHash, msgLeafIndex, exists);
|
|
175
193
|
return Promise.resolve(exists);
|
|
176
194
|
}
|
|
@@ -181,11 +199,13 @@ export class AvmPersistableStateManager {
|
|
|
181
199
|
* @param content - Message content.
|
|
182
200
|
*/
|
|
183
201
|
public writeL1Message(recipient: EthAddress | Fr, content: Fr) {
|
|
202
|
+
this.log.debug(`L1Messages(${recipient}) += ${content}.`);
|
|
184
203
|
const recipientAddress = recipient instanceof EthAddress ? recipient : EthAddress.fromField(recipient);
|
|
185
204
|
this.newL1Messages.push(new L2ToL1Message(recipientAddress, content));
|
|
186
205
|
}
|
|
187
206
|
|
|
188
207
|
public writeLog(contractAddress: Fr, event: Fr, log: Fr[]) {
|
|
208
|
+
this.log.debug(`UnencryptedL2Log(${contractAddress}) += event ${event} with ${log.length} fields.`);
|
|
189
209
|
this.newLogs.push(
|
|
190
210
|
new UnencryptedL2Log(
|
|
191
211
|
AztecAddress.fromField(contractAddress),
|