arnaucube
arnaucube/NovaPublic Self-hosted repository
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}