Skip to main content

sonobe_fs/nova/instances/
mod.rs

1//! Definitions of out-of-circuit values and in-circuit variables for Nova
2//! instances.
3
4use ark_ff::PrimeField;
5use sonobe_primitives::{
6    arithmetizations::ArithConfig, commitments::CommitmentDef, traits::Dummy,
7    transcripts::Absorbable,
8};
9
10use crate::FoldingInstance;
11
12pub mod circuits;
13
14/// [`RunningInstance`] defines Nova's running instance.
15#[derive(Clone, Debug, Eq, PartialEq)]
16pub struct RunningInstance<CM: CommitmentDef> {
17    /// [`RunningInstance::cm_e`] is the error term commitment.
18    pub cm_e: CM::Commitment,
19    /// [`RunningInstance::u`] is the constant term.
20    pub u: CM::Scalar,
21    /// [`RunningInstance::cm_w`] is the witness commitment.
22    pub cm_w: CM::Commitment,
23    /// [`RunningInstance::x`] is the vector of public inputs (to the circuit).
24    pub x: Vec<CM::Scalar>,
25}
26
27impl<CM: CommitmentDef> FoldingInstance<CM> for RunningInstance<CM> {
28    const N_COMMITMENTS: usize = 2;
29
30    fn commitments(&self) -> Vec<&CM::Commitment> {
31        vec![&self.cm_e, &self.cm_w]
32    }
33
34    fn public_inputs(&self) -> &[CM::Scalar] {
35        &self.x
36    }
37
38    fn public_inputs_mut(&mut self) -> &mut [CM::Scalar] {
39        &mut self.x
40    }
41}
42
43impl<CM: CommitmentDef> Dummy<&ArithConfig> for RunningInstance<CM> {
44    fn dummy(cfg: &ArithConfig) -> Self {
45        Self {
46            cm_e: Default::default(),
47            u: Default::default(),
48            cm_w: Default::default(),
49            x: vec![Default::default(); cfg.n_public_inputs],
50        }
51    }
52}
53
54impl<CM: CommitmentDef> Absorbable for RunningInstance<CM> {
55    fn absorb_into<F: PrimeField>(&self, dest: &mut Vec<F>) {
56        self.u.absorb_into(dest);
57        self.x.absorb_into(dest);
58        self.cm_e.absorb_into(dest);
59        self.cm_w.absorb_into(dest);
60    }
61}
62
63/// [`IncomingInstance`] defines Nova's incoming instance.
64#[derive(Clone, Debug, Eq, PartialEq)]
65pub struct IncomingInstance<CM: CommitmentDef> {
66    /// [`IncomingInstance::cm_w`] is the witness commitment.
67    pub cm_w: CM::Commitment,
68    /// [`IncomingInstance::x`] is the vector of public inputs (to the circuit).
69    pub x: Vec<CM::Scalar>,
70}
71
72impl<CM: CommitmentDef> FoldingInstance<CM> for IncomingInstance<CM> {
73    const N_COMMITMENTS: usize = 1;
74
75    fn commitments(&self) -> Vec<&CM::Commitment> {
76        vec![&self.cm_w]
77    }
78
79    fn public_inputs(&self) -> &[CM::Scalar] {
80        &self.x
81    }
82
83    fn public_inputs_mut(&mut self) -> &mut [CM::Scalar] {
84        &mut self.x
85    }
86}
87
88impl<CM: CommitmentDef> Dummy<&ArithConfig> for IncomingInstance<CM> {
89    fn dummy(cfg: &ArithConfig) -> Self {
90        Self {
91            cm_w: Default::default(),
92            x: vec![Default::default(); cfg.n_public_inputs],
93        }
94    }
95}
96
97impl<CM: CommitmentDef> Absorbable for IncomingInstance<CM> {
98    fn absorb_into<F: PrimeField>(&self, dest: &mut Vec<F>) {
99        self.x.absorb_into(dest);
100        self.cm_w.absorb_into(dest);
101    }
102}