use core::borrow::Borrow;
use log::info;
use plonky2::recursion::cyclic_recursion::check_cyclic_proof_verifier_data;
use crate::proof_gen::ProofGenResult;
use crate::prover_state::ProverStateBuilder;
use crate::types::PlonkyProofIntern;
use crate::{prover_state::ProverState, types::VerifierData};
pub struct VerifierState {
pub state: VerifierData,
}
pub type VerifierStateBuilder = ProverStateBuilder;
impl VerifierStateBuilder {
pub fn build_verifier(self) -> VerifierState {
info!("Initializing Plonky2 aggregation verifier state (This may take a while)...");
let ProverState { state } = self.build();
info!("Finished initializing Plonky2 aggregation verifier state!");
VerifierState {
state: state.final_verifier_data(),
}
}
}
impl<T: Borrow<ProverState>> From<T> for VerifierState {
fn from(prover_state: T) -> Self {
VerifierState {
state: prover_state.borrow().state.final_verifier_data(),
}
}
}
impl VerifierState {
pub fn verify(&self, block_proof: &PlonkyProofIntern) -> ProofGenResult<()> {
self.state
.verify(block_proof.clone())
.map_err(|err| err.to_string())?;
check_cyclic_proof_verifier_data(
block_proof,
&self.state.verifier_only,
&self.state.common,
)
.map_err(|err| err.to_string())?;
Ok(())
}
}