|
|
@ -20,25 +20,26 @@ pub fn load_parameters( |
|
|
|
spend_hash: &str, |
|
|
|
output_path: &Path, |
|
|
|
output_hash: &str, |
|
|
|
sprout_path: &Path, |
|
|
|
sprout_hash: &str, |
|
|
|
sprout_path: Option<&Path>, |
|
|
|
sprout_hash: Option<&str>, |
|
|
|
) -> ( |
|
|
|
Parameters<Bls12>, |
|
|
|
PreparedVerifyingKey<Bls12>, |
|
|
|
Parameters<Bls12>, |
|
|
|
PreparedVerifyingKey<Bls12>, |
|
|
|
PreparedVerifyingKey<Bls12>, |
|
|
|
Option<PreparedVerifyingKey<Bls12>>, |
|
|
|
) { |
|
|
|
// Load from each of the paths
|
|
|
|
let spend_fs = File::open(spend_path).expect("couldn't load Sapling spend parameters file"); |
|
|
|
let output_fs = File::open(output_path).expect("couldn't load Sapling output parameters file"); |
|
|
|
let sprout_fs = File::open(sprout_path).expect("couldn't load Sprout groth16 parameters file"); |
|
|
|
let sprout_fs = |
|
|
|
sprout_path.map(|p| File::open(p).expect("couldn't load Sprout groth16 parameters file")); |
|
|
|
|
|
|
|
let mut spend_fs = hashreader::HashReader::new(BufReader::with_capacity(1024 * 1024, spend_fs)); |
|
|
|
let mut output_fs = |
|
|
|
hashreader::HashReader::new(BufReader::with_capacity(1024 * 1024, output_fs)); |
|
|
|
let mut sprout_fs = |
|
|
|
hashreader::HashReader::new(BufReader::with_capacity(1024 * 1024, sprout_fs)); |
|
|
|
sprout_fs.map(|fs| hashreader::HashReader::new(BufReader::with_capacity(1024 * 1024, fs))); |
|
|
|
|
|
|
|
// Deserialize params
|
|
|
|
let spend_params = Parameters::<Bls12>::read(&mut spend_fs, false) |
|
|
@ -49,8 +50,10 @@ pub fn load_parameters( |
|
|
|
// We only deserialize the verifying key for the Sprout parameters, which
|
|
|
|
// appears at the beginning of the parameter file. The rest is loaded
|
|
|
|
// during proving time.
|
|
|
|
let sprout_vk = VerifyingKey::<Bls12>::read(&mut sprout_fs) |
|
|
|
.expect("couldn't deserialize Sprout Groth16 verifying key"); |
|
|
|
let sprout_vk = sprout_fs.as_mut().map(|mut fs| { |
|
|
|
VerifyingKey::<Bls12>::read(&mut fs) |
|
|
|
.expect("couldn't deserialize Sprout Groth16 verifying key") |
|
|
|
}); |
|
|
|
|
|
|
|
// There is extra stuff (the transcript) at the end of the parameter file which is
|
|
|
|
// used to verify the parameter validity, but we're not interested in that. We do
|
|
|
@ -61,8 +64,10 @@ pub fn load_parameters( |
|
|
|
.expect("couldn't finish reading Sapling spend parameter file"); |
|
|
|
io::copy(&mut output_fs, &mut sink) |
|
|
|
.expect("couldn't finish reading Sapling output parameter file"); |
|
|
|
io::copy(&mut sprout_fs, &mut sink) |
|
|
|
.expect("couldn't finish reading Sprout groth16 parameter file"); |
|
|
|
if let Some(mut sprout_fs) = sprout_fs.as_mut() { |
|
|
|
io::copy(&mut sprout_fs, &mut sink) |
|
|
|
.expect("couldn't finish reading Sprout groth16 parameter file"); |
|
|
|
} |
|
|
|
|
|
|
|
if spend_fs.into_hash() != spend_hash { |
|
|
|
panic!("Sapling spend parameter file is not correct, please clean your `~/.zcash-params/` and re-run `fetch-params`."); |
|
|
@ -72,14 +77,14 @@ pub fn load_parameters( |
|
|
|
panic!("Sapling output parameter file is not correct, please clean your `~/.zcash-params/` and re-run `fetch-params`."); |
|
|
|
} |
|
|
|
|
|
|
|
if sprout_fs.into_hash() != sprout_hash { |
|
|
|
if sprout_fs.map(|fs| fs.into_hash()) != sprout_hash.map(|h| h.to_owned()) { |
|
|
|
panic!("Sprout groth16 parameter file is not correct, please clean your `~/.zcash-params/` and re-run `fetch-params`."); |
|
|
|
} |
|
|
|
|
|
|
|
// Prepare verifying keys
|
|
|
|
let spend_vk = prepare_verifying_key(&spend_params.vk); |
|
|
|
let output_vk = prepare_verifying_key(&output_params.vk); |
|
|
|
let sprout_vk = prepare_verifying_key(&sprout_vk); |
|
|
|
let sprout_vk = sprout_vk.map(|vk| prepare_verifying_key(&vk)); |
|
|
|
|
|
|
|
(spend_params, spend_vk, output_params, output_vk, sprout_vk) |
|
|
|
} |
|
|
|