jubjub.rs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. use bls12_381::Scalar;
  2. use drk::{BlsStringConversion, Decodable, Encodable, ZkContract, ZkProof};
  3. use std::fs::File;
  4. use std::time::Instant;
  5. type Result<T> = std::result::Result<T, failure::Error>;
  6. fn main() -> Result<()> {
  7. {
  8. // Load the contract from file
  9. let start = Instant::now();
  10. let file = File::open("jubjub.zcd")?;
  11. let mut contract = ZkContract::decode(file)?;
  12. println!(
  13. "Loaded contract '{}': [{:?}]",
  14. contract.name,
  15. start.elapsed()
  16. );
  17. println!("Stats:");
  18. println!(" Constants: {}", contract.vm.constants.len());
  19. println!(" Alloc: {}", contract.vm.alloc.len());
  20. println!(" Operations: {}", contract.vm.ops.len());
  21. println!(
  22. " Constraint Instructions: {}",
  23. contract.vm.constraints.len()
  24. );
  25. // Do the trusted setup
  26. contract.setup("jubjub.zts")?;
  27. }
  28. // Load the contract from file
  29. let start = Instant::now();
  30. let file = File::open("jubjub.zcd")?;
  31. let mut contract = ZkContract::decode(file)?;
  32. println!(
  33. "Loaded contract '{}': [{:?}]",
  34. contract.name,
  35. start.elapsed()
  36. );
  37. contract.load_setup("jubjub.zts")?;
  38. {
  39. // Put in our input parameters
  40. contract.set_param(
  41. "a_u",
  42. Scalar::from_string("15a36d1f0f390d8852a35a8c1908dd87a361ee3fd48fdf77b9819dc82d90607e"),
  43. )?;
  44. contract.set_param(
  45. "a_v",
  46. Scalar::from_string("015d8c7f5b43fe33f7891142c001d9251f3abeeb98fad3e87b0dc53c4ebf1891"),
  47. )?;
  48. contract.set_param(
  49. "b_u",
  50. Scalar::from_string("15a36d1f0f390d8852a35a8c1908dd87a361ee3fd48fdf77b9819dc82d90607e"),
  51. )?;
  52. contract.set_param(
  53. "b_v",
  54. Scalar::from_string("015d8c7f5b43fe33f7891142c001d9251f3abeeb98fad3e87b0dc53c4ebf1891"),
  55. )?;
  56. // Generate the ZK proof
  57. let proof = contract.prove()?;
  58. // Test and show our output values
  59. assert_eq!(proof.public.len(), 2);
  60. // 0x66ced46f14e5616d12b993f60a6e66558d6b6afe4c321ed212e0b9cfbd81061a
  61. assert_eq!(
  62. *proof.public.get("result_u").unwrap(),
  63. Scalar::from_string("66ced46f14e5616d12b993f60a6e66558d6b6afe4c321ed212e0b9cfbd81061a")
  64. );
  65. // 0x4731570fdd57cf280eadc8946fa00df81112502e44e497e794ab9a221f1bcca
  66. assert_eq!(
  67. *proof.public.get("result_v").unwrap(),
  68. Scalar::from_string("04731570fdd57cf280eadc8946fa00df81112502e44e497e794ab9a221f1bcca")
  69. );
  70. println!("u = {:?}", proof.public.get("result_u").unwrap());
  71. println!("v = {:?}", proof.public.get("result_v").unwrap());
  72. let mut file = File::create("jubjub.prf")?;
  73. proof.encode(&mut file)?;
  74. }
  75. // Verify the proof
  76. let file = File::open("jubjub.prf")?;
  77. let proof = ZkProof::decode(file)?;
  78. assert!(contract.verify(&proof));
  79. Ok(())
  80. }