zk.rs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. // ../zkas simple.zk
  2. use darkfi::{
  3. crypto::{
  4. proof::{ProvingKey, VerifyingKey},
  5. util::pedersen_commitment_u64,
  6. Proof,
  7. },
  8. zk::{
  9. vm::{Witness, ZkCircuit},
  10. vm_stack::empty_witnesses,
  11. },
  12. zkas::decoder::ZkBinary,
  13. Result,
  14. };
  15. use pasta_curves::{
  16. arithmetic::CurveAffine,
  17. group::{ff::Field, Curve},
  18. pallas,
  19. };
  20. use rand::rngs::OsRng;
  21. fn main() -> Result<()> {
  22. let bincode = include_bytes!("simple.zk.bin");
  23. let zkbin = ZkBinary::decode(bincode)?;
  24. // ======
  25. // Prover
  26. // ======
  27. // Bigger k = more rows, but slower circuit
  28. // Number of rows is 2^k
  29. let k = 13;
  30. // Witness values
  31. let value = 42;
  32. let value_blind = pallas::Scalar::random(&mut OsRng);
  33. let prover_witnesses =
  34. vec![Witness::Base(Some(pallas::Base::from(value))), Witness::Scalar(Some(value_blind))];
  35. // Create the public inputs
  36. let value_commit = pedersen_commitment_u64(value, value_blind);
  37. let value_coords = value_commit.to_affine().coordinates().unwrap();
  38. let public_inputs = vec![*value_coords.x(), *value_coords.y()];
  39. // Create the circuit
  40. let circuit = ZkCircuit::new(prover_witnesses, zkbin.clone());
  41. let now = std::time::Instant::now();
  42. let proving_key = ProvingKey::build(k, &circuit);
  43. println!("ProvingKey built [{} s]", now.elapsed().as_secs_f64());
  44. let now = std::time::Instant::now();
  45. let proof = Proof::create(&proving_key, &[circuit], &public_inputs, &mut OsRng)?;
  46. println!("Proof created [{} s]", now.elapsed().as_secs_f64());
  47. // ========
  48. // Verifier
  49. // ========
  50. // Construct empty witnesses
  51. let verifier_witnesses = empty_witnesses(&zkbin);
  52. // Create the circuit
  53. let circuit = ZkCircuit::new(verifier_witnesses, zkbin);
  54. let now = std::time::Instant::now();
  55. let verifying_key = VerifyingKey::build(k, &circuit);
  56. println!("VerifyingKey built [{} s]", now.elapsed().as_secs_f64());
  57. let now = std::time::Instant::now();
  58. proof.verify(&verifying_key, &public_inputs)?;
  59. println!("proof verify [{} s]", now.elapsed().as_secs_f64());
  60. Ok(())
  61. }