shared_types/transcript/
poseidon_sponge.rs1use super::TranscriptSponge;
5use crate::Field;
6use itertools::Itertools;
7use poseidon::Poseidon;
8
9#[derive(Clone, Debug)]
11pub struct PoseidonSponge<F: Field> {
12 sponge: Poseidon<F, 3, 2>,
14}
15
16impl<F: Field> Default for PoseidonSponge<F> {
17 fn default() -> Self {
18 Self {
19 sponge: Poseidon::new(8, 57),
20 }
21 }
22}
23
24impl<F: Field> TranscriptSponge<F> for PoseidonSponge<F> {
25 fn absorb(&mut self, elem: F) {
26 self.sponge.update(&[elem]);
27 }
28
29 fn absorb_elements(&mut self, elements: &[F]) {
30 self.sponge.update(elements);
31 }
32
33 fn squeeze(&mut self) -> F {
34 self.sponge.squeeze()
35 }
36
37 fn squeeze_elements(&mut self, num_elements: usize) -> Vec<F> {
38 (0..num_elements)
39 .map(|_| self.sponge.squeeze())
40 .collect_vec()
41 }
42
43 fn absorb_initialization_label(&mut self, label: &str) {
44 let label_as_bytes = label.as_bytes();
45 let label_as_field_elems = F::vec_from_bytes_le(label_as_bytes);
46 self.absorb_elements(&label_as_field_elems);
47 }
48}
49
50#[cfg(test)]
51mod tests {
52
53 use halo2curves::bn256::Fq as Base;
54 use halo2curves::bn256::G1 as Bn256Point;
55
56 use crate::transcript::ec_transcript::ECTranscript;
57 use crate::transcript::ec_transcript::ECTranscriptTrait;
58 use crate::transcript::ProverTranscript;
59
60 use super::PoseidonSponge;
61
62 #[test]
63 fn test_poseidon() {
64 let mut transcript =
65 ECTranscript::<Bn256Point, PoseidonSponge<Base>>::new("new transcript");
66 transcript.append("test2", Base::one());
67 let one = halo2curves::bn256::G1::generator();
68 transcript.append_ec_point("ec_test", one);
69 let _: Base = transcript.get_challenge("test_challenge_2");
71 }
72}