use super::*;
impl<N: Network> Ratifications<N> {
pub fn to_ratifications_root(&self) -> Result<Field<N>> {
Ok(*self.to_tree()?.root())
}
pub fn to_path(&self, ratification_id: N::RatificationID) -> Result<RatificationsPath<N>> {
match self.ratifications.get_index_of(&ratification_id) {
Some(ratification_index) => self.to_tree()?.prove(ratification_index, &ratification_id.to_bits_le()),
None => bail!("The ratification '{ratification_id}' is not in the block ratifications"),
}
}
pub fn to_tree(&self) -> Result<RatificationsTree<N>> {
Self::ratifications_tree(self.ratifications.keys())
}
fn ratifications_tree<'a>(
ratifications: impl ExactSizeIterator<Item = &'a N::RatificationID>,
) -> Result<RatificationsTree<N>> {
ensure!(
ratifications.len() <= Self::MAX_RATIFICATIONS,
"Block cannot exceed {} ratifications, found {}",
Self::MAX_RATIFICATIONS,
ratifications.len()
);
let leaves = ratifications.map(|id| id.to_bits_le());
N::merkle_tree_bhp::<RATIFICATIONS_DEPTH>(&leaves.collect::<Vec<_>>())
}
}
#[cfg(test)]
mod tests {
use super::*;
use console::network::MainnetV0;
type CurrentNetwork = MainnetV0;
#[test]
fn test_ratifications_depth() {
assert_eq!(2usize.pow(RATIFICATIONS_DEPTH as u32), Ratifications::<CurrentNetwork>::MAX_RATIFICATIONS);
}
}