miden_client/rpc/domain/
block.rs1use 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
9impl 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
132impl From<BlockNumber> for proto::blockchain::BlockNumber {
136 fn from(value: BlockNumber) -> Self {
137 Self { block_num: value.as_u32() }
138 }
139}