zkmimc.rs 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. use bls12_381::Scalar;
  2. use ff::{Field, PrimeField};
  3. use std::ops::{Add, AddAssign, MulAssign, Neg, SubAssign};
  4. mod vm;
  5. mod zkmimc_contract;
  6. use zkmimc_contract::load_zkvm;
  7. mod mimc_constants;
  8. use mimc_constants::mimc_constants;
  9. const MIMC_ROUNDS: usize = 322;
  10. fn mimc(mut xl: Scalar, mut xr: Scalar, constants: &[Scalar]) -> Scalar {
  11. assert_eq!(constants.len(), MIMC_ROUNDS);
  12. for i in 0..MIMC_ROUNDS {
  13. let mut tmp1 = xl;
  14. tmp1.add_assign(&constants[i]);
  15. let mut tmp2 = tmp1.square();
  16. tmp2.mul_assign(&tmp1);
  17. tmp2.add_assign(&xr);
  18. xr = xl;
  19. xl = tmp2;
  20. }
  21. xl
  22. }
  23. macro_rules! from_slice {
  24. ($data:expr, $len:literal) => {{
  25. let mut array = [0; $len];
  26. // panics if not enough data
  27. let bytes = &$data[..array.len()];
  28. assert_eq!(bytes.len(), array.len());
  29. for (a, b) in array.iter_mut().rev().zip(bytes.iter()) {
  30. *a = *b;
  31. }
  32. //array.copy_from_slice(bytes.iter().rev());
  33. array
  34. }};
  35. }
  36. fn main() -> std::result::Result<(), vm::ZKVMError> {
  37. use rand::rngs::OsRng;
  38. /////////////////////////////////
  39. // Initialize our MiMC constants
  40. let mut constants = Vec::new();
  41. for const_str in mimc_constants() {
  42. let bytes = from_slice!(&hex::decode(const_str).unwrap(), 32);
  43. assert_eq!(bytes.len(), 32);
  44. let constant = Scalar::from_bytes(&bytes).unwrap();
  45. constants.push(constant);
  46. }
  47. /////////////////////////////////
  48. let mut vm = load_zkvm();
  49. vm.setup();
  50. let params = vec![
  51. (
  52. 0,
  53. Scalar::from_raw([
  54. 0xb981_9dc8_2d90_607e,
  55. 0xa361_ee3f_d48f_df77,
  56. 0x52a3_5a8c_1908_dd87,
  57. 0x15a3_6d1f_0f39_0d88,
  58. ]),
  59. ),
  60. (
  61. 1,
  62. Scalar::from_raw([
  63. 0x7b0d_c53c_4ebf_1891,
  64. 0x1f3a_beeb_98fa_d3e8,
  65. 0xf789_1142_c001_d925,
  66. 0x015d_8c7f_5b43_fe33,
  67. ]),
  68. ),
  69. ];
  70. vm.initialize(&params)?;
  71. let proof = vm.prove();
  72. let public = vm.public();
  73. let mimc_hash = mimc(params[0].1.clone(), params[1].1.clone(), &constants);
  74. assert_eq!(public.len(), 1);
  75. assert_eq!(public[0], mimc_hash);
  76. assert!(vm.verify(&proof, &public));
  77. Ok(())
  78. }