cargo_openvm/commands/
verify.rs

1use std::path::PathBuf;
2
3use clap::Parser;
4use eyre::Result;
5use openvm_sdk::{
6    fs::{
7        read_app_proof_from_file, read_app_vk_from_file, read_evm_proof_from_file,
8        read_evm_verifier_from_folder,
9    },
10    Sdk,
11};
12
13use crate::default::{
14    DEFAULT_APP_PROOF_PATH, DEFAULT_APP_VK_PATH, DEFAULT_EVM_PROOF_PATH, DEFAULT_VERIFIER_FOLDER,
15};
16
17#[derive(Parser)]
18#[command(name = "verify", about = "Verify a proof")]
19pub struct VerifyCmd {
20    #[command(subcommand)]
21    command: VerifySubCommand,
22}
23
24#[derive(Parser)]
25enum VerifySubCommand {
26    App {
27        #[arg(long, action, help = "Path to app verifying key", default_value = DEFAULT_APP_VK_PATH)]
28        app_vk: PathBuf,
29
30        #[arg(long, action, help = "Path to app proof", default_value = DEFAULT_APP_PROOF_PATH)]
31        proof: PathBuf,
32    },
33    Evm {
34        #[arg(long, action, help = "Path to EVM proof", default_value = DEFAULT_EVM_PROOF_PATH)]
35        proof: PathBuf,
36    },
37}
38
39impl VerifyCmd {
40    pub fn run(&self) -> Result<()> {
41        let sdk = Sdk::new();
42        match &self.command {
43            VerifySubCommand::App { app_vk, proof } => {
44                let app_vk = read_app_vk_from_file(app_vk)?;
45                let app_proof = read_app_proof_from_file(proof)?;
46                sdk.verify_app_proof(&app_vk, &app_proof)?;
47            }
48            VerifySubCommand::Evm { proof } => {
49                let evm_verifier = read_evm_verifier_from_folder(DEFAULT_VERIFIER_FOLDER).map_err(|e| {
50                    eyre::eyre!("Failed to read EVM verifier: {}\nPlease run 'cargo openvm evm-proving-setup' first", e)
51                })?;
52                let evm_proof = read_evm_proof_from_file(proof)?;
53                sdk.verify_evm_proof(&evm_verifier, &evm_proof)?;
54            }
55        }
56        Ok(())
57    }
58}