jubjub.lisp 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. ;; public params
  2. (def! a_u "15a36d1f0f390d8852a35a8c1908dd87a361ee3fd48fdf77b9819dc82d90607e")
  3. (def! a_v "015d8c7f5b43fe33f7891142c001d9251f3abeeb98fad3e87b0dc53c4ebf1891")
  4. (def! b_u "15a36d1f0f390d8852a35a8c1908dd87a361ee3fd48fdf77b9819dc82d90607e")
  5. (def! b_v "015d8c7f5b43fe33f7891142c001d9251f3abeeb98fad3e87b0dc53c4ebf1891")
  6. (def! a "73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000")
  7. (def! d "2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1")
  8. (def! one "0000000000000000000000000000000000000000000000000000000000000001")
  9. (defzk! circuit ())
  10. ;; U should be evaluated just once
  11. (def! U (fn* [x1 y1 x2 y2] (* (+ x1 y1) (+ x2 y2))))
  12. (def! A (fn* [x1 y2] (* y2 x1)))
  13. (def! B (fn* [y1 x2] (* x2 y1)))
  14. (def! C (fn* [x1 y1 x2 y2] (* d (A x1 y2) (B y1 x2))))
  15. (def! P.x (fn* [x1 y1 x2 y2] (/ (+ (A x1 y2) (B y1 x2)) (+ one (C x1 y1 x2 y2)))))
  16. (def! P.y (fn* [x1 y1 x2 y2] (/ (- (U x1 y1 x2 y2) (A x1 y2) (B y1 x2)) (+ one (C x1 y1 x2 y2)))))
  17. ;; lc0 = bellman::LinearCombination::<Scalar>::zero();
  18. ;; (lc0-args LinearCombination<Scalar>)
  19. ;; (cs! circuit (lc0-args) (lc1-args) (lc2-args))
  20. ;; (lc-add-coeff 1 1)
  21. (def! jubjub-add (fn* [x1 y1 x2 y2] (cs! circuit (
  22. (add lc0 x1)
  23. (add lc0 y1)
  24. (add lc1 x2)
  25. (add lc1 y2)
  26. (add lc2 (U x1 y1 x2 y2))
  27. enforce
  28. ;; Compute P.x = (A + B) / (1 + C)
  29. (add-one lc0)
  30. (add lc0 (C x1 y1 x2 y2))
  31. (add lc1 (P.x x1 y1 x2 y2))
  32. (add lc1 (A x1 y2))
  33. (add lc1 (B y1 x2))
  34. enforce
  35. ;; Compute P.y = (U - A - B) / (1 - C)
  36. (add-one lc0)
  37. (sub lc0 (C x1 y1 x2 y2))
  38. (add lc1 (P.y x1 y1 x2 y2))
  39. (add lc2 (U x1 y1 x2 y2))
  40. (sub lc2 (A x1 y2))
  41. (sub lc2 (B y1 x2))
  42. enforce
  43. ))))
  44. (def! circuit (jubjub-add a_u a_v b_u b_v))
  45. ;;(println circuit)
  46. (def! circuit (cs! circuit (
  47. (public (P.x a_u a_v b_u b_v))
  48. (public (P.y a_u a_v b_u b_v))
  49. (add lc0 (P.x a_u a_v b_u b_v))
  50. (add-one lc1)
  51. (add lc2 (P.x a_u a_v b_u b_v))
  52. enforce
  53. (add lc0 (P.y a_u a_v b_u b_v))
  54. (add-one lc1)
  55. (add lc2 (P.y a_u a_v b_u b_v))
  56. enforce
  57. )))
  58. ;;(println circuit)
  59. ;; contract exection
  60. (def! circuit (cs! circuit (
  61. (params [a_u a_v b_u b_v])
  62. )))
  63. (println circuit)