mirror of https://github.com/zcash/mpc.git
Added simulator binary for R1CS.
This commit is contained in:
parent
10c65393a9
commit
2a2e10d3e0
|
@ -21,6 +21,12 @@ path = "src/verifier.rs"
|
||||||
# avoid duplicate tests
|
# avoid duplicate tests
|
||||||
test = false
|
test = false
|
||||||
|
|
||||||
|
[[bin]]
|
||||||
|
name = "simulator"
|
||||||
|
path = "src/simulator.rs"
|
||||||
|
# avoid duplicate tests
|
||||||
|
test = false
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "player"
|
name = "player"
|
||||||
path = "src/player.rs"
|
path = "src/player.rs"
|
||||||
|
|
|
@ -226,6 +226,7 @@ pub struct Stage3Contents {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Stage3Contents {
|
impl Stage3Contents {
|
||||||
|
#[cfg(feature = "snark")]
|
||||||
pub fn new(cs: &CS, stage2: &Stage2Contents) -> Self {
|
pub fn new(cs: &CS, stage2: &Stage2Contents) -> Self {
|
||||||
assert_eq!(stage2.pk_a.len(), cs.num_vars + 1);
|
assert_eq!(stage2.pk_a.len(), cs.num_vars + 1);
|
||||||
assert_eq!(stage2.pk_b_temp.len(), cs.num_vars + 1);
|
assert_eq!(stage2.pk_b_temp.len(), cs.num_vars + 1);
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use bn::*;
|
use bn::*;
|
||||||
use rand::Rng;
|
use rand::Rng;
|
||||||
use super::spair::{Spair, same_power};
|
use super::spair::{Spair, same_power};
|
||||||
#[cfg(test)]
|
#[cfg(feature = "snark")]
|
||||||
use snark::*;
|
use snark::*;
|
||||||
use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
|
use rustc_serialize::{Encodable, Encoder, Decodable, Decoder};
|
||||||
|
|
||||||
|
@ -205,7 +205,7 @@ impl PrivateKey {
|
||||||
|
|
||||||
/// Construct a "blank" private key for accumulating
|
/// Construct a "blank" private key for accumulating
|
||||||
/// in tests.
|
/// in tests.
|
||||||
#[cfg(test)]
|
#[cfg(feature = "snark")]
|
||||||
pub fn new_blank() -> PrivateKey {
|
pub fn new_blank() -> PrivateKey {
|
||||||
PrivateKey {
|
PrivateKey {
|
||||||
tau: Fr::one(),
|
tau: Fr::one(),
|
||||||
|
@ -219,7 +219,7 @@ impl PrivateKey {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(feature = "snark")]
|
||||||
pub fn multiply(&mut self, other: &Self) {
|
pub fn multiply(&mut self, other: &Self) {
|
||||||
self.tau = self.tau * other.tau;
|
self.tau = self.tau * other.tau;
|
||||||
self.alpha_a = self.alpha_a * other.alpha_a;
|
self.alpha_a = self.alpha_a * other.alpha_a;
|
||||||
|
@ -231,7 +231,7 @@ impl PrivateKey {
|
||||||
self.gamma = self.gamma * other.gamma;
|
self.gamma = self.gamma * other.gamma;
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(feature = "snark")]
|
||||||
pub fn libsnark_keypair(&self, cs: &CS) -> Keypair {
|
pub fn libsnark_keypair(&self, cs: &CS) -> Keypair {
|
||||||
Keypair::generate(
|
Keypair::generate(
|
||||||
cs,
|
cs,
|
||||||
|
|
|
@ -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));
|
||||||
|
}
|
Loading…
Reference in New Issue