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
|
||||
test = false
|
||||
|
||||
[[bin]]
|
||||
name = "simulator"
|
||||
path = "src/simulator.rs"
|
||||
# avoid duplicate tests
|
||||
test = false
|
||||
|
||||
[[bin]]
|
||||
name = "player"
|
||||
path = "src/player.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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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