zkvc 0.1.0

A Rust crate for building zero-knowledge proof-based volunteer computing systems
Documentation
use crate::circuit::{ConstraintGenerator, ZkCircuit};
use ark_bls12_381::{Bls12_381, Fr};
use ark_groth16::{Groth16, ProvingKey, VerifyingKey};
use ark_serialize::CanonicalSerialize as _;
use ark_snark::CircuitSpecificSetupSNARK as _;
use rand::thread_rng;
use std::{
    path::Path,
    sync::{Arc, Mutex},
};

pub fn generate_keys(
    generator: Box<dyn ConstraintGenerator<Fr>>,
) -> Result<(ProvingKey<Bls12_381>, VerifyingKey<Bls12_381>), anyhow::Error> {
    let public_inputs: Arc<Mutex<Vec<Fr>>> = Arc::new(Mutex::new(Vec::new()));
    let circuit = ZkCircuit {
        generator,
        public_inputs: Arc::clone(&public_inputs),
    };

    let mut rng = thread_rng();
    let (pk, vk) = Groth16::<Bls12_381>::setup(circuit, &mut rng)?;
    Ok((pk, vk))
}

pub fn generate_keys_to_files(
    generator: Box<dyn ConstraintGenerator<Fr>>,
    pk_path: &Path,
    vk_path: &Path,
) -> Result<(), anyhow::Error> {
    let (pk, vk) = generate_keys(generator)?;

    let mut pk_file = std::fs::File::create(pk_path)?;
    pk.serialize_uncompressed(&mut pk_file)?;

    let mut vk_file = std::fs::File::create(vk_path)?;
    vk.serialize_uncompressed(&mut vk_file)?;

    Ok(())
}