macro-test.lisp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. ;; TODO implement alloc_conditionally
  115. ;; cs.enforce(
  116. ;; || "boolean constraint",
  117. ;; |lc| lc + CS::one() - var,
  118. ;; |lc| lc + var,
  119. ;; |lc| lc,
  120. ;; );
  121. (defmacro! conditionally_select (fn* [u v condition] (
  122. (let* [u-prime (gensym)] (
  123. `(def! ~u-prime (alloc ~u-prime (* ~u ~condition)))
  124. ;; `(alloc ~v1 u)
  125. ;; `(alloc ~v2 v)
  126. ;; `(alloc ~condition ~condition)
  127. `(enforce
  128. (scalar::one ~u)
  129. (scalar::one ~condition)
  130. (scalar::one ~u-prime)
  131. )
  132. )
  133. ))))
  134. (def! param1 (scalar 3))
  135. (def! param2 (scalar 9))
  136. (def! param3 (scalar "0000000000000000000000000000000000000000000000000000000000000000"))
  137. (def! param-u (scalar "273f910d9ecc1615d8618ed1d15fef4e9472c89ac043042d36183b2cb4d7ef51"))
  138. (def! param-v (scalar "466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c8d7"))
  139. (prove
  140. (
  141. ;; (println (zk-square param1))
  142. ;; (println (zk-mul param1 param2))
  143. ;; (println 'witness (zk-witness param-u param-v))
  144. ;; (println 'double (last (last (zk-double param-u param-v))))
  145. ;; (println 'nonzero (zk-nonzero? param3))
  146. ;; (println 'not-small-order? (zk-not-small-order? param-u param-v))
  147. (def! alloc-u (alloc "alloc-u" param-u))
  148. ;; (def! alloc-v (alloc "alloc-v" param-v))
  149. (def! condition (alloc "condition" param3))
  150. (println 'conditionally_select
  151. (conditionally_select alloc-u alloc-v condition))
  152. )
  153. )