arnaucube
arnaucube/sonobePublic Self-hosted repository
sonobe/solidity-verifiers/src/verifiers/nova_cyclefold.rs
solidity-verifiers/src/verifiers/nova_cyclefold.rsRaw
 1use crate::utils::HeaderInclusion;
 2use crate::{Groth16Data, KzgData, ProtocolData, PRAGMA_GROTH16_VERIFIER};
 3use ark_bn254::{Bn254, G1Affine};
 4use ark_groth16::VerifyingKey;
 5use ark_poly_commit::kzg10::VerifierKey;
 6use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
 7use askama::Template;
 8
 9use super::g16::Groth16Verifier;
10use super::kzg::KZG10Verifier;
11
12#[derive(Template, Default)]
13#[template(path = "nova_cyclefold_decider.askama.sol", ext = "sol")]
14pub(crate) struct NovaCyclefoldDecider {
15    groth16_verifier: Groth16Verifier,
16    kzg10_verifier: KZG10Verifier,
17}
18
19impl From<NovaCyclefoldData> for NovaCyclefoldDecider {
20    fn from(value: NovaCyclefoldData) -> Self {
21        Self {
22            groth16_verifier: Groth16Verifier::from(value.g16_data),
23            kzg10_verifier: KZG10Verifier::from(value.kzg_data),
24        }
25    }
26}
27
28#[derive(CanonicalDeserialize, CanonicalSerialize, PartialEq, Debug)]
29pub struct NovaCyclefoldData {
30    g16_data: Groth16Data,
31    kzg_data: KzgData,
32}
33
34impl ProtocolData for NovaCyclefoldData {
35    const PROTOCOL_NAME: &'static str = "NovaCyclefold";
36
37    fn render_as_template(self, pragma: Option<String>) -> Vec<u8> {
38        HeaderInclusion::<NovaCyclefoldDecider>::builder()
39            .pragma_version(pragma.unwrap_or(PRAGMA_GROTH16_VERIFIER.to_string()))
40            .template(self)
41            .build()
42            .render()
43            .unwrap()
44            .into_bytes()
45    }
46}
47
48impl From<(Groth16Data, KzgData)> for NovaCyclefoldData {
49    fn from(value: (Groth16Data, KzgData)) -> Self {
50        Self {
51            g16_data: value.0,
52            kzg_data: value.1,
53        }
54    }
55}
56
57impl NovaCyclefoldData {
58    pub fn new(
59        vkey_g16: VerifyingKey<Bn254>,
60        vkey_kzg: VerifierKey<Bn254>,
61        crs_points: Vec<G1Affine>,
62    ) -> Self {
63        Self {
64            g16_data: Groth16Data::from(vkey_g16),
65            // TODO: Remove option from crs points
66            kzg_data: KzgData::from((vkey_kzg, Some(crs_points))),
67        }
68    }
69}