From 2a2e10d3e094a6f221b812162a2935e6464adee5 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Sat, 17 Sep 2016 14:48:08 -0600 Subject: [PATCH] Added simulator binary for R1CS. --- Cargo.toml | 6 +++++ src/protocol/mod.rs | 1 + src/protocol/secrets.rs | 8 +++--- src/simulator.rs | 56 +++++++++++++++++++++++++++++++++++++++++ 4 files changed, 67 insertions(+), 4 deletions(-) create mode 100644 src/simulator.rs diff --git a/Cargo.toml b/Cargo.toml index 3239242..989bb14 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,6 +21,12 @@ path = "src/verifier.rs" # avoid duplicate tests test = false +[[bin]] +name = "simulator" +path = "src/simulator.rs" +# avoid duplicate tests +test = false + [[bin]] name = "player" path = "src/player.rs" diff --git a/src/protocol/mod.rs b/src/protocol/mod.rs index a29bbc3..b928332 100644 --- a/src/protocol/mod.rs +++ b/src/protocol/mod.rs @@ -226,6 +226,7 @@ pub struct Stage3Contents { } impl Stage3Contents { + #[cfg(feature = "snark")] pub fn new(cs: &CS, stage2: &Stage2Contents) -> Self { assert_eq!(stage2.pk_a.len(), cs.num_vars + 1); assert_eq!(stage2.pk_b_temp.len(), cs.num_vars + 1); diff --git a/src/protocol/secrets.rs b/src/protocol/secrets.rs index 334785e..056b77d 100644 --- a/src/protocol/secrets.rs +++ b/src/protocol/secrets.rs @@ -1,7 +1,7 @@ use bn::*; use rand::Rng; use super::spair::{Spair, same_power}; -#[cfg(test)] +#[cfg(feature = "snark")] use snark::*; use rustc_serialize::{Encodable, Encoder, Decodable, Decoder}; @@ -205,7 +205,7 @@ impl PrivateKey { /// Construct a "blank" private key for accumulating /// in tests. - #[cfg(test)] + #[cfg(feature = "snark")] pub fn new_blank() -> PrivateKey { PrivateKey { tau: Fr::one(), @@ -219,7 +219,7 @@ impl PrivateKey { } } - #[cfg(test)] + #[cfg(feature = "snark")] pub fn multiply(&mut self, other: &Self) { self.tau = self.tau * other.tau; self.alpha_a = self.alpha_a * other.alpha_a; @@ -231,7 +231,7 @@ impl PrivateKey { self.gamma = self.gamma * other.gamma; } - #[cfg(test)] + #[cfg(feature = "snark")] pub fn libsnark_keypair(&self, cs: &CS) -> Keypair { Keypair::generate( cs, diff --git a/src/simulator.rs b/src/simulator.rs new file mode 100644 index 0000000..ea89368 --- /dev/null +++ b/src/simulator.rs @@ -0,0 +1,56 @@ +extern crate bn; +extern crate rand; +extern crate snark; +extern crate crossbeam; +extern crate rustc_serialize; + +mod protocol; +use protocol::*; +use snark::*; + +pub const THREADS: usize = 128; + +fn main() { + let rng = &mut ::rand::thread_rng(); + + let privkeys: Vec<_> = (0..3).map(|_| PrivateKey::new(rng)).collect(); + let pubkeys: Vec<_> = privkeys.iter().map(|p| p.pubkey(rng)).collect(); + + let cs = CS::from_file(); + + // Stage 1 + let mut stage1 = Stage1Contents::new(&cs); + + for (private, public) in privkeys.iter().zip(pubkeys.iter()) { + let prev = stage1.clone(); + stage1.transform(private); + assert!(stage1.verify_transform(&prev, public)); + } + + // Stage 2 + let mut stage2 = Stage2Contents::new(&cs, &stage1); + for (private, public) in privkeys.iter().zip(pubkeys.iter()) { + let prev = stage2.clone(); + stage2.transform(private); + assert!(stage2.verify_transform(&prev, public)); + } + + // Stage 3 + let mut stage3 = Stage3Contents::new(&cs, &stage2); + for (private, public) in privkeys.iter().zip(pubkeys.iter()) { + let prev = stage3.clone(); + stage3.transform(private); + assert!(stage3.verify_transform(&prev, public)); + } + + let kp = keypair(&cs, &stage1, &stage2, &stage3); + + // Compare to libsnark + + let mut acc = PrivateKey::new_blank(); + for private in privkeys.iter() { + acc.multiply(private); + } + + assert!(kp == acc.libsnark_keypair(&cs)); +}