sui_adapter_latest/static_programmable_transactions/
mod.rs

1// Copyright (c) Mysten Labs, Inc.
2// SPDX-License-Identifier: Apache-2.0
3
4#![deny(clippy::arithmetic_side_effects)]
5#![deny(clippy::indexing_slicing)]
6#![deny(clippy::cast_possible_truncation)]
7
8use crate::{
9    data_store::{
10        cached_package_store::CachedPackageStore,
11        transaction_package_store::TransactionPackageStore,
12    },
13    execution_mode::ExecutionMode,
14    execution_value::ExecutionState,
15    gas_charger::GasCharger,
16    static_programmable_transactions::{
17        env::Env, linkage::analysis::LinkageAnalyzer, metering::translation_meter,
18    },
19};
20use move_trace_format::format::MoveTraceBuilder;
21use move_vm_runtime::runtime::MoveRuntime;
22use std::{cell::RefCell, rc::Rc, sync::Arc};
23use sui_protocol_config::ProtocolConfig;
24use sui_types::{
25    base_types::TxContext, error::ExecutionError, execution::ResultWithTimings,
26    execution_status::ExecutionErrorKind, metrics::LimitsMetrics, storage::BackingPackageStore,
27    transaction::ProgrammableTransaction,
28};
29
30pub mod env;
31pub mod execution;
32pub mod linkage;
33pub mod loading;
34pub mod metering;
35pub mod spanned;
36pub mod typing;
37
38pub fn execute<Mode: ExecutionMode>(
39    protocol_config: &ProtocolConfig,
40    metrics: Arc<LimitsMetrics>,
41    vm: &MoveRuntime,
42    state_view: &mut dyn ExecutionState,
43    package_store: &dyn BackingPackageStore,
44    tx_context: Rc<RefCell<TxContext>>,
45    gas_charger: &mut GasCharger,
46    // which inputs are withdrawals that need to be converted to coins
47    withdrawal_compatibility_inputs: Option<Vec<bool>>,
48    txn: ProgrammableTransaction,
49    trace_builder_opt: &mut Option<MoveTraceBuilder>,
50) -> ResultWithTimings<Mode::ExecutionResults, ExecutionError> {
51    let gas_payment = gas_charger.gas_payment_amount();
52    let package_store = CachedPackageStore::new(vm, TransactionPackageStore::new(package_store));
53    let linkage_analysis =
54        LinkageAnalyzer::new::<Mode>(protocol_config).map_err(|e| (e, vec![]))?;
55    let ptb_type_linkage = linkage_analysis
56        .compute_input_type_resolution_linkage(&txn, &package_store, state_view)
57        .and_then(|linkage| linkage.linkage_context())
58        .map_err(|e| (e, vec![]))?;
59    let resolution_vm = vm
60        .make_vm(&package_store.package_store, ptb_type_linkage)
61        .map_err(|e| {
62            (
63                ExecutionError::new_with_source(ExecutionErrorKind::InvalidLinkage, e),
64                vec![],
65            )
66        })?;
67
68    let mut env = Env::new(
69        protocol_config,
70        vm,
71        state_view,
72        &package_store,
73        &linkage_analysis,
74        &resolution_vm,
75    );
76    let mut translation_meter =
77        translation_meter::TranslationMeter::new(protocol_config, gas_charger);
78
79    let txn = {
80        let tx_context_ref = tx_context.borrow();
81        loading::translate::transaction::<Mode>(
82            &mut translation_meter,
83            &env,
84            &tx_context_ref,
85            withdrawal_compatibility_inputs,
86            gas_payment,
87            txn,
88        )
89        .map_err(|e| (e, vec![]))?
90    };
91    let txn = typing::translate_and_verify::<Mode>(&mut translation_meter, &env, txn)
92        .map_err(|e| (e, vec![]))?;
93    execution::interpreter::execute::<Mode>(
94        &mut env,
95        metrics,
96        tx_context,
97        gas_charger,
98        txn,
99        trace_builder_opt,
100    )
101}