@aztec/simulator 0.55.1 → 0.57.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/oracle/oracle.d.ts +2 -5
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +6 -37
- package/dest/acvm/oracle/typed_oracle.d.ts +3 -6
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +1 -10
- package/dest/avm/avm_execution_environment.d.ts +2 -11
- package/dest/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/avm/avm_execution_environment.js +3 -22
- package/dest/avm/avm_gas.d.ts +2 -2
- package/dest/avm/avm_gas.d.ts.map +1 -1
- package/dest/avm/avm_gas.js +31 -116
- package/dest/avm/avm_machine_state.d.ts.map +1 -1
- package/dest/avm/avm_machine_state.js +6 -6
- package/dest/avm/avm_memory_types.d.ts +38 -9
- package/dest/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/avm/avm_memory_types.js +27 -13
- package/dest/avm/avm_simulator.d.ts.map +1 -1
- package/dest/avm/avm_simulator.js +5 -6
- package/dest/avm/bytecode_utils.d.ts +1 -2
- package/dest/avm/bytecode_utils.d.ts.map +1 -1
- package/dest/avm/bytecode_utils.js +3 -17
- package/dest/avm/errors.d.ts +1 -1
- package/dest/avm/errors.d.ts.map +1 -1
- package/dest/avm/errors.js +12 -3
- package/dest/avm/fixtures/index.d.ts +4 -16
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +11 -27
- package/dest/avm/journal/index.d.ts +0 -1
- package/dest/avm/journal/index.d.ts.map +1 -1
- package/dest/avm/journal/index.js +1 -2
- package/dest/avm/journal/journal.d.ts +6 -5
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +18 -16
- package/dest/avm/opcodes/accrued_substate.d.ts.map +1 -1
- package/dest/avm/opcodes/accrued_substate.js +37 -30
- package/dest/avm/opcodes/addressing_mode.d.ts +3 -2
- package/dest/avm/opcodes/addressing_mode.d.ts.map +1 -1
- package/dest/avm/opcodes/addressing_mode.js +25 -21
- package/dest/avm/opcodes/arithmetic.d.ts.map +1 -1
- package/dest/avm/opcodes/arithmetic.js +6 -5
- package/dest/avm/opcodes/bitwise.d.ts +10 -4
- package/dest/avm/opcodes/bitwise.d.ts.map +1 -1
- package/dest/avm/opcodes/bitwise.js +26 -18
- package/dest/avm/opcodes/commitment.d.ts.map +1 -1
- package/dest/avm/opcodes/commitment.js +6 -5
- package/dest/avm/opcodes/comparators.d.ts.map +1 -1
- package/dest/avm/opcodes/comparators.js +8 -7
- package/dest/avm/opcodes/contract.d.ts.map +1 -1
- package/dest/avm/opcodes/contract.js +6 -5
- package/dest/avm/opcodes/control_flow.js +6 -6
- package/dest/avm/opcodes/conversion.d.ts +3 -2
- package/dest/avm/opcodes/conversion.d.ts.map +1 -1
- package/dest/avm/opcodes/conversion.js +21 -13
- package/dest/avm/opcodes/ec_add.d.ts.map +1 -1
- package/dest/avm/opcodes/ec_add.js +8 -7
- package/dest/avm/opcodes/environment_getters.d.ts +27 -63
- package/dest/avm/opcodes/environment_getters.d.ts.map +1 -1
- package/dest/avm/opcodes/environment_getters.js +76 -80
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +27 -16
- package/dest/avm/opcodes/hashing.d.ts +5 -5
- package/dest/avm/opcodes/hashing.d.ts.map +1 -1
- package/dest/avm/opcodes/hashing.js +47 -40
- package/dest/avm/opcodes/index.d.ts +3 -0
- package/dest/avm/opcodes/index.d.ts.map +1 -1
- package/dest/avm/opcodes/index.js +4 -1
- package/dest/avm/opcodes/instruction.d.ts +2 -6
- package/dest/avm/opcodes/instruction.d.ts.map +1 -1
- package/dest/avm/opcodes/instruction.js +3 -9
- package/dest/avm/opcodes/instruction_impl.d.ts +0 -26
- package/dest/avm/opcodes/instruction_impl.d.ts.map +1 -1
- package/dest/avm/opcodes/instruction_impl.js +1 -51
- package/dest/avm/opcodes/memory.d.ts +5 -12
- package/dest/avm/opcodes/memory.d.ts.map +1 -1
- package/dest/avm/opcodes/memory.js +40 -53
- package/dest/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/avm/opcodes/misc.js +6 -5
- package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +1 -1
- package/dest/avm/opcodes/multi_scalar_mul.js +17 -16
- package/dest/avm/opcodes/storage.d.ts.map +1 -1
- package/dest/avm/opcodes/storage.js +11 -9
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/bytecode_serialization.js +5 -25
- package/dest/avm/serialization/instruction_serialization.d.ts +40 -54
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/instruction_serialization.js +41 -57
- package/dest/avm/test_utils.d.ts +8 -8
- package/dest/avm/test_utils.d.ts.map +1 -1
- package/dest/avm/test_utils.js +15 -15
- package/dest/client/client_execution_context.d.ts +6 -30
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +31 -53
- package/dest/client/index.d.ts +0 -1
- package/dest/client/index.d.ts.map +1 -1
- package/dest/client/index.js +1 -2
- package/dest/client/private_execution.d.ts +2 -2
- package/dest/client/private_execution.d.ts.map +1 -1
- package/dest/client/private_execution.js +5 -19
- package/dest/client/simulator.d.ts +3 -4
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +1 -1
- package/dest/client/test_utils.d.ts.map +1 -1
- package/dest/client/test_utils.js +12 -6
- package/dest/client/unconstrained_execution.d.ts +2 -2
- package/dest/client/unconstrained_execution.d.ts.map +1 -1
- package/dest/client/unconstrained_execution.js +3 -3
- package/dest/common/debug_fn_name.d.ts +4 -0
- package/dest/common/debug_fn_name.d.ts.map +1 -0
- package/dest/common/debug_fn_name.js +15 -0
- package/dest/common/index.d.ts +0 -1
- package/dest/common/index.d.ts.map +1 -1
- package/dest/common/index.js +1 -2
- package/dest/public/enqueued_call_simulator.d.ts +43 -0
- package/dest/public/enqueued_call_simulator.d.ts.map +1 -0
- package/dest/public/enqueued_call_simulator.js +154 -0
- package/dest/public/enqueued_calls_processor.d.ts +44 -0
- package/dest/public/enqueued_calls_processor.d.ts.map +1 -0
- package/dest/public/enqueued_calls_processor.js +218 -0
- package/dest/public/execution.d.ts +10 -8
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +15 -8
- package/dest/public/executor.d.ts +4 -7
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +10 -14
- package/dest/public/hints_builder.d.ts +4 -3
- package/dest/public/hints_builder.d.ts.map +1 -1
- package/dest/public/hints_builder.js +5 -5
- package/dest/public/index.d.ts +3 -2
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +3 -3
- package/dest/public/public_db_sources.d.ts +17 -24
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +58 -65
- package/dest/public/public_kernel.d.ts +3 -9
- package/dest/public/public_kernel.d.ts.map +1 -1
- package/dest/public/public_kernel.js +13 -40
- package/dest/public/public_kernel_circuit_simulator.d.ts +5 -11
- package/dest/public/public_kernel_circuit_simulator.d.ts.map +1 -1
- package/dest/public/public_kernel_tail_simulator.d.ts +19 -0
- package/dest/public/public_kernel_tail_simulator.d.ts.map +1 -0
- package/dest/public/public_kernel_tail_simulator.js +45 -0
- package/dest/public/public_processor.d.ts +9 -5
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +34 -48
- package/dest/public/public_processor_metrics.d.ts +3 -3
- package/dest/public/public_processor_metrics.d.ts.map +1 -1
- package/dest/public/public_processor_metrics.js +1 -1
- package/dest/public/side_effect_errors.d.ts +4 -0
- package/dest/public/side_effect_errors.d.ts.map +1 -0
- package/dest/public/side_effect_errors.js +7 -0
- package/dest/public/side_effect_trace.d.ts +2 -2
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +56 -35
- package/dest/public/side_effect_trace_interface.d.ts +1 -1
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/package.json +12 -9
- package/src/acvm/oracle/oracle.ts +7 -85
- package/src/acvm/oracle/typed_oracle.ts +2 -31
- package/src/avm/avm_execution_environment.ts +2 -24
- package/src/avm/avm_gas.ts +30 -115
- package/src/avm/avm_machine_state.ts +5 -5
- package/src/avm/avm_memory_types.ts +41 -14
- package/src/avm/avm_simulator.ts +4 -5
- package/src/avm/bytecode_utils.ts +2 -17
- package/src/avm/errors.ts +11 -3
- package/src/avm/fixtures/index.ts +13 -46
- package/src/avm/journal/index.ts +0 -1
- package/src/avm/journal/journal.ts +22 -22
- package/src/avm/opcodes/accrued_substate.ts +36 -44
- package/src/avm/opcodes/addressing_mode.ts +27 -24
- package/src/avm/opcodes/arithmetic.ts +5 -7
- package/src/avm/opcodes/bitwise.ts +23 -20
- package/src/avm/opcodes/commitment.ts +6 -7
- package/src/avm/opcodes/comparators.ts +7 -9
- package/src/avm/opcodes/contract.ts +5 -7
- package/src/avm/opcodes/control_flow.ts +5 -5
- package/src/avm/opcodes/conversion.ts +19 -12
- package/src/avm/opcodes/ec_add.ts +14 -16
- package/src/avm/opcodes/environment_getters.ts +73 -99
- package/src/avm/opcodes/external_calls.ts +27 -20
- package/src/avm/opcodes/hashing.ts +52 -52
- package/src/avm/opcodes/index.ts +3 -0
- package/src/avm/opcodes/instruction.ts +3 -10
- package/src/avm/opcodes/instruction_impl.ts +0 -62
- package/src/avm/opcodes/memory.ts +37 -67
- package/src/avm/opcodes/misc.ts +5 -7
- package/src/avm/opcodes/multi_scalar_mul.ts +16 -19
- package/src/avm/opcodes/storage.ts +10 -8
- package/src/avm/serialization/bytecode_serialization.ts +11 -35
- package/src/avm/serialization/instruction_serialization.ts +3 -19
- package/src/avm/test_utils.ts +20 -16
- package/src/client/client_execution_context.ts +40 -96
- package/src/client/index.ts +0 -1
- package/src/client/private_execution.ts +9 -9
- package/src/client/simulator.ts +2 -3
- package/src/client/test_utils.ts +36 -9
- package/src/client/unconstrained_execution.ts +3 -8
- package/src/common/debug_fn_name.ts +22 -0
- package/src/common/index.ts +0 -1
- package/src/public/enqueued_call_simulator.ts +335 -0
- package/src/public/enqueued_calls_processor.ts +388 -0
- package/src/public/execution.ts +16 -12
- package/src/public/executor.ts +8 -22
- package/src/public/hints_builder.ts +21 -21
- package/src/public/index.ts +3 -2
- package/src/public/public_db_sources.ts +62 -67
- package/src/public/public_kernel.ts +15 -49
- package/src/public/public_kernel_circuit_simulator.ts +6 -10
- package/src/public/public_kernel_tail_simulator.ts +106 -0
- package/src/public/public_processor.ts +65 -86
- package/src/public/public_processor_metrics.ts +3 -3
- package/src/public/side_effect_errors.ts +6 -0
- package/src/public/side_effect_trace.ts +77 -39
- package/src/public/side_effect_trace_interface.ts +2 -2
- package/dest/avm/journal/host_storage.d.ts +0 -13
- package/dest/avm/journal/host_storage.d.ts.map +0 -1
- package/dest/avm/journal/host_storage.js +0 -13
- package/dest/avm/opcodes/context_getters.d.ts +0 -15
- package/dest/avm/opcodes/context_getters.d.ts.map +0 -1
- package/dest/avm/opcodes/context_getters.js +0 -19
- package/dest/client/execution_result.d.ts +0 -104
- package/dest/client/execution_result.d.ts.map +0 -1
- package/dest/client/execution_result.js +0 -136
- package/dest/common/return_values.d.ts +0 -11
- package/dest/common/return_values.d.ts.map +0 -1
- package/dest/common/return_values.js +0 -13
- package/dest/public/abstract_phase_manager.d.ts +0 -93
- package/dest/public/abstract_phase_manager.d.ts.map +0 -1
- package/dest/public/abstract_phase_manager.js +0 -285
- package/dest/public/app_logic_phase_manager.d.ts +0 -25
- package/dest/public/app_logic_phase_manager.d.ts.map +0 -1
- package/dest/public/app_logic_phase_manager.js +0 -52
- package/dest/public/phase_manager_factory.d.ts +0 -18
- package/dest/public/phase_manager_factory.d.ts.map +0 -1
- package/dest/public/phase_manager_factory.js +0 -56
- package/dest/public/setup_phase_manager.d.ts +0 -25
- package/dest/public/setup_phase_manager.d.ts.map +0 -1
- package/dest/public/setup_phase_manager.js +0 -39
- package/dest/public/tail_phase_manager.d.ts +0 -23
- package/dest/public/tail_phase_manager.d.ts.map +0 -1
- package/dest/public/tail_phase_manager.js +0 -50
- package/dest/public/teardown_phase_manager.d.ts +0 -27
- package/dest/public/teardown_phase_manager.d.ts.map +0 -1
- package/dest/public/teardown_phase_manager.js +0 -56
- package/src/avm/journal/host_storage.ts +0 -14
- package/src/avm/opcodes/context_getters.ts +0 -23
- package/src/client/execution_result.ts +0 -228
- package/src/common/return_values.ts +0 -18
- package/src/public/abstract_phase_manager.ts +0 -522
- package/src/public/app_logic_phase_manager.ts +0 -81
- package/src/public/phase_manager_factory.ts +0 -126
- package/src/public/setup_phase_manager.ts +0 -61
- package/src/public/tail_phase_manager.ts +0 -127
- package/src/public/teardown_phase_manager.ts +0 -86
|
@@ -3,11 +3,12 @@ import { Fr } from '@aztec/foundation/fields';
|
|
|
3
3
|
import { type DebugLogger, createDebugLogger } from '@aztec/foundation/log';
|
|
4
4
|
import { SerializableContractInstance } from '@aztec/types/contracts';
|
|
5
5
|
|
|
6
|
+
import { getPublicFunctionDebugName } from '../../common/debug_fn_name.js';
|
|
7
|
+
import { type WorldStateDB } from '../../public/public_db_sources.js';
|
|
6
8
|
import { type TracedContractInstance } from '../../public/side_effect_trace.js';
|
|
7
9
|
import { type PublicSideEffectTraceInterface } from '../../public/side_effect_trace_interface.js';
|
|
8
10
|
import { type AvmContractCallResult } from '../avm_contract_call_result.js';
|
|
9
11
|
import { type AvmExecutionEnvironment } from '../avm_execution_environment.js';
|
|
10
|
-
import { type HostStorage } from './host_storage.js';
|
|
11
12
|
import { NullifierManager } from './nullifiers.js';
|
|
12
13
|
import { PublicStorage } from './public_storage.js';
|
|
13
14
|
|
|
@@ -25,7 +26,7 @@ export class AvmPersistableStateManager {
|
|
|
25
26
|
|
|
26
27
|
constructor(
|
|
27
28
|
/** Reference to node storage */
|
|
28
|
-
private readonly
|
|
29
|
+
private readonly worldStateDB: WorldStateDB,
|
|
29
30
|
/** Side effect trace */
|
|
30
31
|
private readonly trace: PublicSideEffectTraceInterface,
|
|
31
32
|
/** Public storage, including cached writes */
|
|
@@ -39,18 +40,15 @@ export class AvmPersistableStateManager {
|
|
|
39
40
|
* Create a new state manager with some preloaded pending siloed nullifiers
|
|
40
41
|
*/
|
|
41
42
|
public static newWithPendingSiloedNullifiers(
|
|
42
|
-
|
|
43
|
+
worldStateDB: WorldStateDB,
|
|
43
44
|
trace: PublicSideEffectTraceInterface,
|
|
44
45
|
pendingSiloedNullifiers: Fr[],
|
|
45
46
|
) {
|
|
46
|
-
const parentNullifiers = NullifierManager.newWithPendingSiloedNullifiers(
|
|
47
|
-
hostStorage.commitmentsDb,
|
|
48
|
-
pendingSiloedNullifiers,
|
|
49
|
-
);
|
|
47
|
+
const parentNullifiers = NullifierManager.newWithPendingSiloedNullifiers(worldStateDB, pendingSiloedNullifiers);
|
|
50
48
|
return new AvmPersistableStateManager(
|
|
51
|
-
|
|
49
|
+
worldStateDB,
|
|
52
50
|
trace,
|
|
53
|
-
/*publicStorage=*/ new PublicStorage(
|
|
51
|
+
/*publicStorage=*/ new PublicStorage(worldStateDB),
|
|
54
52
|
/*nullifiers=*/ parentNullifiers.fork(),
|
|
55
53
|
);
|
|
56
54
|
}
|
|
@@ -60,7 +58,7 @@ export class AvmPersistableStateManager {
|
|
|
60
58
|
*/
|
|
61
59
|
public fork() {
|
|
62
60
|
return new AvmPersistableStateManager(
|
|
63
|
-
this.
|
|
61
|
+
this.worldStateDB,
|
|
64
62
|
this.trace.fork(),
|
|
65
63
|
this.publicStorage.fork(),
|
|
66
64
|
this.nullifiers.fork(),
|
|
@@ -122,7 +120,7 @@ export class AvmPersistableStateManager {
|
|
|
122
120
|
* @returns true if the note hash exists at the given leaf index, false otherwise
|
|
123
121
|
*/
|
|
124
122
|
public async checkNoteHashExists(storageAddress: Fr, noteHash: Fr, leafIndex: Fr): Promise<boolean> {
|
|
125
|
-
const gotLeafValue = (await this.
|
|
123
|
+
const gotLeafValue = (await this.worldStateDB.getCommitmentValue(leafIndex.toBigInt())) ?? Fr.ZERO;
|
|
126
124
|
const exists = gotLeafValue.equals(noteHash);
|
|
127
125
|
this.log.debug(
|
|
128
126
|
`noteHashes(${storageAddress})@${noteHash} ?? leafIndex: ${leafIndex} | gotLeafValue: ${gotLeafValue}, exists: ${exists}.`,
|
|
@@ -177,7 +175,7 @@ export class AvmPersistableStateManager {
|
|
|
177
175
|
* @returns exists - whether the message exists in the L1 to L2 Messages tree
|
|
178
176
|
*/
|
|
179
177
|
public async checkL1ToL2MessageExists(contractAddress: Fr, msgHash: Fr, msgLeafIndex: Fr): Promise<boolean> {
|
|
180
|
-
const valueAtIndex = (await this.
|
|
178
|
+
const valueAtIndex = (await this.worldStateDB.getL1ToL2LeafValue(msgLeafIndex.toBigInt())) ?? Fr.ZERO;
|
|
181
179
|
const exists = valueAtIndex.equals(msgHash);
|
|
182
180
|
this.log.debug(
|
|
183
181
|
`l1ToL2Messages(@${msgLeafIndex}) ?? exists: ${exists}, expected: ${msgHash}, found: ${valueAtIndex}.`,
|
|
@@ -190,12 +188,13 @@ export class AvmPersistableStateManager {
|
|
|
190
188
|
|
|
191
189
|
/**
|
|
192
190
|
* Write an L2 to L1 message.
|
|
191
|
+
* @param contractAddress - L2 contract address that created this message
|
|
193
192
|
* @param recipient - L1 contract address to send the message to.
|
|
194
193
|
* @param content - Message content.
|
|
195
194
|
*/
|
|
196
|
-
public writeL2ToL1Message(recipient: Fr, content: Fr) {
|
|
197
|
-
this.log.debug(`
|
|
198
|
-
this.trace.traceNewL2ToL1Message(recipient, content);
|
|
195
|
+
public writeL2ToL1Message(contractAddress: Fr, recipient: Fr, content: Fr) {
|
|
196
|
+
this.log.debug(`L2ToL1Messages(${contractAddress}) += (recipient: ${recipient}, content: ${content}).`);
|
|
197
|
+
this.trace.traceNewL2ToL1Message(contractAddress, recipient, content);
|
|
199
198
|
}
|
|
200
199
|
|
|
201
200
|
/**
|
|
@@ -217,7 +216,7 @@ export class AvmPersistableStateManager {
|
|
|
217
216
|
public async getContractInstance(contractAddress: Fr): Promise<TracedContractInstance> {
|
|
218
217
|
let exists = true;
|
|
219
218
|
const aztecAddress = AztecAddress.fromField(contractAddress);
|
|
220
|
-
let instance = await this.
|
|
219
|
+
let instance = await this.worldStateDB.getContractInstance(aztecAddress);
|
|
221
220
|
if (instance === undefined) {
|
|
222
221
|
instance = SerializableContractInstance.empty().withAddress(aztecAddress);
|
|
223
222
|
exists = false;
|
|
@@ -242,7 +241,7 @@ export class AvmPersistableStateManager {
|
|
|
242
241
|
* Get a contract's bytecode from the contracts DB
|
|
243
242
|
*/
|
|
244
243
|
public async getBytecode(contractAddress: AztecAddress, selector: FunctionSelector): Promise<Buffer | undefined> {
|
|
245
|
-
return await this.
|
|
244
|
+
return await this.worldStateDB.getBytecode(contractAddress, selector);
|
|
246
245
|
}
|
|
247
246
|
|
|
248
247
|
/**
|
|
@@ -259,11 +258,12 @@ export class AvmPersistableStateManager {
|
|
|
259
258
|
if (!avmCallResults.reverted) {
|
|
260
259
|
this.acceptNestedCallState(nestedState);
|
|
261
260
|
}
|
|
262
|
-
const functionName =
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
261
|
+
const functionName = await getPublicFunctionDebugName(
|
|
262
|
+
this.worldStateDB,
|
|
263
|
+
nestedEnvironment.address,
|
|
264
|
+
nestedEnvironment.functionSelector,
|
|
265
|
+
nestedEnvironment.calldata,
|
|
266
|
+
);
|
|
267
267
|
|
|
268
268
|
this.log.verbose(`[AVM] Calling nested function ${functionName}`);
|
|
269
269
|
|
|
@@ -28,13 +28,11 @@ export class NoteHashExists extends Instruction {
|
|
|
28
28
|
}
|
|
29
29
|
|
|
30
30
|
public async execute(context: AvmContext): Promise<void> {
|
|
31
|
-
const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
|
|
32
31
|
const memory = context.machineState.memory.track(this.type);
|
|
33
|
-
context.machineState.consumeGas(this.gasCost(
|
|
34
|
-
const [noteHashOffset, leafIndexOffset, existsOffset]
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
);
|
|
32
|
+
context.machineState.consumeGas(this.gasCost());
|
|
33
|
+
const operands = [this.noteHashOffset, this.leafIndexOffset, this.existsOffset];
|
|
34
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
35
|
+
const [noteHashOffset, leafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
38
36
|
memory.checkTags(TypeTag.FIELD, noteHashOffset, leafIndexOffset);
|
|
39
37
|
|
|
40
38
|
// Note that this instruction accepts any type in memory, and converts to Field.
|
|
@@ -48,7 +46,7 @@ export class NoteHashExists extends Instruction {
|
|
|
48
46
|
);
|
|
49
47
|
memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0));
|
|
50
48
|
|
|
51
|
-
memory.assert(
|
|
49
|
+
memory.assert({ reads: 2, writes: 1, addressing });
|
|
52
50
|
context.machineState.incrementPc();
|
|
53
51
|
}
|
|
54
52
|
}
|
|
@@ -64,11 +62,12 @@ export class EmitNoteHash extends Instruction {
|
|
|
64
62
|
}
|
|
65
63
|
|
|
66
64
|
public async execute(context: AvmContext): Promise<void> {
|
|
67
|
-
const memoryOperations = { reads: 1, indirect: this.indirect };
|
|
68
65
|
const memory = context.machineState.memory.track(this.type);
|
|
69
|
-
context.machineState.consumeGas(this.gasCost(
|
|
66
|
+
context.machineState.consumeGas(this.gasCost());
|
|
70
67
|
|
|
71
|
-
const
|
|
68
|
+
const operands = [this.noteHashOffset];
|
|
69
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
70
|
+
const [noteHashOffset] = addressing.resolve(operands, memory);
|
|
72
71
|
memory.checkTag(TypeTag.FIELD, noteHashOffset);
|
|
73
72
|
|
|
74
73
|
if (context.environment.isStaticCall) {
|
|
@@ -78,7 +77,7 @@ export class EmitNoteHash extends Instruction {
|
|
|
78
77
|
const noteHash = memory.get(noteHashOffset).toFr();
|
|
79
78
|
context.persistableState.writeNoteHash(context.environment.storageAddress, noteHash);
|
|
80
79
|
|
|
81
|
-
memory.assert(
|
|
80
|
+
memory.assert({ reads: 1, addressing });
|
|
82
81
|
context.machineState.incrementPc();
|
|
83
82
|
}
|
|
84
83
|
}
|
|
@@ -105,14 +104,12 @@ export class NullifierExists extends Instruction {
|
|
|
105
104
|
}
|
|
106
105
|
|
|
107
106
|
public async execute(context: AvmContext): Promise<void> {
|
|
108
|
-
const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
|
|
109
107
|
const memory = context.machineState.memory.track(this.type);
|
|
110
|
-
context.machineState.consumeGas(this.gasCost(
|
|
108
|
+
context.machineState.consumeGas(this.gasCost());
|
|
111
109
|
|
|
112
|
-
const [nullifierOffset, addressOffset, existsOffset]
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
);
|
|
110
|
+
const operands = [this.nullifierOffset, this.addressOffset, this.existsOffset];
|
|
111
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
112
|
+
const [nullifierOffset, addressOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
116
113
|
memory.checkTags(TypeTag.FIELD, nullifierOffset, addressOffset);
|
|
117
114
|
|
|
118
115
|
const nullifier = memory.get(nullifierOffset).toFr();
|
|
@@ -121,7 +118,7 @@ export class NullifierExists extends Instruction {
|
|
|
121
118
|
|
|
122
119
|
memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0));
|
|
123
120
|
|
|
124
|
-
memory.assert(
|
|
121
|
+
memory.assert({ reads: 2, writes: 1, addressing });
|
|
125
122
|
context.machineState.incrementPc();
|
|
126
123
|
}
|
|
127
124
|
}
|
|
@@ -141,11 +138,12 @@ export class EmitNullifier extends Instruction {
|
|
|
141
138
|
throw new StaticCallAlterationError();
|
|
142
139
|
}
|
|
143
140
|
|
|
144
|
-
const memoryOperations = { reads: 1, indirect: this.indirect };
|
|
145
141
|
const memory = context.machineState.memory.track(this.type);
|
|
146
|
-
context.machineState.consumeGas(this.gasCost(
|
|
142
|
+
context.machineState.consumeGas(this.gasCost());
|
|
147
143
|
|
|
148
|
-
const
|
|
144
|
+
const operands = [this.nullifierOffset];
|
|
145
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
146
|
+
const [nullifierOffset] = addressing.resolve(operands, memory);
|
|
149
147
|
memory.checkTag(TypeTag.FIELD, nullifierOffset);
|
|
150
148
|
|
|
151
149
|
const nullifier = memory.get(nullifierOffset).toFr();
|
|
@@ -162,7 +160,7 @@ export class EmitNullifier extends Instruction {
|
|
|
162
160
|
}
|
|
163
161
|
}
|
|
164
162
|
|
|
165
|
-
memory.assert(
|
|
163
|
+
memory.assert({ reads: 1, addressing });
|
|
166
164
|
context.machineState.incrementPc();
|
|
167
165
|
}
|
|
168
166
|
}
|
|
@@ -189,14 +187,12 @@ export class L1ToL2MessageExists extends Instruction {
|
|
|
189
187
|
}
|
|
190
188
|
|
|
191
189
|
public async execute(context: AvmContext): Promise<void> {
|
|
192
|
-
const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
|
|
193
190
|
const memory = context.machineState.memory.track(this.type);
|
|
194
|
-
context.machineState.consumeGas(this.gasCost(
|
|
191
|
+
context.machineState.consumeGas(this.gasCost());
|
|
195
192
|
|
|
196
|
-
const [msgHashOffset, msgLeafIndexOffset, existsOffset]
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
);
|
|
193
|
+
const operands = [this.msgHashOffset, this.msgLeafIndexOffset, this.existsOffset];
|
|
194
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
195
|
+
const [msgHashOffset, msgLeafIndexOffset, existsOffset] = addressing.resolve(operands, memory);
|
|
200
196
|
memory.checkTags(TypeTag.FIELD, msgHashOffset, msgLeafIndexOffset);
|
|
201
197
|
|
|
202
198
|
const msgHash = memory.get(msgHashOffset).toFr();
|
|
@@ -208,7 +204,7 @@ export class L1ToL2MessageExists extends Instruction {
|
|
|
208
204
|
);
|
|
209
205
|
memory.set(existsOffset, exists ? new Uint8(1) : new Uint8(0));
|
|
210
206
|
|
|
211
|
-
memory.assert(
|
|
207
|
+
memory.assert({ reads: 2, writes: 1, addressing });
|
|
212
208
|
context.machineState.incrementPc();
|
|
213
209
|
}
|
|
214
210
|
}
|
|
@@ -230,22 +226,20 @@ export class EmitUnencryptedLog extends Instruction {
|
|
|
230
226
|
|
|
231
227
|
const memory = context.machineState.memory.track(this.type);
|
|
232
228
|
|
|
233
|
-
const [logOffset, logSizeOffset]
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
);
|
|
229
|
+
const operands = [this.logOffset, this.logSizeOffset];
|
|
230
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
231
|
+
const [logOffset, logSizeOffset] = addressing.resolve(operands, memory);
|
|
237
232
|
memory.checkTag(TypeTag.UINT32, logSizeOffset);
|
|
238
233
|
const logSize = memory.get(logSizeOffset).toNumber();
|
|
239
234
|
memory.checkTagsRange(TypeTag.FIELD, logOffset, logSize);
|
|
240
235
|
|
|
241
236
|
const contractAddress = context.environment.address;
|
|
242
237
|
|
|
243
|
-
|
|
244
|
-
context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: logSize }));
|
|
238
|
+
context.machineState.consumeGas(this.gasCost(logSize));
|
|
245
239
|
const log = memory.getSlice(logOffset, logSize).map(f => f.toFr());
|
|
246
240
|
context.persistableState.writeUnencryptedLog(contractAddress, log);
|
|
247
241
|
|
|
248
|
-
memory.assert(
|
|
242
|
+
memory.assert({ reads: 1 + logSize, addressing });
|
|
249
243
|
context.machineState.incrementPc();
|
|
250
244
|
}
|
|
251
245
|
}
|
|
@@ -265,20 +259,18 @@ export class SendL2ToL1Message extends Instruction {
|
|
|
265
259
|
throw new StaticCallAlterationError();
|
|
266
260
|
}
|
|
267
261
|
|
|
268
|
-
const memoryOperations = { reads: 2, indirect: this.indirect };
|
|
269
262
|
const memory = context.machineState.memory.track(this.type);
|
|
270
|
-
context.machineState.consumeGas(this.gasCost(
|
|
263
|
+
context.machineState.consumeGas(this.gasCost());
|
|
271
264
|
|
|
272
|
-
const [recipientOffset, contentOffset]
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
);
|
|
265
|
+
const operands = [this.recipientOffset, this.contentOffset];
|
|
266
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
267
|
+
const [recipientOffset, contentOffset] = addressing.resolve(operands, memory);
|
|
276
268
|
|
|
277
269
|
const recipient = memory.get(recipientOffset).toFr();
|
|
278
270
|
const content = memory.get(contentOffset).toFr();
|
|
279
|
-
context.persistableState.writeL2ToL1Message(recipient, content);
|
|
271
|
+
context.persistableState.writeL2ToL1Message(context.environment.address, recipient, content);
|
|
280
272
|
|
|
281
|
-
memory.assert(
|
|
273
|
+
memory.assert({ reads: 2, addressing });
|
|
282
274
|
context.machineState.incrementPc();
|
|
283
275
|
}
|
|
284
276
|
}
|
|
@@ -3,9 +3,10 @@ import { strict as assert } from 'assert';
|
|
|
3
3
|
import { type TaggedMemoryInterface } from '../avm_memory_types.js';
|
|
4
4
|
|
|
5
5
|
export enum AddressingMode {
|
|
6
|
-
DIRECT,
|
|
7
|
-
INDIRECT,
|
|
8
|
-
|
|
6
|
+
DIRECT = 0,
|
|
7
|
+
INDIRECT = 1,
|
|
8
|
+
RELATIVE = 2,
|
|
9
|
+
INDIRECT_RELATIVE = 3,
|
|
9
10
|
}
|
|
10
11
|
|
|
11
12
|
/** A class to represent the addressing mode of an instruction. */
|
|
@@ -13,16 +14,17 @@ export class Addressing {
|
|
|
13
14
|
public constructor(
|
|
14
15
|
/** The addressing mode for each operand. The length of this array is the number of operands of the instruction. */
|
|
15
16
|
private readonly modePerOperand: AddressingMode[],
|
|
16
|
-
) {
|
|
17
|
-
assert(modePerOperand.length <= 8, 'At most 8 operands are supported');
|
|
18
|
-
}
|
|
17
|
+
) {}
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
// TODO(facundo): 8 for backwards compatibility.
|
|
20
|
+
public static fromWire(wireModes: number, numOperands: number = 8): Addressing {
|
|
21
21
|
// The modes are stored in the wire format as a byte, with each bit representing the mode for an operand.
|
|
22
22
|
// The least significant bit represents the zeroth operand, and the most significant bit represents the last operand.
|
|
23
|
-
const modes = new Array<AddressingMode>(
|
|
24
|
-
for (let i = 0; i <
|
|
25
|
-
modes[i] =
|
|
23
|
+
const modes = new Array<AddressingMode>(numOperands);
|
|
24
|
+
for (let i = 0; i < numOperands; i++) {
|
|
25
|
+
modes[i] =
|
|
26
|
+
(((wireModes >> i) & 1) * AddressingMode.INDIRECT) |
|
|
27
|
+
(((wireModes >> (i + numOperands)) & 1) * AddressingMode.RELATIVE);
|
|
26
28
|
}
|
|
27
29
|
return new Addressing(modes);
|
|
28
30
|
}
|
|
@@ -31,17 +33,20 @@ export class Addressing {
|
|
|
31
33
|
// The modes are stored in the wire format as a byte, with each bit representing the mode for an operand.
|
|
32
34
|
// The least significant bit represents the zeroth operand, and the least significant bit represents the last operand.
|
|
33
35
|
let wire: number = 0;
|
|
34
|
-
for (let i = 0; i <
|
|
35
|
-
if (this.modePerOperand[i]
|
|
36
|
+
for (let i = 0; i < this.modePerOperand.length; i++) {
|
|
37
|
+
if (this.modePerOperand[i] & AddressingMode.INDIRECT) {
|
|
36
38
|
wire |= 1 << i;
|
|
37
39
|
}
|
|
40
|
+
if (this.modePerOperand[i] & AddressingMode.RELATIVE) {
|
|
41
|
+
wire |= 1 << (this.modePerOperand.length + i);
|
|
42
|
+
}
|
|
38
43
|
}
|
|
39
44
|
return wire;
|
|
40
45
|
}
|
|
41
46
|
|
|
42
47
|
/** Returns how many operands use the given addressing mode. */
|
|
43
48
|
public count(mode: AddressingMode): number {
|
|
44
|
-
return this.modePerOperand.filter(m => m
|
|
49
|
+
return this.modePerOperand.filter(m => (m & mode) !== 0).length;
|
|
45
50
|
}
|
|
46
51
|
|
|
47
52
|
/**
|
|
@@ -54,17 +59,15 @@ export class Addressing {
|
|
|
54
59
|
assert(offsets.length <= this.modePerOperand.length);
|
|
55
60
|
const resolved = new Array(offsets.length);
|
|
56
61
|
for (const [i, offset] of offsets.entries()) {
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
default:
|
|
67
|
-
throw new Error(`Unimplemented addressing mode: ${AddressingMode[this.modePerOperand[i]]}`);
|
|
62
|
+
const mode = this.modePerOperand[i];
|
|
63
|
+
resolved[i] = offset;
|
|
64
|
+
if (mode & AddressingMode.RELATIVE) {
|
|
65
|
+
mem.checkIsValidMemoryOffsetTag(0);
|
|
66
|
+
resolved[i] += Number(mem.get(0).toBigInt());
|
|
67
|
+
}
|
|
68
|
+
if (mode & AddressingMode.INDIRECT) {
|
|
69
|
+
mem.checkIsValidMemoryOffsetTag(resolved[i]);
|
|
70
|
+
resolved[i] = Number(mem.get(resolved[i]).toBigInt());
|
|
68
71
|
}
|
|
69
72
|
}
|
|
70
73
|
return resolved;
|
|
@@ -6,14 +6,12 @@ import { ThreeOperandInstruction } from './instruction_impl.js';
|
|
|
6
6
|
|
|
7
7
|
export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInstruction {
|
|
8
8
|
public async execute(context: AvmContext): Promise<void> {
|
|
9
|
-
const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
|
|
10
9
|
const memory = context.machineState.memory.track(this.type);
|
|
11
|
-
context.machineState.consumeGas(this.gasCost(
|
|
10
|
+
context.machineState.consumeGas(this.gasCost());
|
|
12
11
|
|
|
13
|
-
const [aOffset, bOffset, dstOffset]
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
);
|
|
12
|
+
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
13
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
14
|
+
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
17
15
|
memory.checkTags(this.inTag, aOffset, bOffset);
|
|
18
16
|
|
|
19
17
|
const a = memory.get(aOffset);
|
|
@@ -22,7 +20,7 @@ export abstract class ThreeOperandArithmeticInstruction extends ThreeOperandInst
|
|
|
22
20
|
const dest = this.compute(a, b);
|
|
23
21
|
memory.set(dstOffset, dest);
|
|
24
22
|
|
|
25
|
-
memory.assert(
|
|
23
|
+
memory.assert({ reads: 2, writes: 1, addressing });
|
|
26
24
|
context.machineState.incrementPc();
|
|
27
25
|
}
|
|
28
26
|
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
import type { AvmContext } from '../avm_context.js';
|
|
2
|
-
import { type IntegralValue, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
|
|
3
|
-
import { Opcode } from '../serialization/instruction_serialization.js';
|
|
2
|
+
import { type IntegralValue, TaggedMemory, type TaggedMemoryInterface, TypeTag } from '../avm_memory_types.js';
|
|
3
|
+
import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
|
|
4
4
|
import { Addressing } from './addressing_mode.js';
|
|
5
|
-
import {
|
|
5
|
+
import { Instruction } from './instruction.js';
|
|
6
|
+
import { ThreeOperandInstruction } from './instruction_impl.js';
|
|
6
7
|
|
|
7
8
|
abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
|
|
8
9
|
public async execute(context: AvmContext): Promise<void> {
|
|
9
|
-
const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
|
|
10
10
|
const memory = context.machineState.memory.track(this.type);
|
|
11
|
-
context.machineState.consumeGas(this.gasCost(
|
|
11
|
+
context.machineState.consumeGas(this.gasCost());
|
|
12
12
|
|
|
13
|
-
const [aOffset, bOffset, dstOffset]
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
);
|
|
13
|
+
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
14
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
15
|
+
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
17
16
|
this.checkTags(memory, this.inTag, aOffset, bOffset);
|
|
18
17
|
|
|
19
18
|
const a = memory.getAs<IntegralValue>(aOffset);
|
|
@@ -22,7 +21,7 @@ abstract class ThreeOperandBitwiseInstruction extends ThreeOperandInstruction {
|
|
|
22
21
|
const res = this.compute(a, b);
|
|
23
22
|
memory.set(dstOffset, res);
|
|
24
23
|
|
|
25
|
-
memory.assert(
|
|
24
|
+
memory.assert({ reads: 2, writes: 1, addressing });
|
|
26
25
|
context.machineState.incrementPc();
|
|
27
26
|
}
|
|
28
27
|
|
|
@@ -85,27 +84,31 @@ export class Shr extends ThreeOperandBitwiseInstruction {
|
|
|
85
84
|
}
|
|
86
85
|
}
|
|
87
86
|
|
|
88
|
-
export class Not extends
|
|
87
|
+
export class Not extends Instruction {
|
|
89
88
|
static readonly type: string = 'NOT';
|
|
90
89
|
static readonly opcode = Opcode.NOT_8;
|
|
91
90
|
|
|
92
|
-
|
|
93
|
-
|
|
91
|
+
static readonly wireFormat8 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT8, OperandType.UINT8];
|
|
92
|
+
static readonly wireFormat16 = [OperandType.UINT8, OperandType.UINT8, OperandType.UINT16, OperandType.UINT16];
|
|
93
|
+
|
|
94
|
+
constructor(private indirect: number, private srcOffset: number, private dstOffset: number) {
|
|
95
|
+
super();
|
|
94
96
|
}
|
|
95
97
|
|
|
96
98
|
public async execute(context: AvmContext): Promise<void> {
|
|
97
|
-
const memoryOperations = { reads: 1, writes: 1, indirect: this.indirect };
|
|
98
99
|
const memory = context.machineState.memory.track(this.type);
|
|
99
|
-
context.machineState.consumeGas(this.gasCost(
|
|
100
|
+
context.machineState.consumeGas(this.gasCost());
|
|
100
101
|
|
|
101
|
-
const
|
|
102
|
-
|
|
103
|
-
const
|
|
102
|
+
const operands = [this.srcOffset, this.dstOffset];
|
|
103
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
104
|
+
const [srcOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
105
|
+
TaggedMemory.checkIsIntegralTag(memory.getTag(srcOffset));
|
|
106
|
+
const value = memory.getAs<IntegralValue>(srcOffset);
|
|
104
107
|
|
|
105
|
-
const res =
|
|
108
|
+
const res = value.not();
|
|
106
109
|
memory.set(dstOffset, res);
|
|
107
110
|
|
|
108
|
-
memory.assert(
|
|
111
|
+
memory.assert({ reads: 1, writes: 1, addressing });
|
|
109
112
|
context.machineState.incrementPc();
|
|
110
113
|
}
|
|
111
114
|
}
|
|
@@ -32,10 +32,10 @@ export class PedersenCommitment extends Instruction {
|
|
|
32
32
|
|
|
33
33
|
public async execute(context: AvmContext): Promise<void> {
|
|
34
34
|
const memory = context.machineState.memory.track(this.type);
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
);
|
|
35
|
+
|
|
36
|
+
const operands = [this.inputOffset, this.outputOffset, this.inputSizeOffset, this.genIndexOffset];
|
|
37
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
38
|
+
const [inputOffset, outputOffset, inputSizeOffset, genIndexOffset] = addressing.resolve(operands, memory);
|
|
39
39
|
|
|
40
40
|
const inputSize = memory.get(inputSizeOffset).toNumber();
|
|
41
41
|
memory.checkTag(TypeTag.UINT32, inputSizeOffset);
|
|
@@ -46,8 +46,7 @@ export class PedersenCommitment extends Instruction {
|
|
|
46
46
|
const generatorIndex = memory.get(genIndexOffset).toNumber();
|
|
47
47
|
memory.checkTag(TypeTag.UINT32, genIndexOffset);
|
|
48
48
|
|
|
49
|
-
|
|
50
|
-
context.machineState.consumeGas(this.gasCost(memoryOperations));
|
|
49
|
+
context.machineState.consumeGas(this.gasCost(inputSize));
|
|
51
50
|
|
|
52
51
|
const inputBuffer: Buffer[] = inputs.map(input => input.toBuffer());
|
|
53
52
|
// TODO: Add the generate index to the pedersenCommit function
|
|
@@ -60,7 +59,7 @@ export class PedersenCommitment extends Instruction {
|
|
|
60
59
|
memory.set(outputOffset + 1, commitment[1]); // Field typed
|
|
61
60
|
memory.set(outputOffset + 2, new Uint8(isInfinity ? 1 : 0)); // U8 typed
|
|
62
61
|
|
|
63
|
-
memory.assert(
|
|
62
|
+
memory.assert({ reads: inputSize + 2, writes: 3, addressing });
|
|
64
63
|
context.machineState.incrementPc();
|
|
65
64
|
}
|
|
66
65
|
}
|
|
@@ -1,28 +1,26 @@
|
|
|
1
1
|
import type { AvmContext } from '../avm_context.js';
|
|
2
|
-
import { type MemoryValue,
|
|
2
|
+
import { type MemoryValue, Uint1 } from '../avm_memory_types.js';
|
|
3
3
|
import { Opcode } from '../serialization/instruction_serialization.js';
|
|
4
4
|
import { Addressing } from './addressing_mode.js';
|
|
5
5
|
import { ThreeOperandInstruction } from './instruction_impl.js';
|
|
6
6
|
|
|
7
7
|
abstract class ComparatorInstruction extends ThreeOperandInstruction {
|
|
8
8
|
public async execute(context: AvmContext): Promise<void> {
|
|
9
|
-
const memoryOperations = { reads: 2, writes: 1, indirect: this.indirect };
|
|
10
9
|
const memory = context.machineState.memory.track(this.type);
|
|
11
|
-
context.machineState.consumeGas(this.gasCost(
|
|
10
|
+
context.machineState.consumeGas(this.gasCost());
|
|
12
11
|
|
|
13
|
-
const [aOffset, bOffset, dstOffset]
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
);
|
|
12
|
+
const operands = [this.aOffset, this.bOffset, this.dstOffset];
|
|
13
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
14
|
+
const [aOffset, bOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
17
15
|
memory.checkTags(this.inTag, aOffset, bOffset);
|
|
18
16
|
|
|
19
17
|
const a = memory.get(aOffset);
|
|
20
18
|
const b = memory.get(bOffset);
|
|
21
19
|
|
|
22
|
-
const dest = new
|
|
20
|
+
const dest = new Uint1(this.compare(a, b) ? 1 : 0);
|
|
23
21
|
memory.set(dstOffset, dest);
|
|
24
22
|
|
|
25
|
-
memory.assert(
|
|
23
|
+
memory.assert({ reads: 2, writes: 1, addressing });
|
|
26
24
|
context.machineState.incrementPc();
|
|
27
25
|
}
|
|
28
26
|
|
|
@@ -22,14 +22,12 @@ export class GetContractInstance extends Instruction {
|
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
async execute(context: AvmContext): Promise<void> {
|
|
25
|
-
const memoryOperations = { reads: 1, writes: 6, indirect: this.indirect };
|
|
26
25
|
const memory = context.machineState.memory.track(this.type);
|
|
27
|
-
context.machineState.consumeGas(this.gasCost(
|
|
26
|
+
context.machineState.consumeGas(this.gasCost());
|
|
28
27
|
|
|
29
|
-
const [addressOffset, dstOffset]
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
);
|
|
28
|
+
const operands = [this.addressOffset, this.dstOffset];
|
|
29
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
30
|
+
const [addressOffset, dstOffset] = addressing.resolve(operands, memory);
|
|
33
31
|
memory.checkTag(TypeTag.FIELD, addressOffset);
|
|
34
32
|
|
|
35
33
|
const address = memory.get(addressOffset).toFr();
|
|
@@ -46,7 +44,7 @@ export class GetContractInstance extends Instruction {
|
|
|
46
44
|
|
|
47
45
|
memory.setSlice(dstOffset, data);
|
|
48
46
|
|
|
49
|
-
memory.assert(
|
|
47
|
+
memory.assert({ reads: 1, writes: 6, addressing });
|
|
50
48
|
context.machineState.incrementPc();
|
|
51
49
|
}
|
|
52
50
|
}
|
|
@@ -41,21 +41,21 @@ export class JumpI extends Instruction {
|
|
|
41
41
|
}
|
|
42
42
|
|
|
43
43
|
public async execute(context: AvmContext): Promise<void> {
|
|
44
|
-
const memoryOperations = { reads: 1, indirect: this.indirect };
|
|
45
44
|
const memory = context.machineState.memory.track(this.type);
|
|
46
|
-
context.machineState.consumeGas(this.gasCost(
|
|
45
|
+
context.machineState.consumeGas(this.gasCost());
|
|
47
46
|
|
|
48
|
-
const
|
|
47
|
+
const operands = [this.condOffset];
|
|
48
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
49
|
+
const [condOffset] = addressing.resolve(operands, memory);
|
|
49
50
|
const condition = memory.getAs<IntegralValue>(condOffset);
|
|
50
51
|
|
|
51
|
-
// TODO: reconsider this casting
|
|
52
52
|
if (condition.toBigInt() == 0n) {
|
|
53
53
|
context.machineState.incrementPc();
|
|
54
54
|
} else {
|
|
55
55
|
context.machineState.pc = this.loc;
|
|
56
56
|
}
|
|
57
57
|
|
|
58
|
-
memory.assert(
|
|
58
|
+
memory.assert({ reads: 1, addressing });
|
|
59
59
|
}
|
|
60
60
|
}
|
|
61
61
|
|