use super::{
pairings, DeferredG2, DoryMessages, ExtendedProverState, ExtendedVerifierState, G1Projective,
ProverSetup, VMVProverState, VMVVerifierState, VerifierSetup,
};
use crate::{
base::{if_rayon, proof::Transcript},
utils::log,
};
use alloc::vec::Vec;
use ark_ec::VariableBaseMSM;
#[cfg(feature = "rayon")]
use rayon::iter::{IntoParallelRefIterator, ParallelIterator};
#[tracing::instrument(level = "debug", skip_all)]
pub fn eval_vmv_re_prove(
messages: &mut DoryMessages,
transcript: &mut impl Transcript,
state: VMVProverState,
setup: &ProverSetup,
) -> ExtendedProverState {
log::log_memory_usage("Start");
let C = pairings::pairing(
G1Projective::msm_unchecked(&state.T_vec_prime, &state.v_vec),
setup.Gamma_2_fin,
);
let D_2 = pairings::pairing(
G1Projective::msm_unchecked(setup.Gamma_1[state.nu], &state.v_vec),
setup.Gamma_2_fin,
);
let E_1 = G1Projective::msm_unchecked(&state.T_vec_prime, &state.L_vec);
messages.prover_send_GT_message(transcript, C);
messages.prover_send_GT_message(transcript, D_2);
messages.prover_send_G1_message(transcript, E_1);
let Gamma_2_fin = setup.Gamma_2_fin;
let v2 = if_rayon!(state.v_vec.par_iter(), state.v_vec.iter())
.map(|c| (Gamma_2_fin * c).into())
.collect::<Vec<_>>();
let res = ExtendedProverState::from_vmv_prover_state(state, v2);
log::log_memory_usage("End");
res
}
pub fn eval_vmv_re_verify(
messages: &mut DoryMessages,
transcript: &mut impl Transcript,
state: VMVVerifierState,
setup: &VerifierSetup,
) -> Option<ExtendedVerifierState> {
if messages.GT_messages.len() < 2 || messages.G1_messages.is_empty() {
return None;
}
let C = messages.prover_receive_GT_message(transcript).into();
let D_2 = messages.prover_receive_GT_message(transcript).into();
let E_1 = messages.prover_receive_G1_message(transcript).into();
let D_1 = state.T;
let E_2 = DeferredG2::from(setup.Gamma_2_fin) * state.y;
let s1_tensor = state.r_tensor;
let s2_tensor = state.l_tensor;
let nu = state.nu;
Some(ExtendedVerifierState::new_tensor(
E_1, E_2, s1_tensor, s2_tensor, C, D_1, D_2, nu,
))
}