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}