From ff480aeb09ed7d21636abe39c717d218aceef012 Mon Sep 17 00:00:00 2001 From: narodnik Date: Thu, 29 Apr 2021 13:25:12 +0200 Subject: [PATCH] add mint contract: cargo run --release --bin mint-classic ... and be patient --- Cargo.toml | 7 +- src/{old/mint.rs => bin/mint-classic.rs} | 4 +- src/circuit/mint_contract.rs | 130 +++++++++++++++++++++++ src/circuit/mod.rs | 2 + src/lib.rs | 1 + 5 files changed, 141 insertions(+), 3 deletions(-) rename src/{old/mint.rs => bin/mint-classic.rs} (98%) create mode 100644 src/circuit/mint_contract.rs create mode 100644 src/circuit/mod.rs diff --git a/Cargo.toml b/Cargo.toml index bc107b74b..8a39f292b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -92,6 +92,10 @@ path = "src/bin/dfi.rs" name = "mimc" path = "src/old/mimc.rs" +[[bin]] +name = "mint-classic" +path = "src/bin/mint-classic.rs" + [[bin]] name = "dfg" path = "src/bin/dfg.rs" @@ -101,4 +105,5 @@ name = "compile-shaders" path = "src/bin/compile-shaders.rs" [profile.release] -debug = 1 \ No newline at end of file +debug = 1 + diff --git a/src/old/mint.rs b/src/bin/mint-classic.rs similarity index 98% rename from src/old/mint.rs rename to src/bin/mint-classic.rs index 2399acd82..367c40449 100644 --- a/src/old/mint.rs +++ b/src/bin/mint-classic.rs @@ -5,8 +5,7 @@ use bls12_381::Bls12; use ff::Field; use group::{Curve, Group, GroupEncoding}; -mod mint_contract; -use mint_contract::MintContract; +use sapvi::circuit::mint_contract::MintContract; struct MintRevealedValues { value_commit: jubjub::SubgroupPoint, @@ -87,6 +86,7 @@ fn main() { let revealed = MintRevealedValues::compute(value, &randomness_value, &serial, &randomness_coin, &public); + println!("Making random params..."); let start = Instant::now(); let params = { let c = MintContract { diff --git a/src/circuit/mint_contract.rs b/src/circuit/mint_contract.rs new file mode 100644 index 000000000..44fee8707 --- /dev/null +++ b/src/circuit/mint_contract.rs @@ -0,0 +1,130 @@ +#![allow(unused_imports)] +#![allow(unused_mut)] +use bellman::{ + gadgets::{ + blake2s, boolean, + boolean::{AllocatedBit, Boolean}, + multipack, num, Assignment, + }, + groth16, Circuit, ConstraintSystem, SynthesisError, +}; +use bls12_381::Bls12; +use ff::{Field, PrimeField}; +use group::Curve; +use zcash_proofs::circuit::{ecc, pedersen_hash}; + +pub struct MintContract { + pub value: Option, + pub randomness_value: Option, + pub serial: Option, + pub randomness_coin: Option, + pub public: Option, +} +impl Circuit for MintContract { + fn synthesize>( + self, + cs: &mut CS, + ) -> Result<(), SynthesisError> { + // Line 18: u64_as_binary_le value param:value + let value = boolean::u64_into_boolean_vec_le( + cs.namespace(|| "Line 18: u64_as_binary_le value param:value"), + self.value, + )?; + + // Line 19: fr_as_binary_le randomness_value param:randomness_value + let randomness_value = boolean::field_into_boolean_vec_le( + cs.namespace(|| "Line 19: fr_as_binary_le randomness_value param:randomness_value"), + self.randomness_value, + )?; + + // Line 20: fr_as_binary_le serial param:serial + let serial = boolean::field_into_boolean_vec_le( + cs.namespace(|| "Line 20: fr_as_binary_le serial param:serial"), + self.serial, + )?; + + // Line 21: fr_as_binary_le randomness_coin param:randomness_coin + let randomness_coin = boolean::field_into_boolean_vec_le( + cs.namespace(|| "Line 21: fr_as_binary_le randomness_coin param:randomness_coin"), + self.randomness_coin, + )?; + + // Line 23: witness public param:public + let public = ecc::EdwardsPoint::witness( + cs.namespace(|| "Line 23: witness public param:public"), + self.public.map(jubjub::ExtendedPoint::from), + )?; + + // Line 24: assert_not_small_order public + public.assert_not_small_order(cs.namespace(|| "Line 24: assert_not_small_order public"))?; + + // Line 29: ec_mul_const vcv value G_VCV + let vcv = ecc::fixed_base_multiplication( + cs.namespace(|| "Line 29: ec_mul_const vcv value G_VCV"), + &zcash_proofs::constants::VALUE_COMMITMENT_VALUE_GENERATOR, + &value, + )?; + + // Line 30: ec_mul_const rcv randomness_value G_VCR + let rcv = ecc::fixed_base_multiplication( + cs.namespace(|| "Line 30: ec_mul_const rcv randomness_value G_VCR"), + &zcash_proofs::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR, + &randomness_value, + )?; + + // Line 31: ec_add cv vcv rcv + let cv = vcv.add(cs.namespace(|| "Line 31: ec_add cv vcv rcv"), &rcv)?; + + // Line 33: emit_ec cv + cv.inputize(cs.namespace(|| "Line 33: emit_ec cv"))?; + + // Line 39: alloc_binary preimage + let mut preimage = vec![]; + + // Line 42: ec_repr repr_public public + let repr_public = public.repr(cs.namespace(|| "Line 42: ec_repr repr_public public"))?; + + // Line 43: binary_extend preimage repr_public + preimage.extend(repr_public); + + // Line 46: binary_extend preimage value + preimage.extend(value); + + // Line 53: binary_extend preimage serial + preimage.extend(serial); + + for _ in 0..4 { + // Line 55: alloc_const_bit zero_bit false + let zero_bit = Boolean::constant(false); + + // Line 56: binary_push preimage zero_bit + preimage.push(zero_bit); + } + + // Line 69: binary_extend preimage randomness_coin + preimage.extend(randomness_coin); + + for _ in 0..4 { + // Line 71: alloc_const_bit zero_bit false + let zero_bit = Boolean::constant(false); + + // Line 72: binary_push preimage zero_bit + preimage.push(zero_bit); + } + + // Line 89: static_assert_binary_size preimage 832 + assert_eq!(preimage.len(), 832); + + // Line 90: blake2s coin preimage CRH_IVK + let mut coin = blake2s::blake2s( + cs.namespace(|| "Line 90: blake2s coin preimage CRH_IVK"), + &preimage, + zcash_primitives::constants::CRH_IVK_PERSONALIZATION, + )?; + + // Line 91: emit_binary coin + multipack::pack_into_inputs(cs.namespace(|| "Line 91: emit_binary coin"), &coin)?; + + Ok(()) + } +} diff --git a/src/circuit/mod.rs b/src/circuit/mod.rs new file mode 100644 index 000000000..aa7ed0afd --- /dev/null +++ b/src/circuit/mod.rs @@ -0,0 +1,2 @@ +pub mod mint_contract; + diff --git a/src/lib.rs b/src/lib.rs index 54d3def97..5e889b8dc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -4,6 +4,7 @@ use std::collections::{HashMap, HashSet}; pub mod async_serial; pub mod bls_extensions; +pub mod circuit; pub mod endian; pub mod error; pub mod gfx;