diff --git a/src/crypto/lead_proof.rs b/src/crypto/lead_proof.rs new file mode 100644 index 000000000..eb9ec7f61 --- /dev/null +++ b/src/crypto/lead_proof.rs @@ -0,0 +1,75 @@ +use std::time::Instant; + +use halo2_gadgets::primitives::{ + poseidon, + poseidon::{ConstantLength, P128Pow5T3}, +}; +use log::debug; +use pasta_curves::{arithmetic::CurveAffine, group::Curve, pallas}; +use rand::rngs::OsRng; + +use crate::{ + crypto::{ + leadcoin::{LeadCoin}, + keypair::PublicKey, + proof::{Proof, ProvingKey, VerifyingKey}, + types::{DrkCoinBlind, DrkSerial, DrkTokenId, DrkValue, DrkValueBlind, DrkValueCommit}, + util::{mod_r_p, pedersen_commitment_scalar, pedersen_commitment_u64}, + }, + zk::circuit::lead_contract::LeadContract, + util::serial::{SerialDecodable, SerialEncodable}, + Result, +}; + + +use rand::{thread_rng, Rng}; + + +#[allow(clippy::too_many_arguments)] +pub fn create_lead_proof( + pk: ProvingKey, + coin : LeadCoin, +) -> Result { + // + let mut rng = thread_rng(); + let yu64: u64 = rng.gen(); + let rhou64: u64 = rng.gen(); + let mau_y: pallas::Base = pallas::Base::from(yu64); + let mau_rho: pallas::Base = pallas::Base::from(rhou64); + let contract = LeadContract { + path: coin.path, + coin_pk_x: coin.pk_x, + coin_pk_y: coin.pk_y, + root_sk: coin.root_sk, + path_sk: coin.path_sk, + coin_timestamp: coin.tau, // + coin_nonce: coin.nonce, + coin_opening_1: Some(mod_r_p(coin.opening1.unwrap())), + value: coin.value, + coin_opening_2: Some(mod_r_p(coin.opening2.unwrap())), + cm_pos: Some(coin.idx), + //sn_c1: Some(coin.sn.unwrap()), + slot: Some(coin.sl.unwrap()), + mau_rho: Some(mau_rho.clone()), + mau_y: Some(mau_y.clone()), + root_cm: Some(coin.root_cm.unwrap()), + }; + + let start = Instant::now(); + let public_inputs = coin.public_inputs(); + let proof = Proof::create(&pk, &[contract], &public_inputs, &mut OsRng)?; + debug!("Prove lead: [{:?}]", start.elapsed()); + Ok((proof)) +} + +pub fn verify_lead_proof( + vk: &VerifyingKey, + proof: &Proof, + coin: LeadCoin +) -> Result<()> { + let start = Instant::now(); + let public_inputs = coin.public_inputs(); + proof.verify(vk, &public_inputs)?; + debug!("Verify lead: [{:?}]", start.elapsed()); + Ok(()) +}