@aztec/simulator 0.86.0 → 0.87.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/common/errors.d.ts +3 -6
- package/dest/common/errors.d.ts.map +1 -1
- package/dest/common/errors.js +50 -31
- package/dest/private/acvm/acvm.d.ts +0 -2
- package/dest/private/acvm/acvm.d.ts.map +1 -1
- package/dest/private/acvm/acvm.js +2 -2
- package/dest/private/acvm/deserialize.d.ts +0 -2
- package/dest/private/acvm/deserialize.d.ts.map +1 -1
- package/dest/private/acvm/oracle/oracle.d.ts +2 -2
- package/dest/private/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/private/acvm/oracle/oracle.js +30 -33
- package/dest/private/acvm/oracle/typed_oracle.d.ts +1 -3
- package/dest/private/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/private/acvm/serialize.d.ts +8 -2
- package/dest/private/acvm/serialize.d.ts.map +1 -1
- package/dest/private/acvm/serialize.js +26 -0
- package/dest/private/index.d.ts +3 -0
- package/dest/private/index.d.ts.map +1 -1
- package/dest/private/index.js +3 -0
- package/dest/private/private_execution.d.ts.map +1 -1
- package/dest/private/private_execution.js +7 -1
- package/dest/private/providers/acvm_native.d.ts +0 -2
- package/dest/private/providers/acvm_native.d.ts.map +1 -1
- package/dest/private/providers/acvm_native.js +1 -1
- package/dest/private/providers/circuit_recording/circuit_recorder.d.ts +0 -2
- package/dest/private/providers/circuit_recording/circuit_recorder.d.ts.map +1 -1
- package/dest/private/providers/simulation_provider.d.ts.map +1 -1
- package/dest/private/providers/simulation_provider.js +14 -16
- package/dest/private/simulator.d.ts.map +1 -1
- package/dest/private/utility_execution_oracle.d.ts +0 -2
- package/dest/private/utility_execution_oracle.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.d.ts.map +1 -1
- package/dest/public/avm/avm_contract_call_result.js +2 -2
- package/dest/public/avm/avm_execution_environment.d.ts +2 -1
- package/dest/public/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/public/avm/avm_execution_environment.js +4 -2
- package/dest/public/avm/avm_gas.d.ts +0 -15
- package/dest/public/avm/avm_gas.d.ts.map +1 -1
- package/dest/public/avm/avm_gas.js +0 -18
- package/dest/public/avm/avm_memory_types.d.ts +84 -86
- package/dest/public/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.d.ts +1 -3
- package/dest/public/avm/avm_simulator.d.ts.map +1 -1
- package/dest/public/avm/avm_simulator.js +3 -3
- package/dest/public/avm/avm_simulator_interface.d.ts +0 -2
- package/dest/public/avm/avm_simulator_interface.d.ts.map +1 -1
- package/dest/public/avm/fixtures/initializers.d.ts.map +1 -1
- package/dest/public/avm/fixtures/initializers.js +1 -1
- package/dest/public/avm/fixtures/utils.d.ts +0 -10
- package/dest/public/avm/fixtures/utils.d.ts.map +1 -1
- package/dest/public/avm/fixtures/utils.js +0 -42
- package/dest/public/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/public/avm/opcodes/accrued_substate.js +7 -7
- package/dest/public/avm/opcodes/addressing_mode.d.ts +7 -6
- package/dest/public/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/public/avm/opcodes/addressing_mode.js +18 -15
- package/dest/public/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/public/avm/opcodes/arithmetic.js +1 -1
- package/dest/public/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/public/avm/opcodes/bitwise.js +2 -2
- package/dest/public/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/public/avm/opcodes/comparators.js +1 -1
- package/dest/public/avm/opcodes/contract.d.ts +1 -2
- package/dest/public/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/public/avm/opcodes/contract.js +8 -9
- package/dest/public/avm/opcodes/control_flow.d.ts.map +1 -1
- package/dest/public/avm/opcodes/control_flow.js +1 -1
- package/dest/public/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/public/avm/opcodes/conversion.js +1 -1
- package/dest/public/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/public/avm/opcodes/ec_add.js +1 -1
- package/dest/public/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/public/avm/opcodes/environment_getters.js +1 -1
- package/dest/public/avm/opcodes/external_calls.d.ts +6 -6
- package/dest/public/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/public/avm/opcodes/external_calls.js +22 -22
- package/dest/public/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/public/avm/opcodes/hashing.js +3 -3
- package/dest/public/avm/opcodes/instruction.d.ts +0 -2
- package/dest/public/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.d.ts +4 -4
- package/dest/public/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/public/avm/opcodes/memory.js +16 -16
- package/dest/public/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/public/avm/opcodes/misc.js +18 -11
- package/dest/public/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/public/avm/opcodes/storage.js +2 -2
- package/dest/public/avm/serialization/buffer_cursor.d.ts +0 -2
- package/dest/public/avm/serialization/buffer_cursor.d.ts.map +1 -1
- package/dest/public/avm/serialization/bytecode_serialization.d.ts +0 -2
- package/dest/public/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/public/avm/serialization/instruction_serialization.d.ts +0 -2
- package/dest/public/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/public/executor_metrics.d.ts +3 -3
- package/dest/public/executor_metrics.d.ts.map +1 -1
- package/dest/public/executor_metrics.js +6 -6
- package/dest/public/executor_metrics_interface.d.ts +1 -1
- package/dest/public/executor_metrics_interface.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +1 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +3 -3
- package/dest/public/fixtures/utils.d.ts.map +1 -1
- package/dest/public/fixtures/utils.js +19 -26
- package/dest/public/hinting_db_sources.d.ts +0 -2
- package/dest/public/hinting_db_sources.d.ts.map +1 -1
- package/dest/public/hinting_db_sources.js +9 -2
- package/dest/public/public_processor/public_processor.d.ts +5 -7
- package/dest/public/public_processor/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor/public_processor.js +10 -7
- package/dest/public/public_tx_simulator/apps_tests/amm_test.js +5 -5
- package/dest/public/public_tx_simulator/apps_tests/token_test.js +6 -6
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts +1 -1
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/measured_public_tx_simulator.js +3 -3
- package/dest/public/public_tx_simulator/public_tx_context.d.ts +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_context.js +37 -34
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts +2 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/public_tx_simulator.js +15 -4
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts +1 -1
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator/telemetry_public_tx_simulator.js +2 -2
- package/dest/public/side_effect_trace.d.ts +2 -39
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +8 -32
- package/dest/public/side_effect_trace_interface.d.ts +0 -4
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/state_manager/nullifiers.d.ts.map +1 -1
- package/dest/public/state_manager/public_storage.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.d.ts +6 -4
- package/dest/public/state_manager/state_manager.d.ts.map +1 -1
- package/dest/public/state_manager/state_manager.js +6 -3
- package/dest/public/test_executor_metrics.d.ts +5 -4
- package/dest/public/test_executor_metrics.d.ts.map +1 -1
- package/dest/public/test_executor_metrics.js +47 -11
- package/dest/public/unique_class_ids.d.ts.map +1 -1
- package/dest/test/utils.d.ts.map +1 -1
- package/package.json +18 -17
- package/src/common/errors.ts +77 -41
- package/src/private/acvm/acvm.ts +2 -2
- package/src/private/acvm/oracle/oracle.ts +38 -31
- package/src/private/acvm/oracle/typed_oracle.ts +1 -1
- package/src/private/acvm/serialize.ts +35 -0
- package/src/private/index.ts +3 -0
- package/src/private/pick_notes.ts +4 -4
- package/src/private/private_execution.ts +8 -0
- package/src/private/providers/acvm_native.ts +6 -2
- package/src/private/providers/simulation_provider.ts +14 -16
- package/src/private/simulator.ts +4 -1
- package/src/public/avm/avm_contract_call_result.ts +2 -2
- package/src/public/avm/avm_execution_environment.ts +7 -1
- package/src/public/avm/avm_gas.ts +0 -20
- package/src/public/avm/avm_simulator.ts +3 -1
- package/src/public/avm/fixtures/initializers.ts +1 -0
- package/src/public/avm/fixtures/utils.ts +0 -66
- package/src/public/avm/opcodes/accrued_substate.ts +31 -11
- package/src/public/avm/opcodes/addressing_mode.ts +23 -20
- package/src/public/avm/opcodes/arithmetic.ts +2 -1
- package/src/public/avm/opcodes/bitwise.ts +9 -3
- package/src/public/avm/opcodes/comparators.ts +2 -1
- package/src/public/avm/opcodes/contract.ts +7 -6
- package/src/public/avm/opcodes/control_flow.ts +7 -2
- package/src/public/avm/opcodes/conversion.ts +2 -1
- package/src/public/avm/opcodes/ec_add.ts +2 -1
- package/src/public/avm/opcodes/environment_getters.ts +7 -2
- package/src/public/avm/opcodes/external_calls.ts +26 -14
- package/src/public/avm/opcodes/hashing.ts +17 -5
- package/src/public/avm/opcodes/memory.ts +33 -15
- package/src/public/avm/opcodes/misc.ts +23 -15
- package/src/public/avm/opcodes/storage.ts +9 -3
- package/src/public/avm/serialization/buffer_cursor.ts +4 -1
- package/src/public/executor_metrics.ts +11 -6
- package/src/public/executor_metrics_interface.ts +1 -1
- package/src/public/fixtures/public_tx_simulation_tester.ts +3 -2
- package/src/public/fixtures/utils.ts +21 -28
- package/src/public/hinting_db_sources.ts +17 -4
- package/src/public/public_processor/public_processor.ts +11 -5
- package/src/public/public_tx_simulator/apps_tests/amm_test.ts +5 -5
- package/src/public/public_tx_simulator/apps_tests/token_test.ts +6 -6
- package/src/public/public_tx_simulator/measured_public_tx_simulator.ts +3 -2
- package/src/public/public_tx_simulator/public_tx_context.ts +96 -81
- package/src/public/public_tx_simulator/public_tx_simulator.ts +14 -3
- package/src/public/public_tx_simulator/telemetry_public_tx_simulator.ts +10 -1
- package/src/public/side_effect_trace.ts +7 -111
- package/src/public/side_effect_trace_interface.ts +0 -4
- package/src/public/state_manager/state_manager.ts +13 -5
- package/src/public/test_executor_metrics.ts +60 -13
- package/src/public/avm/opcodes/.eslintrc.cjs +0 -8
|
@@ -29,9 +29,10 @@ export class NoteHashExists extends Instruction {
|
|
|
29
29
|
|
|
30
30
|
public async execute(context: AvmContext): Promise<void> {
|
|
31
31
|
const memory = context.machineState.memory;
|
|
32
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
33
|
+
|
|
32
34
|
context.machineState.consumeGas(this.gasCost());
|
|
33
35
|
const operands = [this.noteHashOffset, this.leafIndexOffset, this.existsOffset];
|
|
34
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
35
36
|
const [noteHashOffset, leafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
36
37
|
memory.checkTags(TypeTag.FIELD, noteHashOffset, leafIndexOffset);
|
|
37
38
|
|
|
@@ -50,16 +51,20 @@ export class EmitNoteHash extends Instruction {
|
|
|
50
51
|
// Informs (de)serialization. See Instruction.deserialize.
|
|
51
52
|
static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16];
|
|
52
53
|
|
|
53
|
-
constructor(
|
|
54
|
+
constructor(
|
|
55
|
+
private indirect: number,
|
|
56
|
+
private noteHashOffset: number,
|
|
57
|
+
) {
|
|
54
58
|
super();
|
|
55
59
|
}
|
|
56
60
|
|
|
57
61
|
public async execute(context: AvmContext): Promise<void> {
|
|
58
62
|
const memory = context.machineState.memory;
|
|
63
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
64
|
+
|
|
59
65
|
context.machineState.consumeGas(this.gasCost());
|
|
60
66
|
|
|
61
67
|
const operands = [this.noteHashOffset];
|
|
62
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
63
68
|
const [noteHashOffset] = addressing.resolve(operands, memory);
|
|
64
69
|
memory.checkTag(TypeTag.FIELD, noteHashOffset);
|
|
65
70
|
|
|
@@ -95,10 +100,11 @@ export class NullifierExists extends Instruction {
|
|
|
95
100
|
|
|
96
101
|
public async execute(context: AvmContext): Promise<void> {
|
|
97
102
|
const memory = context.machineState.memory;
|
|
103
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
104
|
+
|
|
98
105
|
context.machineState.consumeGas(this.gasCost());
|
|
99
106
|
|
|
100
107
|
const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset];
|
|
101
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
102
108
|
const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
103
109
|
memory.checkTags(TypeTag.FIELD, nullifierOffset, addressOffset);
|
|
104
110
|
|
|
@@ -116,7 +122,10 @@ export class EmitNullifier extends Instruction {
|
|
|
116
122
|
// Informs (de)serialization. See Instruction.deserialize.
|
|
117
123
|
static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16];
|
|
118
124
|
|
|
119
|
-
constructor(
|
|
125
|
+
constructor(
|
|
126
|
+
private indirect: number,
|
|
127
|
+
private nullifierOffset: number,
|
|
128
|
+
) {
|
|
120
129
|
super();
|
|
121
130
|
}
|
|
122
131
|
|
|
@@ -126,10 +135,11 @@ export class EmitNullifier extends Instruction {
|
|
|
126
135
|
}
|
|
127
136
|
|
|
128
137
|
const memory = context.machineState.memory;
|
|
138
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
139
|
+
|
|
129
140
|
context.machineState.consumeGas(this.gasCost());
|
|
130
141
|
|
|
131
142
|
const operands = [this.nullifierOffset];
|
|
132
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
133
143
|
const [nullifierOffset] = addressing.resolve(operands, memory);
|
|
134
144
|
memory.checkTag(TypeTag.FIELD, nullifierOffset);
|
|
135
145
|
|
|
@@ -172,10 +182,11 @@ export class L1ToL2MessageExists extends Instruction {
|
|
|
172
182
|
|
|
173
183
|
public async execute(context: AvmContext): Promise<void> {
|
|
174
184
|
const memory = context.machineState.memory;
|
|
185
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
186
|
+
|
|
175
187
|
context.machineState.consumeGas(this.gasCost());
|
|
176
188
|
|
|
177
189
|
const operands = [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset];
|
|
178
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
179
190
|
const [msgHashOffset, msgLeafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
180
191
|
memory.checkTags(TypeTag.FIELD, msgHashOffset, msgLeafIndexOffset);
|
|
181
192
|
|
|
@@ -193,7 +204,11 @@ export class EmitUnencryptedLog extends Instruction {
|
|
|
193
204
|
// Informs (de)serialization. See Instruction.deserialize.
|
|
194
205
|
static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
|
|
195
206
|
|
|
196
|
-
constructor(
|
|
207
|
+
constructor(
|
|
208
|
+
private indirect: number,
|
|
209
|
+
private logOffset: number,
|
|
210
|
+
private logSizeOffset: number,
|
|
211
|
+
) {
|
|
197
212
|
super();
|
|
198
213
|
}
|
|
199
214
|
|
|
@@ -203,9 +218,9 @@ export class EmitUnencryptedLog extends Instruction {
|
|
|
203
218
|
}
|
|
204
219
|
|
|
205
220
|
const memory = context.machineState.memory;
|
|
221
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
206
222
|
|
|
207
223
|
const operands = [this.logOffset, this.logSizeOffset];
|
|
208
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
209
224
|
const [logOffset, logSizeOffset] = addressing.resolve(operands, memory);
|
|
210
225
|
memory.checkTag(TypeTag.UINT32, logSizeOffset);
|
|
211
226
|
const logSize = memory.get(logSizeOffset).toNumber();
|
|
@@ -225,7 +240,11 @@ export class SendL2ToL1Message extends Instruction {
|
|
|
225
240
|
// Informs (de)serialization. See Instruction.deserialize.
|
|
226
241
|
static readonly wireFormat = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
|
|
227
242
|
|
|
228
|
-
constructor(
|
|
243
|
+
constructor(
|
|
244
|
+
private indirect: number,
|
|
245
|
+
private recipientOffset: number,
|
|
246
|
+
private contentOffset: number,
|
|
247
|
+
) {
|
|
229
248
|
super();
|
|
230
249
|
}
|
|
231
250
|
|
|
@@ -235,10 +254,11 @@ export class SendL2ToL1Message extends Instruction {
|
|
|
235
254
|
}
|
|
236
255
|
|
|
237
256
|
const memory = context.machineState.memory;
|
|
257
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
258
|
+
|
|
238
259
|
context.machineState.consumeGas(this.gasCost());
|
|
239
260
|
|
|
240
261
|
const operands = [this.recipientOffset, this.contentOffset];
|
|
241
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
242
262
|
const [recipientOffset, contentOffset] = addressing.resolve(operands, memory);
|
|
243
263
|
memory.checkTags(TypeTag.FIELD, recipientOffset, contentOffset);
|
|
244
264
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { AVM_MAX_OPERANDS } from '@aztec/constants';
|
|
2
|
+
import { padArrayEnd } from '@aztec/foundation/collection';
|
|
3
|
+
import type { Tuple } from '@aztec/foundation/serialize';
|
|
2
4
|
|
|
3
5
|
import { TaggedMemory, type TaggedMemoryInterface } from '../avm_memory_types.js';
|
|
4
6
|
import { RelativeAddressOutOfRangeError } from '../errors.js';
|
|
@@ -13,21 +15,28 @@ export enum AddressingMode {
|
|
|
13
15
|
/** A class to represent the addressing mode of an instruction. */
|
|
14
16
|
export class Addressing {
|
|
15
17
|
public constructor(
|
|
16
|
-
/** The addressing mode for each operand.
|
|
17
|
-
private readonly modePerOperand: AddressingMode
|
|
18
|
+
/** The addressing mode for each possible operand. */
|
|
19
|
+
private readonly modePerOperand: Tuple<AddressingMode, typeof AVM_MAX_OPERANDS>,
|
|
18
20
|
) {}
|
|
19
21
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
22
|
+
public static fromModes(modes: AddressingMode[]): Addressing {
|
|
23
|
+
if (modes.length > AVM_MAX_OPERANDS) {
|
|
24
|
+
throw new Error('Too many operands for addressing mode');
|
|
25
|
+
}
|
|
26
|
+
return new Addressing(padArrayEnd(modes, AddressingMode.DIRECT, AVM_MAX_OPERANDS));
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
public static fromWire(wireModes: number): Addressing {
|
|
30
|
+
// The modes are stored in the wire format as one or two bytes, with each two bits representing the modes for an operand.
|
|
31
|
+
// Even bits are indirect, odd bits are relative.
|
|
32
|
+
const modes = new Array<AddressingMode>(AVM_MAX_OPERANDS);
|
|
33
|
+
for (let i = 0; i < AVM_MAX_OPERANDS; i++) {
|
|
26
34
|
modes[i] =
|
|
27
|
-
(((wireModes >> i) & 1) * AddressingMode.INDIRECT) |
|
|
28
|
-
(((wireModes >> (i +
|
|
35
|
+
(((wireModes >> (i * 2)) & 1) * AddressingMode.INDIRECT) |
|
|
36
|
+
(((wireModes >> (i * 2 + 1)) & 1) * AddressingMode.RELATIVE);
|
|
29
37
|
}
|
|
30
|
-
|
|
38
|
+
// Casting the array to tuple since it should be more performant than using makeTuple
|
|
39
|
+
return new Addressing(modes as Tuple<AddressingMode, typeof AVM_MAX_OPERANDS>);
|
|
31
40
|
}
|
|
32
41
|
|
|
33
42
|
public toWire(): number {
|
|
@@ -36,20 +45,15 @@ export class Addressing {
|
|
|
36
45
|
let wire: number = 0;
|
|
37
46
|
for (let i = 0; i < this.modePerOperand.length; i++) {
|
|
38
47
|
if (this.modePerOperand[i] & AddressingMode.INDIRECT) {
|
|
39
|
-
wire |= 1 << i;
|
|
48
|
+
wire |= 1 << (i * 2);
|
|
40
49
|
}
|
|
41
50
|
if (this.modePerOperand[i] & AddressingMode.RELATIVE) {
|
|
42
|
-
wire |= 1 << (
|
|
51
|
+
wire |= 1 << (i * 2 + 1);
|
|
43
52
|
}
|
|
44
53
|
}
|
|
45
54
|
return wire;
|
|
46
55
|
}
|
|
47
56
|
|
|
48
|
-
/** Returns how many operands use the given addressing mode. */
|
|
49
|
-
public count(mode: AddressingMode): number {
|
|
50
|
-
return this.modePerOperand.filter(m => (m & mode) !== 0).length;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
57
|
/**
|
|
54
58
|
* Resolves the offsets using the addressing mode.
|
|
55
59
|
* @param offsets The offsets to resolve.
|
|
@@ -57,7 +61,6 @@ export class Addressing {
|
|
|
57
61
|
* @returns The resolved offsets. The length of the returned array is the same as the length of the input array.
|
|
58
62
|
*/
|
|
59
63
|
public resolve(offsets: number[], mem: TaggedMemoryInterface): number[] {
|
|
60
|
-
assert(offsets.length <= this.modePerOperand.length);
|
|
61
64
|
const resolved = new Array(offsets.length);
|
|
62
65
|
|
|
63
66
|
let didRelativeOnce = false;
|
|
@@ -14,10 +14,11 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
|
|
|
14
14
|
export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInstruction {
|
|
15
15
|
public async execute(context: AvmContext): Promise<void> {
|
|
16
16
|
const memory = context.machineState.memory;
|
|
17
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
18
|
+
|
|
17
19
|
context.machineState.consumeGas(this.gasCost());
|
|
18
20
|
|
|
19
21
|
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
20
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
21
22
|
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
22
23
|
this.checkTags(memory, aOffset, bOffset);
|
|
23
24
|
|
|
@@ -8,10 +8,11 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
|
|
|
8
8
|
abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
|
|
9
9
|
public async execute(context: AvmContext): Promise<void> {
|
|
10
10
|
const memory = context.machineState.memory;
|
|
11
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
12
|
+
|
|
11
13
|
context.machineState.consumeGas(this.gasCost());
|
|
12
14
|
|
|
13
15
|
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
14
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
15
16
|
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
16
17
|
this.checkTags(memory, aOffset, bOffset);
|
|
17
18
|
|
|
@@ -89,16 +90,21 @@ export class Not extends Instruction {
|
|
|
89
90
|
static readonly wireFormat8 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT8, OperandType.UINT8];
|
|
90
91
|
static readonly wireFormat16 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
|
|
91
92
|
|
|
92
|
-
constructor(
|
|
93
|
+
constructor(
|
|
94
|
+
private indirect: number,
|
|
95
|
+
private srcOffset: number,
|
|
96
|
+
private dstOffset: number,
|
|
97
|
+
) {
|
|
93
98
|
super();
|
|
94
99
|
}
|
|
95
100
|
|
|
96
101
|
public async execute(context: AvmContext): Promise<void> {
|
|
97
102
|
const memory = context.machineState.memory;
|
|
103
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
104
|
+
|
|
98
105
|
context.machineState.consumeGas(this.gasCost());
|
|
99
106
|
|
|
100
107
|
const operands = [this.srcOffset, this.dstOffset];
|
|
101
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
102
108
|
const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
103
109
|
TaggedMemory.checkIsIntegralTag(memory.getTag(srcOffset));
|
|
104
110
|
const value = memory.getAs<IntegralValue>(srcOffset);
|
|
@@ -7,10 +7,11 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
|
|
|
7
7
|
abstract class ComparatorInstruction extends ThreeOperandInstruction {
|
|
8
8
|
public async execute(context: AvmContext): Promise<void> {
|
|
9
9
|
const memory = context.machineState.memory;
|
|
10
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
11
|
+
|
|
10
12
|
context.machineState.consumeGas(this.gasCost());
|
|
11
13
|
|
|
12
14
|
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
13
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
14
15
|
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
15
16
|
memory.checkTagsAreSame(aOffset, bOffset);
|
|
16
17
|
|
|
@@ -20,7 +20,6 @@ export class GetContractInstance extends Instruction {
|
|
|
20
20
|
OperandType.UINT8, // indirect bits
|
|
21
21
|
OperandType.UINT16, // addressOffset
|
|
22
22
|
OperandType.UINT16, // dstOffset
|
|
23
|
-
OperandType.UINT16, // existsOfsset
|
|
24
23
|
OperandType.UINT8, // member enum (immediate)
|
|
25
24
|
];
|
|
26
25
|
|
|
@@ -28,7 +27,6 @@ export class GetContractInstance extends Instruction {
|
|
|
28
27
|
private indirect: number,
|
|
29
28
|
private addressOffset: number,
|
|
30
29
|
private dstOffset: number,
|
|
31
|
-
private existsOffset: number,
|
|
32
30
|
private memberEnum: number,
|
|
33
31
|
) {
|
|
34
32
|
super();
|
|
@@ -36,15 +34,16 @@ export class GetContractInstance extends Instruction {
|
|
|
36
34
|
|
|
37
35
|
async execute(context: AvmContext): Promise<void> {
|
|
38
36
|
const memory = context.machineState.memory;
|
|
37
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
38
|
+
|
|
39
39
|
context.machineState.consumeGas(this.gasCost());
|
|
40
40
|
|
|
41
41
|
if (!(this.memberEnum in ContractInstanceMember)) {
|
|
42
42
|
throw new InstructionExecutionError(`Invalid GETCONSTRACTINSTANCE member enum ${this.memberEnum}`);
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
const operands = [this.addressOffset, this.dstOffset
|
|
46
|
-
const
|
|
47
|
-
const [addressOffset, dstOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
45
|
+
const operands = [this.addressOffset, this.dstOffset];
|
|
46
|
+
const [addressOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
48
47
|
memory.checkTag(TypeTag.FIELD, addressOffset);
|
|
49
48
|
|
|
50
49
|
const address = memory.get(addressOffset).toAztecAddress();
|
|
@@ -66,7 +65,9 @@ export class GetContractInstance extends Instruction {
|
|
|
66
65
|
}
|
|
67
66
|
}
|
|
68
67
|
|
|
68
|
+
const existsOffset = dstOffset;
|
|
69
|
+
const memberValueOffset = dstOffset + 1;
|
|
69
70
|
memory.set(existsOffset, new Uint1(exists ? 1 : 0));
|
|
70
|
-
memory.set(
|
|
71
|
+
memory.set(memberValueOffset, memberValue);
|
|
71
72
|
}
|
|
72
73
|
}
|
|
@@ -38,16 +38,21 @@ export class JumpI extends Instruction {
|
|
|
38
38
|
OperandType.UINT32,
|
|
39
39
|
];
|
|
40
40
|
|
|
41
|
-
constructor(
|
|
41
|
+
constructor(
|
|
42
|
+
private indirect: number,
|
|
43
|
+
private condOffset: number,
|
|
44
|
+
private loc: number,
|
|
45
|
+
) {
|
|
42
46
|
super();
|
|
43
47
|
}
|
|
44
48
|
|
|
45
49
|
public async execute(context: AvmContext): Promise<void> {
|
|
46
50
|
const memory = context.machineState.memory;
|
|
51
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
52
|
+
|
|
47
53
|
context.machineState.consumeGas(this.gasCost());
|
|
48
54
|
|
|
49
55
|
const operands = [this.condOffset];
|
|
50
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
51
56
|
const [condOffset] = addressing.resolve(operands, memory);
|
|
52
57
|
const condition = memory.getAs<IntegralValue>(condOffset);
|
|
53
58
|
|
|
@@ -33,8 +33,9 @@ export class ToRadixBE extends Instruction {
|
|
|
33
33
|
|
|
34
34
|
public async execute(context: AvmContext): Promise<void> {
|
|
35
35
|
const memory = context.machineState.memory;
|
|
36
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
37
|
+
|
|
36
38
|
const operands = [this.srcOffset, this.radixOffset, this.numLimbsOffset, this.outputBitsOffset, this.dstOffset];
|
|
37
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
38
39
|
const [srcOffset, radixOffset, numLimbsOffset, outputBitsOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
39
40
|
|
|
40
41
|
// The radix gadget only takes in a Field
|
|
@@ -39,6 +39,8 @@ export class EcAdd extends Instruction {
|
|
|
39
39
|
|
|
40
40
|
public async execute(context: AvmContext): Promise<void> {
|
|
41
41
|
const memory = context.machineState.memory;
|
|
42
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
43
|
+
|
|
42
44
|
context.machineState.consumeGas(this.gasCost());
|
|
43
45
|
|
|
44
46
|
const operands = [
|
|
@@ -50,7 +52,6 @@ export class EcAdd extends Instruction {
|
|
|
50
52
|
this.p2IsInfiniteOffset,
|
|
51
53
|
this.dstOffset,
|
|
52
54
|
];
|
|
53
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
54
55
|
const [p1XOffset, p1YOffset, p1IsInfiniteOffset, p2XOffset, p2YOffset, p2IsInfiniteOffset, dstOffset] =
|
|
55
56
|
addressing.resolve(operands, memory);
|
|
56
57
|
|
|
@@ -61,12 +61,18 @@ export class GetEnvVar extends Instruction {
|
|
|
61
61
|
OperandType.UINT8, // variable enum (immediate)
|
|
62
62
|
];
|
|
63
63
|
|
|
64
|
-
constructor(
|
|
64
|
+
constructor(
|
|
65
|
+
private indirect: number,
|
|
66
|
+
private dstOffset: number,
|
|
67
|
+
private varEnum: number,
|
|
68
|
+
) {
|
|
65
69
|
super();
|
|
66
70
|
}
|
|
67
71
|
|
|
68
72
|
public async execute(context: AvmContext): Promise<void> {
|
|
69
73
|
const memory = context.machineState.memory;
|
|
74
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
75
|
+
|
|
70
76
|
context.machineState.consumeGas(this.gasCost());
|
|
71
77
|
|
|
72
78
|
if (!(this.varEnum in EnvironmentVariable)) {
|
|
@@ -74,7 +80,6 @@ export class GetEnvVar extends Instruction {
|
|
|
74
80
|
}
|
|
75
81
|
|
|
76
82
|
const operands = [this.dstOffset];
|
|
77
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
78
83
|
const [dstOffset] = addressing.resolve(operands, memory);
|
|
79
84
|
|
|
80
85
|
memory.set(dstOffset, getValue(this.varEnum as EnvironmentVariable, context));
|
|
@@ -22,17 +22,18 @@ abstract class ExternalCall extends Instruction {
|
|
|
22
22
|
private l2GasOffset: number,
|
|
23
23
|
private daGasOffset: number,
|
|
24
24
|
private addrOffset: number,
|
|
25
|
-
private argsOffset: number,
|
|
26
25
|
private argsSizeOffset: number,
|
|
26
|
+
private argsOffset: number,
|
|
27
27
|
) {
|
|
28
28
|
super();
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
public async execute(context: AvmContext) {
|
|
32
32
|
const memory = context.machineState.memory;
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
const [l2GasOffset, daGasOffset, addrOffset,
|
|
33
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
34
|
+
|
|
35
|
+
const operands = [this.l2GasOffset, this.daGasOffset, this.addrOffset, this.argsSizeOffset, this.argsOffset];
|
|
36
|
+
const [l2GasOffset, daGasOffset, addrOffset, argsSizeOffset, argsOffset] = addressing.resolve(operands, memory);
|
|
36
37
|
// TODO: Should be U32
|
|
37
38
|
memory.checkTags(TypeTag.FIELD, l2GasOffset);
|
|
38
39
|
memory.checkTags(TypeTag.FIELD, daGasOffset);
|
|
@@ -133,15 +134,18 @@ export class SuccessCopy extends Instruction {
|
|
|
133
134
|
OperandType.UINT16, // dstOffset (16-bit)
|
|
134
135
|
];
|
|
135
136
|
|
|
136
|
-
constructor(
|
|
137
|
+
constructor(
|
|
138
|
+
private indirect: number,
|
|
139
|
+
private dstOffset: number,
|
|
140
|
+
) {
|
|
137
141
|
super();
|
|
138
142
|
}
|
|
139
143
|
|
|
140
144
|
public async execute(context: AvmContext): Promise<void> {
|
|
141
145
|
const memory = context.machineState.memory;
|
|
146
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
142
147
|
|
|
143
148
|
const operands = [this.dstOffset];
|
|
144
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
145
149
|
const [dstOffset] = addressing.resolve(operands, memory);
|
|
146
150
|
|
|
147
151
|
// Use the direct success tracking property
|
|
@@ -163,16 +167,20 @@ export class Return extends Instruction {
|
|
|
163
167
|
OperandType.UINT16,
|
|
164
168
|
];
|
|
165
169
|
|
|
166
|
-
constructor(
|
|
170
|
+
constructor(
|
|
171
|
+
private indirect: number,
|
|
172
|
+
private returnSizeOffset: number,
|
|
173
|
+
private returnOffset: number,
|
|
174
|
+
) {
|
|
167
175
|
super();
|
|
168
176
|
}
|
|
169
177
|
|
|
170
178
|
public async execute(context: AvmContext): Promise<void> {
|
|
171
179
|
const memory = context.machineState.memory;
|
|
180
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
172
181
|
|
|
173
|
-
const operands = [this.
|
|
174
|
-
const
|
|
175
|
-
const [returnOffset, returnSizeOffset] = addressing.resolve(operands, memory);
|
|
182
|
+
const operands = [this.returnSizeOffset, this.returnOffset];
|
|
183
|
+
const [returnSizeOffset, returnOffset] = addressing.resolve(operands, memory);
|
|
176
184
|
|
|
177
185
|
memory.checkTag(TypeTag.UINT32, returnSizeOffset);
|
|
178
186
|
const returnSize = memory.get(returnSizeOffset).toNumber();
|
|
@@ -205,16 +213,20 @@ export class Revert extends Instruction {
|
|
|
205
213
|
OperandType.UINT16,
|
|
206
214
|
];
|
|
207
215
|
|
|
208
|
-
constructor(
|
|
216
|
+
constructor(
|
|
217
|
+
private indirect: number,
|
|
218
|
+
private retSizeOffset: number,
|
|
219
|
+
private returnOffset: number,
|
|
220
|
+
) {
|
|
209
221
|
super();
|
|
210
222
|
}
|
|
211
223
|
|
|
212
224
|
public async execute(context: AvmContext): Promise<void> {
|
|
213
225
|
const memory = context.machineState.memory;
|
|
226
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
214
227
|
|
|
215
|
-
const operands = [this.
|
|
216
|
-
const
|
|
217
|
-
const [returnOffset, retSizeOffset] = addressing.resolve(operands, memory);
|
|
228
|
+
const operands = [this.retSizeOffset, this.returnOffset];
|
|
229
|
+
const [retSizeOffset, returnOffset] = addressing.resolve(operands, memory);
|
|
218
230
|
|
|
219
231
|
memory.checkTag(TypeTag.UINT32, retSizeOffset);
|
|
220
232
|
const retSize = memory.get(retSizeOffset).toNumber();
|
|
@@ -19,16 +19,22 @@ export class Poseidon2 extends Instruction {
|
|
|
19
19
|
OperandType.UINT16,
|
|
20
20
|
];
|
|
21
21
|
|
|
22
|
-
constructor(
|
|
22
|
+
constructor(
|
|
23
|
+
private indirect: number,
|
|
24
|
+
private inputStateOffset: number,
|
|
25
|
+
private outputStateOffset: number,
|
|
26
|
+
) {
|
|
23
27
|
super();
|
|
24
28
|
}
|
|
25
29
|
|
|
26
30
|
public async execute(context: AvmContext): Promise<void> {
|
|
27
31
|
const memory = context.machineState.memory;
|
|
32
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
33
|
+
|
|
28
34
|
context.machineState.consumeGas(this.gasCost());
|
|
29
35
|
|
|
30
36
|
const operands = [this.inputStateOffset, this.outputStateOffset];
|
|
31
|
-
|
|
37
|
+
|
|
32
38
|
const [inputOffset, outputOffset] = addressing.resolve(operands, memory);
|
|
33
39
|
|
|
34
40
|
const inputState = memory.getSlice(inputOffset, Poseidon2.stateSize);
|
|
@@ -54,7 +60,11 @@ export class KeccakF1600 extends Instruction {
|
|
|
54
60
|
OperandType.UINT16,
|
|
55
61
|
];
|
|
56
62
|
|
|
57
|
-
constructor(
|
|
63
|
+
constructor(
|
|
64
|
+
private indirect: number,
|
|
65
|
+
private dstOffset: number,
|
|
66
|
+
private inputOffset: number,
|
|
67
|
+
) {
|
|
58
68
|
super();
|
|
59
69
|
}
|
|
60
70
|
|
|
@@ -62,8 +72,9 @@ export class KeccakF1600 extends Instruction {
|
|
|
62
72
|
public async execute(context: AvmContext): Promise<void> {
|
|
63
73
|
const inputSize = 25;
|
|
64
74
|
const memory = context.machineState.memory;
|
|
75
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
76
|
+
|
|
65
77
|
const operands = [this.dstOffset, this.inputOffset];
|
|
66
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
67
78
|
const [dstOffset, inputOffset] = addressing.resolve(operands, memory);
|
|
68
79
|
context.machineState.consumeGas(this.gasCost());
|
|
69
80
|
|
|
@@ -104,8 +115,9 @@ export class Sha256Compression extends Instruction {
|
|
|
104
115
|
const INPUTS_SIZE = 16;
|
|
105
116
|
|
|
106
117
|
const memory = context.machineState.memory;
|
|
118
|
+
const addressing = Addressing.fromWire(this.indirect);
|
|
119
|
+
|
|
107
120
|
const operands = [this.outputOffset, this.stateOffset, this.inputsOffset];
|
|
108
|
-
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
109
121
|
const [outputOffset, stateOffset, inputsOffset] = addressing.resolve(operands, memory);
|
|
110
122
|
|
|
111
123
|
// Note: size of output is same as size of state
|