use cyber_hemera::{Hash, Hasher};
use strata_proof::Reduce;
#[derive(Clone)]
pub struct Transcript {
hasher: Hasher,
}
impl Transcript {
pub fn new(domain: &[u8]) -> Self {
let mut hasher = Hasher::new();
hasher.update(domain);
Self { hasher }
}
pub fn absorb(&mut self, data: &[u8]) {
self.hasher.update(data);
}
pub fn squeeze(&mut self) -> Hash {
let hash = self.hasher.finalize();
self.hasher = Hasher::new();
self.hasher.update(hash.as_bytes());
hash
}
pub fn squeeze_field<F: Reduce>(&mut self) -> F {
let hash = self.squeeze();
F::reduce(hash.as_bytes())
}
}