use std::sync::atomic::AtomicBool;
use crate::{
stark::{MachineVerificationError, ShardProof, StarkVerifyingKey},
utils::BabyBearPoseidon2,
};
pub trait SubproofVerifier: Sync + Send {
fn verify_deferred_proof(
&self,
proof: &ShardProof<BabyBearPoseidon2>,
vk: &StarkVerifyingKey<BabyBearPoseidon2>,
vk_hash: [u32; 8],
committed_value_digest: [u32; 8],
) -> Result<(), MachineVerificationError<BabyBearPoseidon2>>;
}
#[derive(Default)]
pub struct DefaultSubproofVerifier {
printed: AtomicBool,
}
impl DefaultSubproofVerifier {
pub fn new() -> Self {
Self {
printed: AtomicBool::new(false),
}
}
}
impl SubproofVerifier for DefaultSubproofVerifier {
fn verify_deferred_proof(
&self,
_proof: &ShardProof<BabyBearPoseidon2>,
_vk: &StarkVerifyingKey<BabyBearPoseidon2>,
_vk_hash: [u32; 8],
_committed_value_digest: [u32; 8],
) -> Result<(), MachineVerificationError<BabyBearPoseidon2>> {
if !self.printed.load(std::sync::atomic::Ordering::SeqCst) {
tracing::info!("Not verifying sub proof during runtime");
self.printed
.store(true, std::sync::atomic::Ordering::SeqCst);
}
Ok(())
}
}
pub struct NoOpSubproofVerifier;
impl SubproofVerifier for NoOpSubproofVerifier {
fn verify_deferred_proof(
&self,
_proof: &ShardProof<BabyBearPoseidon2>,
_vk: &StarkVerifyingKey<BabyBearPoseidon2>,
_vk_hash: [u32; 8],
_committed_value_digest: [u32; 8],
) -> Result<(), MachineVerificationError<BabyBearPoseidon2>> {
Ok(())
}
}