use {
super::{util::resolve_key_path, 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(option, long = "prover", short = 'p')]
prover_path: Option<PathBuf>,
#[argh(option, long = "input", short = 'i')]
input_path: Option<PathBuf>,
#[argh(
option,
long = "out",
short = 'o',
default = "PathBuf::from(\"./proof.np\")"
)]
proof_path: PathBuf,
#[cfg(test)]
#[argh(option, long = "verifier")]
verifier_path: Option<PathBuf>,
}
impl Command for Args {
#[instrument(skip_all)]
fn run(&self) -> Result<()> {
let prover_path = resolve_key_path(self.prover_path.as_deref(), "pkp")?;
let input_path = self
.input_path
.clone()
.unwrap_or_else(|| PathBuf::from("./Prover.toml"));
let prover: Prover = read(&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(&input_path)
.context("While proving Noir program statement")?;
write(&proof, &self.proof_path).context("while writing proof")?;
#[cfg(test)]
{
let verifier_path = resolve_key_path(self.verifier_path.as_deref(), "pkv")?;
let mut verifier: Verifier =
read(&verifier_path).context("while reading Provekit Verifier")?;
verifier
.verify(&proof)
.context("While verifying Noir proof")?;
}
Ok(())
}
}