diff --git a/Cargo.toml b/Cargo.toml index 888fe2c..2ec808f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,9 @@ required-features = ["verification"] [[bin]] name = "compute" +[[bin]] +name = "verify_transform" + [dependencies] phase2 = "0.2.1" pairing = "0.14" diff --git a/src/bin/verify.rs b/src/bin/verify.rs index c0f0e43..25c5625 100644 --- a/src/bin/verify.rs +++ b/src/bin/verify.rs @@ -13,13 +13,13 @@ fn main() { let params = File::open("params").unwrap(); let mut params = BufReader::with_capacity(1024 * 1024, params); - let sapling_spend = phase2::MPCParameters::read(&mut params, false) + let sapling_spend = phase2::MPCParameters::read(&mut params, true) .expect("couldn't deserialize Sapling Spend params"); - let sapling_output = phase2::MPCParameters::read(&mut params, false) + let sapling_output = phase2::MPCParameters::read(&mut params, true) .expect("couldn't deserialize Sapling Output params"); - let sprout_joinsplit = phase2::MPCParameters::read(&mut params, false) + let sprout_joinsplit = phase2::MPCParameters::read(&mut params, true) .expect("couldn't deserialize Sprout JoinSplit params"); let sapling_spend_contributions = sapling_spend.verify(sapling_crypto::circuit::sapling::Spend { diff --git a/src/bin/verify_transform.rs b/src/bin/verify_transform.rs new file mode 100644 index 0000000..11b30ae --- /dev/null +++ b/src/bin/verify_transform.rs @@ -0,0 +1,66 @@ +extern crate phase2; +extern crate pairing; +extern crate blake2_rfc; + +use std::fs::File; +use std::io::BufReader; +use blake2_rfc::blake2b::Blake2b; + +fn main() { + let params = File::open("params").unwrap(); + let mut params = BufReader::with_capacity(1024 * 1024, params); + + let new_params = File::open("new_params").unwrap(); + let mut new_params = BufReader::with_capacity(1024 * 1024, new_params); + + let sapling_spend = phase2::MPCParameters::read(&mut params, false) + .expect("couldn't deserialize Sapling Spend params"); + + let sapling_output = phase2::MPCParameters::read(&mut params, false) + .expect("couldn't deserialize Sapling Output params"); + + let sprout_joinsplit = phase2::MPCParameters::read(&mut params, false) + .expect("couldn't deserialize Sprout JoinSplit params"); + + let new_sapling_spend = phase2::MPCParameters::read(&mut new_params, true) + .expect("couldn't deserialize Sapling Spend new_params"); + + let new_sapling_output = phase2::MPCParameters::read(&mut new_params, true) + .expect("couldn't deserialize Sapling Output new_params"); + + let new_sprout_joinsplit = phase2::MPCParameters::read(&mut new_params, true) + .expect("couldn't deserialize Sprout JoinSplit new_params"); + + let h1 = match phase2::verify_contribution(&sapling_spend, &new_sapling_spend) { + Ok(hash) => hash, + Err(_) => panic!("invalid transformation!") + }; + + let h2 = match phase2::verify_contribution(&sapling_output, &new_sapling_output) { + Ok(hash) => hash, + Err(_) => panic!("invalid transformation!") + }; + + let h3 = match phase2::verify_contribution(&sprout_joinsplit, &new_sprout_joinsplit) { + Ok(hash) => hash, + Err(_) => panic!("invalid transformation!") + }; + + let mut h = Blake2b::new(64); + h.update(&h1); + h.update(&h2); + h.update(&h3); + let h = h.finalize(); + + println!("{}", into_hex(h.as_ref())); +} + +fn into_hex(h: &[u8]) -> String { + let mut f = String::new(); + + for byte in &h[..] { + f += &format!("{:02x}", byte); + } + + f +}