Nova/src/traits/snark.rs
src/traits/snark.rsRaw
1//! This module defines a collection of traits that define the behavior of a zkSNARK for RelaxedR1CS
2use crate::{
3 errors::NovaError,
4 r1cs::{R1CSGens, R1CSShape, RelaxedR1CSInstance, RelaxedR1CSWitness},
5 traits::Group,
6};
7
8use serde::{Deserialize, Serialize};
9
10/// A trait that defines the behavior of a zkSNARK's prover key
11pub trait ProverKeyTrait<G: Group>: Send + Sync {
12 /// Produces a new prover's key
13 fn new(gens: &R1CSGens<G>, S: &R1CSShape<G>) -> Self;
14}
15
16/// A trait that defines the behavior of a zkSNARK's verifier key
17pub trait VerifierKeyTrait<G: Group>: Send + Sync {
18 /// Produces a new verifier's key
19 fn new(gens: &R1CSGens<G>, S: &R1CSShape<G>) -> Self;
20}
21
22/// A trait that defines the behavior of a zkSNARK
23pub trait RelaxedR1CSSNARKTrait<G: Group>:
24 Sized + Send + Sync + Serialize + for<'de> Deserialize<'de>
25{
26 /// A type that represents the prover's key
27 type ProverKey: ProverKeyTrait<G> + Serialize + for<'de> Deserialize<'de>;
28
29 /// A type that represents the verifier's key
30 type VerifierKey: VerifierKeyTrait<G> + Serialize + for<'de> Deserialize<'de>;
31
32 /// Produces a prover key
33 fn prover_key(gens: &R1CSGens<G>, S: &R1CSShape<G>) -> Self::ProverKey {
34 Self::ProverKey::new(gens, S)
35 }
36
37 /// Produces a verifier key
38 fn verifier_key(gens: &R1CSGens<G>, S: &R1CSShape<G>) -> Self::VerifierKey {
39 Self::VerifierKey::new(gens, S)
40 }
41
42 /// Produces a new SNARK for a relaxed R1CS
43 fn prove(
44 pk: &Self::ProverKey,
45 U: &RelaxedR1CSInstance<G>,
46 W: &RelaxedR1CSWitness<G>,
47 ) -> Result<Self, NovaError>;
48
49 /// Verifies a SNARK for a relaxed R1CS
50 fn verify(&self, vk: &Self::VerifierKey, U: &RelaxedR1CSInstance<G>) -> Result<(), NovaError>;
51}