use ark_ec::CurveGroup; use ark_std::{rand::RngCore, One, UniformRand}; use super::{CommittedInstance, Witness}; use crate::arith::r1cs::{RelaxedR1CS, R1CS}; use crate::Error; impl RelaxedR1CS, CommittedInstance> for R1CS { fn dummy_running_instance(&self) -> (Witness, CommittedInstance) { let w_len = self.A.n_cols - 1 - self.l; let w_dummy = Witness::::dummy(w_len, self.A.n_rows); let u_dummy = CommittedInstance::::dummy(self.l); (w_dummy, u_dummy) } fn dummy_incoming_instance(&self) -> (Witness, CommittedInstance) { self.dummy_running_instance() } fn is_relaxed(_w: &Witness, u: &CommittedInstance) -> bool { u.cmE != C::zero() || u.u != C::ScalarField::one() } fn extract_z(w: &Witness, u: &CommittedInstance) -> Vec { [&[u.u][..], &u.x, &w.W].concat() } fn check_error_terms( w: &Witness, _u: &CommittedInstance, e: Vec, ) -> Result<(), Error> { if w.E == e { Ok(()) } else { Err(Error::NotSatisfied) } } fn sample( &self, params: &CS::ProverParams, mut rng: impl RngCore, ) -> Result<(Witness, CommittedInstance), Error> where CS: crate::commitment::CommitmentScheme, { // Implements sampling a (committed) RelaxedR1CS // See construction 5 in https://eprint.iacr.org/2023/573.pdf let u = C::ScalarField::rand(&mut rng); let rE = C::ScalarField::rand(&mut rng); let rW = C::ScalarField::rand(&mut rng); let W = (0..self.A.n_cols - self.l - 1) .map(|_| C::ScalarField::rand(&mut rng)) .collect(); let x = (0..self.l) .map(|_| C::ScalarField::rand(&mut rng)) .collect::>(); let mut z = vec![u]; z.extend(&x); z.extend(&W); let E = , CommittedInstance>>::compute_E( &self.A, &self.B, &self.C, &z, &u, )?; debug_assert!( z.len() == self.A.n_cols, "Length of z is {}, while A has {} columns.", z.len(), self.A.n_cols ); let witness = Witness { E, rE, W, rW }; let mut cm_witness = witness.commit::(params, x)?; // witness.commit() sets u to 1, we set it to the sampled u value cm_witness.u = u; debug_assert!( self.check_relaxed_relation(&witness, &cm_witness).is_ok(), "Sampled a non satisfiable relaxed R1CS, sampled u: {}, computed E: {:?}", u, witness.E ); Ok((witness, cm_witness)) } }