mint2.rs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. use bls12_381::Scalar;
  2. use ff::{Field, PrimeField};
  3. use group::{Curve, Group, GroupEncoding};
  4. mod mint2_contract;
  5. mod vm;
  6. use mint2_contract::{load_params, load_zkvm};
  7. fn unpack<F: PrimeField>(value: F) -> Vec<Scalar> {
  8. let mut bits = Vec::new();
  9. print!("Unpack: ");
  10. for (i, bit) in value.to_le_bits().into_iter().cloned().enumerate() {
  11. match bit {
  12. true => bits.push(Scalar::one()),
  13. false => bits.push(Scalar::zero()),
  14. }
  15. print!("{}", if bit { 1 } else { 0 });
  16. }
  17. println!("");
  18. bits
  19. }
  20. fn unpack_u64(value: u64) -> Vec<Scalar> {
  21. let mut result = Vec::with_capacity(64);
  22. for i in 0..64 {
  23. if (value >> i) & 1 == 1 {
  24. result.push(Scalar::one());
  25. } else {
  26. result.push(Scalar::zero());
  27. }
  28. }
  29. result
  30. }
  31. fn do_vcr_test(value: &jubjub::Fr) {
  32. let mut curbase = zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR;
  33. let mut result = jubjub::SubgroupPoint::identity();
  34. //let value = jubjub::Fr::from(7);
  35. for (i, bit) in value.to_le_bits().into_iter().cloned().enumerate() {
  36. let thisbase = if bit {
  37. curbase.clone()
  38. } else {
  39. jubjub::SubgroupPoint::identity()
  40. };
  41. result += thisbase;
  42. curbase = curbase.double();
  43. print!("{}", if bit { 1 } else { 0 });
  44. }
  45. println!("");
  46. let result = jubjub::ExtendedPoint::from(result).to_affine();
  47. println!("cvr1: {:?}", result);
  48. let randomness_commit =
  49. zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR * value;
  50. let randomness_commit = jubjub::ExtendedPoint::from(randomness_commit).to_affine();
  51. println!("cvr2: {:?}", randomness_commit);
  52. }
  53. fn main() -> std::result::Result<(), vm::ZkVmError> {
  54. use rand::rngs::OsRng;
  55. let public_point = jubjub::ExtendedPoint::from(jubjub::SubgroupPoint::random(&mut OsRng));
  56. let public_affine = public_point.to_affine();
  57. let value = 110;
  58. let randomness_value: jubjub::Fr = jubjub::Fr::random(&mut OsRng);
  59. //let randomness_value = jubjub::Fr::from(7);
  60. let value_commit = (zcash_primitives::constants::VALUE_COMMITMENT_VALUE_GENERATOR
  61. * jubjub::Fr::from(value))
  62. + (zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR * randomness_value);
  63. /////
  64. let randomness_commit =
  65. zcash_primitives::constants::VALUE_COMMITMENT_RANDOMNESS_GENERATOR * randomness_value;
  66. /////
  67. do_vcr_test(&randomness_value);
  68. let mut vm = load_zkvm();
  69. vm.setup();
  70. let mut params = vec![public_affine.get_u(), public_affine.get_v()];
  71. for x in unpack(randomness_value) {
  72. params.push(x);
  73. }
  74. let params = load_params(params);
  75. println!("Size of params: {}", params.len());
  76. vm.initialize(&params)?;
  77. let proof = vm.prove();
  78. let public = vm.public();
  79. assert_eq!(public.len(), 2);
  80. // Use this code for testing point doubling
  81. let dbl = public_point.double().to_affine();
  82. println!("{:?}", dbl.get_u());
  83. println!("{:?}", public[0]);
  84. println!("{:?}", dbl.get_v());
  85. println!("{:?}", public[1]);
  86. //assert_eq!(public.len(), 2);
  87. //assert_eq!(public[0], dbl.get_u());
  88. //assert_eq!(public[1], dbl.get_v());
  89. assert!(vm.verify(&proof, &public));
  90. Ok(())
  91. }