#![allow(clippy::upper_case_acronyms)]
#![allow(non_camel_case_types)]
#![cfg_attr(any(feature = "no_srs", feature = "no_vk"), allow(unused))]
use ark_bn254::G1Projective;
use std::path::PathBuf;
use structopt::StructOpt;
use turboplonk::{
gen_params::SRS,
poly_commit::{kzg_poly_commitment::KZGCommitmentSchemeBN254, pcs::PolyComScheme},
};
#[derive(StructOpt, Debug)]
#[structopt(
about = "Tool to generate necessary zero-knowledge proof parameters.",
rename_all = "kebab-case"
)]
enum Actions {
CUT_SRS { directory: PathBuf },
GEN_VK_COMMON { directory: PathBuf },
ALL { directory: PathBuf },
}
fn main() {
use Actions::*;
let action = Actions::from_args();
match action {
CUT_SRS { directory } => cut_srs(directory),
GEN_VK_COMMON { directory } => gen_vk_common(directory),
ALL { directory } => gen_all(directory),
};
}
fn cut_srs(mut path: PathBuf) {
let srs = SRS.unwrap();
let KZGCommitmentSchemeBN254 {
public_parameter_group_1,
public_parameter_group_2,
} = KZGCommitmentSchemeBN254::from_unchecked_bytes(&srs).unwrap();
if public_parameter_group_1.len() == 2060 {
println!("Already complete");
return;
}
let mut new_group_1 = vec![G1Projective::default(); 2060];
new_group_1[0..2051].copy_from_slice(&public_parameter_group_1[0..2051]);
new_group_1[2051..2054].copy_from_slice(&public_parameter_group_1[4096..4099]);
new_group_1[2054..2057].copy_from_slice(&public_parameter_group_1[8192..8195]);
new_group_1[2057..2060].copy_from_slice(&public_parameter_group_1[16384..16387]);
let new_srs = KZGCommitmentSchemeBN254 {
public_parameter_group_2,
public_parameter_group_1: new_group_1,
};
let bytes = new_srs.to_unchecked_bytes().unwrap();
path.push("srs-padding.bin");
save_to_file(&bytes, path);
}
fn gen_vk_common(directory: PathBuf) {
let srs = SRS.unwrap();
let kzg_poly_commitment = KZGCommitmentSchemeBN254::from_unchecked_bytes(&srs).unwrap();
assert_eq!(kzg_poly_commitment.public_parameter_group_1.len(), 2060);
let common = kzg_poly_commitment.shrink_to_verifier_only().unwrap();
let common_ser = bincode::serialize(&common).unwrap();
let mut common_path = directory.clone();
common_path.push("vk-common.bin");
save_to_file(&common_ser, common_path);
}
fn gen_all(directory: PathBuf) {
cut_srs(directory.clone());
gen_vk_common(directory);
}
fn save_to_file(params_ser: &[u8], out_filename: ark_std::path::PathBuf) {
use ark_std::io::Write;
let filename = out_filename.to_str().unwrap();
let mut f = ark_std::fs::File::create(&filename).expect("Unable to create file");
f.write_all(params_ser).expect("Unable to write data");
}