iota_execution/
executor.rs

1// Copyright (c) Mysten Labs, Inc.
2// Modifications Copyright (c) 2024 IOTA Stiftung
3// SPDX-License-Identifier: Apache-2.0
4
5use std::{collections::HashSet, sync::Arc};
6
7use iota_protocol_config::ProtocolConfig;
8use iota_types::{
9    base_types::{IotaAddress, ObjectRef, TxContext},
10    committee::EpochId,
11    digests::TransactionDigest,
12    effects::TransactionEffects,
13    error::ExecutionError,
14    execution::{ExecutionResult, TypeLayoutStore},
15    gas::IotaGasStatus,
16    inner_temporary_store::InnerTemporaryStore,
17    layout_resolver::LayoutResolver,
18    metrics::LimitsMetrics,
19    storage::BackingStore,
20    transaction::{CheckedInputObjects, ProgrammableTransaction, TransactionKind},
21};
22use move_trace_format::format::MoveTraceBuilder;
23
24/// Abstracts over access to the VM across versions of the execution layer.
25pub trait Executor {
26    fn execute_transaction_to_effects(
27        &self,
28        store: &dyn BackingStore,
29        // Configuration
30        protocol_config: &ProtocolConfig,
31        metrics: Arc<LimitsMetrics>,
32        enable_expensive_checks: bool,
33        certificate_deny_set: &HashSet<TransactionDigest>,
34        // Epoch
35        epoch_id: &EpochId,
36        epoch_timestamp_ms: u64,
37        // Transaction Inputs
38        input_objects: CheckedInputObjects,
39        // Gas related
40        gas_coins: Vec<ObjectRef>,
41        gas_status: IotaGasStatus,
42        // Transaction
43        transaction_kind: TransactionKind,
44        transaction_signer: IotaAddress,
45        transaction_digest: TransactionDigest,
46        trace_builder_opt: &mut Option<MoveTraceBuilder>,
47    ) -> (
48        InnerTemporaryStore,
49        IotaGasStatus,
50        TransactionEffects,
51        Result<(), ExecutionError>,
52    );
53
54    fn dev_inspect_transaction(
55        &self,
56        store: &dyn BackingStore,
57        // Configuration
58        protocol_config: &ProtocolConfig,
59        metrics: Arc<LimitsMetrics>,
60        enable_expensive_checks: bool,
61        certificate_deny_set: &HashSet<TransactionDigest>,
62        // Epoch
63        epoch_id: &EpochId,
64        epoch_timestamp_ms: u64,
65        // Transaction Inputs
66        input_objects: CheckedInputObjects,
67        // Gas related
68        gas_coins: Vec<ObjectRef>,
69        gas_status: IotaGasStatus,
70        // Transaction
71        transaction_kind: TransactionKind,
72        transaction_signer: IotaAddress,
73        transaction_digest: TransactionDigest,
74        skip_all_checks: bool,
75    ) -> (
76        InnerTemporaryStore,
77        IotaGasStatus,
78        TransactionEffects,
79        Result<Vec<ExecutionResult>, ExecutionError>,
80    );
81
82    fn update_genesis_state(
83        &self,
84        store: &dyn BackingStore,
85        // Configuration
86        protocol_config: &ProtocolConfig,
87        metrics: Arc<LimitsMetrics>,
88        // Genesis State
89        tx_context: &mut TxContext,
90        // Transaction
91        input_objects: CheckedInputObjects,
92        pt: ProgrammableTransaction,
93    ) -> Result<InnerTemporaryStore, ExecutionError>;
94
95    fn type_layout_resolver<'r, 'vm: 'r, 'store: 'r>(
96        &'vm self,
97        store: Box<dyn TypeLayoutStore + 'store>,
98    ) -> Box<dyn LayoutResolver + 'r>;
99}