use ark_bn254::Bn254;
use ark_groth16::Groth16;
use ark_snark::SNARK;
use crate::error::SdkError;
use crate::verification_key::VerificationKey;
use crate::proof::{Groth16Proof, PublicInputs, VerificationResult};
pub struct Verifier {
verification_key: VerificationKey,
}
impl Verifier {
pub fn new(vk: VerificationKey) -> Self {
Self { verification_key: vk }
}
pub fn verify(
&self,
proof: &Groth16Proof,
public_inputs: &PublicInputs,
) -> Result<VerificationResult, SdkError> {
let valid = Groth16::<Bn254>::verify(
&self.verification_key.inner,
&public_inputs.values,
&proof.inner,
).map_err(|e| SdkError::VerificationFailed(format!("Verification error: {:?}", e)))?;
let npub = public_inputs.npub_bech32()?;
Ok(VerificationResult {
valid,
npub_hex: public_inputs.npub_hex.clone(),
npub,
merkle_root: public_inputs.merkle_root.clone(),
session_binding: public_inputs.session_binding.clone(),
})
}
pub fn verify_json(
&self,
proof_json: &str,
public_inputs_json: &str,
) -> Result<VerificationResult, SdkError> {
let proof = Groth16Proof::from_json(proof_json)?;
let public_inputs = PublicInputs::from_json(public_inputs_json)?;
self.verify(&proof, &public_inputs)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_verifier_creation() {
}
}