jubjub.lisp 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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. (def! U (fn* [x1 y1 x2 y2] (+ (+ x1 y1) (+ x2 y2))))
  11. (def! A (fn* [x1 y2] (* y2 x1)))
  12. (def! B (fn* [y1 x2] (* x2 y1)))
  13. (def! C (fn* [x1 y1 x2 y2] (* d (A x1 y2) (B y1 x2))))
  14. (def! P.x (fn* [x1 y1 x2 y2] (/ (+ (A x1 y2) (B y1 x2)) (+ one (C x1 y1 x2 y2)))))
  15. (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)))))
  16. (def! jubjub-add (fn* [x1 y1 x2 y2] (cs! circuit (
  17. (add lc0 x1)
  18. (add lc0 y1)
  19. (add lc1 x2)
  20. (add lc1 y2)
  21. (add lc2 (U x1 y1 x2 y2))
  22. enforce
  23. ;; Compute P.x = (A + B) / (1 + C)
  24. (add-one lc0)
  25. (add lc0 (C x1 y1 x2 y2))
  26. (add lc1 (P.x x1 y1 x2 y2))
  27. (add lc1 (A x1 y2))
  28. (add lc1 (B y1 x2))
  29. enforce
  30. ;; Compute P.y = (U - A - B) / (1 - C)
  31. (add-one lc0)
  32. (sub lc0 (C x1 y1 x2 y2))
  33. (add lc1 (P.y x1 y1 x2 y2))
  34. (add lc2 (U x1 y1 x2 y2))
  35. (sub lc2 (A x1 y2))
  36. (sub lc2 (B y1 x2))
  37. enforce
  38. ))))
  39. (def! circuit (jubjub-add a_u a_v b_u b_v))
  40. ;;(println circuit)
  41. (def! circuit (cs! circuit (
  42. (public (P.x a_u a_v b_u b_v))
  43. (public (P.y a_u a_v b_u b_v))
  44. (add lc0 (P.x a_u a_v b_u b_v))
  45. (add-one lc1)
  46. (add lc2 (P.x a_u a_v b_u b_v))
  47. enforce
  48. (add lc0 (P.y a_u a_v b_u b_v))
  49. (add-one lc1)
  50. (add lc2 (P.y a_u a_v b_u b_v))
  51. enforce
  52. )))
  53. ;;(println circuit)
  54. ;; contract exection
  55. (def! circuit (cs! circuit (
  56. (params [a_u a_v b_u b_v])
  57. )))
  58. (println circuit)