arithmetic_proof.rs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. use darkfi::{
  2. crypto::{
  3. proof::{ProvingKey, VerifyingKey},
  4. Proof,
  5. },
  6. zk::{
  7. vm::{Witness, ZkCircuit},
  8. vm_stack::empty_witnesses,
  9. },
  10. zkas::decoder::ZkBinary,
  11. Result,
  12. };
  13. use pasta_curves::pallas;
  14. use rand::rngs::OsRng;
  15. #[test]
  16. fn arithmetic_proof() -> Result<()> {
  17. /* ANCHOR: main */
  18. let bincode = include_bytes!("../proof/arithmetic.zk.bin");
  19. let zkbin = ZkBinary::decode(bincode)?;
  20. // ======
  21. // Prover
  22. // ======
  23. // Witness values
  24. let a = pallas::Base::from(42);
  25. let b = pallas::Base::from(69);
  26. let prover_witnesses = vec![Witness::Base(Some(a)), Witness::Base(Some(b))];
  27. // Create the public inputs
  28. let sum = a + b;
  29. let product = a * b;
  30. let difference = a - b;
  31. let public_inputs = vec![sum, product, difference];
  32. // Create the circuit
  33. let circuit = ZkCircuit::new(prover_witnesses, zkbin.clone());
  34. let proving_key = ProvingKey::build(11, &circuit);
  35. let proof = Proof::create(&proving_key, &[circuit], &public_inputs, &mut OsRng)?;
  36. // ========
  37. // Verifier
  38. // ========
  39. // Construct empty witnesses
  40. let verifier_witnesses = empty_witnesses(&zkbin);
  41. // Create the circuit
  42. let circuit = ZkCircuit::new(verifier_witnesses, zkbin);
  43. let verifying_key = VerifyingKey::build(11, &circuit);
  44. proof.verify(&verifying_key, &public_inputs)?;
  45. /* ANCHOR_END: main */
  46. Ok(())
  47. }