arnaucube
arnaucube/sonobePublic Self-hosted repository
sonobe/src/folding/nova/mod.rs
src/folding/nova/mod.rsRaw
 1/// Implements the scheme described in [Nova](https://eprint.iacr.org/2021/370.pdf)
 2use ark_crypto_primitives::sponge::Absorb;
 3use ark_ec::{CurveGroup, Group};
 4use ark_std::fmt::Debug;
 5use ark_std::{One, Zero};
 6
 7use crate::pedersen::{Params as PedersenParams, Pedersen};
 8
 9pub mod circuits;
10pub mod nifs;
11
12#[derive(Debug, Clone, Eq, PartialEq)]
13pub struct CommittedInstance<C: CurveGroup> {
14    pub cmE: C,
15    pub u: C::ScalarField,
16    pub cmW: C,
17    pub x: Vec<C::ScalarField>,
18}
19
20impl<C: CurveGroup> CommittedInstance<C> {
21    pub fn empty() -> Self {
22        CommittedInstance {
23            cmE: C::zero(),
24            u: C::ScalarField::one(),
25            cmW: C::zero(),
26            x: Vec::new(),
27        }
28    }
29}
30
31#[derive(Debug, Clone, Eq, PartialEq)]
32pub struct Witness<C: CurveGroup> {
33    pub E: Vec<C::ScalarField>,
34    pub rE: C::ScalarField,
35    pub W: Vec<C::ScalarField>,
36    pub rW: C::ScalarField,
37}
38
39impl<C: CurveGroup> Witness<C>
40where
41    <C as Group>::ScalarField: Absorb,
42{
43    pub fn new(w: Vec<C::ScalarField>, e_len: usize) -> Self {
44        Self {
45            E: vec![C::ScalarField::zero(); e_len],
46            rE: C::ScalarField::one(),
47            W: w,
48            rW: C::ScalarField::one(),
49        }
50    }
51    pub fn commit(
52        &self,
53        params: &PedersenParams<C>,
54        x: Vec<C::ScalarField>,
55    ) -> CommittedInstance<C> {
56        let cmE = Pedersen::commit(params, &self.E, &self.rE);
57        let cmW = Pedersen::commit(params, &self.W, &self.rW);
58        CommittedInstance {
59            cmE,
60            u: C::ScalarField::one(),
61            cmW,
62            x,
63        }
64    }
65}