use super::*;
mod bytes;
mod parse;
mod serialize;
#[derive(Clone)]
pub struct ProvingKey<N: Network> {
proving_key: marlin::CircuitProvingKey<N::PairingCurve, marlin::MarlinHidingMode>,
}
impl<N: Network> ProvingKey<N> {
pub(super) const fn new(proving_key: marlin::CircuitProvingKey<N::PairingCurve, marlin::MarlinHidingMode>) -> Self {
Self { proving_key }
}
pub fn prove<R: Rng + CryptoRng>(
&self,
function_name: &Identifier<N>,
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_batch(
N::marlin_fs_parameters(),
self,
std::slice::from_ref(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: &Identifier<N>,
assignments: &[circuit::Assignment<N::Field>],
rng: &mut R,
) -> Result<Proof<N>> {
#[cfg(feature = "aleo-cli")]
let timer = std::time::Instant::now();
let batch_proof = Proof::new(Marlin::<N>::prove_batch(N::marlin_fs_parameters(), self, assignments, 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
}
}