use {
super::{util::resolve_key_path, Command},
anyhow::{Context, Result},
argh::FromArgs,
provekit_common::{file::read, NoirProof, Verifier},
provekit_verifier::Verify,
std::path::PathBuf,
tracing::instrument,
};
#[derive(FromArgs, PartialEq, Eq, Debug)]
#[argh(subcommand, name = "verify")]
pub struct Args {
#[argh(option, long = "verifier", short = 'v')]
verifier_path: Option<PathBuf>,
#[argh(option, long = "proof", default = "PathBuf::from(\"./proof.np\")")]
proof_path: PathBuf,
}
impl Command for Args {
#[instrument(skip_all)]
fn run(&self) -> Result<()> {
let verifier_path = resolve_key_path(self.verifier_path.as_deref(), "pkv")?;
let (verifier, proof) = rayon::join(
|| read::<Verifier>(&verifier_path).context("while reading Provekit Verifier"),
|| read::<NoirProof>(&self.proof_path).context("while reading proof"),
);
let mut verifier = verifier?;
let proof = proof?;
verifier
.verify(&proof)
.context("While verifying Noir proof")?;
Ok(())
}
}