use super::*;
mod bytes;
mod parse;
mod serialize;
#[derive(Clone, PartialEq, Eq)]
pub struct Certificate<N: Network> {
certificate: marlin::Certificate<N::PairingCurve>,
}
impl<N: Network> Certificate<N> {
pub(super) const fn new(certificate: marlin::Certificate<N::PairingCurve>) -> Self {
Self { certificate }
}
pub fn certify(
function_name: &Identifier<N>,
proving_key: &ProvingKey<N>,
verifying_key: &VerifyingKey<N>,
) -> Result<Certificate<N>> {
#[cfg(feature = "aleo-cli")]
let timer = std::time::Instant::now();
let certificate = Marlin::<N>::prove_vk(N::marlin_fs_parameters(), verifying_key, proving_key)?;
#[cfg(feature = "aleo-cli")]
println!("{}", format!(" • Certified '{function_name}': {} ms", timer.elapsed().as_millis()).dimmed());
Ok(Self::new(certificate))
}
pub fn verify(
&self,
function_name: &Identifier<N>,
assignment: &circuit::Assignment<N::Field>,
verifying_key: &VerifyingKey<N>,
) -> bool {
#[cfg(feature = "aleo-cli")]
let timer = std::time::Instant::now();
match Marlin::<N>::verify_vk(N::marlin_fs_parameters(), assignment, verifying_key, self) {
Ok(is_valid) => {
#[cfg(feature = "aleo-cli")]
{
let elapsed = timer.elapsed().as_millis();
println!("{}", format!(" • Verified certificate for '{function_name}': {} ms", elapsed).dimmed());
}
is_valid
}
Err(error) => {
#[cfg(feature = "aleo-cli")]
println!("{}", format!(" • Certificate verification failed: {error}").dimmed());
false
}
}
}
}
impl<N: Network> Deref for Certificate<N> {
type Target = marlin::Certificate<N::PairingCurve>;
fn deref(&self) -> &Self::Target {
&self.certificate
}
}
#[cfg(test)]
mod tests {
use super::*;
use console::network::Testnet3;
use once_cell::sync::OnceCell;
type CurrentNetwork = Testnet3;
pub(super) fn sample_certificate() -> Certificate<CurrentNetwork> {
static INSTANCE: OnceCell<Certificate<CurrentNetwork>> = OnceCell::new();
INSTANCE
.get_or_init(|| {
let (function_name, proving_key, verifying_key) = crate::process::test_helpers::sample_key();
Certificate::certify(&function_name, &proving_key, &verifying_key).unwrap()
})
.clone()
}
}