Skip to main content

miden_client/rpc/domain/
block.rs

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