iota_types/
transaction_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::BTreeMap, time::Duration};
6
7use crate::{
8    base_types::ObjectID,
9    digests::TransactionDigest,
10    effects::{TransactionEffects, TransactionEvents},
11    error::{ExecutionError, IotaError},
12    execution::ExecutionResult,
13    messages_checkpoint::CheckpointSequenceNumber,
14    object::Object,
15    quorum_driver_types::{
16        ExecuteTransactionRequestV1, ExecuteTransactionResponseV1, QuorumDriverError,
17    },
18    transaction::TransactionData,
19};
20
21/// Trait to define the interface for how the REST service interacts with a
22/// QuorumDriver or a simulated transaction executor.
23#[async_trait::async_trait]
24pub trait TransactionExecutor: Send + Sync {
25    async fn execute_transaction(
26        &self,
27        request: ExecuteTransactionRequestV1,
28        client_addr: Option<std::net::SocketAddr>,
29    ) -> Result<ExecuteTransactionResponseV1, QuorumDriverError>;
30
31    fn simulate_transaction(
32        &self,
33        transaction: TransactionData,
34        checks: VmChecks,
35    ) -> Result<SimulateTransactionResult, IotaError>;
36
37    /// Wait for the given transactions to be included in a checkpoint.
38    ///
39    /// Returns a mapping from transaction digest to
40    /// `(checkpoint_sequence_number, checkpoint_timestamp_ms)`.
41    /// On timeout, returns partial results for any transactions that were
42    /// already checkpointed.
43    async fn wait_for_checkpoint_inclusion(
44        &self,
45        digests: &[TransactionDigest],
46        timeout: Duration,
47    ) -> Result<BTreeMap<TransactionDigest, (CheckpointSequenceNumber, u64)>, IotaError>;
48}
49
50pub struct SimulateTransactionResult {
51    pub effects: TransactionEffects,
52    pub events: Option<TransactionEvents>,
53    pub input_objects: BTreeMap<ObjectID, Object>,
54    pub output_objects: BTreeMap<ObjectID, Object>,
55    pub execution_result: Result<Vec<ExecutionResult>, ExecutionError>,
56    pub mock_gas_id: Option<ObjectID>,
57    pub suggested_gas_price: Option<u64>,
58}
59
60#[derive(Default, Debug, Copy, Clone)]
61pub enum VmChecks {
62    #[default]
63    Enabled,
64    Disabled,
65}
66
67impl VmChecks {
68    pub fn disabled(self) -> bool {
69        matches!(self, Self::Disabled)
70    }
71
72    pub fn enabled(self) -> bool {
73        matches!(self, Self::Enabled)
74    }
75}