//! Generated code for handling light client protobuf structs. use ff::{PrimeField, PrimeFieldRepr}; use pairing::bls12_381::{Bls12, Fr, FrRepr}; use zcash_primitives::{ block::{BlockHash, BlockHeader}, jubjub::{edwards, PrimeOrder}, JUBJUB, }; pub mod compact_formats; impl compact_formats::CompactBlock { /// Returns the [`BlockHash`] for this block. /// /// # Panics /// /// This function will panic if [`CompactBlock.header`] is not set and /// [`CompactBlock.hash`] is not exactly 32 bytes. /// /// [`CompactBlock.header`]: #structfield.header /// [`CompactBlock.hash`]: #structfield.hash pub fn hash(&self) -> BlockHash { if let Some(header) = self.header() { header.hash() } else { BlockHash::from_slice(&self.hash) } } /// Returns the [`BlockHash`] for this block's parent. /// /// # Panics /// /// This function will panic if [`CompactBlock.header`] is not set and /// [`CompactBlock.prevHash`] is not exactly 32 bytes. /// /// [`CompactBlock.header`]: #structfield.header /// [`CompactBlock.prevHash`]: #structfield.prevHash pub fn prev_hash(&self) -> BlockHash { if let Some(header) = self.header() { header.prev_block } else { BlockHash::from_slice(&self.prevHash) } } /// Returns the [`BlockHeader`] for this block if present. /// /// A convenience method that parses [`CompactBlock.header`] if present. /// /// [`CompactBlock.header`]: #structfield.header pub fn header(&self) -> Option { if self.header.is_empty() { None } else { BlockHeader::read(&self.header[..]).ok() } } } impl compact_formats::CompactOutput { /// Returns the note commitment for this output. /// /// A convenience method that parses [`CompactOutput.cmu`]. /// /// [`CompactOutput.cmu`]: #structfield.cmu pub fn cmu(&self) -> Result { let mut repr = FrRepr::default(); repr.read_le(&self.cmu[..]).map_err(|_| ())?; Fr::from_repr(repr).map_err(|_| ()) } /// Returns the ephemeral public key for this output. /// /// A convenience method that parses [`CompactOutput.epk`]. /// /// [`CompactOutput.epk`]: #structfield.epk pub fn epk(&self) -> Result, ()> { let p = edwards::Point::::read(&self.epk[..], &JUBJUB).map_err(|_| ())?; p.as_prime_order(&JUBJUB).ok_or(()) } }