Skip to main content

miden_client/rpc/domain/
block.rs

1use alloc::string::ToString;
2use alloc::vec::Vec;
3
4use miden_protocol::block::{BlockHeader, BlockNumber, FeeParameters, ValidatorKeys};
5use miden_protocol::crypto::dsa::ecdsa_k256_keccak;
6use miden_protocol::utils::serde::{Deserializable, Serializable};
7
8use crate::rpc::domain::MissingFieldHelper;
9use crate::rpc::errors::RpcConversionError;
10use crate::rpc::generated as proto;
11
12// BLOCK HEADER
13// ================================================================================================
14
15impl From<&BlockHeader> for proto::blockchain::BlockHeader {
16    fn from(header: &BlockHeader) -> Self {
17        Self {
18            version: header.version(),
19            prev_block_commitment: Some(header.prev_block_commitment().into()),
20            block_num: header.block_num().as_u32(),
21            chain_commitment: Some(header.chain_commitment().into()),
22            account_root: Some(header.account_root().into()),
23            nullifier_root: Some(header.nullifier_root().into()),
24            note_root: Some(header.note_root().into()),
25            tx_commitment: Some(header.tx_commitment().into()),
26            validator_keys: header
27                .validator_keys()
28                .as_keys()
29                .iter()
30                .map(|key| proto::blockchain::ValidatorPublicKey { validator_key: key.to_bytes() })
31                .collect(),
32            tx_kernel_commitment: Some(header.tx_kernel_commitment().into()),
33            fee_parameters: Some(header.fee_parameters().into()),
34            timestamp: header.timestamp(),
35        }
36    }
37}
38
39impl From<&FeeParameters> for proto::blockchain::FeeParameters {
40    fn from(fee_params: &FeeParameters) -> Self {
41        Self {
42            native_asset_id: Some(fee_params.fee_faucet_id().into()),
43            verification_base_fee: fee_params.verification_base_fee(),
44        }
45    }
46}
47
48impl From<FeeParameters> for proto::blockchain::FeeParameters {
49    fn from(fee_params: FeeParameters) -> Self {
50        (&fee_params).into()
51    }
52}
53
54impl From<BlockHeader> for proto::blockchain::BlockHeader {
55    fn from(header: BlockHeader) -> Self {
56        (&header).into()
57    }
58}
59
60impl TryFrom<proto::blockchain::BlockHeader> for BlockHeader {
61    type Error = RpcConversionError;
62
63    fn try_from(value: proto::blockchain::BlockHeader) -> Result<Self, Self::Error> {
64        let validator_keys = value
65            .validator_keys
66            .into_iter()
67            .map(|key| ecdsa_k256_keccak::PublicKey::read_from_bytes(&key.validator_key))
68            .collect::<Result<Vec<_>, _>>()?;
69        let validator_keys = ValidatorKeys::new(validator_keys)
70            .map_err(|err| RpcConversionError::InvalidField(err.to_string()))?;
71
72        Ok(BlockHeader::new(
73            value.version,
74            value
75                .prev_block_commitment
76                .ok_or(proto::blockchain::BlockHeader::missing_field(stringify!(
77                    prev_block_commitment
78                )))?
79                .try_into()?,
80            value.block_num.into(),
81            value
82                .chain_commitment
83                .ok_or(proto::blockchain::BlockHeader::missing_field(stringify!(chain_commitment)))?
84                .try_into()?,
85            value
86                .account_root
87                .ok_or(proto::blockchain::BlockHeader::missing_field(stringify!(account_root)))?
88                .try_into()?,
89            value
90                .nullifier_root
91                .ok_or(proto::blockchain::BlockHeader::missing_field(stringify!(nullifier_root)))?
92                .try_into()?,
93            value
94                .note_root
95                .ok_or(proto::blockchain::BlockHeader::missing_field(stringify!(note_root)))?
96                .try_into()?,
97            value
98                .tx_commitment
99                .ok_or(proto::blockchain::BlockHeader::missing_field(stringify!(tx_commitment)))?
100                .try_into()?,
101            value
102                .tx_kernel_commitment
103                .ok_or(proto::blockchain::BlockHeader::missing_field(stringify!(
104                    tx_kernel_commitment
105                )))?
106                .try_into()?,
107            validator_keys,
108            value
109                .fee_parameters
110                .ok_or(proto::blockchain::BlockHeader::missing_field(stringify!(fee_parameters)))?
111                .try_into()?,
112            value.timestamp,
113        ))
114    }
115}
116
117impl TryFrom<&proto::blockchain::FeeParameters> for FeeParameters {
118    type Error = RpcConversionError;
119
120    fn try_from(value: &proto::blockchain::FeeParameters) -> Result<Self, Self::Error> {
121        let account_id = value
122            .native_asset_id
123            .clone()
124            .ok_or(proto::blockchain::FeeParameters::missing_field("account_id"))?
125            .try_into()?;
126
127        Ok(FeeParameters::new(account_id, value.verification_base_fee))
128    }
129}
130
131impl TryFrom<proto::blockchain::FeeParameters> for FeeParameters {
132    type Error = RpcConversionError;
133
134    fn try_from(value: proto::blockchain::FeeParameters) -> Result<Self, Self::Error> {
135        FeeParameters::try_from(&value)
136    }
137}
138
139// BLOCK NUMBER
140// ================================================================================================
141
142impl From<BlockNumber> for proto::blockchain::BlockNumber {
143    fn from(value: BlockNumber) -> Self {
144        Self { block_num: value.as_u32() }
145    }
146}