From 983af331b2760c6b438abbd50cee7614c839c937 Mon Sep 17 00:00:00 2001 From: Sean Bowe Date: Wed, 14 Sep 2016 15:04:14 -0600 Subject: [PATCH] Improve performance of verification. --- Cargo.lock | 6 +++--- Cargo.toml | 2 +- snark/Cargo.toml | 2 +- src/lib.rs | 1 - src/sequences.rs | 36 ------------------------------------ src/spairs.rs | 35 +++++++++++++++++++++++++---------- 6 files changed, 30 insertions(+), 52 deletions(-) delete mode 100644 src/sequences.rs diff --git a/Cargo.lock b/Cargo.lock index c64c967..1cf2a74 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3,7 +3,7 @@ name = "mpc" version = "0.0.1" dependencies = [ "bincode 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", - "bn 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bn 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "crossbeam 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)", "rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)", "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)", @@ -22,7 +22,7 @@ dependencies = [ [[package]] name = "bn" -version = "0.2.2" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "byteorder 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", @@ -77,7 +77,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" name = "snark" version = "0.0.1" dependencies = [ - "bn 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "bn 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", "gcc 0.3.32 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", "libc 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 1401eec..4f9f04b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,7 @@ readme = "README.md" [dependencies] snark = { path = "./snark/" } -bn = "0.2.2" +bn = "0.2.3" crossbeam = "0.2.9" rand = "0.3.14" rustc-serialize = "~0.3.19" diff --git a/snark/Cargo.toml b/snark/Cargo.toml index ec820a4..f76cf41 100644 --- a/snark/Cargo.toml +++ b/snark/Cargo.toml @@ -16,4 +16,4 @@ gcc = "0.3.*" [dependencies] libc = "0.2.*" lazy_static = "0.1.*" -bn = "0.2.2" +bn = "0.2.3" diff --git a/src/lib.rs b/src/lib.rs index e90f886..7e9586d 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,7 +6,6 @@ extern crate rustc_serialize; mod taupowers; mod multicore; -mod sequences; mod qap; mod spairs; mod transcript; diff --git a/src/sequences.rs b/src/sequences.rs deleted file mode 100644 index eab9f2a..0000000 --- a/src/sequences.rs +++ /dev/null @@ -1,36 +0,0 @@ -pub struct Sequences<'a, T: 'a, I: Iterator> { - v: I, - last: Option<&'a T> -} - -impl<'a, T: 'a, I: Iterator> Sequences<'a, T, I> { - pub fn new(v: I) -> Self { - Sequences { v: v, last: None } - } -} - -impl<'a, T: 'a, I: Iterator> Iterator for Sequences<'a, T, I> { - type Item = (&'a T, &'a T); - - fn next(&mut self) -> Option<(&'a T, &'a T)> { - match (self.last, self.v.next()) { - (Some(a), Some(b)) => { - self.last = Some(b); - Some((a, b)) - }, - (None, Some(b)) => { - self.last = Some(b); - self.next() - }, - _ => None - } - } -} - -#[test] -fn test_sequences() { - let a = vec![10, 57, 34, 12]; - let b: Vec<(&usize, &usize)> = Sequences::new(a.iter()).collect(); - let expected = vec![(&a[0], &a[1]), (&a[1], &a[2]), (&a[2], &a[3])]; - assert_eq!(b, expected); -} diff --git a/src/spairs.rs b/src/spairs.rs index 17c47dc..12b32a0 100644 --- a/src/spairs.rs +++ b/src/spairs.rs @@ -2,7 +2,6 @@ use bn::*; use rand::Rng; use snark::*; use rustc_serialize::{Encodable, Encoder, Decodable, Decoder}; -use sequences::*; use multicore::*; use crossbeam; @@ -394,18 +393,34 @@ pub fn checkvec( where Group1: Pairing { assert!(v1.len() == v2.len()); - let mut p = Group1::zero(); - let mut q = Group1::zero(); - for i in v1.iter().zip(v2.iter()) { - let alpha = Fr::random(rng); - p = p + *i.0 * alpha; - q = q + *i.1 * alpha; - } + crossbeam::scope(|scope| { + let window_size = v1.len() / THREADS; + let mut tasks = vec![]; + for i in v1.chunks(window_size).zip(v2.chunks(window_size)) { + tasks.push(scope.spawn(move || { + let rng = &mut ::rand::thread_rng(); + let mut p = Group1::zero(); + let mut q = Group1::zero(); - if p.is_zero() || q.is_zero() { return false; } + for (a, b) in i.0.iter().zip(i.1.iter()) { + let alpha = Fr::random(rng); + p = p + (*a * alpha); + q = q + (*b * alpha); + } - same_power(&Spair::new(p, q).unwrap(), &a) + if p.is_zero() || q.is_zero() { + false + } else { + same_power(&Spair::new(p, q).unwrap(), a) + } + })); + } + + assert!(tasks.len() >= THREADS); + + tasks.into_iter().map(|t| t.join()).all(|r| r) + }) } pub fn checkseq(