util.rs 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. use darkfi_sdk::pasta::pallas;
  2. use std::{collections::HashMap, fs::File, io::Write, path::Path};
  3. use tinyjson::JsonValue::{Array as JsonArray, Object as JsonObj, String as JsonStr};
  4. use crate::zk::Witness;
  5. /// Export witness.json which can be used by zkrunner for debugging circuits
  6. pub fn export_witness_json<P: AsRef<Path>>(
  7. output_path: P,
  8. prover_witnesses: &Vec<Witness>,
  9. public_inputs: &Vec<pallas::Base>,
  10. ) {
  11. let mut witnesses = Vec::new();
  12. for witness in prover_witnesses {
  13. let mut value_json = HashMap::new();
  14. match witness {
  15. Witness::Base(value) => {
  16. value.map(|w1| {
  17. value_json.insert("Base".to_string(), JsonStr(format!("{:?}", w1)));
  18. w1
  19. });
  20. }
  21. Witness::Scalar(value) => {
  22. value.map(|w1| {
  23. value_json.insert("Scalar".to_string(), JsonStr(format!("{:?}", w1)));
  24. w1
  25. });
  26. }
  27. _ => unimplemented!(),
  28. }
  29. witnesses.push(JsonObj(value_json));
  30. }
  31. let mut instances = Vec::new();
  32. for instance in public_inputs {
  33. instances.push(JsonStr(format!("{:?}", instance)));
  34. }
  35. let witnesses_json = JsonArray(witnesses);
  36. let instances_json = JsonArray(instances);
  37. let witness_json = JsonObj(HashMap::from([
  38. ("witnesses".to_string(), witnesses_json),
  39. ("instances".to_string(), instances_json),
  40. ]));
  41. // This is a debugging method. We don't care about .expect() crashing.
  42. let json = witness_json.format().expect("cannot create debug json");
  43. let mut output = File::create(output_path).expect("cannot write file");
  44. output.write_all(json.as_bytes()).expect("write failed");
  45. }