Added simulator binary for R1CS.

This commit is contained in:
Sean Bowe 2016-09-17 14:48:08 -06:00
parent 10c65393a9
commit 2a2e10d3e0
No known key found for this signature in database
GPG Key ID: 95684257D8F8B031
4 changed files with 67 additions and 4 deletions

View File

@ -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"

View File

@ -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);

View File

@ -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,

56
src/simulator.rs Normal file
View File

@ -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));
}