use bls12_381::{G1Point, G2Point};
use serde::Deserialize;
use serialization::trusted_setup::{deserialize_g1_points, deserialize_g2_points, SubgroupCheck};
const TRUSTED_SETUP_JSON: &str = include_str!("../data/trusted_setup_4096.json");
#[derive(Deserialize, Debug, PartialEq, Eq)]
pub struct TrustedSetup {
pub g1_monomial: Vec<G1Point>,
pub g2_monomial: Vec<G2Point>,
}
#[derive(Deserialize, Debug, PartialEq, Eq)]
struct TrustedSetupJSON {
pub g1_monomial: Vec<String>,
pub g2_monomial: Vec<String>,
}
impl TrustedSetupJSON {
fn to_trusted_setup(&self) -> TrustedSetup {
let g1_monomial = deserialize_g1_points(&self.g1_monomial, SubgroupCheck::Check);
let g2_monomial = deserialize_g2_points(&self.g2_monomial, SubgroupCheck::Check);
TrustedSetup {
g1_monomial,
g2_monomial,
}
}
fn to_trusted_setup_unchecked(&self) -> TrustedSetup {
let g1_monomial = deserialize_g1_points(&self.g1_monomial, SubgroupCheck::NoCheck);
let g2_monomial = deserialize_g2_points(&self.g2_monomial, SubgroupCheck::NoCheck);
TrustedSetup {
g1_monomial,
g2_monomial,
}
}
fn from_json_unchecked(json: &str) -> Self {
serde_json::from_str(json)
.expect("could not parse json string into a TrustedSetup structure")
}
fn from_embed() -> Self {
Self::from_json_unchecked(TRUSTED_SETUP_JSON)
}
}
impl Default for TrustedSetup {
fn default() -> Self {
let trusted_setup_json = TrustedSetupJSON::from_embed();
trusted_setup_json.to_trusted_setup_unchecked()
}
}
impl TrustedSetup {
pub fn from_json(json: &str) -> Self {
let trusted_setup_json = TrustedSetupJSON::from_json_unchecked(json);
trusted_setup_json.to_trusted_setup()
}
pub fn from_json_unchecked(json: &str) -> Self {
let trusted_setup = TrustedSetupJSON::from_json_unchecked(json);
trusted_setup.to_trusted_setup_unchecked()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_embedded_setup_has_points_in_correct_subgroup() {
let setup = TrustedSetupJSON::from_embed();
setup.to_trusted_setup();
}
}