arithmetic_proof.rs 1.4 KB

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