new-cs.lisp 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. ;; defzk!
  2. ;; enforce LABEL
  3. ;; alloc
  4. ;; alloc-input
  5. ;; scalar::one
  6. ;; scalar::zero
  7. ;; scalar
  8. ;; cs::one
  9. ;; bellman::zero
  10. ;; setup
  11. ;; prove
  12. ;; verify
  13. (println "new-cs.lisp")
  14. (def! MyCircuit (fn* [aux]
  15. (let* [x (alloc "num" (first aux))
  16. x2 (alloc "product num" (first (rest aux)))
  17. x3 (alloc "product num" (last aux))
  18. input (alloc-input "input variable" (last aux))]
  19. ;; Lc0: [(Scalar::one(), CS::one()), (Scalar::one().neg(), C)]
  20. ;; Lc1: [(Scalar::one(), y)]
  21. ;; Lc2: [(Scalar::one(), U), (Scalar::one().neg(), A), (Scalar::one().neg(), B)]
  22. (enforce (scalar::one x) ((neg scalar::one) x2) ((neg scalar::one) x3))
  23. )))
  24. (def! a (scalar "0000000000000000000000000000000000000000000000000000000000000003"))
  25. (setup (MyCircuit (a (* a a) (* (* a a) a))))
  26. ;; (prove MyCircuit)
  27. ;; (verify (prove MyCircuit) (scalar 27))
  28. ;; (U - A - B) / (1 - C)
  29. ;; [(1 - C)] * [y] = [U - A - B]
  30. ;; Lc0: [(Scalar::one(), CS::one()), (Scalar::one().neg(), C)]
  31. ;; Lc1: [(Scalar::one(), y)]
  32. ;; Lc2: [(Scalar::one(), U), (Scalar::one().neg(), A), (Scalar::one().neg(), B)]
  33. ;; assert (x1 + y1) * (x2 + y2) == U
  34. ;; Lc0: [(Scalar::one(), x1), (Scalar::one(), y1)]
  35. ;; Lc1: [(Scalar::one(), x2), (Scalar::one(), y2)]
  36. ;; Lc2: [(Scalar::one(), U)]
  37. ;; (enforce ((scalar::one x1) (scalar::one y1)) ((scalar::one x2) (scalar::one y2) ((scalar::one U)))