miden_client/rpc/domain/
block.rs1use 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
12impl 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
139impl From<BlockNumber> for proto::blockchain::BlockNumber {
143 fn from(value: BlockNumber) -> Self {
144 Self { block_num: value.as_u32() }
145 }
146}