Skip to main content

miden_node_proto/domain/
sign_block_request.rs

1//! Validator signing request conversions.
2
3use miden_protocol::batch::OrderedBatches;
4use miden_protocol::block::{BlockHeader, BlockInputs};
5use miden_protocol::protocol_config::ProtocolConfig;
6
7use super::protocol_config::verify_protocol_config_commitment;
8use crate::errors::ConversionError;
9use crate::{BuildUnchecked, Verify, generated as proto};
10
11/// The domain inputs needed to validate and sign a block.
12#[derive(Debug)]
13pub struct SignBlockRequest {
14    pub tx_batches: OrderedBatches,
15    pub block_header: BlockHeader,
16    pub block_inputs: BlockInputs,
17    pub protocol_config: Option<ProtocolConfig>,
18}
19
20impl BuildUnchecked for proto::miden::validator::v1::DecodedSignBlockRequest {
21    type Output = SignBlockRequest;
22    type Error = ConversionError;
23
24    /// Build the proposal and check any supplied protocol configuration against its header. The
25    /// caller must verify the parent and batch proofs and contents before signing.
26    fn build_unchecked(self) -> Result<Self::Output, Self::Error> {
27        // SAFETY: The caller must authenticate the parent and validate batches before signing. The
28        // shared proposal constructor checks block witnesses and batch consistency.
29        let decoded = proto::block_proving::DecodedBlockProofRequest {
30            block_inputs: self.block_inputs,
31            batches: self.batches,
32            timestamp: self.timestamp,
33            next_validator_config: self.next_validator_config,
34            next_protocol_config: self.next_protocol_config,
35        }
36        .build_unchecked()?;
37        let protocol_config = self.protocol_config.try_map(|config| {
38            verify_protocol_config_commitment(
39                config.verify().map_err(ConversionError::new)?,
40                &decoded.block_header,
41            )
42        })?;
43        Ok(SignBlockRequest {
44            tx_batches: decoded.tx_batches,
45            block_header: decoded.block_header,
46            block_inputs: decoded.block_inputs,
47            protocol_config,
48        })
49    }
50}
51
52impl From<&SignBlockRequest> for proto::miden::validator::v1::SignBlockRequest {
53    fn from(value: &SignBlockRequest) -> Self {
54        Self {
55            batches: value.tx_batches.as_slice().iter().map(Into::into).collect(),
56            block_inputs: Some((&value.block_inputs).into()),
57            timestamp: value.block_header.timestamp(),
58            next_validator_config: Some(value.block_header.validator_config().into()),
59            next_protocol_config: value.block_header.next_protocol_config().map(Into::into),
60            protocol_config: value.protocol_config.as_ref().map(Into::into),
61        }
62    }
63}
64
65impl From<SignBlockRequest> for proto::miden::validator::v1::SignBlockRequest {
66    fn from(value: SignBlockRequest) -> Self {
67        Self::from(&value)
68    }
69}