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}