mint.rs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. use drk::{Decodable, ZKContract};
  2. use std::fs::File;
  3. use std::time::Instant;
  4. use bls12_381::Scalar;
  5. use ff::{Field, PrimeField};
  6. use group::{Curve, Group};
  7. use rand::rngs::OsRng;
  8. type Result<T> = std::result::Result<T, failure::Error>;
  9. // Unpack a value (such as jubjub::Fr) into 256 Scalar binary digits
  10. fn unpack<F: PrimeField>(value: F) -> Vec<Scalar> {
  11. let mut bits = Vec::new();
  12. print!("Unpack: ");
  13. for (_i, bit) in value.to_le_bits().into_iter().cloned().enumerate() {
  14. match bit {
  15. true => bits.push(Scalar::one()),
  16. false => bits.push(Scalar::zero()),
  17. }
  18. print!("{}", if bit { 1 } else { 0 });
  19. }
  20. println!("");
  21. bits
  22. }
  23. // Unpack a u64 value in 64 Scalar binary digits
  24. fn _unpack_u64(value: u64) -> Vec<Scalar> {
  25. let mut result = Vec::with_capacity(64);
  26. for i in 0..64 {
  27. if (value >> i) & 1 == 1 {
  28. result.push(Scalar::one());
  29. } else {
  30. result.push(Scalar::zero());
  31. }
  32. }
  33. result
  34. }
  35. fn main() -> Result<()> {
  36. let start = Instant::now();
  37. let file = File::open("mint.zcd")?;
  38. let mut visor = ZKContract::decode(file)?;
  39. println!("{}", visor.name);
  40. //ZKContract::load_contract(bytes);
  41. println!("Loaded contract: [{:?}]", start.elapsed());
  42. println!("Stats:");
  43. println!(" Constants: {}", visor.vm.constants.len());
  44. println!(" Alloc: {}", visor.vm.alloc.len());
  45. println!(" Operations: {}", visor.vm.ops.len());
  46. println!(
  47. " Constraint Instructions: {}",
  48. visor.vm.constraints.len()
  49. );
  50. visor.setup("mint.zts")?;
  51. // We use the ExtendedPoint in calculations because it's faster
  52. let public_point = jubjub::ExtendedPoint::from(jubjub::SubgroupPoint::random(&mut OsRng));
  53. // But to serialize we need to convert to affine (which has the (u, v) values)
  54. let public_affine = public_point.to_affine();
  55. let randomness_value: jubjub::Fr = jubjub::Fr::random(&mut OsRng);
  56. for param in visor.param_names() {
  57. println!("Param name: {}", param);
  58. }
  59. visor.set_param("public_u", public_affine.get_u())?;
  60. visor.set_param("public_v", public_affine.get_v())?;
  61. for (i, param_bit) in unpack(randomness_value).into_iter().enumerate() {
  62. visor.set_param(&format!("vc_randomness_{}", i), param_bit)?;
  63. }
  64. let proof = visor.prove()?;
  65. assert_eq!(proof.public.len(), 2);
  66. for (name, value) in &proof.public {
  67. println!("Public {} = {:?}", name, value);
  68. }
  69. assert!(visor.verify(&proof));
  70. Ok(())
  71. }