arithmetic.rs 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 log::info;
  11. use pasta_curves::pallas;
  12. use rand::rngs::OsRng;
  13. use simplelog::{ColorChoice::Auto, Config, LevelFilter, TermLogger, TerminalMode::Mixed};
  14. fn main() -> Result<()> {
  15. let loglevel = match option_env!("RUST_LOG") {
  16. Some("debug") => LevelFilter::Debug,
  17. Some("trace") => LevelFilter::Trace,
  18. Some(_) | None => LevelFilter::Info,
  19. };
  20. TermLogger::init(loglevel, Config::default(), Mixed, Auto)?;
  21. /* ANCHOR: main */
  22. let bincode = include_bytes!("arithmetic.zk.bin");
  23. let zkbin = ZkBinary::decode(bincode)?;
  24. // ======
  25. // Prover
  26. // ======
  27. // Witness values
  28. let a = pallas::Base::from(42);
  29. let b = pallas::Base::from(69);
  30. let prover_witnesses = vec![Witness::Base(Some(a)), Witness::Base(Some(b))];
  31. // Create the public inputs
  32. let sum = a + b;
  33. let product = a * b;
  34. let difference = a - b;
  35. let public_inputs = vec![sum, product, difference];
  36. // Create the circuit
  37. let circuit = ZkCircuit::new(prover_witnesses, zkbin.clone());
  38. info!(target: "PROVER", "Building proving key and creating the zero-knowledge proof");
  39. let proving_key = ProvingKey::build(11, &circuit);
  40. let proof = Proof::create(&proving_key, &[circuit], &public_inputs, &mut OsRng)?;
  41. // ========
  42. // Verifier
  43. // ========
  44. // Construct empty witnesses
  45. let verifier_witnesses = vec![Witness::Base(None), Witness::Base(None)];
  46. // Create the circuit
  47. let circuit = ZkCircuit::new(verifier_witnesses, zkbin);
  48. info!(target: "VERIFIER", "Building verifying key and verifying the zero-knowledge proof");
  49. let verifying_key = VerifyingKey::build(11, &circuit);
  50. proof.verify(&verifying_key, &public_inputs)?;
  51. /* ANCHOR_END: main */
  52. Ok(())
  53. }