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}