arnaucube
arnaucube/sonobePublic Self-hosted repository
feat: add TranscriptVar trait (#42)

* feat: add TranscriptVar trait

* Update src/transcript/poseidon.rs

Co-authored-by: arnaucube <root@arnaucube.com>

---------

Co-authored-by: arnaucube <root@arnaucube.com>
Pierre pdaixmoreux@gmail.com
Tue, 05 Dec 2023 20:28:06 +0300
commit

14a0b460e79449eb299a46dc6cdde797909253e1

parent

905ba44d8dd7700e5f044b5c0137c015f31cbc0f

2 files changed, 27 insertions(+), 7 deletions(-)

jump to
M src/transcript/mod.rs → src/transcript/mod.rs

@@ -1,5 +1,8 @@

use crate::Error; use ark_ec::CurveGroup; +use ark_ff::PrimeField; +use ark_r1cs_std::{boolean::Boolean, fields::fp::FpVar}; +use ark_relations::r1cs::{ConstraintSystemRef, SynthesisError}; use ark_std::fmt::Debug; pub mod poseidon;

@@ -16,3 +19,16 @@ /// get_challenge_nbits returns a field element of size nbits

fn get_challenge_nbits(&mut self, nbits: usize) -> Vec<bool>; fn get_challenges(&mut self, n: usize) -> Vec<C::ScalarField>; } + +pub trait TranscriptVar<F: PrimeField> { + type TranscriptVarConfig: Debug; + + fn new(cs: ConstraintSystemRef<F>, poseidon_config: &Self::TranscriptVarConfig) -> Self; + fn absorb(&mut self, v: FpVar<F>) -> Result<(), SynthesisError>; + fn absorb_vec(&mut self, v: &[FpVar<F>]) -> Result<(), SynthesisError>; + fn get_challenge(&mut self) -> Result<FpVar<F>, SynthesisError>; + /// returns the bit representation of the challenge, we use its output in-circuit for the + /// `GC.scalar_mul_le` method. + fn get_challenge_nbits(&mut self, nbits: usize) -> Result<Vec<Boolean<F>>, SynthesisError>; + fn get_challenges(&mut self, n: usize) -> Result<Vec<FpVar<F>>, SynthesisError>; +}
M src/transcript/poseidon.rs → src/transcript/poseidon.rs

@@ -12,6 +12,8 @@

use crate::transcript::Transcript; use crate::Error; +use super::TranscriptVar; + /// PoseidonTranscript implements the Transcript trait using the Poseidon hash pub struct PoseidonTranscript<C: CurveGroup> where

@@ -84,18 +86,20 @@ /// PoseidonTranscriptVar implements the gadget compatible with PoseidonTranscript

pub struct PoseidonTranscriptVar<F: PrimeField> { sponge: PoseidonSpongeVar<F>, } -impl<F: PrimeField> PoseidonTranscriptVar<F> { - pub fn new(cs: ConstraintSystemRef<F>, poseidon_config: &PoseidonConfig<F>) -> Self { +impl<F: PrimeField> TranscriptVar<F> for PoseidonTranscriptVar<F> { + type TranscriptVarConfig = PoseidonConfig<F>; + + fn new(cs: ConstraintSystemRef<F>, poseidon_config: &Self::TranscriptVarConfig) -> Self { let sponge = PoseidonSpongeVar::<F>::new(cs, poseidon_config); Self { sponge } } - pub fn absorb(&mut self, v: FpVar<F>) -> Result<(), SynthesisError> { + fn absorb(&mut self, v: FpVar<F>) -> Result<(), SynthesisError> { self.sponge.absorb(&v) } - pub fn absorb_vec(&mut self, v: &[FpVar<F>]) -> Result<(), SynthesisError> { + fn absorb_vec(&mut self, v: &[FpVar<F>]) -> Result<(), SynthesisError> { self.sponge.absorb(&v) } - pub fn get_challenge(&mut self) -> Result<FpVar<F>, SynthesisError> { + fn get_challenge(&mut self) -> Result<FpVar<F>, SynthesisError> { let c = self.sponge.squeeze_field_elements(1)?; self.sponge.absorb(&c[0])?; Ok(c[0].clone())

@@ -103,10 +107,10 @@ }

/// returns the bit representation of the challenge, we use its output in-circuit for the /// `GC.scalar_mul_le` method. - pub fn get_challenge_nbits(&mut self, nbits: usize) -> Result<Vec<Boolean<F>>, SynthesisError> { + fn get_challenge_nbits(&mut self, nbits: usize) -> Result<Vec<Boolean<F>>, SynthesisError> { self.sponge.squeeze_bits(nbits) } - pub fn get_challenges(&mut self, n: usize) -> Result<Vec<FpVar<F>>, SynthesisError> { + fn get_challenges(&mut self, n: usize) -> Result<Vec<FpVar<F>>, SynthesisError> { let c = self.sponge.squeeze_field_elements(n)?; self.sponge.absorb(&c)?; Ok(c)