arnaucube
arnaucube/sonobePublic Self-hosted repository
sonobe/folding-schemes/src/folding/nova/traits.rs
folding-schemes/src/folding/nova/traits.rsRaw
 1use ark_ec::CurveGroup;
 2use ark_std::{rand::RngCore, One, UniformRand};
 3
 4use super::{CommittedInstance, Witness};
 5use crate::arith::r1cs::{RelaxedR1CS, R1CS};
 6use crate::Error;
 7
 8impl<C: CurveGroup> RelaxedR1CS<C, Witness<C>, CommittedInstance<C>> for R1CS<C::ScalarField> {
 9    fn dummy_running_instance(&self) -> (Witness<C>, CommittedInstance<C>) {
10        let w_len = self.A.n_cols - 1 - self.l;
11        let w_dummy = Witness::<C>::dummy(w_len, self.A.n_rows);
12        let u_dummy = CommittedInstance::<C>::dummy(self.l);
13        (w_dummy, u_dummy)
14    }
15
16    fn dummy_incoming_instance(&self) -> (Witness<C>, CommittedInstance<C>) {
17        self.dummy_running_instance()
18    }
19
20    fn is_relaxed(_w: &Witness<C>, u: &CommittedInstance<C>) -> bool {
21        u.cmE != C::zero() || u.u != C::ScalarField::one()
22    }
23
24    fn extract_z(w: &Witness<C>, u: &CommittedInstance<C>) -> Vec<C::ScalarField> {
25        [&[u.u][..], &u.x, &w.W].concat()
26    }
27
28    fn check_error_terms(
29        w: &Witness<C>,
30        _u: &CommittedInstance<C>,
31        e: Vec<C::ScalarField>,
32    ) -> Result<(), Error> {
33        if w.E == e {
34            Ok(())
35        } else {
36            Err(Error::NotSatisfied)
37        }
38    }
39
40    fn sample<CS>(
41        &self,
42        params: &CS::ProverParams,
43        mut rng: impl RngCore,
44    ) -> Result<(Witness<C>, CommittedInstance<C>), Error>
45    where
46        CS: crate::commitment::CommitmentScheme<C, true>,
47    {
48        // Implements sampling a (committed) RelaxedR1CS
49        // See construction 5 in https://eprint.iacr.org/2023/573.pdf
50        let u = C::ScalarField::rand(&mut rng);
51        let rE = C::ScalarField::rand(&mut rng);
52        let rW = C::ScalarField::rand(&mut rng);
53
54        let W = (0..self.A.n_cols - self.l - 1)
55            .map(|_| C::ScalarField::rand(&mut rng))
56            .collect();
57        let x = (0..self.l)
58            .map(|_| C::ScalarField::rand(&mut rng))
59            .collect::<Vec<C::ScalarField>>();
60        let mut z = vec![u];
61        z.extend(&x);
62        z.extend(&W);
63
64        let E = <Self as RelaxedR1CS<C, Witness<C>, CommittedInstance<C>>>::compute_E(
65            &self.A, &self.B, &self.C, &z, &u,
66        )?;
67
68        debug_assert!(
69            z.len() == self.A.n_cols,
70            "Length of z is {}, while A has {} columns.",
71            z.len(),
72            self.A.n_cols
73        );
74
75        let witness = Witness { E, rE, W, rW };
76        let mut cm_witness = witness.commit::<CS, true>(params, x)?;
77
78        // witness.commit() sets u to 1, we set it to the sampled u value
79        cm_witness.u = u;
80
81        debug_assert!(
82            self.check_relaxed_relation(&witness, &cm_witness).is_ok(),
83            "Sampled a non satisfiable relaxed R1CS, sampled u: {}, computed E: {:?}",
84            u,
85            witness.E
86        );
87
88        Ok((witness, cm_witness))
89    }
90}