macro-test.lisp 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286
  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* [val1 val2 val3] (
  115. (let* [u-prime (gensym)
  116. v-prime (gensym)
  117. u (gensym)
  118. v (gensym)
  119. condition (gensym)
  120. ] (
  121. `(def! ~u (alloc ~u ~val1))
  122. `(def! ~v (alloc ~v ~val2))
  123. `(def! ~condition (alloc ~condition ~val3))
  124. `(def! ~u-prime (alloc-input ~u-prime (* ~u ~condition)))
  125. `(def! ~v-prime (alloc-input ~v-prime (* ~v ~condition)))
  126. `(enforce
  127. (scalar::one ~u)
  128. (scalar::one ~condition)
  129. (scalar::one ~u-prime)
  130. )
  131. `(enforce
  132. (scalar::one ~v)
  133. (scalar::one ~condition)
  134. (scalar::one ~v-prime)
  135. )
  136. { "u-prime" u-prime, "v-prime" v-prime }
  137. )
  138. ))))
  139. (defmacro! jj-add (fn* [param1 param2 param3 param4]
  140. (let* [u1 (gensym) v1 (gensym) u2 (gensym) v2 (gensym)
  141. EDWARDS_D (gensym) U (gensym) A (gensym) B (gensym)
  142. C (gensym) u3 (gensym) v3 (gensym)] (
  143. ;; debug
  144. ;; `(println 'jj-add ~param1 ~param2 ~param3 ~param4)
  145. `(def! ~u1 (alloc ~u1 ~param1))
  146. `(def! ~v1 (alloc ~v1 ~param2))
  147. `(def! ~u2 (alloc ~u2 ~param3))
  148. `(def! ~v2 (alloc ~v2 ~param4))
  149. `(def! ~EDWARDS_D (alloc-const ~EDWARDS_D (scalar "2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1")))
  150. `(def! ~U (alloc ~U (* (+ ~u1 ~v1) (+ ~u2 ~v2))))
  151. `(def! ~A (alloc ~A (* ~v2 ~u1)))
  152. `(def! ~B (alloc ~B (* ~u2 ~v1)))
  153. `(def! ~C (alloc ~C (* ~EDWARDS_D (* ~A ~B))))
  154. `(def! ~u3 (alloc-input ~u3 (/ (+ ~A ~B) (+ scalar::one ~C))))
  155. `(def! ~v3 (alloc-input ~v3 (/ (- (- ~U ~A) ~B) (- scalar::one ~C))))
  156. `(enforce
  157. ((scalar::one ~u1) (scalar::one ~v1))
  158. ((scalar::one ~u2) (scalar::one ~v2))
  159. (scalar::one ~U)
  160. )
  161. `(enforce
  162. (~EDWARDS_D ~A)
  163. (scalar::one ~B)
  164. (scalar::one ~C)
  165. )
  166. `(enforce
  167. ((scalar::one cs::one)(scalar::one ~C))
  168. (scalar::one ~u3)
  169. ((scalar::one ~A) (scalar::one ~B))
  170. )
  171. `(enforce
  172. ((scalar::one cs::one) (scalar::one::neg ~C))
  173. (scalar::one ~v3)
  174. ((scalar::one ~U) (scalar::one::neg ~A) (scalar::one::neg ~B))
  175. )
  176. `{ "u3" u3, "v3" v3 }
  177. )
  178. )
  179. ))
  180. ;; cs.enforce(
  181. ;; || "boolean constraint",
  182. ;; |lc| lc + CS::one() - var,
  183. ;; |lc| lc + var,
  184. ;; |lc| lc,
  185. ;; );
  186. (defmacro! zk-boolean (fn* [val] (
  187. (let* [var (gensym)] (
  188. `(alloc ~var ~val)
  189. `(enforce
  190. (scalar::one cs::one) (scalar::one ~var)
  191. (scalar::one ~var)
  192. ()
  193. )
  194. )
  195. ))))
  196. (def! jj-mul (fn* [u v b] (
  197. (def! result (unpack-bits b))
  198. (eval (map zk-boolean result))
  199. (def! val (last (last (zk-double u v))))
  200. (def! acc 0)
  201. (dotimes (count result) (
  202. (def! acc (i+ acc 1))
  203. (def! u3 (get val "u3"))
  204. (def! v3 (get val "v3"))
  205. (def! r (nth result acc))
  206. (def! cond-result (last (last (conditionally-select u3 v3 r))))
  207. (def! u-prime (get cond-result "u-prime"))
  208. (def! v-prime (get cond-result "v-prime"))
  209. (def! add-result (last (jj-add u3 v3 u-prime v-prime)))
  210. (def! u-add (get add-result "u3"))
  211. (def! v-add (get add-result "v3"))
  212. (def! val (last (last (zk-double u-add v-add))))
  213. ;; debug
  214. (println 'first-double val)
  215. (println 'r r)
  216. (println 'cond cond-result)
  217. (println 'add add-result)
  218. (println 'double acc val)
  219. ))
  220. (println 'out val)
  221. )))
  222. (load-file "mimc-constants.lisp")
  223. (defmacro! mimc-macro (fn* [xr xl acc] (
  224. (let* [tmp-xl (gensym) xl-new-value (gensym) cur-mimc-const (gensym)] (
  225. `(def! ~cur-mimc-const (alloc-const ~cur-mimc-const (nth mimc-constants ~acc)))
  226. `(def! ~tmp-xl (alloc ~tmp-xl (square (+ ~cur-mimc-const ~xl))))
  227. `(enforce
  228. ((scalar::one xl) (~cur-mimc-const cs::one))
  229. ((scalar::one xl) (~cur-mimc-const cs::one))
  230. (scalar::one ~tmp-xl)
  231. )
  232. `(def! ~xl-new-value (alloc ~xl-new-value (+ (* ~tmp-xl (+ ~cur-mimc-const ~xl)) ~xr)))
  233. `(enforce
  234. (scalar::one ~tmp-xl)
  235. ((scalar::one xl) (~cur-mimc-const cs::one))
  236. ((scalar::one ~xl-new-value) (scalar::one::neg xr))
  237. )
  238. )))))
  239. (def! mimc (fn* [left right] (
  240. (def! xl (alloc "xl" left))
  241. (def! xr (alloc "xr" right))
  242. (def! acc 1)
  243. (dotimes 322 (
  244. (println (mimc-macro xl xr acc))
  245. (def! acc (i+ acc 1))
  246. (println acc)
  247. ))
  248. )))
  249. (def! param3 (rnd-scalar))
  250. ;; (println 'rnd-scalar param3)
  251. (def! param-u (scalar "6800f4fa0f001cfc7ff6826ad58004b4d1d8da41af03744e3bce3b7793664337"))
  252. (def! param-v (scalar "6d81d3a9cb45dedbe6fb2a6e1e22ab50ad46f1b0473b803b3caefab9380b6a8b"))
  253. (prove
  254. (
  255. ;; (jj-mul param-u param-v param3)
  256. (mimc param-u param-v)
  257. )
  258. )
  259. ;; following some examples
  260. ;; (def! alloc-u (alloc "alloc-u" param-u))
  261. ;; (def! alloc-v (alloc "alloc-v" param-v))
  262. ;; (def! condition (alloc "condition" param3))
  263. ;; (println 'conditionally_select
  264. ;; (conditionally_select alloc-u alloc-v condition))
  265. ;; (println (zk-mul param1 param2))
  266. ;; (def! param1 (scalar 3))
  267. ;; (def! param2 (scalar 9))
  268. ;; (println (zk-square param1))
  269. ;; (println (zk-mul param1 param2))
  270. ;; (println 'witness (zk-witness param-u param-v))
  271. ;; (println 'double (last (last (zk-double param-u param-v))))
  272. ;; (println 'nonzero (zk-nonzero? param3))
  273. ;; (println 'not-small-order? (zk-not-small-order? param-u param-v))