diff --git a/types/src/vm/config.rs b/types/src/vm/config.rs index 705084c9e5..dec540c194 100644 --- a/types/src/vm/config.rs +++ b/types/src/vm/config.rs @@ -24,6 +24,13 @@ pub fn get_max_binary_format_version( } } +pub fn starcoin_prod_deserializer_config(features: &Features) -> DeserializerConfig { + DeserializerConfig::new( + get_max_binary_format_version(features, None), + get_max_identifier_size(features), + ) +} + pub fn get_max_identifier_size(features: &Features) -> u64 { if features.is_enabled(FeatureFlag::LIMIT_MAX_IDENTIFIER_LENGTH) { IDENTIFIER_SIZE_MAX diff --git a/vm/e2e-tests/src/executor.rs b/vm/e2e-tests/src/executor.rs index 79c3b173bd..f9477f772d 100644 --- a/vm/e2e-tests/src/executor.rs +++ b/vm/e2e-tests/src/executor.rs @@ -535,7 +535,7 @@ impl FakeExecutor { &resolver, ) .unwrap(); - let remote_view = StorageAdapter::new(&self.data_store); + let remote_view = self.data_store.as_move_resolver(); let balance = gas_params.vm.txn.maximum_number_of_gas_units.clone(); let mut gas_meter = StarcoinGasMeter::new(gas_params, balance); @@ -608,7 +608,7 @@ impl FakeExecutor { &resolver, ) .unwrap(); - let remote_view = StorageAdapter::new(&self.data_store); + let remote_view = self.data_store.as_move_resolver(); let balance = gas_params.vm.txn.maximum_number_of_gas_units.clone(); let mut gas_meter = StarcoinGasMeter::new(gas_params, balance); diff --git a/vm/starcoin-transactional-test-harness/src/lib.rs b/vm/starcoin-transactional-test-harness/src/lib.rs index 7dc263cb83..35fc165de4 100644 --- a/vm/starcoin-transactional-test-harness/src/lib.rs +++ b/vm/starcoin-transactional-test-harness/src/lib.rs @@ -54,6 +54,7 @@ use starcoin_types::{ account_config::{genesis_address, AccountResource}, transaction::RawUserTransaction, }; +use starcoin_vm_runtime::data_cache::AsMoveResolver; use starcoin_vm_runtime::session::SerializedReturnValues; use starcoin_vm_runtime::{data_cache::StorageAdapter, starcoin_vm::StarcoinVM}; use starcoin_vm_types::account_config::{ @@ -706,7 +707,7 @@ impl<'a> StarcoinTestAdapter<'a> { None, )?; - let move_resolver = StorageAdapter::new(&self.context.storage); + let move_resolver = self.context.storage.as_move_resolver(); let annotator = move_resource_viewer::MoveValueAnnotator::new(move_resolver); let rets = rets .into_iter() @@ -1371,7 +1372,7 @@ impl<'a> MoveTestAdapter<'a> for StarcoinTestAdapter<'a> { resource: &IdentStr, type_args: Vec, ) -> anyhow::Result { - let s = StorageAdapter::new(&self.context.storage); + let s = self.context.storage.as_move_resolver(); view_resource_in_move_storage(s, address, module, resource, type_args) } diff --git a/vm/types/src/on_chain_config/starcoin_features.rs b/vm/types/src/on_chain_config/starcoin_features.rs index 4e01bedd23..fa9cbc4f0a 100644 --- a/vm/types/src/on_chain_config/starcoin_features.rs +++ b/vm/types/src/on_chain_config/starcoin_features.rs @@ -56,7 +56,7 @@ pub enum FeatureFlag { LIMIT_MAX_IDENTIFIER_LENGTH = 38, OPERATOR_BENEFICIARY_CHANGE = 39, VM_BINARY_FORMAT_V7 = 40, - RESOURCE_GROUPS_CHARGE_AS_SIZE_SUM = 41, + RESOURCE_GROUPS_SPLIT_IN_VM_CHANGE_SET = 41, // default to be disabled COMMISSION_CHANGE_DELEGATION_POOL = 42, BN254_STRUCTURES = 43, WEBAUTHN_SIGNATURE = 44, @@ -216,14 +216,14 @@ impl Features { /// Once enabled, Aggregator V2 functions become parallel. pub fn is_aggregator_v2_delayed_fields_enabled(&self) -> bool { // This feature depends on resource groups being split inside VMChange set, - // which is gated by RESOURCE_GROUPS_CHARGE_AS_SIZE_SUM feature, so + // which is gated by RESOURCE_GROUPS_SPLIT_IN_VM_CHANGE_SET feature, so // require that feature to be enabled as well. self.is_enabled(FeatureFlag::AGGREGATOR_V2_DELAYED_FIELDS) - && self.is_resource_group_charge_as_size_sum_enabled() + && self.is_resource_groups_split_in_vm_change_set_enabled() } - pub fn is_resource_group_charge_as_size_sum_enabled(&self) -> bool { - self.is_enabled(FeatureFlag::RESOURCE_GROUPS_CHARGE_AS_SIZE_SUM) + pub fn is_resource_groups_split_in_vm_change_set_enabled(&self) -> bool { + self.is_enabled(FeatureFlag::RESOURCE_GROUPS_SPLIT_IN_VM_CHANGE_SET) } } diff --git a/vm/vm-runtime/src/data_cache.rs b/vm/vm-runtime/src/data_cache.rs index 2a25732626..1203352d8d 100644 --- a/vm/vm-runtime/src/data_cache.rs +++ b/vm/vm-runtime/src/data_cache.rs @@ -14,10 +14,12 @@ use move_table_extension::{TableHandle, TableResolver}; use starcoin_gas_schedule::LATEST_GAS_FEATURE_VERSION; use starcoin_logger::prelude::*; use starcoin_types::account_address::AccountAddress; +use starcoin_types::vm::config::starcoin_prod_deserializer_config; use starcoin_vm_runtime_types::resolver::{ ExecutorView, ResourceGroupSize, TResourceGroupView, TResourceView, }; use starcoin_vm_runtime_types::resource_group_adapter::ResourceGroupAdapter; +use starcoin_vm_types::on_chain_config::{Features, GasSchedule, OnChainConfig}; use starcoin_vm_types::state_store::{ errors::StateviewError, state_key::StateKey, state_storage_usage::StateStorageUsage, state_value::StateValue, StateView, TStateView, @@ -142,11 +144,11 @@ impl<'block, S: StateView> ModuleResolver for StateViewCache<'block, S> { type Error = PartialVMError; fn get_module_metadata(&self, module_id: &ModuleId) -> Vec { - StorageAdapter::new(self).get_module_metadata(module_id) + self.as_move_resolver().get_module_metadata(module_id) } fn get_module(&self, module_id: &ModuleId) -> Result, Self::Error> { - StorageAdapter::new(self).get_module(module_id) + self.as_move_resolver().get_module(module_id) } } impl<'block, S: StateView> ResourceResolver for StateViewCache<'block, S> { @@ -159,22 +161,21 @@ impl<'block, S: StateView> ResourceResolver for StateViewCache<'block, S> { metadata: &[Metadata], layout: Option<&MoveTypeLayout>, ) -> Result<(Option, usize), Self::Error> { - StorageAdapter::new(self) + self.as_move_resolver() .get_resource_bytes_with_metadata_and_layout(address, struct_tag, metadata, layout) } } impl<'a, S: StateView> StorageAdapter<'a, S> { - pub fn new(state_store: &'a S) -> Self { + pub fn new( + state_store: &'a S, + deserializer_config: DeserializerConfig, + resource_group_view: ResourceGroupAdapter, + ) -> Self { Self { executor_view: state_store, - _deserializer_config: DeserializerConfig::new(0, 0), - resource_group_view: ResourceGroupAdapter::new( - None, - state_store, - LATEST_GAS_FEATURE_VERSION, - false, - ), + _deserializer_config: deserializer_config, + resource_group_view, accessed_groups: RefCell::new(HashSet::new()), } } @@ -317,7 +318,19 @@ pub trait AsMoveResolver { impl AsMoveResolver for S { fn as_move_resolver(&self) -> StorageAdapter { - StorageAdapter::new(self) + let features = Features::fetch_config(self).unwrap_or_default(); + let deserializer_config = starcoin_prod_deserializer_config(&features); + assert!(!features.is_resource_groups_split_in_vm_change_set_enabled()); + + let gas_feature_version = GasSchedule::fetch_config(self).unwrap().feature_version; + let resource_group_adapter = ResourceGroupAdapter::new( + None, + self, + gas_feature_version, + // todo(simon): Currently it is disabled + features.is_resource_groups_split_in_vm_change_set_enabled(), + ); + StorageAdapter::new(self, deserializer_config, resource_group_adapter) } } @@ -459,8 +472,6 @@ pub(crate) mod tests { resource_groups_split_in_vm_change_set_enabled, ); - // let features = Features::fetch_config(state_view).unwrap_or_default(); - // let deserializer_config = aptos_prod_deserializer_config(&features); - StorageAdapter::new(state_view) + state_view.as_move_resolver() } } diff --git a/vm/vm-runtime/src/starcoin_vm.rs b/vm/vm-runtime/src/starcoin_vm.rs index 0d43e0b090..2a01afea35 100644 --- a/vm/vm-runtime/src/starcoin_vm.rs +++ b/vm/vm-runtime/src/starcoin_vm.rs @@ -105,7 +105,7 @@ impl StarcoinVM { }); let gas_params = StarcoinGasParameters::initial(); let native_params = gas_params.natives.clone(); - let resolver = StorageAdapter::new(state); + let resolver = state.as_move_resolver(); let inner = MoveVmExt::new( native_params.clone(), gas_params.vm.misc.clone(), @@ -211,7 +211,7 @@ impl StarcoinVM { } fn load_configs_impl(&mut self, state: &S) -> Result<(), Error> { - let remote_storage = StorageAdapter::new(state); + let remote_storage = state.as_move_resolver(); self.version = Version::fetch_config(&remote_storage); // move version can be none. self.move_version = MoveLanguageVersion::fetch_config(&remote_storage);