use std::{fs::File, io::BufReader, path::PathBuf};
use poly_commitment::srs::SRS;
use crate::curve::KimchiCurve;
pub const SERIALIZED_SRS_SIZE: u32 = 16;
fn get_srs_path<G: KimchiCurve>() -> PathBuf {
let base_path = env!("CARGO_MANIFEST_DIR");
PathBuf::from(base_path)
.join("../srs")
.join(format!("{}.srs", G::NAME))
}
pub fn get_srs<G>() -> SRS<G>
where
G: KimchiCurve,
{
let srs_path = get_srs_path::<G>();
let file =
File::open(srs_path.clone()).unwrap_or_else(|_| panic!("missing SRS file: {srs_path:?}"));
let reader = BufReader::new(file);
rmp_serde::from_read(reader).unwrap()
}
#[cfg(test)]
mod tests {
use super::*;
use ark_ec::AffineCurve;
use ark_ff::PrimeField;
use ark_serialize::Write;
use hex;
use mina_curves::pasta::{Pallas, Vesta};
use std::collections::HashMap;
fn test_regression_serialization_srs_with_generators<G: AffineCurve>(exp_output: String) {
let h = G::prime_subgroup_generator();
let g = vec![h];
let lagrange_bases = HashMap::new();
let srs = SRS::<G> {
g,
h,
lagrange_bases,
};
let srs_bytes = rmp_serde::to_vec(&srs).unwrap();
let output = hex::encode(srs_bytes.clone());
assert_eq!(output, exp_output)
}
#[test]
fn test_regression_serialization_srs_with_generators_vesta() {
let exp_output = "9291c421010000000000000000000000000000000000000000000000000000000000000000c421010000000000000000000000000000000000000000000000000000000000000000";
test_regression_serialization_srs_with_generators::<Vesta>(exp_output.to_string())
}
#[test]
fn test_regression_serialization_srs_with_generators_pallas() {
let exp_output = "9291c421010000000000000000000000000000000000000000000000000000000000000000c421010000000000000000000000000000000000000000000000000000000000000000";
test_regression_serialization_srs_with_generators::<Pallas>(exp_output.to_string())
}
fn create_or_check_srs<G>(log2_size: u32)
where
G: KimchiCurve,
G::BaseField: PrimeField,
{
let srs = SRS::<G>::create(1 << log2_size);
let srs_path = get_srs_path::<G>();
if std::env::var("SRS_OVERWRITE").is_ok() {
let mut file = std::fs::OpenOptions::new()
.create(true)
.write(true)
.open(srs_path)
.expect("failed to open SRS file");
let srs_bytes = rmp_serde::to_vec(&srs).unwrap();
file.write_all(&srs_bytes).expect("failed to write file");
file.flush().expect("failed to flush file");
}
let srs_on_disk = get_srs::<G>();
assert_eq!(srs, srs_on_disk);
}
#[test]
pub fn test_srs_serialization() {
create_or_check_srs::<Vesta>(SERIALIZED_SRS_SIZE);
create_or_check_srs::<Pallas>(SERIALIZED_SRS_SIZE);
}
}