lead_proof.rs 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. use std::time::Instant;
  2. use halo2_proofs::circuit::Value;
  3. use log::debug;
  4. use pasta_curves::pallas;
  5. use rand::rngs::OsRng;
  6. use crate::{
  7. crypto::{
  8. leadcoin::LeadCoin,
  9. proof::{Proof, ProvingKey, VerifyingKey},
  10. util::mod_r_p,
  11. },
  12. zk::circuit::lead_contract::LeadContract,
  13. Result,
  14. };
  15. use rand::{thread_rng, Rng};
  16. #[allow(clippy::too_many_arguments)]
  17. pub fn create_lead_proof(pk: ProvingKey, coin: LeadCoin) -> Result<Proof> {
  18. //
  19. let mut rng = thread_rng();
  20. let yu64: u64 = rng.gen();
  21. let rhou64: u64 = rng.gen();
  22. let mau_y: pallas::Base = pallas::Base::from(yu64);
  23. let mau_rho: pallas::Base = pallas::Base::from(rhou64);
  24. let contract = LeadContract {
  25. path: Value::known(coin.path.unwrap()),
  26. coin_pk_x: Value::known(coin.pk_x.unwrap()),
  27. coin_pk_y: Value::known(coin.pk_y.unwrap()),
  28. root_sk: Value::known(coin.root_sk.unwrap()),
  29. sf_root_sk: Value::known(mod_r_p(coin.root_sk.unwrap())),
  30. path_sk: Value::known(coin.path_sk.unwrap()),
  31. coin_timestamp: Value::known(coin.tau.unwrap()),
  32. coin_nonce: Value::known(coin.nonce.unwrap()),
  33. coin_opening_1: Value::known(mod_r_p(coin.opening1.unwrap())),
  34. value: Value::known(coin.value.unwrap()),
  35. coin_opening_2: Value::known(mod_r_p(coin.opening2.unwrap())),
  36. cm_pos: Value::known(coin.idx),
  37. //sn_c1: Value::known(coin.sn.unwrap()),
  38. slot: Value::known(coin.sl.unwrap()),
  39. mau_rho: Value::known(mod_r_p(mau_rho)),
  40. mau_y: Value::known(mod_r_p(mau_y)),
  41. root_cm: Value::known(coin.root_cm.unwrap()),
  42. };
  43. let start = Instant::now();
  44. let public_inputs = coin.public_inputs();
  45. let proof = Proof::create(&pk, &[contract], &public_inputs, &mut OsRng)?;
  46. debug!("Prove lead: [{:?}]", start.elapsed());
  47. Ok(proof)
  48. }
  49. pub fn verify_lead_proof(vk: &VerifyingKey, proof: &Proof, coin: LeadCoin) -> Result<()> {
  50. let start = Instant::now();
  51. let public_inputs = coin.public_inputs();
  52. proof.verify(vk, &public_inputs)?;
  53. debug!("Verify lead: [{:?}]", start.elapsed());
  54. Ok(())
  55. }