arithmetic.rs 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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 public_inputs = vec![sum, product];
  35. // Create the circuit
  36. let circuit = ZkCircuit::new(prover_witnesses, zkbin.clone());
  37. info!(target: "PROVER", "Building proving key and creating the zero-knowledge proof");
  38. let proving_key = ProvingKey::build(11, &circuit);
  39. let proof = Proof::create(&proving_key, &[circuit], &public_inputs, &mut OsRng)?;
  40. // ========
  41. // Verifier
  42. // ========
  43. // Construct empty witnesses
  44. let verifier_witnesses = vec![Witness::Base(None), Witness::Base(None)];
  45. // Create the circuit
  46. let circuit = ZkCircuit::new(verifier_witnesses, zkbin);
  47. info!(target: "VERIFIER", "Building verifying key and verifying the zero-knowledge proof");
  48. let verifying_key = VerifyingKey::build(11, &circuit);
  49. proof.verify(&verifying_key, &public_inputs)?;
  50. /* ANCHOR_END: main */
  51. Ok(())
  52. }