diff --git a/src/bin/mint-classic.rs b/src/bin/mint-classic.rs index 414c390eb..b9dee9ef4 100644 --- a/src/bin/mint-classic.rs +++ b/src/bin/mint-classic.rs @@ -5,7 +5,7 @@ use bls12_381::Bls12; use ff::Field; use group::{Curve, Group, GroupEncoding}; -use sapvi::crypto::{setup_mint_prover, create_mint_proof, verify_mint_proof}; +use sapvi::crypto::{save_params, load_params, setup_mint_prover, create_mint_proof, verify_mint_proof}; fn main() { use rand::rngs::OsRng; @@ -19,7 +19,11 @@ fn main() { let serial: jubjub::Fr = jubjub::Fr::random(&mut OsRng); let randomness_coin: jubjub::Fr = jubjub::Fr::random(&mut OsRng); - let (params, pvk) = setup_mint_prover(); + { + let params = setup_mint_prover(); + save_params("mint.params", ¶ms); + } + let (params, pvk) = load_params("mint.params").expect("params should load"); let (proof, revealed) = create_mint_proof(¶ms, value, randomness_value, serial, randomness_coin, public); diff --git a/src/crypto/mod.rs b/src/crypto/mod.rs index 92bde2c15..d9371ea14 100644 --- a/src/crypto/mod.rs +++ b/src/crypto/mod.rs @@ -1,4 +1,4 @@ pub mod payment_proof; -pub use payment_proof::{setup_mint_prover, create_mint_proof, verify_mint_proof}; +pub use payment_proof::{save_params, load_params, setup_mint_prover, create_mint_proof, verify_mint_proof}; diff --git a/src/crypto/payment_proof.rs b/src/crypto/payment_proof.rs index a4796e06c..233a5f0e4 100644 --- a/src/crypto/payment_proof.rs +++ b/src/crypto/payment_proof.rs @@ -7,6 +7,7 @@ use bls12_381::Bls12; use ff::Field; use group::{Curve, Group, GroupEncoding}; +use crate::error::Result; use crate::circuit::mint_contract::MintContract; pub struct MintRevealedValues { @@ -73,7 +74,20 @@ impl MintRevealedValues { } } -pub fn setup_mint_prover() -> (groth16::Parameters, groth16::PreparedVerifyingKey) { +pub fn save_params(filename: &str, params: &groth16::Parameters) -> Result<()> { + let buffer = std::fs::File::create(filename)?; + params.write(buffer)?; + Ok(()) +} + +pub fn load_params(filename: &str) -> Result<(groth16::Parameters, groth16::PreparedVerifyingKey)> { + let buffer = std::fs::File::open(filename)?; + let params = groth16::Parameters::::read(buffer, false)?; + let pvk = groth16::prepare_verifying_key(¶ms.vk); + Ok((params, pvk)) +} + +pub fn setup_mint_prover() -> groth16::Parameters { println!("Making random params..."); let start = Instant::now(); let params = { @@ -86,9 +100,8 @@ pub fn setup_mint_prover() -> (groth16::Parameters, groth16::PreparedVeri }; groth16::generate_random_parameters::(c, &mut OsRng).unwrap() }; - let pvk = groth16::prepare_verifying_key(¶ms.vk); println!("Setup: [{:?}]", start.elapsed()); - (params, pvk) + params } pub fn create_mint_proof(