@aztec/simulator 0.74.0 → 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/acvm/acvm.js +18 -21
- package/dest/acvm/acvm_types.js +3 -2
- package/dest/acvm/deserialize.js +9 -13
- package/dest/acvm/index.js +0 -1
- package/dest/acvm/oracle/index.js +0 -1
- package/dest/acvm/oracle/oracle.js +42 -23
- package/dest/acvm/oracle/typed_oracle.js +36 -38
- package/dest/acvm/serialize.js +7 -14
- package/dest/avm/avm_context.js +24 -27
- package/dest/avm/avm_contract_call_result.js +12 -7
- package/dest/avm/avm_execution_environment.js +10 -7
- package/dest/avm/avm_gas.js +93 -56
- package/dest/avm/avm_machine_state.js +60 -61
- package/dest/avm/avm_memory_types.js +166 -255
- package/dest/avm/avm_simulator.js +68 -47
- package/dest/avm/avm_tree.js +282 -276
- package/dest/avm/bytecode_utils.js +8 -6
- package/dest/avm/errors.js +46 -63
- package/dest/avm/fixtures/avm_simulation_tester.js +18 -17
- package/dest/avm/fixtures/base_avm_simulation_tester.js +21 -16
- package/dest/avm/fixtures/index.js +27 -26
- package/dest/avm/fixtures/simple_contract_data_source.js +9 -13
- package/dest/avm/index.js +0 -1
- package/dest/avm/journal/index.js +0 -1
- package/dest/avm/journal/journal.js +147 -200
- package/dest/avm/journal/nullifiers.js +43 -46
- package/dest/avm/journal/public_storage.js +73 -87
- package/dest/avm/opcodes/accrued_substate.js +140 -110
- package/dest/avm/opcodes/addressing_mode.js +29 -31
- package/dest/avm/opcodes/arithmetic.js +17 -15
- package/dest/avm/opcodes/bitwise.js +40 -26
- package/dest/avm/opcodes/comparators.js +12 -10
- package/dest/avm/opcodes/contract.js +31 -29
- package/dest/avm/opcodes/control_flow.js +47 -43
- package/dest/avm/opcodes/conversion.js +30 -26
- package/dest/avm/opcodes/ec_add.js +35 -34
- package/dest/avm/opcodes/environment_getters.js +33 -33
- package/dest/avm/opcodes/external_calls.js +83 -74
- package/dest/avm/opcodes/hashing.js +69 -61
- package/dest/avm/opcodes/index.js +0 -1
- package/dest/avm/opcodes/instruction.js +31 -40
- package/dest/avm/opcodes/instruction_impl.js +12 -15
- package/dest/avm/opcodes/memory.js +177 -156
- package/dest/avm/opcodes/misc.js +27 -25
- package/dest/avm/opcodes/multi_scalar_mul.js +43 -41
- package/dest/avm/opcodes/storage.js +28 -25
- package/dest/avm/serialization/buffer_cursor.js +4 -4
- package/dest/avm/serialization/bytecode_serialization.js +292 -89
- package/dest/avm/serialization/instruction_serialization.js +67 -28
- package/dest/avm/test_utils.js +6 -9
- package/dest/client/client_execution_context.js +197 -219
- package/dest/client/db_oracle.js +4 -7
- package/dest/client/execution_note_cache.js +80 -81
- package/dest/client/index.js +0 -1
- package/dest/client/pick_notes.js +27 -30
- package/dest/client/private_execution.js +13 -14
- package/dest/client/simulator.js +44 -48
- package/dest/client/unconstrained_execution.js +8 -11
- package/dest/client/view_data_oracle.js +130 -139
- package/dest/common/debug_fn_name.js +1 -4
- package/dest/common/errors.js +30 -39
- package/dest/common/hashed_values_cache.js +16 -20
- package/dest/common/index.js +0 -1
- package/dest/common/message_load_oracle_inputs.js +7 -7
- package/dest/common/simulation_provider.js +3 -6
- package/dest/common.js +0 -1
- package/dest/providers/acvm_native.js +46 -32
- package/dest/providers/acvm_wasm.js +18 -10
- package/dest/providers/acvm_wasm_with_blobs.js +2 -5
- package/dest/providers/factory.js +5 -5
- package/dest/providers/index.js +0 -1
- package/dest/public/bytecode_errors.js +1 -2
- package/dest/public/db_interfaces.js +1 -2
- package/dest/public/execution.js +2 -4
- package/dest/public/executor_metrics.js +16 -12
- package/dest/public/fee_payment.js +2 -5
- package/dest/public/fixtures/index.js +0 -1
- package/dest/public/fixtures/public_tx_simulation_tester.js +13 -17
- package/dest/public/fixtures/utils.js +11 -14
- package/dest/public/index.js +0 -1
- package/dest/public/public_db_sources.js +79 -87
- package/dest/public/public_processor.js +310 -306
- package/dest/public/public_processor_metrics.js +46 -27
- package/dest/public/public_tx_context.js +97 -118
- package/dest/public/public_tx_simulator.js +299 -314
- package/dest/public/side_effect_errors.js +1 -2
- package/dest/public/side_effect_trace.js +44 -71
- package/dest/public/side_effect_trace_interface.js +1 -2
- package/dest/public/unique_class_ids.js +22 -27
- package/dest/public/utils.js +16 -11
- package/dest/server.js +0 -1
- package/dest/stats/index.js +0 -1
- package/dest/stats/stats.js +1 -2
- package/dest/test/utils.js +5 -4
- package/package.json +11 -11
- package/src/acvm/oracle/typed_oracle.ts +34 -34
- package/src/avm/avm_machine_state.ts +18 -14
- package/src/avm/avm_memory_types.ts +43 -183
- package/src/avm/avm_simulator.ts +37 -11
- package/src/avm/opcodes/accrued_substate.ts +7 -21
- package/src/avm/opcodes/addressing_mode.ts +9 -2
- package/src/avm/opcodes/arithmetic.ts +1 -3
- package/src/avm/opcodes/bitwise.ts +2 -6
- package/src/avm/opcodes/comparators.ts +1 -3
- package/src/avm/opcodes/contract.ts +1 -3
- package/src/avm/opcodes/control_flow.ts +1 -9
- package/src/avm/opcodes/conversion.ts +1 -3
- package/src/avm/opcodes/ec_add.ts +1 -3
- package/src/avm/opcodes/environment_getters.ts +1 -3
- package/src/avm/opcodes/external_calls.ts +3 -6
- package/src/avm/opcodes/hashing.ts +3 -9
- package/src/avm/opcodes/memory.ts +6 -20
- package/src/avm/opcodes/misc.ts +1 -3
- package/src/avm/opcodes/multi_scalar_mul.ts +1 -7
- package/src/avm/opcodes/storage.ts +2 -6
- package/src/client/index.ts +2 -2
- package/dest/acvm/acvm.d.ts +0 -35
- package/dest/acvm/acvm.d.ts.map +0 -1
- package/dest/acvm/acvm_types.d.ts +0 -10
- package/dest/acvm/acvm_types.d.ts.map +0 -1
- package/dest/acvm/deserialize.d.ts +0 -36
- package/dest/acvm/deserialize.d.ts.map +0 -1
- package/dest/acvm/index.d.ts +0 -6
- package/dest/acvm/index.d.ts.map +0 -1
- package/dest/acvm/oracle/index.d.ts +0 -14
- package/dest/acvm/oracle/index.d.ts.map +0 -1
- package/dest/acvm/oracle/oracle.d.ts +0 -49
- package/dest/acvm/oracle/oracle.d.ts.map +0 -1
- package/dest/acvm/oracle/typed_oracle.d.ts +0 -75
- package/dest/acvm/oracle/typed_oracle.d.ts.map +0 -1
- package/dest/acvm/serialize.d.ts +0 -20
- package/dest/acvm/serialize.d.ts.map +0 -1
- package/dest/avm/avm_context.d.ts +0 -39
- package/dest/avm/avm_context.d.ts.map +0 -1
- package/dest/avm/avm_contract_call_result.d.ts +0 -30
- package/dest/avm/avm_contract_call_result.d.ts.map +0 -1
- package/dest/avm/avm_execution_environment.d.ts +0 -21
- package/dest/avm/avm_execution_environment.d.ts.map +0 -1
- package/dest/avm/avm_gas.d.ts +0 -60
- package/dest/avm/avm_gas.d.ts.map +0 -1
- package/dest/avm/avm_machine_state.d.ts +0 -93
- package/dest/avm/avm_machine_state.d.ts.map +0 -1
- package/dest/avm/avm_memory_types.d.ts +0 -310
- package/dest/avm/avm_memory_types.d.ts.map +0 -1
- package/dest/avm/avm_simulator.d.ts +0 -37
- package/dest/avm/avm_simulator.d.ts.map +0 -1
- package/dest/avm/avm_tree.d.ts +0 -281
- package/dest/avm/avm_tree.d.ts.map +0 -1
- package/dest/avm/bytecode_utils.d.ts +0 -5
- package/dest/avm/bytecode_utils.d.ts.map +0 -1
- package/dest/avm/errors.d.ts +0 -121
- package/dest/avm/errors.d.ts.map +0 -1
- package/dest/avm/fixtures/avm_simulation_tester.d.ts +0 -21
- package/dest/avm/fixtures/avm_simulation_tester.d.ts.map +0 -1
- package/dest/avm/fixtures/base_avm_simulation_tester.d.ts +0 -35
- package/dest/avm/fixtures/base_avm_simulation_tester.d.ts.map +0 -1
- package/dest/avm/fixtures/index.d.ts +0 -67
- package/dest/avm/fixtures/index.d.ts.map +0 -1
- package/dest/avm/fixtures/simple_contract_data_source.d.ts +0 -31
- package/dest/avm/fixtures/simple_contract_data_source.d.ts.map +0 -1
- package/dest/avm/index.d.ts +0 -4
- package/dest/avm/index.d.ts.map +0 -1
- package/dest/avm/journal/index.d.ts +0 -2
- package/dest/avm/journal/index.d.ts.map +0 -1
- package/dest/avm/journal/journal.d.ts +0 -176
- package/dest/avm/journal/journal.d.ts.map +0 -1
- package/dest/avm/journal/nullifiers.d.ts +0 -62
- package/dest/avm/journal/nullifiers.d.ts.map +0 -1
- package/dest/avm/journal/public_storage.d.ts +0 -66
- package/dest/avm/journal/public_storage.d.ts.map +0 -1
- package/dest/avm/opcodes/accrued_substate.d.ts +0 -75
- package/dest/avm/opcodes/accrued_substate.d.ts.map +0 -1
- package/dest/avm/opcodes/addressing_mode.d.ts +0 -27
- package/dest/avm/opcodes/addressing_mode.d.ts.map +0 -1
- package/dest/avm/opcodes/arithmetic.d.ts +0 -37
- package/dest/avm/opcodes/arithmetic.d.ts.map +0 -1
- package/dest/avm/opcodes/bitwise.d.ts +0 -50
- package/dest/avm/opcodes/bitwise.d.ts.map +0 -1
- package/dest/avm/opcodes/comparators.d.ts +0 -25
- package/dest/avm/opcodes/comparators.d.ts.map +0 -1
- package/dest/avm/opcodes/contract.d.ts +0 -21
- package/dest/avm/opcodes/contract.d.ts.map +0 -1
- package/dest/avm/opcodes/control_flow.d.ts +0 -41
- package/dest/avm/opcodes/control_flow.d.ts.map +0 -1
- package/dest/avm/opcodes/conversion.d.ts +0 -17
- package/dest/avm/opcodes/conversion.d.ts.map +0 -1
- package/dest/avm/opcodes/ec_add.d.ts +0 -19
- package/dest/avm/opcodes/ec_add.d.ts.map +0 -1
- package/dest/avm/opcodes/environment_getters.d.ts +0 -28
- package/dest/avm/opcodes/environment_getters.d.ts.map +0 -1
- package/dest/avm/opcodes/external_calls.d.ts +0 -50
- package/dest/avm/opcodes/external_calls.d.ts.map +0 -1
- package/dest/avm/opcodes/hashing.d.ts +0 -36
- package/dest/avm/opcodes/hashing.d.ts.map +0 -1
- package/dest/avm/opcodes/index.d.ts +0 -16
- package/dest/avm/opcodes/index.d.ts.map +0 -1
- package/dest/avm/opcodes/instruction.d.ts +0 -70
- package/dest/avm/opcodes/instruction.d.ts.map +0 -1
- package/dest/avm/opcodes/instruction_impl.d.ts +0 -19
- package/dest/avm/opcodes/instruction_impl.d.ts.map +0 -1
- package/dest/avm/opcodes/memory.d.ts +0 -74
- package/dest/avm/opcodes/memory.d.ts.map +0 -1
- package/dest/avm/opcodes/misc.d.ts +0 -17
- package/dest/avm/opcodes/misc.d.ts.map +0 -1
- package/dest/avm/opcodes/multi_scalar_mul.d.ts +0 -16
- package/dest/avm/opcodes/multi_scalar_mul.d.ts.map +0 -1
- package/dest/avm/opcodes/storage.d.ts +0 -24
- package/dest/avm/opcodes/storage.d.ts.map +0 -1
- package/dest/avm/serialization/buffer_cursor.d.ts +0 -28
- package/dest/avm/serialization/buffer_cursor.d.ts.map +0 -1
- package/dest/avm/serialization/bytecode_serialization.d.ts +0 -21
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +0 -1
- package/dest/avm/serialization/instruction_serialization.d.ts +0 -105
- package/dest/avm/serialization/instruction_serialization.d.ts.map +0 -1
- package/dest/avm/test_utils.d.ts +0 -16
- package/dest/avm/test_utils.d.ts.map +0 -1
- package/dest/client/client_execution_context.d.ts +0 -214
- package/dest/client/client_execution_context.d.ts.map +0 -1
- package/dest/client/db_oracle.d.ts +0 -229
- package/dest/client/db_oracle.d.ts.map +0 -1
- package/dest/client/execution_note_cache.d.ts +0 -93
- package/dest/client/execution_note_cache.d.ts.map +0 -1
- package/dest/client/index.d.ts +0 -15
- package/dest/client/index.d.ts.map +0 -1
- package/dest/client/pick_notes.d.ts +0 -85
- package/dest/client/pick_notes.d.ts.map +0 -1
- package/dest/client/private_execution.d.ts +0 -19
- package/dest/client/private_execution.d.ts.map +0 -1
- package/dest/client/simulator.d.ts +0 -60
- package/dest/client/simulator.d.ts.map +0 -1
- package/dest/client/unconstrained_execution.d.ts +0 -10
- package/dest/client/unconstrained_execution.d.ts.map +0 -1
- package/dest/client/view_data_oracle.d.ts +0 -159
- package/dest/client/view_data_oracle.d.ts.map +0 -1
- package/dest/common/debug_fn_name.d.ts +0 -4
- package/dest/common/debug_fn_name.d.ts.map +0 -1
- package/dest/common/errors.d.ts +0 -54
- package/dest/common/errors.d.ts.map +0 -1
- package/dest/common/hashed_values_cache.d.ts +0 -28
- package/dest/common/hashed_values_cache.d.ts.map +0 -1
- package/dest/common/index.d.ts +0 -3
- package/dest/common/index.d.ts.map +0 -1
- package/dest/common/message_load_oracle_inputs.d.ts +0 -15
- package/dest/common/message_load_oracle_inputs.d.ts.map +0 -1
- package/dest/common/simulation_provider.d.ts +0 -19
- package/dest/common/simulation_provider.d.ts.map +0 -1
- package/dest/common.d.ts +0 -2
- package/dest/common.d.ts.map +0 -1
- package/dest/providers/acvm_native.d.ts +0 -40
- package/dest/providers/acvm_native.d.ts.map +0 -1
- package/dest/providers/acvm_wasm.d.ts +0 -15
- package/dest/providers/acvm_wasm.d.ts.map +0 -1
- package/dest/providers/acvm_wasm_with_blobs.d.ts +0 -19
- package/dest/providers/acvm_wasm_with_blobs.d.ts.map +0 -1
- package/dest/providers/factory.d.ts +0 -12
- package/dest/providers/factory.d.ts.map +0 -1
- package/dest/providers/index.d.ts +0 -5
- package/dest/providers/index.d.ts.map +0 -1
- package/dest/public/bytecode_errors.d.ts +0 -4
- package/dest/public/bytecode_errors.d.ts.map +0 -1
- package/dest/public/db_interfaces.d.ts +0 -105
- package/dest/public/db_interfaces.d.ts.map +0 -1
- package/dest/public/execution.d.ts +0 -102
- package/dest/public/execution.d.ts.map +0 -1
- package/dest/public/executor_metrics.d.ts +0 -13
- package/dest/public/executor_metrics.d.ts.map +0 -1
- package/dest/public/fee_payment.d.ts +0 -11
- package/dest/public/fee_payment.d.ts.map +0 -1
- package/dest/public/fixtures/index.d.ts +0 -3
- package/dest/public/fixtures/index.d.ts.map +0 -1
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts +0 -21
- package/dest/public/fixtures/public_tx_simulation_tester.d.ts.map +0 -1
- package/dest/public/fixtures/utils.d.ts +0 -17
- package/dest/public/fixtures/utils.d.ts.map +0 -1
- package/dest/public/index.d.ts +0 -9
- package/dest/public/index.d.ts.map +0 -1
- package/dest/public/public_db_sources.d.ts +0 -81
- package/dest/public/public_db_sources.d.ts.map +0 -1
- package/dest/public/public_processor.d.ts +0 -72
- package/dest/public/public_processor.d.ts.map +0 -1
- package/dest/public/public_processor_metrics.d.ts +0 -27
- package/dest/public/public_processor_metrics.d.ts.map +0 -1
- package/dest/public/public_tx_context.d.ts +0 -131
- package/dest/public/public_tx_context.d.ts.map +0 -1
- package/dest/public/public_tx_simulator.d.ts +0 -99
- package/dest/public/public_tx_simulator.d.ts.map +0 -1
- package/dest/public/side_effect_errors.d.ts +0 -4
- package/dest/public/side_effect_errors.d.ts.map +0 -1
- package/dest/public/side_effect_trace.d.ts +0 -126
- package/dest/public/side_effect_trace.d.ts.map +0 -1
- package/dest/public/side_effect_trace_interface.d.ts +0 -32
- package/dest/public/side_effect_trace_interface.d.ts.map +0 -1
- package/dest/public/unique_class_ids.d.ts +0 -37
- package/dest/public/unique_class_ids.d.ts.map +0 -1
- package/dest/public/utils.d.ts +0 -5
- package/dest/public/utils.d.ts.map +0 -1
- package/dest/server.d.ts +0 -6
- package/dest/server.d.ts.map +0 -1
- package/dest/stats/index.d.ts +0 -2
- package/dest/stats/index.d.ts.map +0 -1
- package/dest/stats/stats.d.ts +0 -4
- package/dest/stats/stats.d.ts.map +0 -1
- package/dest/test/utils.d.ts +0 -12
- package/dest/test/utils.d.ts.map +0 -1
|
@@ -7,21 +7,31 @@ import { AvmContractCallResult } from './avm_contract_call_result.js';
|
|
|
7
7
|
import { AvmExecutionEnvironment } from './avm_execution_environment.js';
|
|
8
8
|
import { AvmMachineState } from './avm_machine_state.js';
|
|
9
9
|
import { isAvmBytecode } from './bytecode_utils.js';
|
|
10
|
-
import { AvmExecutionError, AvmRevertReason, InvalidProgramCounterError, revertReasonFromExceptionalHalt, revertReasonFromExplicitRevert
|
|
11
|
-
import { INSTRUCTION_SET, decodeInstructionFromBytecode
|
|
10
|
+
import { AvmExecutionError, AvmRevertReason, InvalidProgramCounterError, revertReasonFromExceptionalHalt, revertReasonFromExplicitRevert } from './errors.js';
|
|
11
|
+
import { INSTRUCTION_SET, decodeInstructionFromBytecode } from './serialization/bytecode_serialization.js';
|
|
12
12
|
export class AvmSimulator {
|
|
13
|
+
context;
|
|
14
|
+
instructionSet;
|
|
15
|
+
log;
|
|
16
|
+
bytecode;
|
|
17
|
+
opcodeTallies;
|
|
18
|
+
// maps pc to [instr, bytesRead]
|
|
19
|
+
deserializedInstructionsCache;
|
|
20
|
+
tallyPrintFunction;
|
|
21
|
+
tallyInstructionFunction;
|
|
13
22
|
// Test Purposes only: Logger will not have the proper function name. Use this constructor for testing purposes
|
|
14
23
|
// only. Otherwise, use build() below.
|
|
15
|
-
constructor(context, instructionSet = INSTRUCTION_SET())
|
|
24
|
+
constructor(context, instructionSet = INSTRUCTION_SET(), enableTallying = false){
|
|
16
25
|
this.context = context;
|
|
17
26
|
this.instructionSet = instructionSet;
|
|
18
27
|
this.opcodeTallies = new Map();
|
|
19
|
-
this.
|
|
20
|
-
this.
|
|
28
|
+
this.deserializedInstructionsCache = new Map();
|
|
29
|
+
this.tallyPrintFunction = ()=>{};
|
|
30
|
+
this.tallyInstructionFunction = (_b, _c)=>{};
|
|
21
31
|
assert(context.machineState.gasLeft.l2Gas <= MAX_L2_GAS_PER_TX_PUBLIC_PORTION, `Cannot allocate more than ${MAX_L2_GAS_PER_TX_PUBLIC_PORTION} to the AVM for execution.`);
|
|
22
32
|
this.log = createLogger(`simulator:avm(calldata[0]: ${context.environment.calldata[0]})`);
|
|
23
|
-
//
|
|
24
|
-
if (this.log.isLevelEnabled('
|
|
33
|
+
// Turn on tallying if explicitly enabled or if trace logging
|
|
34
|
+
if (enableTallying || this.log.isLevelEnabled('trace')) {
|
|
25
35
|
this.tallyPrintFunction = this.printOpcodeTallies;
|
|
26
36
|
this.tallyInstructionFunction = this.tallyInstruction;
|
|
27
37
|
}
|
|
@@ -35,21 +45,18 @@ export class AvmSimulator {
|
|
|
35
45
|
return simulator;
|
|
36
46
|
}
|
|
37
47
|
static async create(stateManager, address, sender, transactionFee, globals, isStaticCall, calldata, allocatedGas) {
|
|
38
|
-
const avmExecutionEnv = new AvmExecutionEnvironment(address, sender,
|
|
39
|
-
/*contractCallDepth=*/ Fr.zero(), transactionFee, globals, isStaticCall, calldata);
|
|
48
|
+
const avmExecutionEnv = new AvmExecutionEnvironment(address, sender, /*contractCallDepth=*/ Fr.zero(), transactionFee, globals, isStaticCall, calldata);
|
|
40
49
|
const avmMachineState = new AvmMachineState(allocatedGas);
|
|
41
50
|
const avmContext = new AvmContext(stateManager, avmExecutionEnv, avmMachineState);
|
|
42
51
|
return await AvmSimulator.build(avmContext);
|
|
43
52
|
}
|
|
44
53
|
/**
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
async execute() {
|
|
54
|
+
* Fetch the bytecode and execute it in the current context.
|
|
55
|
+
*/ async execute() {
|
|
48
56
|
let bytecode;
|
|
49
57
|
try {
|
|
50
58
|
bytecode = await this.context.persistableState.getBytecode(this.context.environment.address);
|
|
51
|
-
}
|
|
52
|
-
catch (err) {
|
|
59
|
+
} catch (err) {
|
|
53
60
|
if (!(err instanceof AvmExecutionError || err instanceof SideEffectLimitReachedError)) {
|
|
54
61
|
this.log.error(`Unknown error thrown by AVM during bytecode retrieval: ${err}`);
|
|
55
62
|
throw err;
|
|
@@ -62,16 +69,15 @@ export class AvmSimulator {
|
|
|
62
69
|
return await this.executeBytecode(bytecode);
|
|
63
70
|
}
|
|
64
71
|
/**
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
getBytecode() {
|
|
72
|
+
* Return the bytecode used for execution, if any.
|
|
73
|
+
*/ getBytecode() {
|
|
68
74
|
return this.bytecode;
|
|
69
75
|
}
|
|
70
76
|
/**
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
77
|
+
* Executes the provided bytecode in the current context.
|
|
78
|
+
* This method is useful for testing and debugging.
|
|
79
|
+
*/ async executeBytecode(bytecode) {
|
|
80
|
+
const startTotalTime = performance.now();
|
|
75
81
|
assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
76
82
|
assert(bytecode.length > 0, "AVM simulator can't execute empty bytecode");
|
|
77
83
|
this.bytecode = bytecode;
|
|
@@ -81,14 +87,24 @@ export class AvmSimulator {
|
|
|
81
87
|
// Execute instruction pointed to by the current program counter
|
|
82
88
|
// continuing until the machine state signifies a halt
|
|
83
89
|
let instrCounter = 0;
|
|
84
|
-
while
|
|
85
|
-
|
|
90
|
+
while(!machineState.getHalted()){
|
|
91
|
+
// Get the instruction from cache, or deserialize for the first time
|
|
92
|
+
let cachedInstruction = this.deserializedInstructionsCache.get(machineState.pc);
|
|
93
|
+
if (cachedInstruction === undefined) {
|
|
94
|
+
cachedInstruction = decodeInstructionFromBytecode(bytecode, machineState.pc, this.instructionSet);
|
|
95
|
+
this.deserializedInstructionsCache.set(machineState.pc, cachedInstruction);
|
|
96
|
+
}
|
|
97
|
+
const [instruction, bytesRead] = cachedInstruction;
|
|
86
98
|
const instrStartGas = machineState.gasLeft; // Save gas before executing instruction (for profiling)
|
|
87
|
-
this.log.trace
|
|
99
|
+
if (this.log.isLevelEnabled('trace')) {
|
|
100
|
+
// Skip this entirely to avoid toStringing etc if trace is not enabled
|
|
101
|
+
this.log.trace(`[PC:${machineState.pc}] [IC:${instrCounter}] ${instruction.toString()} (gasLeft l2=${machineState.l2GasLeft} da=${machineState.daGasLeft})`);
|
|
102
|
+
}
|
|
103
|
+
instrCounter++;
|
|
104
|
+
machineState.nextPc = machineState.pc + bytesRead;
|
|
88
105
|
// Execute the instruction.
|
|
89
106
|
// Normal returns and reverts will return normally here.
|
|
90
107
|
// "Exceptional halts" will throw.
|
|
91
|
-
machineState.nextPc = machineState.pc + bytesRead;
|
|
92
108
|
await instruction.execute(this.context);
|
|
93
109
|
if (!instruction.handlesPC()) {
|
|
94
110
|
// Increment PC if the instruction doesn't handle it itself
|
|
@@ -97,7 +113,7 @@ export class AvmSimulator {
|
|
|
97
113
|
// gas used by this instruction - used for profiling/tallying
|
|
98
114
|
const gasUsed = {
|
|
99
115
|
l2Gas: instrStartGas.l2Gas - machineState.l2GasLeft,
|
|
100
|
-
daGas: instrStartGas.daGas - machineState.daGasLeft
|
|
116
|
+
daGas: instrStartGas.daGas - machineState.daGasLeft
|
|
101
117
|
};
|
|
102
118
|
this.tallyInstructionFunction(instruction.constructor.name, gasUsed);
|
|
103
119
|
if (machineState.pc >= bytecode.length) {
|
|
@@ -112,27 +128,30 @@ export class AvmSimulator {
|
|
|
112
128
|
this.log.debug(`Context execution results: ${results.toString()}`);
|
|
113
129
|
const totalGasUsed = {
|
|
114
130
|
l2Gas: callStartGas.l2Gas - machineState.l2GasLeft,
|
|
115
|
-
daGas: callStartGas.daGas - machineState.daGasLeft
|
|
131
|
+
daGas: callStartGas.daGas - machineState.daGasLeft
|
|
116
132
|
};
|
|
117
133
|
this.log.debug(`Executed ${instrCounter} instructions and consumed ${totalGasUsed.l2Gas} L2 Gas`);
|
|
118
134
|
this.tallyPrintFunction();
|
|
135
|
+
const endTotalTime = performance.now();
|
|
136
|
+
const totalTime = endTotalTime - startTotalTime;
|
|
137
|
+
this.log.debug(`Total execution time: ${totalTime}ms`);
|
|
119
138
|
// Return results for processing by calling context
|
|
120
139
|
return results;
|
|
121
|
-
}
|
|
122
|
-
catch (err) {
|
|
140
|
+
} catch (err) {
|
|
123
141
|
this.log.verbose('Exceptional halt (revert by something other than REVERT opcode)');
|
|
124
142
|
// FIXME: weird that we have to do this OutOfGasError check because:
|
|
125
143
|
// 1. OutOfGasError is an AvmExecutionError, so that check should cover both
|
|
126
144
|
// 2. We should at least be able to do instanceof OutOfGasError instead of checking the constructor name
|
|
127
|
-
if (!(err.constructor.name == 'OutOfGasError' ||
|
|
128
|
-
err instanceof AvmExecutionError ||
|
|
129
|
-
err instanceof SideEffectLimitReachedError)) {
|
|
145
|
+
if (!(err.constructor.name == 'OutOfGasError' || err instanceof AvmExecutionError || err instanceof SideEffectLimitReachedError)) {
|
|
130
146
|
this.log.error(`Unknown error thrown by AVM: ${err}`);
|
|
131
147
|
throw err;
|
|
132
148
|
}
|
|
133
149
|
const revertReason = await revertReasonFromExceptionalHalt(err, this.context);
|
|
134
150
|
// Exceptional halts consume all allocated gas
|
|
135
|
-
const noGasLeft = {
|
|
151
|
+
const noGasLeft = {
|
|
152
|
+
l2Gas: 0,
|
|
153
|
+
daGas: 0
|
|
154
|
+
};
|
|
136
155
|
// Note: "exceptional halts" cannot return data, hence [].
|
|
137
156
|
const results = new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], noGasLeft, revertReason);
|
|
138
157
|
this.log.debug(`Context execution results: ${results.toString()}`);
|
|
@@ -144,21 +163,24 @@ export class AvmSimulator {
|
|
|
144
163
|
async handleFailureToRetrieveBytecode(message) {
|
|
145
164
|
// revert, consuming all gas
|
|
146
165
|
const fnName = await this.context.persistableState.getPublicFunctionDebugName(this.context.environment);
|
|
147
|
-
const revertReason = new AvmRevertReason(message,
|
|
148
|
-
/*failingFunction=*/ {
|
|
166
|
+
const revertReason = new AvmRevertReason(message, /*failingFunction=*/ {
|
|
149
167
|
contractAddress: this.context.environment.address,
|
|
150
|
-
functionName: fnName
|
|
151
|
-
},
|
|
152
|
-
/*noirCallStack=*/ []);
|
|
168
|
+
functionName: fnName
|
|
169
|
+
}, /*noirCallStack=*/ []);
|
|
153
170
|
this.log.warn(message);
|
|
154
|
-
return new AvmContractCallResult(
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
revertReason);
|
|
171
|
+
return new AvmContractCallResult(/*reverted=*/ true, /*output=*/ [], /*gasLeft=*/ {
|
|
172
|
+
l2Gas: 0,
|
|
173
|
+
daGas: 0
|
|
174
|
+
}, revertReason);
|
|
159
175
|
}
|
|
160
176
|
tallyInstruction(opcode, gasUsed) {
|
|
161
|
-
const opcodeTally = this.opcodeTallies.get(opcode) || {
|
|
177
|
+
const opcodeTally = this.opcodeTallies.get(opcode) || {
|
|
178
|
+
count: 0,
|
|
179
|
+
gas: {
|
|
180
|
+
l2Gas: 0,
|
|
181
|
+
daGas: 0
|
|
182
|
+
}
|
|
183
|
+
};
|
|
162
184
|
opcodeTally.count++;
|
|
163
185
|
opcodeTally.gas.l2Gas += gasUsed.l2Gas;
|
|
164
186
|
opcodeTally.gas.daGas += gasUsed.daGas;
|
|
@@ -167,11 +189,10 @@ export class AvmSimulator {
|
|
|
167
189
|
printOpcodeTallies() {
|
|
168
190
|
this.log.debug(`Printing tallies per opcode sorted by gas...`);
|
|
169
191
|
// sort descending by L2 gas consumed
|
|
170
|
-
const sortedOpcodes = Array.from(this.opcodeTallies.entries()).sort((a, b)
|
|
171
|
-
for (const [opcode, tally] of sortedOpcodes)
|
|
192
|
+
const sortedOpcodes = Array.from(this.opcodeTallies.entries()).sort((a, b)=>b[1].gas.l2Gas - a[1].gas.l2Gas);
|
|
193
|
+
for (const [opcode, tally] of sortedOpcodes){
|
|
172
194
|
// NOTE: don't care to clutter the logs with DA gas for now
|
|
173
195
|
this.log.debug(`${opcode} executed ${tally.count} times consuming a total of ${tally.gas.l2Gas} L2 gas`);
|
|
174
196
|
}
|
|
175
197
|
}
|
|
176
198
|
}
|
|
177
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZtX3NpbXVsYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9hdm0vYXZtX3NpbXVsYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQXFCLEVBQUUsRUFBd0IsZ0NBQWdDLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNuSCxPQUFPLEVBQWUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUFFLE1BQU0sSUFBSSxNQUFNLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFFMUMsT0FBTyxFQUFFLDJCQUEyQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDOUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBRXpFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixlQUFlLEVBQ2YsMEJBQTBCLEVBQzFCLCtCQUErQixFQUMvQiw4QkFBOEIsR0FDL0IsTUFBTSxhQUFhLENBQUM7QUFFckIsT0FBTyxFQUNMLGVBQWUsRUFFZiw2QkFBNkIsR0FDOUIsTUFBTSwyQ0FBMkMsQ0FBQztBQU9uRCxNQUFNLE9BQU8sWUFBWTtJQVF2QiwrR0FBK0c7SUFDL0csc0NBQXNDO0lBQ3RDLFlBQW9CLE9BQW1CLEVBQVUsaUJBQWlDLGVBQWUsRUFBRTtRQUEvRSxZQUFPLEdBQVAsT0FBTyxDQUFZO1FBQVUsbUJBQWMsR0FBZCxjQUFjLENBQW9DO1FBUDNGLGtCQUFhLEdBQTZCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFcEQsdUJBQWtCLEdBQUcsR0FBRyxFQUFFLEdBQUUsQ0FB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
|