zksync-gpu-prover 0.156.0

ZKsync GPU prover utilities
use super::*;

use cuda_bindings::GpuError;

pub fn create_proof<
    S: SynthesisMode + 'static,
    C: Circuit<Bn256>,
    T: Transcript<Fr>,
    MC: ManagerConfigs,
>(
    assembly: &DefaultAssembly<S>,
    manager: &mut DeviceMemoryManager<Fr, MC>,
    worker: &Worker,
    setup: &AsyncSetup,
    transcript_params: Option<T::InitializationParameters>,
) -> Result<Proof<Bn256, C>, ProvingError> {
    // if S::PRODUCE_SETUP {
    //     compute_assigments_and_permutations(manager, assembly, worker)?;
    // } else {
    //     assign_cs_variables(manager, assembly, worker)?;
    // }

    compute_assigments_and_permutations(manager, assembly, worker)?;

    let (mut proof, mut transcript, mut constants, input_values) =
        create_initial_variables::<S, C, T, MC>(assembly, transcript_params);

    let mut msm_handles_round1 = vec![];

    // dbg!(1);
    round1(
        manager,
        &assembly,
        &worker,
        &mut proof,
        &mut transcript,
        setup,
        &mut msm_handles_round1,
    )
    .expect("Round 1 failed");

    // dbg!(1.5);
    round15(
        manager,
        &assembly,
        &worker,
        &mut proof,
        &mut constants,
        &mut transcript,
        setup,
        msm_handles_round1,
    )
    .expect("Round 1.5 failed");

    // dbg!(2);
    round2(
        manager,
        &assembly,
        &worker,
        &mut proof,
        &mut constants,
        &mut transcript,
        setup,
        &input_values,
    )
    .expect("Round 2 failed");

    // dbg!(3);
    round3(
        manager,
        &assembly,
        &worker,
        &mut proof,
        &mut constants,
        &mut transcript,
        setup,
    )
    .expect("Round 3 failed");

    round4::<_, _, S, _>(manager, &mut proof, &mut constants, &mut transcript)
        .expect("Round 4 failed");

    round5(manager, &mut proof, &mut constants, &mut transcript).expect("Round 5 failed");

    Ok(proof)
}

fn create_initial_variables<
    S: SynthesisMode + 'static,
    C: Circuit<Bn256>,
    T: Transcript<Fr>,
    MC: ManagerConfigs,
>(
    assembly: &DefaultAssembly<S>,
    transcript_params: Option<T::InitializationParameters>,
) -> (Proof<Bn256, C>, T, ProverConstants<Fr>, Vec<Fr>) {
    assert!(S::PRODUCE_WITNESS);
    assert!(assembly.is_finalized);

    let mut proof = Proof::<Bn256, C>::empty();
    let mut constants = ProverConstants::<Fr>::default();
    constants.non_residues = bellman::plonk::better_cs::generator::make_non_residues::<Fr>(3);
    constants.omega = domain_generator::<Fr>(MC::FULL_SLOT_SIZE);

    let mut transcript = if let Some(params) = transcript_params {
        T::new_from_params(params)
    } else {
        T::new()
    };

    let mut input_values = assembly.input_assingments.to_vec();

    proof.n = assembly.n();
    proof.inputs = input_values.clone();

    for inp in input_values.iter() {
        transcript.commit_field_element(inp);
    }

    (proof, transcript, constants, input_values)
}

#[derive(Debug)]
pub enum ProvingError {
    Synthesis(SynthesisError),
    Gpu(GpuError),
}

impl From<GpuError> for ProvingError {
    fn from(err: GpuError) -> Self {
        Self::Gpu(err)
    }
}

impl From<SynthesisError> for ProvingError {
    fn from(err: SynthesisError) -> Self {
        Self::Synthesis(err)
    }
}