shared_types/transcript/
poseidon_sponge.rs

1//! An implementation of a `TranscriptSponge` that uses the Poseidon hash
2//! function; Useful for recursive proving.
3
4use super::TranscriptSponge;
5use crate::Field;
6use itertools::Itertools;
7use poseidon::Poseidon;
8
9/// A Poseidon implementation of a transcript sponge.
10#[derive(Clone, Debug)]
11pub struct PoseidonSponge<F: Field> {
12    /// The specific poseidon sponge configuration.
13    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 _: Fr = transcript.get_challenge("test_challenge");
70        let _: Base = transcript.get_challenge("test_challenge_2");
71    }
72}