@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
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { strict as assert } from 'assert';
|
|
2
|
-
|
|
3
1
|
import { type AvmContext } from '../avm_context.js';
|
|
4
|
-
import { TypeTag, Uint8 } from '../avm_memory_types.js';
|
|
2
|
+
import { TypeTag, Uint1, Uint8 } from '../avm_memory_types.js';
|
|
3
|
+
import { InstructionExecutionError } from '../errors.js';
|
|
5
4
|
import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
|
|
6
5
|
import { Addressing } from './addressing_mode.js';
|
|
7
6
|
import { Instruction } from './instruction.js';
|
|
@@ -16,32 +15,39 @@ export class ToRadixLE extends Instruction {
|
|
|
16
15
|
OperandType.UINT8, // Indirect
|
|
17
16
|
OperandType.UINT32, // src memory address
|
|
18
17
|
OperandType.UINT32, // dst memory address
|
|
19
|
-
OperandType.UINT32, // radix
|
|
18
|
+
OperandType.UINT32, // radix memory address
|
|
20
19
|
OperandType.UINT32, // number of limbs (Immediate)
|
|
20
|
+
OperandType.UINT8, // output is in "bits" mode (Immediate - Uint1 still takes up a whole byte)
|
|
21
21
|
];
|
|
22
22
|
|
|
23
23
|
constructor(
|
|
24
24
|
private indirect: number,
|
|
25
25
|
private srcOffset: number,
|
|
26
26
|
private dstOffset: number,
|
|
27
|
-
private
|
|
27
|
+
private radixOffset: number,
|
|
28
28
|
private numLimbs: number,
|
|
29
|
+
private outputBits: number, // effectively a bool
|
|
29
30
|
) {
|
|
30
|
-
assert(radix <= 256, 'Radix cannot be greater than 256');
|
|
31
31
|
super();
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
public async execute(context: AvmContext): Promise<void> {
|
|
35
35
|
const memory = context.machineState.memory.track(this.type);
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
|
|
36
|
+
const operands = [this.srcOffset, this.dstOffset, this.radixOffset];
|
|
37
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
38
|
+
const [srcOffset, dstOffset, radixOffset] = addressing.resolve(operands, memory);
|
|
39
|
+
context.machineState.consumeGas(this.gasCost(this.numLimbs));
|
|
39
40
|
|
|
40
41
|
// The radix gadget only takes in a Field
|
|
41
42
|
memory.checkTag(TypeTag.FIELD, srcOffset);
|
|
43
|
+
memory.checkTag(TypeTag.UINT32, radixOffset);
|
|
42
44
|
|
|
43
45
|
let value: bigint = memory.get(srcOffset).toBigInt();
|
|
44
|
-
const
|
|
46
|
+
const radix: bigint = memory.get(radixOffset).toBigInt();
|
|
47
|
+
if (radix > 256) {
|
|
48
|
+
throw new InstructionExecutionError(`ToRadixLE instruction's radix should be <= 256 (was ${radix})`);
|
|
49
|
+
}
|
|
50
|
+
const radixBN: bigint = BigInt(radix);
|
|
45
51
|
const limbArray = [];
|
|
46
52
|
|
|
47
53
|
for (let i = 0; i < this.numLimbs; i++) {
|
|
@@ -50,10 +56,11 @@ export class ToRadixLE extends Instruction {
|
|
|
50
56
|
value /= radixBN;
|
|
51
57
|
}
|
|
52
58
|
|
|
53
|
-
const
|
|
59
|
+
const outputType = this.outputBits != 0 ? Uint1 : Uint8;
|
|
60
|
+
const res = limbArray.map(byte => new outputType(byte));
|
|
54
61
|
memory.setSlice(dstOffset, res);
|
|
55
62
|
|
|
56
|
-
memory.assert(
|
|
63
|
+
memory.assert({ reads: 2, writes: this.numLimbs, addressing });
|
|
57
64
|
context.machineState.incrementPc();
|
|
58
65
|
}
|
|
59
66
|
}
|
|
@@ -14,7 +14,7 @@ export class EcAdd extends Instruction {
|
|
|
14
14
|
// Informs (de)serialization. See Instruction.deserialize.
|
|
15
15
|
static readonly wireFormat: OperandType[] = [
|
|
16
16
|
OperandType.UINT8, // reserved
|
|
17
|
-
OperandType.
|
|
17
|
+
OperandType.UINT16, // indirect
|
|
18
18
|
OperandType.UINT32, // p1X
|
|
19
19
|
OperandType.UINT32, // p1Y
|
|
20
20
|
OperandType.UINT32, // p1IsInfinite
|
|
@@ -38,23 +38,21 @@ export class EcAdd extends Instruction {
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
public async execute(context: AvmContext): Promise<void> {
|
|
41
|
-
const memoryOperations = { reads: 6, writes: 3, indirect: this.indirect };
|
|
42
41
|
const memory = context.machineState.memory.track(this.type);
|
|
43
|
-
context.machineState.consumeGas(this.gasCost(
|
|
42
|
+
context.machineState.consumeGas(this.gasCost());
|
|
44
43
|
|
|
44
|
+
const operands = [
|
|
45
|
+
this.p1XOffset,
|
|
46
|
+
this.p1YOffset,
|
|
47
|
+
this.p1IsInfiniteOffset,
|
|
48
|
+
this.p2XOffset,
|
|
49
|
+
this.p2YOffset,
|
|
50
|
+
this.p2IsInfiniteOffset,
|
|
51
|
+
this.dstOffset,
|
|
52
|
+
];
|
|
53
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
45
54
|
const [p1XOffset, p1YOffset, p1IsInfiniteOffset, p2XOffset, p2YOffset, p2IsInfiniteOffset, dstOffset] =
|
|
46
|
-
|
|
47
|
-
[
|
|
48
|
-
this.p1XOffset,
|
|
49
|
-
this.p1YOffset,
|
|
50
|
-
this.p1IsInfiniteOffset,
|
|
51
|
-
this.p2XOffset,
|
|
52
|
-
this.p2YOffset,
|
|
53
|
-
this.p2IsInfiniteOffset,
|
|
54
|
-
this.dstOffset,
|
|
55
|
-
],
|
|
56
|
-
memory,
|
|
57
|
-
);
|
|
55
|
+
addressing.resolve(operands, memory);
|
|
58
56
|
|
|
59
57
|
const p1X = memory.get(p1XOffset);
|
|
60
58
|
const p1Y = memory.get(p1YOffset);
|
|
@@ -86,7 +84,7 @@ export class EcAdd extends Instruction {
|
|
|
86
84
|
// Check representation of infinity for grumpkin
|
|
87
85
|
memory.set(dstOffset + 2, new Field(dest.equals(Point.ZERO) ? 1 : 0));
|
|
88
86
|
|
|
89
|
-
memory.assert(
|
|
87
|
+
memory.assert({ reads: 6, writes: 3, addressing });
|
|
90
88
|
context.machineState.incrementPc();
|
|
91
89
|
}
|
|
92
90
|
}
|
|
@@ -1,112 +1,86 @@
|
|
|
1
1
|
import type { AvmContext } from '../avm_context.js';
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
export class StorageAddress extends EnvironmentGetterInstruction {
|
|
25
|
-
static type: string = 'STORAGEADDRESS';
|
|
26
|
-
static readonly opcode: Opcode = Opcode.STORAGEADDRESS;
|
|
27
|
-
|
|
28
|
-
protected getEnvironmentValue(env: AvmExecutionEnvironment) {
|
|
29
|
-
return new Field(env.storageAddress.toField());
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export class Sender extends EnvironmentGetterInstruction {
|
|
34
|
-
static type: string = 'SENDER';
|
|
35
|
-
static readonly opcode: Opcode = Opcode.SENDER;
|
|
36
|
-
|
|
37
|
-
protected getEnvironmentValue(env: AvmExecutionEnvironment) {
|
|
38
|
-
return new Field(env.sender.toField());
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
export class FunctionSelector extends EnvironmentGetterInstruction {
|
|
43
|
-
static type: string = 'FUNCTIONSELECTOR';
|
|
44
|
-
static readonly opcode: Opcode = Opcode.FUNCTIONSELECTOR;
|
|
45
|
-
|
|
46
|
-
protected getEnvironmentValue(env: AvmExecutionEnvironment) {
|
|
47
|
-
return new Uint32(env.functionSelector.value);
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
export class TransactionFee extends EnvironmentGetterInstruction {
|
|
52
|
-
static type: string = 'TRANSACTIONFEE';
|
|
53
|
-
static readonly opcode: Opcode = Opcode.TRANSACTIONFEE;
|
|
54
|
-
|
|
55
|
-
protected getEnvironmentValue(env: AvmExecutionEnvironment) {
|
|
56
|
-
return new Field(env.transactionFee);
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
export class ChainId extends EnvironmentGetterInstruction {
|
|
61
|
-
static type: string = 'CHAINID';
|
|
62
|
-
static readonly opcode: Opcode = Opcode.CHAINID;
|
|
63
|
-
|
|
64
|
-
protected getEnvironmentValue(env: AvmExecutionEnvironment) {
|
|
65
|
-
return new Field(env.globals.chainId);
|
|
66
|
-
}
|
|
2
|
+
import { Field, Uint32, Uint64 } from '../avm_memory_types.js';
|
|
3
|
+
import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
|
|
4
|
+
import { Addressing } from './addressing_mode.js';
|
|
5
|
+
import { Instruction } from './instruction.js';
|
|
6
|
+
|
|
7
|
+
export enum EnvironmentVariable {
|
|
8
|
+
ADDRESS,
|
|
9
|
+
STORAGEADDRESS,
|
|
10
|
+
SENDER,
|
|
11
|
+
FUNCTIONSELECTOR,
|
|
12
|
+
TRANSACTIONFEE,
|
|
13
|
+
CHAINID,
|
|
14
|
+
VERSION,
|
|
15
|
+
BLOCKNUMBER,
|
|
16
|
+
TIMESTAMP,
|
|
17
|
+
FEEPERL2GAS,
|
|
18
|
+
FEEPERDAGAS,
|
|
19
|
+
ISSTATICCALL,
|
|
20
|
+
L2GASLEFT,
|
|
21
|
+
DAGASLEFT,
|
|
67
22
|
}
|
|
68
23
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
24
|
+
function getValue(e: EnvironmentVariable, ctx: AvmContext) {
|
|
25
|
+
switch (e) {
|
|
26
|
+
case EnvironmentVariable.ADDRESS:
|
|
27
|
+
return new Field(ctx.environment.address.toField());
|
|
28
|
+
case EnvironmentVariable.STORAGEADDRESS:
|
|
29
|
+
return new Field(ctx.environment.storageAddress.toField());
|
|
30
|
+
case EnvironmentVariable.SENDER:
|
|
31
|
+
return new Field(ctx.environment.sender.toField());
|
|
32
|
+
case EnvironmentVariable.FUNCTIONSELECTOR:
|
|
33
|
+
return new Uint32(ctx.environment.functionSelector.value);
|
|
34
|
+
case EnvironmentVariable.TRANSACTIONFEE:
|
|
35
|
+
return new Field(ctx.environment.transactionFee);
|
|
36
|
+
case EnvironmentVariable.CHAINID:
|
|
37
|
+
return new Field(ctx.environment.globals.chainId);
|
|
38
|
+
case EnvironmentVariable.VERSION:
|
|
39
|
+
return new Field(ctx.environment.globals.version);
|
|
40
|
+
case EnvironmentVariable.BLOCKNUMBER:
|
|
41
|
+
return new Field(ctx.environment.globals.blockNumber);
|
|
42
|
+
case EnvironmentVariable.TIMESTAMP:
|
|
43
|
+
return new Uint64(ctx.environment.globals.timestamp.toBigInt());
|
|
44
|
+
case EnvironmentVariable.FEEPERL2GAS:
|
|
45
|
+
return new Field(ctx.environment.globals.gasFees.feePerL2Gas);
|
|
46
|
+
case EnvironmentVariable.FEEPERDAGAS:
|
|
47
|
+
return new Field(ctx.environment.globals.gasFees.feePerDaGas);
|
|
48
|
+
case EnvironmentVariable.ISSTATICCALL:
|
|
49
|
+
return new Field(ctx.environment.isStaticCall ? 1 : 0);
|
|
50
|
+
case EnvironmentVariable.L2GASLEFT:
|
|
51
|
+
return new Field(ctx.machineState.l2GasLeft);
|
|
52
|
+
case EnvironmentVariable.DAGASLEFT:
|
|
53
|
+
return new Field(ctx.machineState.daGasLeft);
|
|
54
|
+
default:
|
|
55
|
+
throw new Error(`Unknown environment variable ${e}`);
|
|
75
56
|
}
|
|
76
57
|
}
|
|
77
58
|
|
|
78
|
-
export class
|
|
79
|
-
static type: string = '
|
|
80
|
-
static readonly opcode: Opcode = Opcode.
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
59
|
+
export class GetEnvVar extends Instruction {
|
|
60
|
+
public static readonly type: string = 'GETENVVAR';
|
|
61
|
+
public static readonly opcode: Opcode = Opcode.GETENVVAR_16;
|
|
62
|
+
static readonly wireFormat16: OperandType[] = [
|
|
63
|
+
OperandType.UINT8, // opcode
|
|
64
|
+
OperandType.UINT8, // indirect
|
|
65
|
+
OperandType.UINT8, // variable enum (immediate)
|
|
66
|
+
OperandType.UINT16, // dstOffset
|
|
67
|
+
];
|
|
68
|
+
|
|
69
|
+
constructor(private indirect: number, private varEnum: EnvironmentVariable, private dstOffset: number) {
|
|
70
|
+
super();
|
|
84
71
|
}
|
|
85
|
-
}
|
|
86
72
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
73
|
+
public async execute(context: AvmContext): Promise<void> {
|
|
74
|
+
const memory = context.machineState.memory.track(this.type);
|
|
75
|
+
context.machineState.consumeGas(this.gasCost());
|
|
90
76
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
export class FeePerL2Gas extends EnvironmentGetterInstruction {
|
|
97
|
-
static type: string = 'FEEPERL2GAS';
|
|
98
|
-
static readonly opcode: Opcode = Opcode.FEEPERL2GAS;
|
|
99
|
-
|
|
100
|
-
protected getEnvironmentValue(env: AvmExecutionEnvironment) {
|
|
101
|
-
return new Field(env.globals.gasFees.feePerL2Gas);
|
|
102
|
-
}
|
|
103
|
-
}
|
|
77
|
+
const operands = [this.dstOffset];
|
|
78
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
79
|
+
const [dstOffset] = addressing.resolve(operands, memory);
|
|
104
80
|
|
|
105
|
-
|
|
106
|
-
static type: string = 'FEEPERDAGAS';
|
|
107
|
-
static readonly opcode: Opcode = Opcode.FEEPERDAGAS;
|
|
81
|
+
memory.set(dstOffset, getValue(this.varEnum, context));
|
|
108
82
|
|
|
109
|
-
|
|
110
|
-
|
|
83
|
+
memory.assert({ writes: 1, addressing });
|
|
84
|
+
context.machineState.incrementPc();
|
|
111
85
|
}
|
|
112
86
|
}
|
|
@@ -15,7 +15,7 @@ abstract class ExternalCall extends Instruction {
|
|
|
15
15
|
// Informs (de)serialization. See Instruction.deserialize.
|
|
16
16
|
static readonly wireFormat: OperandType[] = [
|
|
17
17
|
OperandType.UINT8,
|
|
18
|
-
OperandType.
|
|
18
|
+
OperandType.UINT16, // Indirect
|
|
19
19
|
OperandType.UINT32,
|
|
20
20
|
OperandType.UINT32,
|
|
21
21
|
OperandType.UINT32,
|
|
@@ -45,29 +45,34 @@ abstract class ExternalCall extends Instruction {
|
|
|
45
45
|
|
|
46
46
|
public async execute(context: AvmContext) {
|
|
47
47
|
const memory = context.machineState.memory.track(this.type);
|
|
48
|
-
const
|
|
49
|
-
this.
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
48
|
+
const operands = [
|
|
49
|
+
this.gasOffset,
|
|
50
|
+
this.addrOffset,
|
|
51
|
+
this.argsOffset,
|
|
52
|
+
this.argsSizeOffset,
|
|
53
|
+
this.retOffset,
|
|
54
|
+
this.successOffset,
|
|
55
|
+
this.functionSelectorOffset,
|
|
56
|
+
];
|
|
57
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
58
|
+
const [gasOffset, addrOffset, argsOffset, argsSizeOffset, retOffset, successOffset, functionSelectorOffset] =
|
|
59
|
+
addressing.resolve(operands, memory);
|
|
54
60
|
memory.checkTags(TypeTag.FIELD, gasOffset, gasOffset + 1);
|
|
55
61
|
memory.checkTag(TypeTag.FIELD, addrOffset);
|
|
56
62
|
memory.checkTag(TypeTag.UINT32, argsSizeOffset);
|
|
57
|
-
memory.checkTag(TypeTag.FIELD,
|
|
63
|
+
memory.checkTag(TypeTag.FIELD, functionSelectorOffset);
|
|
58
64
|
|
|
59
65
|
const calldataSize = memory.get(argsSizeOffset).toNumber();
|
|
60
66
|
memory.checkTagsRange(TypeTag.FIELD, argsOffset, calldataSize);
|
|
61
67
|
|
|
62
68
|
const callAddress = memory.getAs<Field>(addrOffset);
|
|
63
69
|
const calldata = memory.getSlice(argsOffset, calldataSize).map(f => f.toFr());
|
|
64
|
-
const functionSelector = memory.getAs<Field>(
|
|
70
|
+
const functionSelector = memory.getAs<Field>(functionSelectorOffset).toFr();
|
|
65
71
|
// If we are already in a static call, we propagate the environment.
|
|
66
72
|
const callType = context.environment.isStaticCall ? 'STATICCALL' : this.type;
|
|
67
73
|
|
|
68
74
|
// First we consume the gas for this operation.
|
|
69
|
-
|
|
70
|
-
context.machineState.consumeGas(this.gasCost({ ...memoryOperations, dynMultiplier: calldataSize + this.retSize }));
|
|
75
|
+
context.machineState.consumeGas(this.gasCost(calldataSize + this.retSize));
|
|
71
76
|
// Then we consume the gas allocated for the nested call. The excess will be refunded later.
|
|
72
77
|
// Gas allocation is capped by the amount of gas left in the current context.
|
|
73
78
|
// We have to do some dancing here because the gas allocation is a field,
|
|
@@ -127,7 +132,7 @@ abstract class ExternalCall extends Instruction {
|
|
|
127
132
|
/*avmCallResults=*/ nestedCallResults,
|
|
128
133
|
);
|
|
129
134
|
|
|
130
|
-
memory.assert(
|
|
135
|
+
memory.assert({ reads: calldataSize + 5, writes: 1 + this.retSize, addressing });
|
|
131
136
|
context.machineState.incrementPc();
|
|
132
137
|
}
|
|
133
138
|
|
|
@@ -168,16 +173,17 @@ export class Return extends Instruction {
|
|
|
168
173
|
}
|
|
169
174
|
|
|
170
175
|
public async execute(context: AvmContext): Promise<void> {
|
|
171
|
-
const memoryOperations = { reads: this.copySize, indirect: this.indirect };
|
|
172
176
|
const memory = context.machineState.memory.track(this.type);
|
|
173
|
-
context.machineState.consumeGas(this.gasCost(
|
|
177
|
+
context.machineState.consumeGas(this.gasCost(this.copySize));
|
|
174
178
|
|
|
175
|
-
const
|
|
179
|
+
const operands = [this.returnOffset];
|
|
180
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
181
|
+
const [returnOffset] = addressing.resolve(operands, memory);
|
|
176
182
|
|
|
177
183
|
const output = memory.getSlice(returnOffset, this.copySize).map(word => word.toFr());
|
|
178
184
|
|
|
179
185
|
context.machineState.return(output);
|
|
180
|
-
memory.assert(
|
|
186
|
+
memory.assert({ reads: this.copySize, addressing });
|
|
181
187
|
}
|
|
182
188
|
}
|
|
183
189
|
|
|
@@ -203,16 +209,17 @@ export class Revert extends Instruction {
|
|
|
203
209
|
}
|
|
204
210
|
|
|
205
211
|
public async execute(context: AvmContext): Promise<void> {
|
|
206
|
-
const memoryOperations = { reads: this.retSize, indirect: this.indirect };
|
|
207
212
|
const memory = context.machineState.memory.track(this.type);
|
|
208
|
-
context.machineState.consumeGas(this.gasCost(
|
|
213
|
+
context.machineState.consumeGas(this.gasCost(this.retSize));
|
|
209
214
|
|
|
210
|
-
const
|
|
215
|
+
const operands = [this.returnOffset];
|
|
216
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
217
|
+
const [returnOffset] = addressing.resolve(operands, memory);
|
|
211
218
|
|
|
212
219
|
const output = memory.getSlice(returnOffset, this.retSize).map(word => word.toFr());
|
|
213
220
|
|
|
214
221
|
context.machineState.revert(output);
|
|
215
|
-
memory.assert(
|
|
222
|
+
memory.assert({ reads: this.retSize, addressing });
|
|
216
223
|
}
|
|
217
224
|
}
|
|
218
225
|
|
|
@@ -1,9 +1,15 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
keccak256,
|
|
3
|
+
keccakf1600,
|
|
4
|
+
pedersenHash,
|
|
5
|
+
poseidon2Permutation,
|
|
6
|
+
sha256Compression,
|
|
7
|
+
} from '@aztec/foundation/crypto';
|
|
2
8
|
|
|
3
9
|
import { strict as assert } from 'assert';
|
|
4
10
|
|
|
5
11
|
import { type AvmContext } from '../avm_context.js';
|
|
6
|
-
import { Field, TypeTag, Uint8, Uint64 } from '../avm_memory_types.js';
|
|
12
|
+
import { Field, TypeTag, Uint8, Uint32, Uint64 } from '../avm_memory_types.js';
|
|
7
13
|
import { Opcode, OperandType } from '../serialization/instruction_serialization.js';
|
|
8
14
|
import { Addressing } from './addressing_mode.js';
|
|
9
15
|
import { Instruction } from './instruction.js';
|
|
@@ -26,14 +32,12 @@ export class Poseidon2 extends Instruction {
|
|
|
26
32
|
}
|
|
27
33
|
|
|
28
34
|
public async execute(context: AvmContext): Promise<void> {
|
|
29
|
-
const memoryOperations = { reads: Poseidon2.stateSize, writes: Poseidon2.stateSize, indirect: this.indirect };
|
|
30
35
|
const memory = context.machineState.memory.track(this.type);
|
|
31
|
-
context.machineState.consumeGas(this.gasCost(
|
|
36
|
+
context.machineState.consumeGas(this.gasCost());
|
|
32
37
|
|
|
33
|
-
const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
);
|
|
38
|
+
const operands = [this.inputStateOffset, this.outputStateOffset];
|
|
39
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
40
|
+
const [inputOffset, outputOffset] = addressing.resolve(operands, memory);
|
|
37
41
|
memory.checkTagsRange(TypeTag.FIELD, inputOffset, Poseidon2.stateSize);
|
|
38
42
|
|
|
39
43
|
const inputState = memory.getSlice(inputOffset, Poseidon2.stateSize);
|
|
@@ -43,7 +47,7 @@ export class Poseidon2 extends Instruction {
|
|
|
43
47
|
outputState.map(word => new Field(word)),
|
|
44
48
|
);
|
|
45
49
|
|
|
46
|
-
memory.assert(
|
|
50
|
+
memory.assert({ reads: Poseidon2.stateSize, writes: Poseidon2.stateSize, addressing });
|
|
47
51
|
context.machineState.incrementPc();
|
|
48
52
|
}
|
|
49
53
|
}
|
|
@@ -73,14 +77,12 @@ export class Keccak extends Instruction {
|
|
|
73
77
|
// pub fn keccak256(input: [u8], message_size: u32) -> [u8; 32]
|
|
74
78
|
public async execute(context: AvmContext): Promise<void> {
|
|
75
79
|
const memory = context.machineState.memory.track(this.type);
|
|
76
|
-
const [dstOffset, messageOffset, messageSizeOffset]
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
);
|
|
80
|
+
const operands = [this.dstOffset, this.messageOffset, this.messageSizeOffset];
|
|
81
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
82
|
+
const [dstOffset, messageOffset, messageSizeOffset] = addressing.resolve(operands, memory);
|
|
80
83
|
memory.checkTag(TypeTag.UINT32, messageSizeOffset);
|
|
81
84
|
const messageSize = memory.get(messageSizeOffset).toNumber();
|
|
82
|
-
|
|
83
|
-
context.machineState.consumeGas(this.gasCost(memoryOperations));
|
|
85
|
+
context.machineState.consumeGas(this.gasCost(messageSize));
|
|
84
86
|
|
|
85
87
|
memory.checkTagsRange(TypeTag.UINT8, messageOffset, messageSize);
|
|
86
88
|
|
|
@@ -91,7 +93,7 @@ export class Keccak extends Instruction {
|
|
|
91
93
|
const res = [...hashBuffer].map(byte => new Uint8(byte));
|
|
92
94
|
memory.setSlice(dstOffset, res);
|
|
93
95
|
|
|
94
|
-
memory.assert(
|
|
96
|
+
memory.assert({ reads: messageSize + 1, writes: 32, addressing });
|
|
95
97
|
context.machineState.incrementPc();
|
|
96
98
|
}
|
|
97
99
|
}
|
|
@@ -122,15 +124,13 @@ export class KeccakF1600 extends Instruction {
|
|
|
122
124
|
// pub fn keccakf1600(input: [u64; 25]) -> [u64; 25]
|
|
123
125
|
public async execute(context: AvmContext): Promise<void> {
|
|
124
126
|
const memory = context.machineState.memory.track(this.type);
|
|
125
|
-
const [dstOffset, stateOffset, stateSizeOffset]
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
);
|
|
127
|
+
const operands = [this.dstOffset, this.stateOffset, this.stateSizeOffset];
|
|
128
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
129
|
+
const [dstOffset, stateOffset, stateSizeOffset] = addressing.resolve(operands, memory);
|
|
129
130
|
memory.checkTag(TypeTag.UINT32, stateSizeOffset);
|
|
130
131
|
const stateSize = memory.get(stateSizeOffset).toNumber();
|
|
131
132
|
assert(stateSize === 25, 'Invalid state size for keccakf1600');
|
|
132
|
-
|
|
133
|
-
context.machineState.consumeGas(this.gasCost(memoryOperations));
|
|
133
|
+
context.machineState.consumeGas(this.gasCost());
|
|
134
134
|
|
|
135
135
|
memory.checkTagsRange(TypeTag.UINT64, stateOffset, stateSize);
|
|
136
136
|
|
|
@@ -140,14 +140,14 @@ export class KeccakF1600 extends Instruction {
|
|
|
140
140
|
const res = updatedState.map(word => new Uint64(word));
|
|
141
141
|
memory.setSlice(dstOffset, res);
|
|
142
142
|
|
|
143
|
-
memory.assert(
|
|
143
|
+
memory.assert({ reads: stateSize + 1, writes: 25, addressing });
|
|
144
144
|
context.machineState.incrementPc();
|
|
145
145
|
}
|
|
146
146
|
}
|
|
147
147
|
|
|
148
|
-
export class
|
|
149
|
-
static type: string = '
|
|
150
|
-
static readonly opcode: Opcode = Opcode.
|
|
148
|
+
export class Sha256Compression extends Instruction {
|
|
149
|
+
static type: string = 'SHA256COMPRESSION';
|
|
150
|
+
static readonly opcode: Opcode = Opcode.SHA256COMPRESSION;
|
|
151
151
|
|
|
152
152
|
// Informs (de)serialization. See Instruction.deserialize.
|
|
153
153
|
static readonly wireFormat: OperandType[] = [
|
|
@@ -160,34 +160,36 @@ export class Sha256 extends Instruction {
|
|
|
160
160
|
|
|
161
161
|
constructor(
|
|
162
162
|
private indirect: number,
|
|
163
|
-
private
|
|
164
|
-
private
|
|
165
|
-
private
|
|
163
|
+
private outputOffset: number,
|
|
164
|
+
private stateOffset: number,
|
|
165
|
+
private inputsOffset: number,
|
|
166
166
|
) {
|
|
167
167
|
super();
|
|
168
168
|
}
|
|
169
169
|
|
|
170
|
-
// pub fn sha256_slice(input: [u8]) -> [u8; 32]
|
|
171
170
|
public async execute(context: AvmContext): Promise<void> {
|
|
171
|
+
const STATE_SIZE = 8;
|
|
172
|
+
const INPUTS_SIZE = 16;
|
|
173
|
+
|
|
172
174
|
const memory = context.machineState.memory.track(this.type);
|
|
173
|
-
const [
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
);
|
|
177
|
-
memory.checkTag(TypeTag.UINT32, messageSizeOffset);
|
|
178
|
-
const messageSize = memory.get(messageSizeOffset).toNumber();
|
|
179
|
-
const memoryOperations = { reads: messageSize + 1, writes: 32, indirect: this.indirect };
|
|
180
|
-
context.machineState.consumeGas(this.gasCost(memoryOperations));
|
|
181
|
-
memory.checkTagsRange(TypeTag.UINT8, messageOffset, messageSize);
|
|
175
|
+
const operands = [this.outputOffset, this.stateOffset, this.inputsOffset];
|
|
176
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
177
|
+
const [outputOffset, stateOffset, inputsOffset] = addressing.resolve(operands, memory);
|
|
182
178
|
|
|
183
|
-
|
|
184
|
-
|
|
179
|
+
// Note: size of output is same as size of state
|
|
180
|
+
context.machineState.consumeGas(this.gasCost());
|
|
181
|
+
memory.checkTagsRange(TypeTag.UINT32, inputsOffset, INPUTS_SIZE);
|
|
182
|
+
memory.checkTagsRange(TypeTag.UINT32, stateOffset, STATE_SIZE);
|
|
185
183
|
|
|
186
|
-
|
|
187
|
-
const
|
|
188
|
-
|
|
184
|
+
const state = Uint32Array.from(memory.getSlice(stateOffset, STATE_SIZE).map(word => word.toNumber()));
|
|
185
|
+
const inputs = Uint32Array.from(memory.getSlice(inputsOffset, INPUTS_SIZE).map(word => word.toNumber()));
|
|
186
|
+
const output = sha256Compression(state, inputs);
|
|
189
187
|
|
|
190
|
-
|
|
188
|
+
// Conversion required from Uint32Array to Uint32[] (can't map directly, need `...`)
|
|
189
|
+
const res = [...output].map(word => new Uint32(word));
|
|
190
|
+
memory.setSlice(outputOffset, res);
|
|
191
|
+
|
|
192
|
+
memory.assert({ reads: STATE_SIZE + INPUTS_SIZE, writes: STATE_SIZE, addressing });
|
|
191
193
|
context.machineState.incrementPc();
|
|
192
194
|
}
|
|
193
195
|
}
|
|
@@ -218,10 +220,9 @@ export class Pedersen extends Instruction {
|
|
|
218
220
|
|
|
219
221
|
public async execute(context: AvmContext): Promise<void> {
|
|
220
222
|
const memory = context.machineState.memory.track(this.type);
|
|
221
|
-
const [genIndexOffset, dstOffset, messageOffset, messageSizeOffset]
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
);
|
|
223
|
+
const operands = [this.genIndexOffset, this.dstOffset, this.messageOffset, this.messageSizeOffset];
|
|
224
|
+
const addressing = Addressing.fromWire(this.indirect, operands.length);
|
|
225
|
+
const [genIndexOffset, dstOffset, messageOffset, messageSizeOffset] = addressing.resolve(operands, memory);
|
|
225
226
|
|
|
226
227
|
// We hash a set of field elements
|
|
227
228
|
const genIndex = Number(memory.get(genIndexOffset).toBigInt());
|
|
@@ -230,8 +231,7 @@ export class Pedersen extends Instruction {
|
|
|
230
231
|
memory.checkTag(TypeTag.UINT32, messageSizeOffset);
|
|
231
232
|
const hashData = memory.getSlice(messageOffset, messageSize);
|
|
232
233
|
|
|
233
|
-
|
|
234
|
-
context.machineState.consumeGas(this.gasCost(memoryOperations));
|
|
234
|
+
context.machineState.consumeGas(this.gasCost(messageSize));
|
|
235
235
|
|
|
236
236
|
memory.checkTagsRange(TypeTag.FIELD, messageOffset, messageSize);
|
|
237
237
|
|
|
@@ -239,7 +239,7 @@ export class Pedersen extends Instruction {
|
|
|
239
239
|
const hash = pedersenHash(hashData, genIndex);
|
|
240
240
|
memory.set(dstOffset, new Field(hash));
|
|
241
241
|
|
|
242
|
-
memory.assert(
|
|
242
|
+
memory.assert({ reads: messageSize + 2, writes: 1, addressing });
|
|
243
243
|
context.machineState.incrementPc();
|
|
244
244
|
}
|
|
245
245
|
}
|
package/src/avm/opcodes/index.ts
CHANGED
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { strict as assert } from 'assert';
|
|
2
2
|
|
|
3
3
|
import type { AvmContext } from '../avm_context.js';
|
|
4
|
-
import { getBaseGasCost, getDynamicGasCost, mulGas, sumGas } from '../avm_gas.js';
|
|
5
|
-
import { type MemoryOperations } from '../avm_memory_types.js';
|
|
4
|
+
import { type Gas, getBaseGasCost, getDynamicGasCost, mulGas, sumGas } from '../avm_gas.js';
|
|
6
5
|
import { type BufferCursor } from '../serialization/buffer_cursor.js';
|
|
7
6
|
import { type Serializable } from '../serialization/bytecode_serialization.js';
|
|
8
7
|
import { Opcode, type OperandType, deserialize, serializeAs } from '../serialization/instruction_serialization.js';
|
|
@@ -86,17 +85,11 @@ export abstract class Instruction {
|
|
|
86
85
|
|
|
87
86
|
/**
|
|
88
87
|
* Computes gas cost for the instruction based on its base cost and memory operations.
|
|
89
|
-
* @param memoryOps Memory operations performed by the instruction.
|
|
90
88
|
* @returns Gas cost.
|
|
91
89
|
*/
|
|
92
|
-
protected gasCost(
|
|
90
|
+
protected gasCost(dynMultiplier: number = 0): Gas {
|
|
93
91
|
const baseGasCost = getBaseGasCost(this.opcode);
|
|
94
|
-
|
|
95
|
-
// Memory accounting will probably be removed.
|
|
96
|
-
// TODO(https://github.com/AztecProtocol/aztec-packages/issues/6861): reconsider.
|
|
97
|
-
// const memoryGasCost = getMemoryGasCost(memoryOps);
|
|
98
|
-
// const memoryGasCost = { l2Gas: 0, daGas: 0 };
|
|
99
|
-
const dynGasCost = mulGas(getDynamicGasCost(this.opcode), ops.dynMultiplier ?? 0);
|
|
92
|
+
const dynGasCost = mulGas(getDynamicGasCost(this.opcode), dynMultiplier);
|
|
100
93
|
return sumGas(baseGasCost, dynGasCost);
|
|
101
94
|
}
|
|
102
95
|
|