miden-objects 0.17.0-rc.3

Canonical Protobuf representations for Miden protocol objects
Documentation
use alloc::format;
use alloc::vec::Vec;

use miden_protocol::Word;
use miden_protocol::asset::AssetId;
use miden_protocol::protocol_config::{
    KernelConfig,
    ProofSecurityPolicy,
    ProofVerificationConfig,
    ProtocolConfig,
};

use super::{MessageDecodeExt, required};
use crate::{ConversionError, ConversionResultExt, proto};

impl TryFrom<proto::protocol_config::KernelConfig> for KernelConfig {
    type Error = ConversionError;

    fn try_from(message: proto::protocol_config::KernelConfig) -> Result<Self, Self::Error> {
        let decoder = message.decoder();
        let main_proc = required!(decoder, message.main_proc)?;
        let kernel_procs = message
            .kernel_procs
            .into_iter()
            .enumerate()
            .map(|(index, root)| Word::try_from(root).context(format!("kernel_procs[{index}]")))
            .collect::<Result<Vec<_>, _>>()?;

        KernelConfig::new(main_proc, kernel_procs).map_err(ConversionError::new)
    }
}

impl From<&KernelConfig> for proto::protocol_config::KernelConfig {
    fn from(config: &KernelConfig) -> Self {
        Self {
            main_proc: Some(config.main_proc().into()),
            kernel_procs: config.kernel_procs().iter().copied().map(Into::into).collect(),
        }
    }
}

impl From<KernelConfig> for proto::protocol_config::KernelConfig {
    fn from(config: KernelConfig) -> Self {
        (&config).into()
    }
}

impl TryFrom<proto::protocol_config::ProofSecurityPolicy> for ProofSecurityPolicy {
    type Error = ConversionError;

    fn try_from(message: proto::protocol_config::ProofSecurityPolicy) -> Result<Self, Self::Error> {
        let decoder = message.decoder();
        let security_estimator_root = required!(decoder, message.security_estimator_root)?;
        let minimum_bits = u8::try_from(message.minimum_bits).context("minimum_bits")?;

        ProofSecurityPolicy::new(security_estimator_root, minimum_bits)
            .map_err(ConversionError::new)
    }
}

impl From<&ProofSecurityPolicy> for proto::protocol_config::ProofSecurityPolicy {
    fn from(policy: &ProofSecurityPolicy) -> Self {
        Self {
            security_estimator_root: Some(policy.security_estimator_root().into()),
            minimum_bits: u32::from(policy.minimum_bits()),
        }
    }
}

impl From<ProofSecurityPolicy> for proto::protocol_config::ProofSecurityPolicy {
    fn from(policy: ProofSecurityPolicy) -> Self {
        (&policy).into()
    }
}

impl TryFrom<proto::protocol_config::ProofVerificationConfig> for ProofVerificationConfig {
    type Error = ConversionError;

    fn try_from(
        message: proto::protocol_config::ProofVerificationConfig,
    ) -> Result<Self, Self::Error> {
        let decoder = message.decoder();
        let vm_verifier_root = required!(decoder, message.vm_verifier_root)?;
        let precompile_verifier_root = required!(decoder, message.precompile_verifier_root)?;
        let security_policy = required!(decoder, message.security_policy)?;

        Ok(ProofVerificationConfig::new(
            vm_verifier_root,
            precompile_verifier_root,
            security_policy,
        ))
    }
}

impl From<&ProofVerificationConfig> for proto::protocol_config::ProofVerificationConfig {
    fn from(config: &ProofVerificationConfig) -> Self {
        Self {
            vm_verifier_root: Some(config.vm_verifier_root().into()),
            precompile_verifier_root: Some(config.precompile_verifier_root().into()),
            security_policy: Some(config.security_policy().into()),
        }
    }
}

impl From<ProofVerificationConfig> for proto::protocol_config::ProofVerificationConfig {
    fn from(config: ProofVerificationConfig) -> Self {
        (&config).into()
    }
}

impl TryFrom<proto::protocol_config::ProtocolConfig> for ProtocolConfig {
    type Error = ConversionError;

    fn try_from(message: proto::protocol_config::ProtocolConfig) -> Result<Self, Self::Error> {
        let decoder = message.decoder();
        let fee_asset_id: Word = required!(decoder, message.fee_asset_id)?;
        let fee_asset_id = AssetId::try_from(fee_asset_id).context("fee_asset_id")?;
        let tx_kernel = required!(decoder, message.tx_kernel)?;
        let batch_kernel = required!(decoder, message.batch_kernel)?;
        let block_kernel = required!(decoder, message.block_kernel)?;
        let proof_verification = required!(decoder, message.proof_verification)?;

        ProtocolConfig::new(fee_asset_id, tx_kernel, batch_kernel, block_kernel, proof_verification)
            .map_err(ConversionError::new)
    }
}

impl From<&ProtocolConfig> for proto::protocol_config::ProtocolConfig {
    fn from(config: &ProtocolConfig) -> Self {
        Self {
            fee_asset_id: Some(Word::from(config.fee_asset_id()).into()),
            tx_kernel: Some(config.tx_kernel().into()),
            batch_kernel: Some(config.batch_kernel().into()),
            block_kernel: Some(config.block_kernel().into()),
            proof_verification: Some(config.proof_verification().into()),
        }
    }
}

impl From<ProtocolConfig> for proto::protocol_config::ProtocolConfig {
    fn from(config: ProtocolConfig) -> Self {
        (&config).into()
    }
}