use super::*;
mod bytes;
mod parse;
mod serialize;
use std::collections::BTreeMap;
#[derive(Clone)]
pub struct ProvingKey<N: Network> {
proving_key: Arc<marlin::CircuitProvingKey<N::PairingCurve, marlin::MarlinHidingMode>>,
}
impl<N: Network> ProvingKey<N> {
pub const fn new(proving_key: Arc<marlin::CircuitProvingKey<N::PairingCurve, marlin::MarlinHidingMode>>) -> Self {
Self { proving_key }
}
pub fn prove<R: Rng + CryptoRng>(
&self,
function_name: &str,
assignment: &circuit::Assignment<N::Field>,
rng: &mut R,
) -> Result<Proof<N>> {
#[cfg(feature = "aleo-cli")]
let timer = std::time::Instant::now();
let proof = Proof::new(Marlin::<N>::prove(N::marlin_fs_parameters(), self, assignment, rng)?);
#[cfg(feature = "aleo-cli")]
println!("{}", format!(" • Executed '{function_name}' (in {} ms)", timer.elapsed().as_millis()).dimmed());
Ok(proof)
}
pub fn prove_batch<R: Rng + CryptoRng>(
&self,
function_name: &str,
assignments: &[circuit::Assignment<N::Field>],
rng: &mut R,
) -> Result<Proof<N>> {
#[cfg(feature = "aleo-cli")]
let timer = std::time::Instant::now();
let mut assignment_refs: Vec<&circuit::Assignment<N::Field>> = vec![];
for assignment in assignments {
assignment_refs.push(assignment);
}
let mut keys_to_constraints = BTreeMap::new();
keys_to_constraints.insert(self.deref(), assignment_refs.as_slice());
let batch_proof = Proof::new(Marlin::<N>::prove_batch(N::marlin_fs_parameters(), &keys_to_constraints, rng)?);
#[cfg(feature = "aleo-cli")]
println!("{}", format!(" • Executed '{function_name}' (in {} ms)", timer.elapsed().as_millis()).dimmed());
Ok(batch_proof)
}
}
impl<N: Network> Deref for ProvingKey<N> {
type Target = marlin::CircuitProvingKey<N::PairingCurve, marlin::MarlinHidingMode>;
fn deref(&self) -> &Self::Target {
&self.proving_key
}
}