use super::*;
mod bytes;
mod parse;
mod serialize;
#[derive(Clone, PartialEq, Eq)]
pub struct VerifyingKey<N: Network> {
verifying_key: marlin::CircuitVerifyingKey<N::PairingCurve, marlin::MarlinHidingMode>,
}
impl<N: Network> VerifyingKey<N> {
pub(super) const fn new(
verifying_key: marlin::CircuitVerifyingKey<N::PairingCurve, marlin::MarlinHidingMode>,
) -> Self {
Self { verifying_key }
}
pub fn verify(&self, function_name: &Identifier<N>, inputs: &[N::Field], proof: &Proof<N>) -> bool {
#[cfg(feature = "aleo-cli")]
let timer = std::time::Instant::now();
match Marlin::<N>::verify_batch(N::marlin_fs_parameters(), self, std::slice::from_ref(&inputs), proof) {
Ok(is_valid) => {
#[cfg(feature = "aleo-cli")]
{
let elapsed = timer.elapsed().as_millis();
println!("{}", format!(" • Verified '{function_name}' (in {} ms)", elapsed).dimmed());
}
is_valid
}
Err(error) => {
#[cfg(feature = "aleo-cli")]
println!("{}", format!(" • Verifier failed: {error}").dimmed());
false
}
}
}
pub fn verify_batch(&self, function_name: &Identifier<N>, inputs: &[&[N::Field]], proof: &Proof<N>) -> bool {
#[cfg(feature = "aleo-cli")]
let timer = std::time::Instant::now();
match Marlin::<N>::verify_batch(N::marlin_fs_parameters(), self, inputs, proof) {
Ok(is_valid) => {
#[cfg(feature = "aleo-cli")]
{
let elapsed = timer.elapsed().as_millis();
println!("{}", format!(" • Verified '{function_name}' (in {} ms)", elapsed).dimmed());
}
is_valid
}
Err(error) => {
#[cfg(feature = "aleo-cli")]
println!("{}", format!(" • Verifier failed: {error}").dimmed());
false
}
}
}
}
impl<N: Network> Deref for VerifyingKey<N> {
type Target = marlin::CircuitVerifyingKey<N::PairingCurve, marlin::MarlinHidingMode>;
fn deref(&self) -> &Self::Target {
&self.verifying_key
}
}