diff --git a/vm/vm-runtime/src/parallel_executor/vm_wrapper.rs b/vm/vm-runtime/src/parallel_executor/vm_wrapper.rs index 330e95c7d6..6f255f81be 100644 --- a/vm/vm-runtime/src/parallel_executor/vm_wrapper.rs +++ b/vm/vm-runtime/src/parallel_executor/vm_wrapper.rs @@ -4,7 +4,7 @@ use crate::{ parallel_executor::{storage_wrapper::VersionedView, StarcoinTransactionOutput}, starcoin_vm::StarcoinVM, - vm_adapter::{PreprocessedTransaction, VMAdapter}, + vm_adapter::PreprocessedTransaction, }; use starcoin_parallel_executor::{ diff --git a/vm/vm-runtime/src/starcoin_vm.rs b/vm/vm-runtime/src/starcoin_vm.rs index f382da4cc1..c1ef5b6880 100644 --- a/vm/vm-runtime/src/starcoin_vm.rs +++ b/vm/vm-runtime/src/starcoin_vm.rs @@ -7,10 +7,7 @@ use crate::errors::{ convert_normal_success_epilogue_error, convert_prologue_runtime_error, error_split, }; use crate::move_vm_ext::{MoveResolverExt, MoveVmExt, SessionId, SessionOutput}; -use crate::vm_adapter::{ - discard_error_output, discard_error_vm_status, PreprocessedTransaction, - PublishModuleBundleOption, SessionAdapter, VMAdapter, -}; +use crate::vm_adapter::{PreprocessedTransaction, PublishModuleBundleOption, SessionAdapter}; use anyhow::{bail, format_err, Error, Result}; use move_core_types::gas_algebra::{InternalGasPerByte, NumBytes}; use move_core_types::vm_status::StatusCode::VALUE_SERIALIZATION_ERROR; @@ -61,6 +58,7 @@ use starcoin_vm_types::transaction::{DryRunTransaction, Package, TransactionPayl use starcoin_vm_types::transaction_metadata::TransactionPayloadMetadata; use starcoin_vm_types::value::{serialize_values, MoveValue}; use starcoin_vm_types::vm_status::KeptVMStatus; +use starcoin_vm_types::write_set::WriteSet; use starcoin_vm_types::{ errors::Location, language_storage::TypeTag, @@ -71,6 +69,7 @@ use starcoin_vm_types::{ }; use std::borrow::Borrow; use std::cmp::min; +use std::collections::BTreeMap; use std::sync::Arc; static EXECUTION_CONCURRENCY_LEVEL: OnceCell = OnceCell::new(); @@ -79,6 +78,29 @@ static EXECUTION_CONCURRENCY_LEVEL: OnceCell = OnceCell::new(); use crate::metrics::VMMetrics; use crate::{verifier, VMExecutor}; +pub(crate) fn discard_error_vm_status(err: VMStatus) -> (VMStatus, TransactionOutput) { + let vm_status = err.clone(); + let error_code = match err.keep_or_discard() { + Ok(_) => { + debug_assert!(false, "discarding non-discardable error: {:?}", vm_status); + vm_status.status_code() + } + Err(code) => code, + }; + (vm_status, discard_error_output(error_code)) +} + +pub(crate) fn discard_error_output(err: StatusCode) -> TransactionOutput { + // Since this transaction will be discarded, no writeset will be included. + TransactionOutput::new( + BTreeMap::new(), + WriteSet::default(), + vec![], + 0, + TransactionStatus::Discard(err), + ) +} + #[derive(Clone)] #[allow(clippy::upper_case_acronyms)] /// Wrapper of MoveVM @@ -1465,6 +1487,43 @@ impl StarcoinVM { ) -> VMResult> { self.move_vm.load_module(module_id, remote) } + + pub(crate) fn execute_single_transaction( + &self, + txn: &PreprocessedTransaction, + data_cache: &S, + ) -> Result<(VMStatus, TransactionOutput, Option), VMStatus> { + Ok(match txn { + PreprocessedTransaction::UserTransaction(txn) => { + let sender = txn.sender().to_string(); + let (vm_status, output) = self.execute_user_transaction(data_cache, *txn.clone()); + // XXX FIXME YSG + // let gas_unit_price = transaction.gas_unit_price(); think about gas_used OutOfGas + (vm_status, output, Some(sender)) + } + PreprocessedTransaction::BlockMetadata(block_meta) => { + let (vm_status, output) = + match self.process_block_metadata(data_cache, block_meta.clone()) { + Ok(output) => (VMStatus::Executed, output), + Err(vm_status) => discard_error_vm_status(vm_status), + }; + (vm_status, output, Some("block_meta".to_string())) + } + }) + } + + pub(crate) fn should_restart_execution(output: &TransactionOutput) -> bool { + // XXX FIXME YSG if GasSchedule.move UpgradeEvent + for event in output.events() { + if event.key().get_creator_address() == genesis_address() + && (event.is::() || event.is::>()) + { + info!("should_restart_execution happen"); + return true; + } + } + false + } } #[allow(clippy::large_enum_variant)] @@ -1631,42 +1690,3 @@ impl VMExecutor for StarcoinVM { } } } - -impl VMAdapter for StarcoinVM { - fn should_restart_execution(output: &TransactionOutput) -> bool { - // XXX FIXME YSG if GasSchedule.move UpgradeEvent - for event in output.events() { - if event.key().get_creator_address() == genesis_address() - && (event.is::() || event.is::>()) - { - info!("should_restart_execution happen"); - return true; - } - } - false - } - - fn execute_single_transaction( - &self, - txn: &PreprocessedTransaction, - data_cache: &S, - ) -> Result<(VMStatus, TransactionOutput, Option), VMStatus> { - Ok(match txn { - PreprocessedTransaction::UserTransaction(txn) => { - let sender = txn.sender().to_string(); - let (vm_status, output) = self.execute_user_transaction(data_cache, *txn.clone()); - // XXX FIXME YSG - // let gas_unit_price = transaction.gas_unit_price(); think about gas_used OutOfGas - (vm_status, output, Some(sender)) - } - PreprocessedTransaction::BlockMetadata(block_meta) => { - let (vm_status, output) = - match self.process_block_metadata(data_cache, block_meta.clone()) { - Ok(output) => (VMStatus::Executed, output), - Err(vm_status) => discard_error_vm_status(vm_status), - }; - (vm_status, output, Some("block_meta".to_string())) - } - }) - } -} diff --git a/vm/vm-runtime/src/vm_adapter/adapter_common.rs b/vm/vm-runtime/src/vm_adapter/adapter_common.rs deleted file mode 100644 index 4a966bf69d..0000000000 --- a/vm/vm-runtime/src/vm_adapter/adapter_common.rs +++ /dev/null @@ -1,65 +0,0 @@ -// Copyright (c) The Starcoin Core Contributors -// SPDX-License-Identifier: Apache-2.0 - -use crate::move_vm_ext::MoveResolverExt; -use anyhow::Result; -use move_core_types::vm_status::{StatusCode, VMStatus}; -use starcoin_vm_types::state_view::StateView; -use starcoin_vm_types::{ - block_metadata::BlockMetadata, - transaction::{SignedUserTransaction, Transaction, TransactionOutput, TransactionStatus}, - write_set::WriteSet, -}; -use std::collections::BTreeMap; - -/// TODO: bring more of the execution logic in starcoin_vm into this file. -pub trait VMAdapter { - /// TODO: maybe remove this after more refactoring of execution logic. - fn should_restart_execution(output: &TransactionOutput) -> bool; - - /// Execute a single transaction. - fn execute_single_transaction( - &self, - txn: &PreprocessedTransaction, - data_cache: &S, - ) -> Result<(VMStatus, TransactionOutput, Option), VMStatus>; -} - -#[derive(Debug)] -pub enum PreprocessedTransaction { - UserTransaction(Box), - BlockMetadata(BlockMetadata), -} - -#[inline] -pub fn preprocess_transaction(txn: Transaction) -> PreprocessedTransaction { - match txn { - Transaction::BlockMetadata(b) => PreprocessedTransaction::BlockMetadata(b), - Transaction::UserTransaction(txn) => { - PreprocessedTransaction::UserTransaction(Box::new(txn)) - } - } -} - -pub(crate) fn discard_error_vm_status(err: VMStatus) -> (VMStatus, TransactionOutput) { - let vm_status = err.clone(); - let error_code = match err.keep_or_discard() { - Ok(_) => { - debug_assert!(false, "discarding non-discardable error: {:?}", vm_status); - vm_status.status_code() - } - Err(code) => code, - }; - (vm_status, discard_error_output(error_code)) -} - -pub(crate) fn discard_error_output(err: StatusCode) -> TransactionOutput { - // Since this transaction will be discarded, no writeset will be included. - TransactionOutput::new( - BTreeMap::new(), - WriteSet::default(), - vec![], - 0, - TransactionStatus::Discard(err), - ) -} diff --git a/vm/vm-runtime/src/vm_adapter/mod.rs b/vm/vm-runtime/src/vm_adapter/mod.rs index 4adba7c36f..bddf65aea4 100644 --- a/vm/vm-runtime/src/vm_adapter/mod.rs +++ b/vm/vm-runtime/src/vm_adapter/mod.rs @@ -2,12 +2,25 @@ // SPDX-License-Identifier: Apache-2.0 mod adapter; -mod adapter_common; - -pub(crate) use { - adapter::{PublishModuleBundleOption, SessionAdapter}, - adapter_common::{ - discard_error_output, discard_error_vm_status, preprocess_transaction, - PreprocessedTransaction, VMAdapter, - }, -}; + +pub(crate) use adapter::{PublishModuleBundleOption, SessionAdapter}; +use starcoin_vm_types::block_metadata::BlockMetadata; +use starcoin_vm_types::transaction::{SignedUserTransaction, Transaction}; + +#[derive(Debug)] +pub enum PreprocessedTransaction { + UserTransaction(Box), + BlockMetadata(BlockMetadata), +} + +#[inline] +pub fn preprocess_transaction(txn: Transaction) -> crate::vm_adapter::PreprocessedTransaction { + match txn { + Transaction::BlockMetadata(b) => { + crate::vm_adapter::PreprocessedTransaction::BlockMetadata(b) + } + Transaction::UserTransaction(txn) => { + crate::vm_adapter::PreprocessedTransaction::UserTransaction(Box::new(txn)) + } + } +}