use blstrs::{G1Projective, Scalar};
use rayon::iter::{IntoParallelIterator, ParallelIterator};
const DST: &[u8] = b"RLNC_PEDERSEN_GEN";
#[derive(Debug)]
pub struct PedersenCommitter {
generators: Vec<G1Projective>,
}
impl PedersenCommitter {
pub fn new(seed: [u8; 32], n: usize) -> Self {
#[cfg(feature = "parallel")]
let generators = (0..n)
.into_par_iter()
.map(|i| {
let mut msg = [0u8; 40];
msg[..32].copy_from_slice(&seed);
msg[32..].copy_from_slice(&i.to_le_bytes());
G1Projective::hash_to_curve(&msg, DST, &[])
})
.collect();
#[cfg(not(feature = "parallel"))]
let generators = (0..n)
.map(|i| {
let mut msg = [0u8; 40];
msg[..32].copy_from_slice(&seed);
msg[32..].copy_from_slice(&i.to_le_bytes());
G1Projective::hash_to_curve(&msg, DST, &[])
})
.collect();
Self { generators }
}
pub fn commit(&self, symbols: &[Scalar]) -> G1Projective {
assert_eq!(symbols.len(), self.generators.len());
G1Projective::multi_exp(&self.generators, symbols)
}
}