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}