diff --git a/Cargo.lock b/Cargo.lock index 53bc275..3bc3137 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -567,7 +567,9 @@ dependencies = [ "directories 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", "ff 0.4.0", "pairing 0.14.2", + "rand_core 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", "rand_os 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_xorshift 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", "sapling-crypto 0.0.1", "zcash_primitives 0.0.0", ] diff --git a/librustzcash/src/rustzcash.rs b/librustzcash/src/rustzcash.rs index bff8093..92f8d04 100644 --- a/librustzcash/src/rustzcash.rs +++ b/librustzcash/src/rustzcash.rs @@ -26,8 +26,8 @@ use sapling_crypto::{ }, }; -use sapling_crypto::circuit::sapling::TREE_DEPTH as SAPLING_TREE_DEPTH; -use sapling_crypto::circuit::sprout::{self, TREE_DEPTH as SPROUT_TREE_DEPTH}; +use zcash_proofs::circuit::sapling::TREE_DEPTH as SAPLING_TREE_DEPTH; +use zcash_proofs::circuit::sprout::{self, TREE_DEPTH as SPROUT_TREE_DEPTH}; use bellman::groth16::{ create_random_proof, verify_proof, Parameters, PreparedVerifyingKey, Proof, diff --git a/sapling-crypto/src/circuit/mod.rs b/sapling-crypto/src/circuit/mod.rs index fe0fe50..4902f67 100644 --- a/sapling-crypto/src/circuit/mod.rs +++ b/sapling-crypto/src/circuit/mod.rs @@ -1,4 +1,3 @@ -#[cfg(test)] pub mod test; pub mod boolean; @@ -12,9 +11,6 @@ pub mod pedersen_hash; pub mod multipack; pub mod sha256; -pub mod sapling; -pub mod sprout; - use bellman::{ SynthesisError }; @@ -25,7 +21,7 @@ use bellman::{ /// This basically is just an extension to `Option` /// which allows for a convenient mapping to an /// error on `None`. -trait Assignment { +pub trait Assignment { fn get(&self) -> Result<&T, SynthesisError>; } diff --git a/zcash_primitives/src/sapling.rs b/zcash_primitives/src/sapling.rs index 002cc1a..0b94e4e 100644 --- a/zcash_primitives/src/sapling.rs +++ b/zcash_primitives/src/sapling.rs @@ -14,8 +14,7 @@ use crate::merkle_tree::Hashable; use crate::redjubjub::{PrivateKey, PublicKey, Signature}; use JUBJUB; -pub(crate) const SAPLING_COMMITMENT_TREE_DEPTH: usize = - sapling_crypto::circuit::sapling::TREE_DEPTH; +pub const SAPLING_COMMITMENT_TREE_DEPTH: usize = 32; /// Compute a parent node in the Sapling commitment tree given its two children. pub fn merkle_hash(depth: usize, lhs: &FrRepr, rhs: &FrRepr) -> FrRepr { diff --git a/zcash_proofs/Cargo.toml b/zcash_proofs/Cargo.toml index 598e013..fdb0bf8 100644 --- a/zcash_proofs/Cargo.toml +++ b/zcash_proofs/Cargo.toml @@ -16,6 +16,10 @@ rand_os = "0.2" sapling-crypto = { path = "../sapling-crypto" } zcash_primitives = { path = "../zcash_primitives" } +[dev-dependencies] +rand_core = "0.5" +rand_xorshift = "0.2" + [features] default = ["local-prover"] local-prover = ["directories"] diff --git a/sapling-crypto/examples/bench.rs b/zcash_proofs/examples/bench.rs similarity index 97% rename from sapling-crypto/examples/bench.rs rename to zcash_proofs/examples/bench.rs index e9ffc13..9adf028 100644 --- a/sapling-crypto/examples/bench.rs +++ b/zcash_proofs/examples/bench.rs @@ -4,6 +4,7 @@ extern crate bellman; extern crate pairing; extern crate rand_core; extern crate rand_xorshift; +extern crate zcash_proofs; use ff::Field; use std::time::{Duration, Instant}; @@ -12,7 +13,7 @@ use sapling_crypto::jubjub::{ edwards, fs, }; -use sapling_crypto::circuit::sapling::{ +use zcash_proofs::circuit::sapling::{ Spend }; use sapling_crypto::primitives::{ diff --git a/zcash_proofs/src/circuit.rs b/zcash_proofs/src/circuit.rs new file mode 100644 index 0000000..85fa1cf --- /dev/null +++ b/zcash_proofs/src/circuit.rs @@ -0,0 +1,2 @@ +pub mod sapling; +pub mod sprout; diff --git a/sapling-crypto/src/circuit/sapling/mod.rs b/zcash_proofs/src/circuit/sapling.rs similarity index 95% rename from sapling-crypto/src/circuit/sapling/mod.rs rename to zcash_proofs/src/circuit/sapling.rs index 469ab2e..64bf163 100644 --- a/sapling-crypto/src/circuit/sapling/mod.rs +++ b/zcash_proofs/src/circuit/sapling.rs @@ -6,28 +6,28 @@ use bellman::{ Circuit }; -use jubjub::{ +use sapling_crypto::jubjub::{ JubjubEngine, FixedGenerators }; -use constants; +use sapling_crypto::constants; -use primitives::{ +use sapling_crypto::primitives::{ ValueCommitment, ProofGenerationKey, PaymentAddress }; -use super::Assignment; -use super::boolean; -use super::ecc; -use super::pedersen_hash; -use super::blake2s; -use super::num; -use super::multipack; +use sapling_crypto::circuit::Assignment; +use sapling_crypto::circuit::boolean; +use sapling_crypto::circuit::ecc; +use sapling_crypto::circuit::pedersen_hash; +use sapling_crypto::circuit::blake2s; +use sapling_crypto::circuit::num; +use sapling_crypto::circuit::multipack; -pub const TREE_DEPTH: usize = 32; +pub const TREE_DEPTH: usize = zcash_primitives::sapling::SAPLING_COMMITMENT_TREE_DEPTH; /// This is an instance of the `Spend` circuit. pub struct Spend<'a, E: JubjubEngine> { @@ -602,9 +602,12 @@ fn test_input_circuit_with_bls12_381() { use pairing::bls12_381::*; use rand_core::{RngCore, SeedableRng}; use rand_xorshift::XorShiftRng; - - use ::circuit::test::*; - use jubjub::{JubjubBls12, fs, edwards}; + use sapling_crypto::{ + circuit::test::*, + jubjub::{JubjubBls12, fs, edwards}, + pedersen_hash, + primitives::{Diversifier, Note, ProofGenerationKey}, + }; let params = &JubjubBls12::new(); let rng = &mut XorShiftRng::from_seed([ @@ -623,7 +626,7 @@ fn test_input_circuit_with_bls12_381() { let nsk = fs::Fs::random(rng); let ak = edwards::Point::rand(rng, params).mul_by_cofactor(params); - let proof_generation_key = ::primitives::ProofGenerationKey { + let proof_generation_key = ProofGenerationKey { ak: ak.clone(), nsk: nsk.clone() }; @@ -636,7 +639,7 @@ fn test_input_circuit_with_bls12_381() { let diversifier = { let mut d = [0; 11]; rng.fill_bytes(&mut d); - ::primitives::Diversifier(d) + Diversifier(d) }; if let Some(p) = viewing_key.into_payment_address( @@ -657,7 +660,7 @@ fn test_input_circuit_with_bls12_381() { { let rk = viewing_key.rk(ar, params).into_xy(); let expected_value_cm = value_commitment.cm(params).into_xy(); - let note = ::primitives::Note { + let note = Note { value: value_commitment.value, g_d: g_d.clone(), pk_d: payment_address.pk_d.clone(), @@ -685,8 +688,8 @@ fn test_input_circuit_with_bls12_381() { lhs.reverse(); rhs.reverse(); - cur = ::pedersen_hash::pedersen_hash::( - ::pedersen_hash::Personalization::MerkleTree(i), + cur = pedersen_hash::pedersen_hash::( + pedersen_hash::Personalization::MerkleTree(i), lhs.into_iter() .take(Fr::NUM_BITS as usize) .chain(rhs.into_iter().take(Fr::NUM_BITS as usize)), @@ -743,8 +746,11 @@ fn test_output_circuit_with_bls12_381() { use pairing::bls12_381::*; use rand_core::{RngCore, SeedableRng}; use rand_xorshift::XorShiftRng; - use ::circuit::test::*; - use jubjub::{JubjubBls12, fs, edwards}; + use sapling_crypto::{ + circuit::test::*, + jubjub::{JubjubBls12, fs, edwards}, + primitives::{Diversifier, ProofGenerationKey}, + }; let params = &JubjubBls12::new(); let rng = &mut XorShiftRng::from_seed([ @@ -761,7 +767,7 @@ fn test_output_circuit_with_bls12_381() { let nsk = fs::Fs::random(rng); let ak = edwards::Point::rand(rng, params).mul_by_cofactor(params); - let proof_generation_key = ::primitives::ProofGenerationKey { + let proof_generation_key = ProofGenerationKey { ak: ak.clone(), nsk: nsk.clone() }; @@ -774,7 +780,7 @@ fn test_output_circuit_with_bls12_381() { let diversifier = { let mut d = [0; 11]; rng.fill_bytes(&mut d); - ::primitives::Diversifier(d) + Diversifier(d) }; if let Some(p) = viewing_key.into_payment_address( diff --git a/sapling-crypto/src/circuit/sprout/commitment.rs b/zcash_proofs/src/circuit/sprout/commitment.rs similarity index 92% rename from sapling-crypto/src/circuit/sprout/commitment.rs rename to zcash_proofs/src/circuit/sprout/commitment.rs index a32f05c..4d9f00b 100644 --- a/sapling-crypto/src/circuit/sprout/commitment.rs +++ b/zcash_proofs/src/circuit/sprout/commitment.rs @@ -1,9 +1,9 @@ use pairing::{Engine}; use bellman::{ConstraintSystem, SynthesisError}; -use circuit::sha256::{ +use sapling_crypto::circuit::sha256::{ sha256 }; -use circuit::boolean::{ +use sapling_crypto::circuit::boolean::{ Boolean }; diff --git a/sapling-crypto/src/circuit/sprout/input.rs b/zcash_proofs/src/circuit/sprout/input.rs similarity index 98% rename from sapling-crypto/src/circuit/sprout/input.rs rename to zcash_proofs/src/circuit/sprout/input.rs index ce69bc0..e12723a 100644 --- a/sapling-crypto/src/circuit/sprout/input.rs +++ b/zcash_proofs/src/circuit/sprout/input.rs @@ -1,9 +1,9 @@ use pairing::{Engine}; use bellman::{ConstraintSystem, SynthesisError}; -use circuit::sha256::{ +use sapling_crypto::circuit::sha256::{ sha256_block_no_padding }; -use circuit::boolean::{ +use sapling_crypto::circuit::boolean::{ AllocatedBit, Boolean }; diff --git a/sapling-crypto/src/circuit/sprout/mod.rs b/zcash_proofs/src/circuit/sprout/mod.rs similarity index 98% rename from sapling-crypto/src/circuit/sprout/mod.rs rename to zcash_proofs/src/circuit/sprout/mod.rs index 7027b4a..db2ea0d 100644 --- a/sapling-crypto/src/circuit/sprout/mod.rs +++ b/zcash_proofs/src/circuit/sprout/mod.rs @@ -1,11 +1,11 @@ use ff::Field; use pairing::Engine; use bellman::{ConstraintSystem, SynthesisError, Circuit, LinearCombination}; -use circuit::boolean::{ +use sapling_crypto::circuit::boolean::{ AllocatedBit, Boolean }; -use circuit::multipack::pack_into_inputs; +use sapling_crypto::circuit::multipack::pack_into_inputs; mod prfs; mod commitment; @@ -355,7 +355,7 @@ fn witness_u252( #[test] fn test_sprout_constraints() { use pairing::bls12_381::{Bls12}; - use ::circuit::test::*; + use sapling_crypto::circuit::test::*; use byteorder::{WriteBytesExt, ReadBytesExt, LittleEndian}; @@ -479,7 +479,7 @@ fn test_sprout_constraints() { expected_inputs.write_u64::(vpub_old.unwrap()).unwrap(); expected_inputs.write_u64::(vpub_new.unwrap()).unwrap(); - use circuit::multipack; + use sapling_crypto::circuit::multipack; let expected_inputs = multipack::bytes_to_bits(&expected_inputs); let expected_inputs = multipack::compute_multipacking::(&expected_inputs); diff --git a/sapling-crypto/src/circuit/sprout/output.rs b/zcash_proofs/src/circuit/sprout/output.rs similarity index 95% rename from sapling-crypto/src/circuit/sprout/output.rs rename to zcash_proofs/src/circuit/sprout/output.rs index 9cdbf52..65bcd49 100644 --- a/sapling-crypto/src/circuit/sprout/output.rs +++ b/zcash_proofs/src/circuit/sprout/output.rs @@ -1,6 +1,6 @@ use pairing::{Engine}; use bellman::{ConstraintSystem, SynthesisError}; -use circuit::boolean::{Boolean}; +use sapling_crypto::circuit::boolean::{Boolean}; use super::*; use super::prfs::*; diff --git a/sapling-crypto/src/circuit/sprout/prfs.rs b/zcash_proofs/src/circuit/sprout/prfs.rs similarity index 95% rename from sapling-crypto/src/circuit/sprout/prfs.rs rename to zcash_proofs/src/circuit/sprout/prfs.rs index fff8648..53f65a0 100644 --- a/sapling-crypto/src/circuit/sprout/prfs.rs +++ b/zcash_proofs/src/circuit/sprout/prfs.rs @@ -1,9 +1,9 @@ use pairing::{Engine}; use bellman::{ConstraintSystem, SynthesisError}; -use circuit::sha256::{ +use sapling_crypto::circuit::sha256::{ sha256_block_no_padding }; -use circuit::boolean::{ +use sapling_crypto::circuit::boolean::{ Boolean }; diff --git a/sapling-crypto/src/circuit/sprout/test_vectors.dat b/zcash_proofs/src/circuit/sprout/test_vectors.dat similarity index 100% rename from sapling-crypto/src/circuit/sprout/test_vectors.dat rename to zcash_proofs/src/circuit/sprout/test_vectors.dat diff --git a/zcash_proofs/src/lib.rs b/zcash_proofs/src/lib.rs index d2dc877..2a3c8f2 100644 --- a/zcash_proofs/src/lib.rs +++ b/zcash_proofs/src/lib.rs @@ -10,12 +10,19 @@ extern crate zcash_primitives; #[cfg(feature = "local-prover")] extern crate directories; +#[cfg(test)] +extern crate rand_core; + +#[cfg(test)] +extern crate rand_xorshift; + use bellman::groth16::{prepare_verifying_key, Parameters, PreparedVerifyingKey, VerifyingKey}; use pairing::bls12_381::Bls12; use std::fs::File; use std::io::{self, BufReader}; use std::path::Path; +pub mod circuit; mod hashreader; pub mod sapling; diff --git a/zcash_proofs/src/sapling/prover.rs b/zcash_proofs/src/sapling/prover.rs index 3d30524..78958ad 100644 --- a/zcash_proofs/src/sapling/prover.rs +++ b/zcash_proofs/src/sapling/prover.rs @@ -5,10 +5,7 @@ use ff::Field; use pairing::bls12_381::{Bls12, Fr}; use rand_os::OsRng; use sapling_crypto::{ - circuit::{ - multipack, - sapling::{Output, Spend}, - }, + circuit::multipack, jubjub::{edwards, fs::Fs, FixedGenerators, JubjubBls12, Unknown}, primitives::{Diversifier, Note, PaymentAddress, ProofGenerationKey, ValueCommitment}, }; @@ -20,6 +17,7 @@ use zcash_primitives::{ }; use super::compute_value_balance; +use crate::circuit::sapling::{Output, Spend}; /// A context object for creating the Sapling components of a Zcash transaction. pub struct SaplingProvingContext {