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}