arnaucube
arnaucube/sonobePublic Self-hosted repository
sonobe/solidity-verifiers/src/verifiers/kzg.rs
solidity-verifiers/src/verifiers/kzg.rsRaw
 1use crate::utils::encoding::{g1_to_fq_repr, g2_to_fq_repr};
 2use crate::utils::encoding::{G1Repr, G2Repr};
 3use crate::utils::HeaderInclusion;
 4use crate::{ProtocolData, MIT_SDPX_IDENTIFIER};
 5use ark_bn254::{Bn254, G1Affine};
 6use ark_poly_commit::kzg10::VerifierKey;
 7use ark_serialize::{CanonicalDeserialize, CanonicalSerialize};
 8use askama::Template;
 9
10use super::PRAGMA_KZG10_VERIFIER;
11
12#[derive(Template, Default)]
13#[template(path = "kzg10_verifier.askama.sol", ext = "sol")]
14pub(crate) struct KZG10Verifier {
15    /// The generator of `G1`.
16    pub(crate) g1: G1Repr,
17    /// The generator of `G2`.
18    pub(crate) g2: G2Repr,
19    /// The verification key
20    pub(crate) vk: G2Repr,
21    /// Length of the trusted setup vector.
22    pub(crate) g1_crs_len: usize,
23    /// The trusted setup vector.
24    pub(crate) g1_crs: Vec<G1Repr>,
25}
26
27impl From<KzgData> for KZG10Verifier {
28    fn from(data: KzgData) -> Self {
29        let g1_crs_batch_points = data.g1_crs_batch_points.unwrap_or_default();
30
31        Self {
32            g1: g1_to_fq_repr(data.vk.g),
33            g2: g2_to_fq_repr(data.vk.h),
34            vk: g2_to_fq_repr(data.vk.beta_h),
35            g1_crs_len: g1_crs_batch_points.len(),
36            g1_crs: g1_crs_batch_points
37                .iter()
38                .map(|g1| g1_to_fq_repr(*g1))
39                .collect(),
40        }
41    }
42}
43
44#[derive(CanonicalDeserialize, CanonicalSerialize, Clone, PartialEq, Debug)]
45pub struct KzgData {
46    pub(crate) vk: VerifierKey<Bn254>,
47    pub(crate) g1_crs_batch_points: Option<Vec<G1Affine>>,
48}
49
50impl From<(VerifierKey<Bn254>, Option<Vec<G1Affine>>)> for KzgData {
51    fn from(value: (VerifierKey<Bn254>, Option<Vec<G1Affine>>)) -> Self {
52        Self {
53            vk: value.0,
54            g1_crs_batch_points: value.1,
55        }
56    }
57}
58
59impl ProtocolData for KzgData {
60    const PROTOCOL_NAME: &'static str = "KZG";
61
62    fn render_as_template(self, pragma: Option<String>) -> Vec<u8> {
63        HeaderInclusion::<KZG10Verifier>::builder()
64            .sdpx(MIT_SDPX_IDENTIFIER.to_string())
65            .pragma_version(pragma.unwrap_or(PRAGMA_KZG10_VERIFIER.to_string()))
66            .template(self)
67            .build()
68            .render()
69            .unwrap()
70            .into_bytes()
71    }
72}