use {
super::Command,
anyhow::{Context, Result},
argh::FromArgs,
provekit_common::{
file::{read, write},
Prover,
},
provekit_prover::Prove,
std::path::PathBuf,
tracing::{info, instrument},
};
#[cfg(test)]
use {provekit_common::Verifier, provekit_verifier::Verify};
#[derive(FromArgs, PartialEq, Eq, Debug)]
#[argh(subcommand, name = "prove")]
pub struct Args {
#[argh(positional)]
prover_path: PathBuf,
#[cfg(test)]
#[argh(positional)]
verifier_path: PathBuf,
#[argh(positional)]
input_path: PathBuf,
#[argh(
option,
long = "out",
short = 'o',
default = "PathBuf::from(\"./proof.np\")"
)]
proof_path: PathBuf,
}
impl Command for Args {
#[instrument(skip_all)]
fn run(&self) -> Result<()> {
let prover: Prover = read(&self.prover_path).context("while reading Provekit Prover")?;
let (constraints, witnesses) = prover.size();
info!(constraints, witnesses, "Read Noir proof scheme");
let proof = prover
.prove_with_toml(&self.input_path)
.context("While proving Noir program statement")?;
write(&proof, &self.proof_path).context("while writing proof")?;
#[cfg(test)]
{
let mut verifier: Verifier =
read(&self.verifier_path).context("while reading Provekit Verifier")?;
verifier
.verify(&proof)
.context("While verifying Noir proof")?;
}
Ok(())
}
}