macro-test.lisp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. (load-file "util.lisp")
  2. (defmacro! zk-nonzero? (fn* [var] (
  3. (let* [inv (gensym)
  4. v1 (gensym)] (
  5. `(alloc ~inv (invert ~var))
  6. `(alloc ~v1 ~var)
  7. `(enforce
  8. (scalar::one ~v1)
  9. (scalar::one ~inv)
  10. (scalar::one cs::one)
  11. )
  12. ;; { "result" `(zero? ~var) }
  13. )
  14. ))
  15. ))
  16. (defmacro! zk-square (fn* [var] (
  17. (let* [v1 (gensym)
  18. v2 (gensym)] (
  19. `(alloc ~v1 ~var)
  20. `(def! output (alloc-input ~v2 (square ~var)))
  21. `(enforce
  22. (scalar::one ~v1)
  23. (scalar::one ~v1)
  24. (scalar::one ~v2)
  25. )
  26. `{ "v2" output }
  27. )
  28. ))
  29. ))
  30. (defmacro! zk-mul (fn* [val1 val2] (
  31. (let* [v1 (gensym)
  32. v2 (gensym)
  33. var (gensym)] (
  34. `(alloc ~v1 ~val1)
  35. `(alloc ~v2 ~val2)
  36. `(def! result (alloc-input ~var (* ~val1 ~val2)))
  37. `(enforce
  38. (scalar::one ~v1)
  39. (scalar::one ~v2)
  40. (scalar::one ~var)
  41. )
  42. `{ "result" result }
  43. )
  44. ))
  45. ))
  46. (defmacro! zk-witness (fn* [val1 val2] (
  47. (let* [u2 (gensym)
  48. v2 (gensym)
  49. u2v2 (gensym)
  50. EDWARDS_D (gensym)] (
  51. `(def! ~EDWARDS_D (alloc-const ~EDWARDS_D (scalar "2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1")))
  52. `(def! ~u2 (alloc ~u2 (get (nth (nth (zk-square ~val1) 0) 3) "v2")))
  53. `(def! ~v2 (alloc ~v2 (get (nth (nth (zk-square ~val2) 0) 3) "v2")))
  54. `(def! result (alloc-input ~u2v2 (get (last (last (zk-mul ~u2 ~v2))) "result")))
  55. `(enforce
  56. ((scalar::one::neg ~u2) (scalar::one ~v2))
  57. (scalar::one cs::one)
  58. ((scalar::one cs::one) (~EDWARDS_D ~u2v2))
  59. )
  60. `{ "result" result }
  61. )
  62. ))
  63. ))
  64. (def! zk-not-small-order? (fn* [u v] (
  65. (def! first-doubling (last (last (zk-double u v))))
  66. (def! second-doubling (last (last
  67. (zk-double (get first-doubling "u3") (get first-doubling "v3")))))
  68. (def! third-doubling (last (last
  69. (zk-double (get second-doubling "u3") (get second-doubling "v3")))))
  70. (zk-nonzero? (get third-doubling "u3"))
  71. )
  72. )
  73. )
  74. (defmacro! zk-double (fn* [val1 val2] (
  75. (let* [u (gensym)
  76. v (gensym)
  77. u3 (gensym)
  78. v3 (gensym)
  79. T (gensym)
  80. A (gensym)
  81. C (gensym)
  82. EDWARDS_D (gensym)] (
  83. `(def! ~EDWARDS_D (alloc-const ~EDWARDS_D (scalar "2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1")))
  84. `(def! ~u (alloc ~u ~val1))
  85. `(def! ~v (alloc ~v ~val2))
  86. `(def! ~T (alloc ~T (* (+ ~val1 ~val2) (+ ~val1 ~val2))))
  87. `(def! ~A (alloc ~A (* ~u ~v)))
  88. `(def! ~C (alloc ~C (* (square ~A) ~EDWARDS_D)))
  89. `(def! ~u3 (alloc-input ~u3 (/ (double ~A) (+ scalar::one ~C))))
  90. `(def! ~v3 (alloc-input ~v3 (/ (- ~T (double ~A)) (- scalar::one ~C))))
  91. `(enforce
  92. ((scalar::one ~u) (scalar::one ~v))
  93. ((scalar::one ~u) (scalar::one ~v))
  94. (scalar::one ~T)
  95. )
  96. `(enforce
  97. (~EDWARDS_D ~A)
  98. (scalar::one ~A)
  99. (scalar::one ~C)
  100. )
  101. `(enforce
  102. ((scalar::one cs::one) (scalar::one ~C))
  103. (scalar::one ~u3)
  104. ((scalar::one ~A) (scalar::one ~A))
  105. )
  106. `(enforce
  107. ((scalar::one cs::one) (scalar::one::neg ~C))
  108. (scalar::one ~v3)
  109. ((scalar::one ~T) (scalar::one::neg ~A) (scalar::one::neg ~A))
  110. )
  111. { "u3" u3, "v3" v3 }
  112. )
  113. ))
  114. ))
  115. (def! param1 (scalar 3))
  116. (def! param2 (scalar 9))
  117. (def! param3 scalar::zero)
  118. (def! param-u (scalar "273f910d9ecc1615d8618ed1d15fef4e9472c89ac043042d36183b2cb4d7ef51"))
  119. (def! param-v (scalar "466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c8d7"))
  120. (prove
  121. (
  122. ;; (println (zk-square param1))
  123. ;; (println (zk-mul param1 param2))
  124. ;; (println 'witness (zk-witness param-u param-v))
  125. ;; (println 'double (last (last (zk-double param-u param-v))))
  126. ;; (println 'nonzero (zk-nonzero? param3))
  127. (println 'not-small-order? (zk-not-small-order? param-u param-v))
  128. )
  129. )