macro-test.lisp 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. (load-file "util.lisp")
  2. (def! zk-not-small-order? (fn* [u v] (
  3. (def! first-doubling (last (last (zk-double u v))))
  4. (def! second-doubling (last (last
  5. (zk-double (get first-doubling "u3") (get first-doubling "v3")))))
  6. (def! third-doubling (last (last
  7. (zk-double (get second-doubling "u3") (get second-doubling "v3")))))
  8. (zk-nonzero? (get third-doubling "u3"))
  9. )
  10. )
  11. )
  12. (defmacro! zk-nonzero? (fn* [var] (
  13. (let* [inv (gensym)
  14. v1 (gensym)] (
  15. `(alloc ~inv (invert ~var))
  16. `(alloc ~v1 ~var)
  17. `(enforce
  18. (scalar::one ~v1)
  19. (scalar::one ~inv)
  20. (scalar::one cs::one)
  21. )
  22. )
  23. ))
  24. ))
  25. (defmacro! zk-square (fn* [var] (
  26. (let* [v1 (gensym)
  27. v2 (gensym)] (
  28. `(alloc ~v1 ~var)
  29. `(def! output (alloc-input ~v2 (square ~var)))
  30. `(enforce
  31. (scalar::one ~v1)
  32. (scalar::one ~v1)
  33. (scalar::one ~v2)
  34. )
  35. `{ "v2" output }
  36. )
  37. ))
  38. ))
  39. (defmacro! zk-mul (fn* [val1 val2] (
  40. (let* [v1 (gensym)
  41. v2 (gensym)
  42. var (gensym)] (
  43. `(alloc ~v1 ~val1)
  44. `(alloc ~v2 ~val2)
  45. `(def! result (alloc-input ~var (* ~val1 ~val2)))
  46. `(enforce
  47. (scalar::one ~v1)
  48. (scalar::one ~v2)
  49. (scalar::one ~var)
  50. )
  51. `{ "result" result }
  52. )
  53. ))
  54. ))
  55. (defmacro! zk-witness (fn* [val1 val2] (
  56. (let* [u2 (gensym)
  57. v2 (gensym)
  58. u2v2 (gensym)
  59. EDWARDS_D (gensym)] (
  60. `(def! ~EDWARDS_D (alloc-const ~EDWARDS_D (scalar "2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1")))
  61. `(def! ~u2 (alloc ~u2 (get (nth (nth (zk-square ~val1) 0) 3) "v2")))
  62. `(def! ~v2 (alloc ~v2 (get (nth (nth (zk-square ~val2) 0) 3) "v2")))
  63. `(def! result (alloc-input ~u2v2 (get (last (last (zk-mul ~u2 ~v2))) "result")))
  64. `(enforce
  65. ((scalar::one::neg ~u2) (scalar::one ~v2))
  66. (scalar::one cs::one)
  67. ((scalar::one cs::one) (~EDWARDS_D ~u2v2))
  68. )
  69. `{ "result" result }
  70. )
  71. ))
  72. ))
  73. (defmacro! zk-double (fn* [val1 val2] (
  74. (let* [u (gensym)
  75. v (gensym)
  76. u3 (gensym)
  77. v3 (gensym)
  78. T (gensym)
  79. A (gensym)
  80. C (gensym)
  81. EDWARDS_D (gensym)] (
  82. `(def! ~EDWARDS_D (alloc-const ~EDWARDS_D (scalar "2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1")))
  83. `(def! ~u (alloc ~u ~val1))
  84. `(def! ~v (alloc ~v ~val2))
  85. `(def! ~T (alloc ~T (* (+ ~val1 ~val2) (+ ~val1 ~val2))))
  86. `(def! ~A (alloc ~A (* ~u ~v)))
  87. `(def! ~C (alloc ~C (* (square ~A) ~EDWARDS_D)))
  88. `(def! ~u3 (alloc-input ~u3 (/ (double ~A) (+ scalar::one ~C))))
  89. `(def! ~v3 (alloc-input ~v3 (/ (- ~T (double ~A)) (- scalar::one ~C))))
  90. `(enforce
  91. ((scalar::one ~u) (scalar::one ~v))
  92. ((scalar::one ~u) (scalar::one ~v))
  93. (scalar::one ~T)
  94. )
  95. `(enforce
  96. (~EDWARDS_D ~A)
  97. (scalar::one ~A)
  98. (scalar::one ~C)
  99. )
  100. `(enforce
  101. ((scalar::one cs::one) (scalar::one ~C))
  102. (scalar::one ~u3)
  103. ((scalar::one ~A) (scalar::one ~A))
  104. )
  105. `(enforce
  106. ((scalar::one cs::one) (scalar::one::neg ~C))
  107. (scalar::one ~v3)
  108. ((scalar::one ~T) (scalar::one::neg ~A) (scalar::one::neg ~A))
  109. )
  110. { "u3" u3, "v3" v3 }
  111. )
  112. ))
  113. ))
  114. (defmacro! conditionally_select (fn* [u v condition] (
  115. (let* [u-prime (gensym)
  116. v-prime (gensym)] (
  117. `(def! ~u-prime (alloc-input ~u-prime (* ~u ~condition)))
  118. `(def! ~v-prime (alloc-input ~v-prime (* ~v ~condition)))
  119. `(enforce
  120. (scalar::one ~u)
  121. (scalar::one ~condition)
  122. (scalar::one ~u-prime)
  123. )
  124. `(enforce
  125. (scalar::one ~v)
  126. (scalar::one ~condition)
  127. (scalar::one ~v-prime)
  128. )
  129. { "u-prime" u-prime, "v-prime" v-prime }
  130. )
  131. ))))
  132. (defmacro! jj-add (fn* [param1 param2 param3 param4]
  133. (let* [u1 (gensym) v1 (gensym) u2 (gensym) v2 (gensym)
  134. EDWARDS_D (gensym) U (gensym) A (gensym) B (gensym)
  135. C (gensym) u3 (gensym) v3 (gensym)] (
  136. `(def! ~u1 (alloc ~u1 param1))
  137. `(def! ~v1 (alloc ~v1 param2))
  138. `(def! ~u2 (alloc ~u2 param3))
  139. `(def! ~v2 (alloc ~v2 param4))
  140. `(def! ~EDWARDS_D (alloc-const ~EDWARDS_D (scalar "2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1")))
  141. `(def! ~U (alloc ~U (* (+ ~u1 ~v1) (+ ~u2 ~v2))))
  142. `(def! ~A (alloc ~A (* ~v2 ~u1)))
  143. `(def! ~B (alloc ~B (* ~u2 ~v1)))
  144. `(def! ~C (alloc ~C (* ~EDWARDS_D (* ~A ~B))))
  145. `(def! ~u3 (alloc-input ~u3 (/ (+ ~A ~B) (+ scalar::one ~C))))
  146. `(def! ~v3 (alloc-input ~v3 (/ (- (- ~U ~A) ~B) (- scalar::one ~C))))
  147. `(enforce
  148. ((scalar::one ~u1) (scalar::one ~v1))
  149. ((scalar::one ~u2) (scalar::one ~v2))
  150. (scalar::one ~U)
  151. )
  152. `(enforce
  153. (~EDWARDS_D ~A)
  154. (scalar::one ~B)
  155. (scalar::one ~C)
  156. )
  157. `(enforce
  158. ((scalar::one cs::one)(scalar::one ~C))
  159. (scalar::one ~u3)
  160. ((scalar::one ~A) (scalar::one ~B))
  161. )
  162. `(enforce
  163. ((scalar::one cs::one) (scalar::one::neg ~C))
  164. (scalar::one ~v3)
  165. ((scalar::one ~U) (scalar::one::neg ~A) (scalar::one::neg ~B))
  166. )
  167. )
  168. ;; improve return values
  169. )
  170. ))
  171. ;; cs.enforce(
  172. ;; || "boolean constraint",
  173. ;; |lc| lc + CS::one() - var,
  174. ;; |lc| lc + var,
  175. ;; |lc| lc,
  176. ;; );
  177. (defmacro! zk-boolean (fn* [val] (
  178. (let* [var (gensym)] (
  179. `(alloc ~var ~val)
  180. `(enforce
  181. (scalar::one cs::one) (scalar::one ~var)
  182. (scalar::one ~var)
  183. ()
  184. )
  185. )
  186. ))))
  187. ;; b == (scalar "0000000000000000000000000000000000000000000000000000000000000000")
  188. ;; u,v == jubjub ecc point
  189. (def! jj-mul (fn* [u v b] (
  190. (def! result (unpack-bits b))
  191. (eval (map zk-boolean result))
  192. (def! double-result (last (last (zk-double u v))))
  193. ;; 2nd step
  194. ;; (map result [n](
  195. ;; 1st just clone ** ignore this
  196. ;; 2nd zk-double u v
  197. ;; 3rd conditionally_select u v
  198. ;; 4rd jj-add u v (conditionally_select result)
  199. ;; ))
  200. )))
  201. (def! param3 (scalar "0000000000000000000000000000000000000000000000000000000000000000"))
  202. (def! param-u (scalar "273f910d9ecc1615d8618ed1d15fef4e9472c89ac043042d36183b2cb4d7ef51"))
  203. (def! param-v (scalar "466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c8d7"))
  204. (def! param1 (scalar 42))
  205. ;; (prove
  206. ;; (
  207. ;; ;; (println (zk-square param1))
  208. ;; ;; (jj-mul param-u param-v param3)
  209. ;; )
  210. ;; )
  211. ;; (def! for-loop (fn* [acc len val] (
  212. ;; (println acc val)
  213. ;; (if (i>= acc len)
  214. ;; (println 'EOF)
  215. ;; (do
  216. ;; (for-loop (i+ acc 1) len (last (last (zk-double (get val "u3") (get val "v3")))))
  217. ;; )
  218. ;; )
  219. ;; )))
  220. (def! result (unpack-bits param3))
  221. (def! len (count result))
  222. (def! val (last (last (zk-double param-u param-v))))
  223. (dotimes 256 (
  224. (def! u (get val "u3"))
  225. (def! v (get val "v3"))
  226. (def! val (last (last (zk-double u v))))
  227. (println u v val)
  228. ))
  229. ;; (for-loop 2 (count result) double-result)
  230. ;; following some examples
  231. ;; (def! alloc-u (alloc "alloc-u" param-u))
  232. ;; (def! alloc-v (alloc "alloc-v" param-v))
  233. ;; (def! condition (alloc "condition" param3))
  234. ;; (println 'conditionally_select
  235. ;; (conditionally_select alloc-u alloc-v condition))
  236. ;; (println (zk-mul param1 param2))
  237. ;; (def! param1 (scalar 3))
  238. ;; (def! param2 (scalar 9))
  239. ;; (println (zk-square param1))
  240. ;; (println (zk-mul param1 param2))
  241. ;; (println 'witness (zk-witness param-u param-v))
  242. ;; (println 'double (last (last (zk-double param-u param-v))))
  243. ;; (println 'nonzero (zk-nonzero? param3))
  244. ;; (println 'not-small-order? (zk-not-small-order? param-u param-v))