jubjub.lisp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. (println "jubjub-add.lisp")
  2. (load-file "util.lisp")
  3. (defmacro! zk-square (fn* [var] (
  4. (let* [v1 (gensym)
  5. v2 (gensym)] (
  6. `(alloc ~v1 ~var)
  7. `(alloc ~v2 (square ~var))
  8. `(enforce
  9. (scalar::one ~v1)
  10. (scalar::one ~v1)
  11. (scalar::one ~v2)
  12. )
  13. )
  14. ))
  15. ))
  16. ;; -u^2 + v^2 = 1 + du^2v^2
  17. (defmacro! zk-witness (fn* [val1 val2] (
  18. (let* [v (gensym)
  19. u (gensym)
  20. u2v2 (gensym)] (
  21. `(alloc ~v1 ~var)
  22. `(alloc ~v2 (square ~var))
  23. `(enforce
  24. (scalar::one ~v1)
  25. (scalar::one ~v1)
  26. (scalar::one ~v2)
  27. )
  28. )
  29. ))
  30. ))
  31. (defmacro! jubjub-add (fn* [param1 param2 param3 param4]
  32. (let* [u1 (gensym) v1 (gensym) u2 (gensym) v2 (gensym)
  33. EDWARDS_D (gensym) U (gensym) A (gensym) B (gensym)
  34. C (gensym) u3 (gensym) v3 (gensym)] (
  35. `(def! ~u1 (alloc ~u1 param1))
  36. `(def! ~v1 (alloc ~v1 param2))
  37. `(def! ~u2 (alloc ~u2 param3))
  38. `(def! ~v2 (alloc ~v2 param4))
  39. `(def! ~EDWARDS_D (alloc-const ~EDWARDS_D (scalar "2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1")))
  40. `(def! ~U (alloc ~U (* (+ ~u1 ~v1) (+ ~u2 ~v2))))
  41. `(def! ~A (alloc ~A (* ~v2 ~u1)))
  42. `(def! ~B (alloc ~B (* ~u2 ~v1)))
  43. `(def! ~C (alloc ~C (* ~EDWARDS_D (* ~A ~B))))
  44. `(def! ~u3 (alloc-input ~u3 (/ (+ ~A ~B) (+ scalar::one ~C))))
  45. `(def! ~v3 (alloc-input ~v3 (/ (- (- ~U ~A) ~B) (- scalar::one ~C))))
  46. `(enforce
  47. ((scalar::one ~u1) (scalar::one ~v1))
  48. ((scalar::one ~u2) (scalar::one ~v2))
  49. (scalar::one ~U)
  50. )
  51. `(enforce
  52. (~EDWARDS_D ~A)
  53. (scalar::one ~B)
  54. (scalar::one ~C)
  55. )
  56. `(enforce
  57. ((scalar::one cs::one)(scalar::one ~C))
  58. (scalar::one ~u3)
  59. ((scalar::one ~A) (scalar::one ~B))
  60. )
  61. `(enforce
  62. ((scalar::one cs::one) (scalar::one::neg ~C))
  63. (scalar::one ~v3)
  64. ((scalar::one ~U) (scalar::one::neg ~A) (scalar::one::neg ~B))
  65. )
  66. )
  67. ;; improve return values
  68. )
  69. ))
  70. (prove
  71. (
  72. (def! result-witness (zk-witness param1 param2))
  73. (println 'result-witness (nth (nth result-witness 0) 1))
  74. )
  75. )