sui_adapter_v2/
adapter.rs1pub use checked::*;
5#[sui_macros::with_checked_arithmetic]
6mod checked {
7 use std::{collections::BTreeMap, sync::Arc};
8
9 use anyhow::Result;
10 use move_binary_format::file_format::CompiledModule;
11 use move_bytecode_verifier::verify_module_with_config_metered;
12 use move_bytecode_verifier_meter::Meter;
13 use move_core_types::account_address::AccountAddress;
14 use move_vm_config::{
15 runtime::{VMConfig, VMRuntimeLimitsConfig},
16 verifier::VerifierConfig,
17 };
18 use move_vm_runtime::{
19 move_vm::MoveVM, native_extensions::NativeContextExtensions,
20 native_functions::NativeFunctionTable,
21 };
22 use sui_move_natives::object_runtime;
23 use sui_types::{error::SuiErrorKind, metrics::BytecodeVerifierMetrics};
24 use sui_verifier::check_for_verifier_timeout;
25 use tracing::instrument;
26
27 use sui_move_natives::{object_runtime::ObjectRuntime, NativesCostTable};
28 use sui_protocol_config::ProtocolConfig;
29 use sui_types::{
30 base_types::*,
31 error::ExecutionError,
32 error::{ExecutionErrorKind, SuiError},
33 metrics::LimitsMetrics,
34 storage::ChildObjectResolver,
35 };
36 use sui_verifier::verifier::sui_verify_module_metered_check_timeout_only;
37
38 pub fn new_move_vm(
39 natives: NativeFunctionTable,
40 protocol_config: &ProtocolConfig,
41 ) -> Result<MoveVM, SuiError> {
42 MoveVM::new_with_config(
43 natives,
44 VMConfig {
45 verifier: protocol_config.verifier_config(None),
46 max_binary_format_version: protocol_config.move_binary_format_version(),
47 runtime_limits_config: VMRuntimeLimitsConfig {
48 vector_len_max: protocol_config.max_move_vector_len(),
49 max_value_nest_depth: protocol_config.max_move_value_depth_as_option(),
50 hardened_otw_check: protocol_config.hardened_otw_check(),
51 },
52 enable_invariant_violation_check_in_swap_loc: !protocol_config
53 .disable_invariant_violation_check_in_swap_loc(),
54 check_no_extraneous_bytes_during_deserialization: protocol_config
55 .no_extraneous_module_bytes(),
56 error_execution_state: false,
58 binary_config: protocol_config.binary_config(None),
59 rethrow_serialization_type_layout_errors: protocol_config
60 .rethrow_serialization_type_layout_errors(),
61 max_type_to_layout_nodes: protocol_config.max_type_to_layout_nodes_as_option(),
62 variant_nodes: protocol_config.variant_nodes(),
63 deprecate_global_storage_ops_during_deserialization: protocol_config
64 .deprecate_global_storage_ops_during_deserialization(),
65 },
66 )
67 .map_err(|_| SuiErrorKind::ExecutionInvariantViolation.into())
68 }
69
70 pub fn new_native_extensions<'r>(
71 child_resolver: &'r dyn ChildObjectResolver,
72 input_objects: BTreeMap<ObjectID, object_runtime::InputObject>,
73 is_metered: bool,
74 protocol_config: &'r ProtocolConfig,
75 metrics: Arc<LimitsMetrics>,
76 current_epoch_id: EpochId,
77 ) -> NativeContextExtensions<'r> {
78 let mut extensions = NativeContextExtensions::default();
79 extensions.add(ObjectRuntime::new(
80 child_resolver,
81 input_objects,
82 is_metered,
83 protocol_config,
84 metrics,
85 current_epoch_id,
86 ));
87 extensions.add(NativesCostTable::from_protocol_config(protocol_config));
88 extensions
89 }
90
91 pub fn substitute_package_id(
94 modules: &mut [CompiledModule],
95 object_id: ObjectID,
96 ) -> Result<(), ExecutionError> {
97 let new_address = AccountAddress::from(object_id);
98
99 for module in modules.iter_mut() {
100 let self_handle = module.self_handle().clone();
101 let self_address_idx = self_handle.address;
102
103 let addrs = &mut module.address_identifiers;
104 let Some(address_mut) = addrs.get_mut(self_address_idx.0 as usize) else {
105 let name = module.identifier_at(self_handle.name);
106 return Err(ExecutionError::new_with_source(
107 ExecutionErrorKind::PublishErrorNonZeroAddress,
108 format!("Publishing module {name} with invalid address index"),
109 ));
110 };
111
112 if *address_mut != AccountAddress::ZERO {
113 let name = module.identifier_at(self_handle.name);
114 return Err(ExecutionError::new_with_source(
115 ExecutionErrorKind::PublishErrorNonZeroAddress,
116 format!("Publishing module {name} with non-zero address is not allowed"),
117 ));
118 };
119
120 *address_mut = new_address;
121 }
122
123 Ok(())
124 }
125
126 pub fn missing_unwrapped_msg(id: &ObjectID) -> String {
127 format!(
128 "Unable to unwrap object {}. Was unable to retrieve last known version in the parent sync",
129 id
130 )
131 }
132
133 #[instrument(level = "trace", skip_all)]
139 pub fn run_metered_move_bytecode_verifier(
140 modules: &[CompiledModule],
141 verifier_config: &VerifierConfig,
142 meter: &mut (impl Meter + ?Sized),
143 metrics: &Arc<BytecodeVerifierMetrics>,
144 ) -> Result<(), SuiError> {
145 for module in modules.iter() {
147 let per_module_meter_verifier_timer = metrics
148 .verifier_runtime_per_module_success_latency
149 .start_timer();
150
151 if let Err(e) = verify_module_with_config_metered(verifier_config, module, meter) {
152 if check_for_verifier_timeout(&e.major_status()) {
154 metrics
156 .verifier_runtime_per_module_timeout_latency
157 .observe(per_module_meter_verifier_timer.stop_and_discard());
158 metrics
159 .verifier_timeout_metrics
160 .with_label_values(&[
161 BytecodeVerifierMetrics::MOVE_VERIFIER_TAG,
162 BytecodeVerifierMetrics::TIMEOUT_TAG,
163 ])
164 .inc();
165 return Err(SuiErrorKind::ModuleVerificationFailure {
166 error: format!("Verification timedout: {}", e),
167 }
168 .into());
169 };
170 } else if let Err(err) = sui_verify_module_metered_check_timeout_only(
171 module,
172 &BTreeMap::new(),
173 meter,
174 verifier_config,
175 ) {
176 metrics
179 .verifier_runtime_per_module_timeout_latency
180 .observe(per_module_meter_verifier_timer.stop_and_discard());
181 metrics
182 .verifier_timeout_metrics
183 .with_label_values(&[
184 BytecodeVerifierMetrics::SUI_VERIFIER_TAG,
185 BytecodeVerifierMetrics::TIMEOUT_TAG,
186 ])
187 .inc();
188 return Err(err.into());
189 }
190 per_module_meter_verifier_timer.stop_and_record();
192 metrics
193 .verifier_timeout_metrics
194 .with_label_values(&[
195 BytecodeVerifierMetrics::OVERALL_TAG,
196 BytecodeVerifierMetrics::SUCCESS_TAG,
197 ])
198 .inc();
199 }
200 Ok(())
201 }
202}