@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
|
@@ -57,70 +57,70 @@ export abstract class TypedOracle {
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
storeInExecutionCache(_values: Fr[]): Promise<Fr> {
|
|
60
|
-
|
|
60
|
+
return Promise.reject(new OracleMethodNotAvailableError('storeInExecutionCache'));
|
|
61
61
|
}
|
|
62
62
|
|
|
63
63
|
loadFromExecutionCache(_hash: Fr): Promise<Fr[]> {
|
|
64
|
-
|
|
64
|
+
return Promise.reject(new OracleMethodNotAvailableError('loadFromExecutionCache'));
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
getBlockNumber(): Promise<number> {
|
|
68
|
-
|
|
68
|
+
return Promise.reject(new OracleMethodNotAvailableError('getBlockNumber'));
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
getContractAddress(): Promise<AztecAddress> {
|
|
72
|
-
|
|
72
|
+
return Promise.reject(new OracleMethodNotAvailableError('getContractAddress'));
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
getChainId(): Promise<Fr> {
|
|
76
|
-
|
|
76
|
+
return Promise.reject(new OracleMethodNotAvailableError('getChainId'));
|
|
77
77
|
}
|
|
78
78
|
|
|
79
79
|
getVersion(): Promise<Fr> {
|
|
80
|
-
|
|
80
|
+
return Promise.reject(new OracleMethodNotAvailableError('getVersion'));
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
getKeyValidationRequest(_pkMHash: Fr): Promise<KeyValidationRequest> {
|
|
84
|
-
|
|
84
|
+
return Promise.reject(new OracleMethodNotAvailableError('getKeyValidationRequest'));
|
|
85
85
|
}
|
|
86
86
|
|
|
87
87
|
getContractInstance(_address: AztecAddress): Promise<ContractInstance> {
|
|
88
|
-
|
|
88
|
+
return Promise.reject(new OracleMethodNotAvailableError('getContractInstance'));
|
|
89
89
|
}
|
|
90
90
|
|
|
91
91
|
getMembershipWitness(_blockNumber: number, _treeId: MerkleTreeId, _leafValue: Fr): Promise<Fr[] | undefined> {
|
|
92
|
-
|
|
92
|
+
return Promise.reject(new OracleMethodNotAvailableError('getMembershipWitness'));
|
|
93
93
|
}
|
|
94
94
|
|
|
95
95
|
getNullifierMembershipWitness(_blockNumber: number, _nullifier: Fr): Promise<NullifierMembershipWitness | undefined> {
|
|
96
|
-
|
|
96
|
+
return Promise.reject(new OracleMethodNotAvailableError('getNullifierMembershipWitness'));
|
|
97
97
|
}
|
|
98
98
|
|
|
99
99
|
getPublicDataTreeWitness(_blockNumber: number, _leafSlot: Fr): Promise<PublicDataWitness | undefined> {
|
|
100
|
-
|
|
100
|
+
return Promise.reject(new OracleMethodNotAvailableError('getPublicDataTreeWitness'));
|
|
101
101
|
}
|
|
102
102
|
|
|
103
103
|
getLowNullifierMembershipWitness(
|
|
104
104
|
_blockNumber: number,
|
|
105
105
|
_nullifier: Fr,
|
|
106
106
|
): Promise<NullifierMembershipWitness | undefined> {
|
|
107
|
-
|
|
107
|
+
return Promise.reject(new OracleMethodNotAvailableError('getLowNullifierMembershipWitness'));
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
getBlockHeader(_blockNumber: number): Promise<BlockHeader | undefined> {
|
|
111
|
-
|
|
111
|
+
return Promise.reject(new OracleMethodNotAvailableError('getBlockHeader'));
|
|
112
112
|
}
|
|
113
113
|
|
|
114
114
|
getCompleteAddress(_account: AztecAddress): Promise<CompleteAddress> {
|
|
115
|
-
|
|
115
|
+
return Promise.reject(new OracleMethodNotAvailableError('getCompleteAddress'));
|
|
116
116
|
}
|
|
117
117
|
|
|
118
118
|
getAuthWitness(_messageHash: Fr): Promise<Fr[] | undefined> {
|
|
119
|
-
|
|
119
|
+
return Promise.reject(new OracleMethodNotAvailableError('getAuthWitness'));
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
popCapsule(): Promise<Fr[]> {
|
|
123
|
-
|
|
123
|
+
return Promise.reject(new OracleMethodNotAvailableError('popCapsule'));
|
|
124
124
|
}
|
|
125
125
|
|
|
126
126
|
getNotes(
|
|
@@ -139,7 +139,7 @@ export abstract class TypedOracle {
|
|
|
139
139
|
_offset: number,
|
|
140
140
|
_status: NoteStatus,
|
|
141
141
|
): Promise<NoteData[]> {
|
|
142
|
-
|
|
142
|
+
return Promise.reject(new OracleMethodNotAvailableError('getNotes'));
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
notifyCreatedNote(_storageSlot: Fr, _noteTypeId: NoteSelector, _note: Fr[], _noteHash: Fr, _counter: number): void {
|
|
@@ -147,15 +147,15 @@ export abstract class TypedOracle {
|
|
|
147
147
|
}
|
|
148
148
|
|
|
149
149
|
notifyNullifiedNote(_innerNullifier: Fr, _noteHash: Fr, _counter: number): Promise<void> {
|
|
150
|
-
|
|
150
|
+
return Promise.reject(new OracleMethodNotAvailableError('notifyNullifiedNote'));
|
|
151
151
|
}
|
|
152
152
|
|
|
153
153
|
notifyCreatedNullifier(_innerNullifier: Fr): Promise<void> {
|
|
154
|
-
|
|
154
|
+
return Promise.reject(new OracleMethodNotAvailableError('notifyCreatedNullifier'));
|
|
155
155
|
}
|
|
156
156
|
|
|
157
157
|
checkNullifierExists(_innerNullifier: Fr): Promise<boolean> {
|
|
158
|
-
|
|
158
|
+
return Promise.reject(new OracleMethodNotAvailableError('checkNullifierExists'));
|
|
159
159
|
}
|
|
160
160
|
|
|
161
161
|
getL1ToL2MembershipWitness(
|
|
@@ -163,7 +163,7 @@ export abstract class TypedOracle {
|
|
|
163
163
|
_messageHash: Fr,
|
|
164
164
|
_secret: Fr,
|
|
165
165
|
): Promise<MessageLoadOracleInputs<typeof L1_TO_L2_MSG_TREE_HEIGHT>> {
|
|
166
|
-
|
|
166
|
+
return Promise.reject(new OracleMethodNotAvailableError('getL1ToL2MembershipWitness'));
|
|
167
167
|
}
|
|
168
168
|
|
|
169
169
|
storageRead(
|
|
@@ -172,11 +172,11 @@ export abstract class TypedOracle {
|
|
|
172
172
|
_blockNumber: number,
|
|
173
173
|
_numberOfElements: number,
|
|
174
174
|
): Promise<Fr[]> {
|
|
175
|
-
|
|
175
|
+
return Promise.reject(new OracleMethodNotAvailableError('storageRead'));
|
|
176
176
|
}
|
|
177
177
|
|
|
178
178
|
storageWrite(_startStorageSlot: Fr, _values: Fr[]): Promise<Fr[]> {
|
|
179
|
-
|
|
179
|
+
return Promise.reject(new OracleMethodNotAvailableError('storageWrite'));
|
|
180
180
|
}
|
|
181
181
|
|
|
182
182
|
emitContractClassLog(_log: UnencryptedL2Log, _counter: number): Fr {
|
|
@@ -190,7 +190,7 @@ export abstract class TypedOracle {
|
|
|
190
190
|
_sideEffectCounter: number,
|
|
191
191
|
_isStaticCall: boolean,
|
|
192
192
|
): Promise<{ endSideEffectCounter: Fr; returnsHash: Fr }> {
|
|
193
|
-
|
|
193
|
+
return Promise.reject(new OracleMethodNotAvailableError('callPrivateFunction'));
|
|
194
194
|
}
|
|
195
195
|
|
|
196
196
|
enqueuePublicFunctionCall(
|
|
@@ -200,7 +200,7 @@ export abstract class TypedOracle {
|
|
|
200
200
|
_sideEffectCounter: number,
|
|
201
201
|
_isStaticCall: boolean,
|
|
202
202
|
): Promise<Fr> {
|
|
203
|
-
|
|
203
|
+
return Promise.reject(new OracleMethodNotAvailableError('enqueuePublicFunctionCall'));
|
|
204
204
|
}
|
|
205
205
|
|
|
206
206
|
setPublicTeardownFunctionCall(
|
|
@@ -210,7 +210,7 @@ export abstract class TypedOracle {
|
|
|
210
210
|
_sideEffectCounter: number,
|
|
211
211
|
_isStaticCall: boolean,
|
|
212
212
|
): Promise<Fr> {
|
|
213
|
-
|
|
213
|
+
return Promise.reject(new OracleMethodNotAvailableError('setPublicTeardownFunctionCall'));
|
|
214
214
|
}
|
|
215
215
|
|
|
216
216
|
notifySetMinRevertibleSideEffectCounter(_minRevertibleSideEffectCounter: number): void {
|
|
@@ -222,15 +222,15 @@ export abstract class TypedOracle {
|
|
|
222
222
|
}
|
|
223
223
|
|
|
224
224
|
getIndexedTaggingSecretAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise<IndexedTaggingSecret> {
|
|
225
|
-
|
|
225
|
+
return Promise.reject(new OracleMethodNotAvailableError('getIndexedTaggingSecretAsSender'));
|
|
226
226
|
}
|
|
227
227
|
|
|
228
228
|
incrementAppTaggingSecretIndexAsSender(_sender: AztecAddress, _recipient: AztecAddress): Promise<void> {
|
|
229
|
-
|
|
229
|
+
return Promise.reject(new OracleMethodNotAvailableError('incrementAppTaggingSecretIndexAsSender'));
|
|
230
230
|
}
|
|
231
231
|
|
|
232
232
|
syncNotes(): Promise<void> {
|
|
233
|
-
|
|
233
|
+
return Promise.reject(new OracleMethodNotAvailableError('syncNotes'));
|
|
234
234
|
}
|
|
235
235
|
|
|
236
236
|
deliverNote(
|
|
@@ -243,22 +243,22 @@ export abstract class TypedOracle {
|
|
|
243
243
|
_txHash: Fr,
|
|
244
244
|
_recipient: AztecAddress,
|
|
245
245
|
): Promise<void> {
|
|
246
|
-
|
|
246
|
+
return Promise.reject(new OracleMethodNotAvailableError('deliverNote'));
|
|
247
247
|
}
|
|
248
248
|
|
|
249
249
|
dbStore(_contractAddress: AztecAddress, _key: Fr, _values: Fr[]): Promise<void> {
|
|
250
|
-
|
|
250
|
+
return Promise.reject(new OracleMethodNotAvailableError('dbStore'));
|
|
251
251
|
}
|
|
252
252
|
|
|
253
253
|
dbLoad(_contractAddress: AztecAddress, _key: Fr): Promise<Fr[] | null> {
|
|
254
|
-
|
|
254
|
+
return Promise.reject(new OracleMethodNotAvailableError('dbLoad'));
|
|
255
255
|
}
|
|
256
256
|
|
|
257
257
|
dbDelete(_contractAddress: AztecAddress, _key: Fr): Promise<void> {
|
|
258
|
-
|
|
258
|
+
return Promise.reject(new OracleMethodNotAvailableError('dbDelete'));
|
|
259
259
|
}
|
|
260
260
|
|
|
261
261
|
dbCopy(_contractAddress: AztecAddress, _srcKey: Fr, _dstKey: Fr, _numEntries: number): Promise<void> {
|
|
262
|
-
|
|
262
|
+
return Promise.reject(new OracleMethodNotAvailableError('dbCopy'));
|
|
263
263
|
}
|
|
264
264
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { type Fr } from '@aztec/circuits.js';
|
|
2
2
|
|
|
3
|
-
import {
|
|
3
|
+
import { type Gas } from './avm_gas.js';
|
|
4
4
|
import { TaggedMemory } from './avm_memory_types.js';
|
|
5
5
|
import { type AvmRevertReason, OutOfGasError } from './errors.js';
|
|
6
6
|
|
|
@@ -92,26 +92,29 @@ export class AvmMachineState {
|
|
|
92
92
|
*/
|
|
93
93
|
public consumeGas(gasCost: Partial<Gas>) {
|
|
94
94
|
// Assert there is enough gas on every dimension.
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
);
|
|
95
|
+
const outOfL2Gas = this.l2GasLeft - (gasCost.l2Gas ?? 0) < 0;
|
|
96
|
+
const outOfDaGas = this.daGasLeft - (gasCost.daGas ?? 0) < 0;
|
|
98
97
|
// If not, trigger an exceptional halt.
|
|
99
|
-
|
|
100
|
-
if (outOfGasDimensions.length > 0) {
|
|
98
|
+
if (outOfL2Gas || outOfDaGas) {
|
|
101
99
|
this.exceptionalHalt();
|
|
102
|
-
|
|
100
|
+
const dimensions = [];
|
|
101
|
+
if (outOfL2Gas) {
|
|
102
|
+
dimensions.push('l2Gas');
|
|
103
|
+
}
|
|
104
|
+
if (outOfDaGas) {
|
|
105
|
+
dimensions.push('daGas');
|
|
106
|
+
}
|
|
107
|
+
throw new OutOfGasError(dimensions);
|
|
103
108
|
}
|
|
104
109
|
// Otherwise, charge the corresponding gas
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}
|
|
110
|
+
this.l2GasLeft -= gasCost.l2Gas ?? 0;
|
|
111
|
+
this.daGasLeft -= gasCost.daGas ?? 0;
|
|
108
112
|
}
|
|
109
113
|
|
|
110
114
|
/** Increases the gas left by the amounts specified. */
|
|
111
115
|
public refundGas(gasRefund: Partial<Gas>) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
}
|
|
116
|
+
this.l2GasLeft += gasRefund.l2Gas ?? 0;
|
|
117
|
+
this.daGasLeft += gasRefund.daGas ?? 0;
|
|
115
118
|
}
|
|
116
119
|
|
|
117
120
|
/**
|
|
@@ -151,7 +154,8 @@ export class AvmMachineState {
|
|
|
151
154
|
* Flag an exceptional halt. Clears gas left and sets the reverted flag. No output data.
|
|
152
155
|
*/
|
|
153
156
|
private exceptionalHalt() {
|
|
154
|
-
|
|
157
|
+
this.l2GasLeft = 0;
|
|
158
|
+
this.daGasLeft = 0;
|
|
155
159
|
this.reverted = true;
|
|
156
160
|
this.halted = true;
|
|
157
161
|
}
|
|
@@ -15,13 +15,7 @@ import { type FunctionsOf } from '@aztec/foundation/types';
|
|
|
15
15
|
|
|
16
16
|
import { strict as assert } from 'assert';
|
|
17
17
|
|
|
18
|
-
import {
|
|
19
|
-
InstructionExecutionError,
|
|
20
|
-
InvalidTagValueError,
|
|
21
|
-
MemorySliceOutOfRangeError,
|
|
22
|
-
TagCheckError,
|
|
23
|
-
} from './errors.js';
|
|
24
|
-
import { Addressing, AddressingMode } from './opcodes/addressing_mode.js';
|
|
18
|
+
import { InvalidTagValueError, MemorySliceOutOfRangeError, TagCheckError } from './errors.js';
|
|
25
19
|
|
|
26
20
|
/** MemoryValue gathers the common operations for all memory types. */
|
|
27
21
|
export abstract class MemoryValue {
|
|
@@ -251,22 +245,14 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
251
245
|
return TaggedMemory.MAX_MEMORY_SIZE;
|
|
252
246
|
}
|
|
253
247
|
|
|
254
|
-
/** Returns a MeteredTaggedMemory instance to track the number of reads and writes if TRACK_MEMORY_ACCESSES is set. */
|
|
255
|
-
public track(type: string = 'instruction'): TaggedMemoryInterface {
|
|
256
|
-
return TaggedMemory.TRACK_MEMORY_ACCESSES ? new MeteredTaggedMemory(this, type) : this;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
248
|
public get(offset: number): MemoryValue {
|
|
260
|
-
|
|
261
|
-
const value = this.getAs<MemoryValue>(offset);
|
|
262
|
-
return value;
|
|
249
|
+
return this.getAs<MemoryValue>(offset);
|
|
263
250
|
}
|
|
264
251
|
|
|
265
252
|
public getAs<T>(offset: number): T {
|
|
266
|
-
assert(Number.isInteger(offset));
|
|
267
|
-
assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
|
|
253
|
+
assert(Number.isInteger(offset) && offset < TaggedMemory.MAX_MEMORY_SIZE);
|
|
268
254
|
const word = this._mem.get(offset);
|
|
269
|
-
TaggedMemory.log.trace(`get(${offset}) = ${word}`);
|
|
255
|
+
//TaggedMemory.log.trace(`get(${offset}) = ${word}`);
|
|
270
256
|
if (word === undefined) {
|
|
271
257
|
TaggedMemory.log.debug(`WARNING: Memory at offset ${offset} is undefined!`);
|
|
272
258
|
return new Field(0) as T;
|
|
@@ -300,10 +286,9 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
300
286
|
}
|
|
301
287
|
|
|
302
288
|
public set(offset: number, v: MemoryValue) {
|
|
303
|
-
assert(Number.isInteger(offset));
|
|
304
|
-
assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
|
|
289
|
+
assert(Number.isInteger(offset) && offset < TaggedMemory.MAX_MEMORY_SIZE);
|
|
305
290
|
this._mem.set(offset, v);
|
|
306
|
-
TaggedMemory.log.trace(`set(${offset}, ${v})`);
|
|
291
|
+
//TaggedMemory.log.trace(`set(${offset}, ${v})`);
|
|
307
292
|
}
|
|
308
293
|
|
|
309
294
|
public setSlice(offset: number, slice: MemoryValue[]) {
|
|
@@ -320,8 +305,7 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
320
305
|
}
|
|
321
306
|
|
|
322
307
|
public getTag(offset: number): TypeTag {
|
|
323
|
-
assert(Number.isInteger(offset));
|
|
324
|
-
assert(offset < TaggedMemory.MAX_MEMORY_SIZE);
|
|
308
|
+
assert(Number.isInteger(offset) && offset < TaggedMemory.MAX_MEMORY_SIZE);
|
|
325
309
|
return TaggedMemory.getTag(this._mem.get(offset));
|
|
326
310
|
}
|
|
327
311
|
|
|
@@ -340,25 +324,13 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
340
324
|
}
|
|
341
325
|
|
|
342
326
|
public static checkIsIntegralTag(tag: TypeTag) {
|
|
343
|
-
if (
|
|
344
|
-
![TypeTag.UINT1, TypeTag.UINT8, TypeTag.UINT16, TypeTag.UINT32, TypeTag.UINT64, TypeTag.UINT128].includes(tag)
|
|
345
|
-
) {
|
|
327
|
+
if (!INTEGRAL_TAGS.has(tag)) {
|
|
346
328
|
throw TagCheckError.forTag(TypeTag[tag], 'integral');
|
|
347
329
|
}
|
|
348
330
|
}
|
|
349
331
|
|
|
350
332
|
public static checkIsValidTag(tagNumber: number) {
|
|
351
|
-
if (
|
|
352
|
-
![
|
|
353
|
-
TypeTag.FIELD,
|
|
354
|
-
TypeTag.UINT1,
|
|
355
|
-
TypeTag.UINT8,
|
|
356
|
-
TypeTag.UINT16,
|
|
357
|
-
TypeTag.UINT32,
|
|
358
|
-
TypeTag.UINT64,
|
|
359
|
-
TypeTag.UINT128,
|
|
360
|
-
].includes(tagNumber)
|
|
361
|
-
) {
|
|
333
|
+
if (!VALID_TAGS.has(tagNumber)) {
|
|
362
334
|
throw new InvalidTagValueError(tagNumber);
|
|
363
335
|
}
|
|
364
336
|
}
|
|
@@ -375,11 +347,9 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
375
347
|
/**
|
|
376
348
|
* Check that all tags at the given offsets are the same.
|
|
377
349
|
*/
|
|
378
|
-
public checkTagsAreSame(
|
|
379
|
-
const
|
|
380
|
-
|
|
381
|
-
this.checkTag(tag, offsets[i]);
|
|
382
|
-
}
|
|
350
|
+
public checkTagsAreSame(offset0: number, offset1: number) {
|
|
351
|
+
const tag0 = this.getTag(offset0);
|
|
352
|
+
this.checkTag(tag0, offset1);
|
|
383
353
|
}
|
|
384
354
|
|
|
385
355
|
/**
|
|
@@ -391,32 +361,12 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
391
361
|
}
|
|
392
362
|
}
|
|
393
363
|
|
|
394
|
-
// TODO: this might be slow, but I don't want to have the types know of their tags.
|
|
395
|
-
// It might be possible to have a map<Prototype, TypeTag>.
|
|
396
364
|
public static getTag(v: MemoryValue | undefined): TypeTag {
|
|
397
|
-
let tag = TypeTag.INVALID;
|
|
398
|
-
|
|
399
|
-
// Not sure why, but using instanceof here doesn't work and leads odd behavior,
|
|
400
|
-
// but using constructor.name does the job...
|
|
401
365
|
if (v === undefined) {
|
|
402
|
-
|
|
403
|
-
} else
|
|
404
|
-
|
|
405
|
-
} else if (v.constructor.name == 'Uint1') {
|
|
406
|
-
tag = TypeTag.UINT1;
|
|
407
|
-
} else if (v.constructor.name == 'Uint8') {
|
|
408
|
-
tag = TypeTag.UINT8;
|
|
409
|
-
} else if (v.constructor.name == 'Uint16') {
|
|
410
|
-
tag = TypeTag.UINT16;
|
|
411
|
-
} else if (v.constructor.name == 'Uint32') {
|
|
412
|
-
tag = TypeTag.UINT32;
|
|
413
|
-
} else if (v.constructor.name == 'Uint64') {
|
|
414
|
-
tag = TypeTag.UINT64;
|
|
415
|
-
} else if (v.constructor.name == 'Uint128') {
|
|
416
|
-
tag = TypeTag.UINT128;
|
|
366
|
+
return TypeTag.FIELD; // uninitialized memory is Field(0)
|
|
367
|
+
} else {
|
|
368
|
+
return TAG_FOR_MEM_VAL.get(v.constructor.name) ?? TypeTag.INVALID;
|
|
417
369
|
}
|
|
418
|
-
|
|
419
|
-
return tag;
|
|
420
370
|
}
|
|
421
371
|
|
|
422
372
|
// Truncates the value to fit the type.
|
|
@@ -441,123 +391,33 @@ export class TaggedMemory implements TaggedMemoryInterface {
|
|
|
441
391
|
throw new InvalidTagValueError(tag);
|
|
442
392
|
}
|
|
443
393
|
}
|
|
444
|
-
|
|
445
|
-
/** No-op. Implemented here for compatibility with the MeteredTaggedMemory. */
|
|
446
|
-
public assert(_operations: Partial<MemoryOperations & { addressing: Addressing }>) {}
|
|
447
|
-
}
|
|
448
|
-
|
|
449
|
-
/** Tagged memory wrapper with metering for each memory read and write operation. */
|
|
450
|
-
export class MeteredTaggedMemory implements TaggedMemoryInterface {
|
|
451
|
-
private reads: number = 0;
|
|
452
|
-
private writes: number = 0;
|
|
453
|
-
|
|
454
|
-
constructor(private wrapped: TaggedMemory, private type: string = 'instruction') {}
|
|
455
|
-
|
|
456
|
-
/** Returns the number of reads and writes tracked so far and resets them to zero. */
|
|
457
|
-
public reset(): MemoryOperations {
|
|
458
|
-
const stats = { reads: this.reads, writes: this.writes };
|
|
459
|
-
this.reads = 0;
|
|
460
|
-
this.writes = 0;
|
|
461
|
-
return stats;
|
|
462
|
-
}
|
|
463
|
-
|
|
464
|
-
/**
|
|
465
|
-
* Asserts that the exact number of memory operations have been performed.
|
|
466
|
-
* Indirect represents the flags for indirect accesses: each bit set to one counts as an extra read.
|
|
467
|
-
*/
|
|
468
|
-
public assert(operations: Partial<MemoryOperations & { addressing: Addressing }>) {
|
|
469
|
-
const {
|
|
470
|
-
reads: expectedReads,
|
|
471
|
-
writes: expectedWrites,
|
|
472
|
-
addressing,
|
|
473
|
-
} = { reads: 0, writes: 0, addressing: new Addressing([]), ...operations };
|
|
474
|
-
|
|
475
|
-
const totalExpectedReads =
|
|
476
|
-
expectedReads + addressing.count(AddressingMode.INDIRECT) + addressing.count(AddressingMode.RELATIVE);
|
|
477
|
-
const { reads: actualReads, writes: actualWrites } = this.reset();
|
|
478
|
-
if (actualReads !== totalExpectedReads) {
|
|
479
|
-
throw new InstructionExecutionError(
|
|
480
|
-
`Incorrect number of memory reads for ${this.type}: expected ${totalExpectedReads} but executed ${actualReads}`,
|
|
481
|
-
);
|
|
482
|
-
}
|
|
483
|
-
if (actualWrites !== expectedWrites) {
|
|
484
|
-
throw new InstructionExecutionError(
|
|
485
|
-
`Incorrect number of memory writes for ${this.type}: expected ${expectedWrites} but executed ${actualWrites}`,
|
|
486
|
-
);
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
public getMaxMemorySize(): number {
|
|
491
|
-
return this.wrapped.getMaxMemorySize();
|
|
492
|
-
}
|
|
493
|
-
|
|
494
|
-
public track(type: string = 'instruction'): MeteredTaggedMemory {
|
|
495
|
-
return new MeteredTaggedMemory(this.wrapped, type);
|
|
496
|
-
}
|
|
497
|
-
|
|
498
|
-
public get(offset: number): MemoryValue {
|
|
499
|
-
this.reads++;
|
|
500
|
-
return this.wrapped.get(offset);
|
|
501
|
-
}
|
|
502
|
-
|
|
503
|
-
public getSliceAs<T>(offset: number, size: number): T[] {
|
|
504
|
-
this.reads += size;
|
|
505
|
-
return this.wrapped.getSliceAs<T>(offset, size);
|
|
506
|
-
}
|
|
507
|
-
|
|
508
|
-
public getAs<T>(offset: number): T {
|
|
509
|
-
this.reads++;
|
|
510
|
-
return this.wrapped.getAs(offset);
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
public getSlice(offset: number, size: number): MemoryValue[] {
|
|
514
|
-
this.reads += size;
|
|
515
|
-
return this.wrapped.getSlice(offset, size);
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
public set(offset: number, v: MemoryValue): void {
|
|
519
|
-
this.writes++;
|
|
520
|
-
this.wrapped.set(offset, v);
|
|
521
|
-
}
|
|
522
|
-
|
|
523
|
-
public setSlice(offset: number, vs: MemoryValue[]): void {
|
|
524
|
-
this.writes += vs.length;
|
|
525
|
-
this.wrapped.setSlice(offset, vs);
|
|
526
|
-
}
|
|
527
|
-
|
|
528
|
-
public getSliceTags(offset: number, size: number): TypeTag[] {
|
|
529
|
-
return this.wrapped.getSliceTags(offset, size);
|
|
530
|
-
}
|
|
531
|
-
|
|
532
|
-
public getTag(offset: number): TypeTag {
|
|
533
|
-
return this.wrapped.getTag(offset);
|
|
534
|
-
}
|
|
535
|
-
|
|
536
|
-
public checkTag(tag: TypeTag, offset: number): void {
|
|
537
|
-
this.wrapped.checkTag(tag, offset);
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
public checkIsValidMemoryOffsetTag(offset: number): void {
|
|
541
|
-
this.wrapped.checkIsValidMemoryOffsetTag(offset);
|
|
542
|
-
}
|
|
543
|
-
|
|
544
|
-
public checkTags(tag: TypeTag, ...offsets: number[]): void {
|
|
545
|
-
this.wrapped.checkTags(tag, ...offsets);
|
|
546
|
-
}
|
|
547
|
-
|
|
548
|
-
public checkTagsAreSame(...offsets: number[]): void {
|
|
549
|
-
this.wrapped.checkTagsAreSame(...offsets);
|
|
550
|
-
}
|
|
551
|
-
|
|
552
|
-
public checkTagsRange(tag: TypeTag, startOffset: number, size: number): void {
|
|
553
|
-
this.wrapped.checkTagsRange(tag, startOffset, size);
|
|
554
|
-
}
|
|
555
394
|
}
|
|
556
395
|
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
396
|
+
const TAG_FOR_MEM_VAL = new Map<string, TypeTag>([
|
|
397
|
+
['Field', TypeTag.FIELD],
|
|
398
|
+
['Uint1', TypeTag.UINT1],
|
|
399
|
+
['Uint8', TypeTag.UINT8],
|
|
400
|
+
['Uint16', TypeTag.UINT16],
|
|
401
|
+
['Uint32', TypeTag.UINT32],
|
|
402
|
+
['Uint64', TypeTag.UINT64],
|
|
403
|
+
['Uint128', TypeTag.UINT128],
|
|
404
|
+
]);
|
|
405
|
+
|
|
406
|
+
const VALID_TAGS = new Set([
|
|
407
|
+
TypeTag.FIELD,
|
|
408
|
+
TypeTag.UINT1,
|
|
409
|
+
TypeTag.UINT8,
|
|
410
|
+
TypeTag.UINT16,
|
|
411
|
+
TypeTag.UINT32,
|
|
412
|
+
TypeTag.UINT64,
|
|
413
|
+
TypeTag.UINT128,
|
|
414
|
+
]);
|
|
415
|
+
|
|
416
|
+
const INTEGRAL_TAGS = new Set([
|
|
417
|
+
TypeTag.UINT1,
|
|
418
|
+
TypeTag.UINT8,
|
|
419
|
+
TypeTag.UINT16,
|
|
420
|
+
TypeTag.UINT32,
|
|
421
|
+
TypeTag.UINT64,
|
|
422
|
+
TypeTag.UINT128,
|
|
423
|
+
]);
|
package/src/avm/avm_simulator.ts
CHANGED
|
@@ -18,6 +18,7 @@ import {
|
|
|
18
18
|
revertReasonFromExplicitRevert,
|
|
19
19
|
} from './errors.js';
|
|
20
20
|
import { type AvmPersistableStateManager } from './journal/journal.js';
|
|
21
|
+
import { type Instruction } from './opcodes/instruction.js';
|
|
21
22
|
import {
|
|
22
23
|
INSTRUCTION_SET,
|
|
23
24
|
type InstructionSet,
|
|
@@ -33,20 +34,26 @@ export class AvmSimulator {
|
|
|
33
34
|
private log: Logger;
|
|
34
35
|
private bytecode: Buffer | undefined;
|
|
35
36
|
private opcodeTallies: Map<string, OpcodeTally> = new Map();
|
|
37
|
+
// maps pc to [instr, bytesRead]
|
|
38
|
+
private deserializedInstructionsCache: Map<number, [Instruction, number]> = new Map();
|
|
36
39
|
|
|
37
40
|
private tallyPrintFunction = () => {};
|
|
38
41
|
private tallyInstructionFunction = (_b: string, _c: Gas) => {};
|
|
39
42
|
|
|
40
43
|
// Test Purposes only: Logger will not have the proper function name. Use this constructor for testing purposes
|
|
41
44
|
// only. Otherwise, use build() below.
|
|
42
|
-
constructor(
|
|
45
|
+
constructor(
|
|
46
|
+
private context: AvmContext,
|
|
47
|
+
private instructionSet: InstructionSet = INSTRUCTION_SET(),
|
|
48
|
+
enableTallying = false,
|
|
49
|
+
) {
|
|
43
50
|
assert(
|
|
44
51
|
context.machineState.gasLeft.l2Gas <= MAX_L2_GAS_PER_TX_PUBLIC_PORTION,
|
|
45
52
|
`Cannot allocate more than ${MAX_L2_GAS_PER_TX_PUBLIC_PORTION} to the AVM for execution.`,
|
|
46
53
|
);
|
|
47
54
|
this.log = createLogger(`simulator:avm(calldata[0]: ${context.environment.calldata[0]})`);
|
|
48
|
-
//
|
|
49
|
-
if (this.log.isLevelEnabled('
|
|
55
|
+
// Turn on tallying if explicitly enabled or if trace logging
|
|
56
|
+
if (enableTallying || this.log.isLevelEnabled('trace')) {
|
|
50
57
|
this.tallyPrintFunction = this.printOpcodeTallies;
|
|
51
58
|
this.tallyInstructionFunction = this.tallyInstruction;
|
|
52
59
|
}
|
|
@@ -125,6 +132,7 @@ export class AvmSimulator {
|
|
|
125
132
|
* This method is useful for testing and debugging.
|
|
126
133
|
*/
|
|
127
134
|
public async executeBytecode(bytecode: Buffer): Promise<AvmContractCallResult> {
|
|
135
|
+
const startTotalTime = performance.now();
|
|
128
136
|
assert(isAvmBytecode(bytecode), "AVM simulator can't execute non-AVM bytecode");
|
|
129
137
|
assert(bytecode.length > 0, "AVM simulator can't execute empty bytecode");
|
|
130
138
|
|
|
@@ -137,19 +145,32 @@ export class AvmSimulator {
|
|
|
137
145
|
// continuing until the machine state signifies a halt
|
|
138
146
|
let instrCounter = 0;
|
|
139
147
|
while (!machineState.getHalted()) {
|
|
140
|
-
|
|
148
|
+
// Get the instruction from cache, or deserialize for the first time
|
|
149
|
+
let cachedInstruction = this.deserializedInstructionsCache.get(machineState.pc);
|
|
150
|
+
|
|
151
|
+
if (cachedInstruction === undefined) {
|
|
152
|
+
cachedInstruction = decodeInstructionFromBytecode(bytecode, machineState.pc, this.instructionSet);
|
|
153
|
+
this.deserializedInstructionsCache.set(machineState.pc, cachedInstruction);
|
|
154
|
+
}
|
|
155
|
+
const [instruction, bytesRead] = cachedInstruction;
|
|
156
|
+
|
|
141
157
|
const instrStartGas = machineState.gasLeft; // Save gas before executing instruction (for profiling)
|
|
142
158
|
|
|
143
|
-
this.log.trace
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
159
|
+
if (this.log.isLevelEnabled('trace')) {
|
|
160
|
+
// Skip this entirely to avoid toStringing etc if trace is not enabled
|
|
161
|
+
this.log.trace(
|
|
162
|
+
`[PC:${machineState.pc}] [IC:${instrCounter}] ${instruction.toString()} (gasLeft l2=${
|
|
163
|
+
machineState.l2GasLeft
|
|
164
|
+
} da=${machineState.daGasLeft})`,
|
|
165
|
+
);
|
|
166
|
+
}
|
|
167
|
+
instrCounter++;
|
|
168
|
+
|
|
169
|
+
machineState.nextPc = machineState.pc + bytesRead;
|
|
170
|
+
|
|
148
171
|
// Execute the instruction.
|
|
149
172
|
// Normal returns and reverts will return normally here.
|
|
150
173
|
// "Exceptional halts" will throw.
|
|
151
|
-
machineState.nextPc = machineState.pc + bytesRead;
|
|
152
|
-
|
|
153
174
|
await instruction.execute(this.context);
|
|
154
175
|
if (!instruction.handlesPC()) {
|
|
155
176
|
// Increment PC if the instruction doesn't handle it itself
|
|
@@ -181,6 +202,11 @@ export class AvmSimulator {
|
|
|
181
202
|
this.log.debug(`Executed ${instrCounter} instructions and consumed ${totalGasUsed.l2Gas} L2 Gas`);
|
|
182
203
|
|
|
183
204
|
this.tallyPrintFunction();
|
|
205
|
+
|
|
206
|
+
const endTotalTime = performance.now();
|
|
207
|
+
const totalTime = endTotalTime - startTotalTime;
|
|
208
|
+
this.log.debug(`Total execution time: ${totalTime}ms`);
|
|
209
|
+
|
|
184
210
|
// Return results for processing by calling context
|
|
185
211
|
return results;
|
|
186
212
|
} catch (err: any) {
|