arnaucube
arnaucube/protogalaxy-pocPublic Self-hosted repository
protogalaxy-poc/src/transcript.rs
src/transcript.rsRaw
 1/// transcript.rs file and adapted from https://github.com/arnaucube/nova-study
 2use ark_ec::{AffineRepr, CurveGroup};
 3use ark_ff::PrimeField;
 4use std::marker::PhantomData;
 5
 6use ark_crypto_primitives::sponge::poseidon::{PoseidonConfig, PoseidonSponge};
 7use ark_crypto_primitives::sponge::{Absorb, CryptographicSponge};
 8
 9pub struct Transcript<F: PrimeField + Absorb, C: CurveGroup>
10where
11    <C as CurveGroup>::BaseField: Absorb,
12{
13    // where F is the Constraint Field (eq. C::ScalarField)
14    sponge: PoseidonSponge<F>,
15    _c: PhantomData<C>,
16}
17impl<F: PrimeField + Absorb, C: CurveGroup> Transcript<F, C>
18where
19    <C as CurveGroup>::BaseField: Absorb,
20{
21    pub fn new(poseidon_config: &PoseidonConfig<F>) -> Self {
22        let sponge = PoseidonSponge::<F>::new(poseidon_config);
23        Transcript {
24            sponge,
25            _c: PhantomData,
26        }
27    }
28    pub fn add(&mut self, v: &F) {
29        self.sponge.absorb(&v);
30    }
31    pub fn add_vec(&mut self, v: &[F]) {
32        self.sponge.absorb(&v);
33    }
34    pub fn add_point(&mut self, v: &C) {
35        let v_affine = v.into_affine();
36        let xy = v_affine.xy().unwrap(); // WIP
37        self.sponge.absorb(&vec![xy.0, xy.1]);
38    }
39    pub fn get_challenge(&mut self) -> F {
40        let c = self.sponge.squeeze_field_elements(1);
41        self.add(&c[0]);
42        c[0]
43    }
44    pub fn get_challenge_vec(&mut self, n: usize) -> Vec<F> {
45        let c = self.sponge.squeeze_field_elements(n);
46        self.sponge.absorb(&c);
47        c
48    }
49}
50
51use ark_crypto_primitives::sponge::poseidon::find_poseidon_ark_and_mds;
52
53// WARNING this is for test only
54pub fn poseidon_test_config<F: PrimeField>() -> PoseidonConfig<F> {
55    let full_rounds = 8;
56    let partial_rounds = 31;
57    let alpha = 5;
58    let rate = 2;
59
60    let (ark, mds) = find_poseidon_ark_and_mds::<F>(
61        F::MODULUS_BIT_SIZE as u64,
62        rate,
63        full_rounds,
64        partial_rounds,
65        0,
66    );
67
68    PoseidonConfig::new(
69        full_rounds as usize,
70        partial_rounds as usize,
71        alpha,
72        mds,
73        ark,
74        rate,
75        1,
76    )
77}