bee_block/payload/transaction/essence/
mod.rs

1// Copyright 2020-2021 IOTA Stiftung
2// SPDX-License-Identifier: Apache-2.0
3
4mod regular;
5
6use crypto::hashes::{blake2b::Blake2b256, Digest};
7use derive_more::From;
8use packable::PackableExt;
9
10pub(crate) use self::regular::{InputCount, OutputCount};
11pub use self::regular::{RegularTransactionEssence, RegularTransactionEssenceBuilder};
12use crate::Error;
13
14/// A generic essence that can represent different types defining transaction essences.
15#[derive(Clone, Debug, Eq, PartialEq, From, packable::Packable)]
16#[cfg_attr(
17    feature = "serde",
18    derive(serde::Serialize, serde::Deserialize),
19    serde(tag = "type", content = "data")
20)]
21#[packable(unpack_error = Error)]
22#[packable(tag_type = u8, with_error = Error::InvalidEssenceKind)]
23pub enum TransactionEssence {
24    /// A regular transaction essence.
25    #[packable(tag = RegularTransactionEssence::KIND)]
26    Regular(RegularTransactionEssence),
27}
28
29impl TransactionEssence {
30    /// Returns the essence kind of an [`TransactionEssence`].
31    pub fn kind(&self) -> u8 {
32        match self {
33            Self::Regular(_) => RegularTransactionEssence::KIND,
34        }
35    }
36
37    /// Return the Blake2b hash of an [`TransactionEssence`].
38    pub fn hash(&self) -> [u8; 32] {
39        Blake2b256::digest(&self.pack_to_vec()).into()
40    }
41}
42
43#[cfg(feature = "dto")]
44#[allow(missing_docs)]
45pub mod dto {
46    use serde::{Deserialize, Serialize};
47
48    pub use super::regular::dto::RegularTransactionEssenceDto;
49    use super::*;
50    use crate::{error::dto::DtoError, protocol::ProtocolParameters};
51
52    /// Describes all the different essence types.
53    #[derive(Clone, Debug, Eq, PartialEq, Serialize, Deserialize, From)]
54    #[serde(untagged)]
55    pub enum TransactionEssenceDto {
56        Regular(RegularTransactionEssenceDto),
57    }
58
59    impl From<&TransactionEssence> for TransactionEssenceDto {
60        fn from(value: &TransactionEssence) -> Self {
61            match value {
62                TransactionEssence::Regular(r) => TransactionEssenceDto::Regular(r.into()),
63            }
64        }
65    }
66
67    impl TransactionEssence {
68        pub fn try_from_dto(
69            value: &TransactionEssenceDto,
70            protocol_parameters: &ProtocolParameters,
71        ) -> Result<TransactionEssence, DtoError> {
72            match value {
73                TransactionEssenceDto::Regular(r) => Ok(TransactionEssence::Regular(
74                    RegularTransactionEssence::try_from_dto(r, protocol_parameters)?,
75                )),
76            }
77        }
78    }
79}