jj.rkt 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. #lang racket
  2. (require "zk.rkt")
  3. (struct jj_point
  4. (u v)
  5. )
  6. (define (create_jj_param_point name)
  7. (jj_point
  8. (zk_param (string-append name "_u"))
  9. (zk_param (string-append name "_v"))
  10. )
  11. )
  12. (define (create_jj_public_point name)
  13. (jj_point
  14. (zk_public (string-append name "_u"))
  15. (zk_public (string-append name "_v"))
  16. )
  17. )
  18. (define (zk_jj_add namespace result a b)
  19. (zk_comment "call jj_add()")
  20. (let* ([namespace (append namespace (list "_jj_add"))]
  21. [U (zk_private namespace 'U)]
  22. [A (zk_private namespace 'A)]
  23. [B (zk_private namespace 'B)]
  24. [C (zk_private namespace 'C)]
  25. [tmp (zk_local namespace 'tmp)])
  26. (zk_comment "Compute U = (x1 + y1) * (y2 - EDWARDS_A*x2)")
  27. (zk_comment " = (x1 + y1) * (x2 + y2)")
  28. (zk_set U (jj_point-u a))
  29. (zk_add U (jj_point-v a))
  30. (zk_set tmp (jj_point-u b))
  31. (zk_add tmp (jj_point-v b))
  32. (zk_mul U tmp)
  33. (zk_comment "assert (x1 + y1) * (x2 + y2) == U")
  34. (zk_lc0_add (jj_point-u a))
  35. (zk_lc0_add (jj_point-v a))
  36. (zk_lc1_add (jj_point-u b))
  37. (zk_lc1_add (jj_point-v b))
  38. (zk_lc2_add U)
  39. (zk_enforce)
  40. (zk_comment "Compute A = y2 * x1")
  41. (zk_set A (jj_point-v b))
  42. (zk_mul A (jj_point-u a))
  43. (zk_comment "Compute B = x2 * y1")
  44. (zk_set B (jj_point-u b))
  45. (zk_mul B (jj_point-v a))
  46. (zk_comment "Compute C = d*A*B")
  47. (zk_load C const_d)
  48. (zk_mul C A)
  49. (zk_mul C B)
  50. (zk_comment "assert (d * A) * (B) == C")
  51. (zk_lc0_add_coeff const_d A)
  52. (zk_lc1_add B)
  53. (zk_lc2_add C)
  54. (zk_enforce)
  55. (zk_comment "Compute P.x = (A + B) / (1 + C)")
  56. (zk_set (jj_point-u result) A)
  57. (zk_add (jj_point-u result) B)
  58. ; Re-use the tmp variable from earlier here
  59. (zk_load tmp const_one)
  60. (zk_add tmp C)
  61. (zk_divide (jj_point-u result) tmp)
  62. (zk_lc0_add_one)
  63. (zk_lc0_add C)
  64. (zk_lc1_add (jj_point-u result))
  65. (zk_lc2_add A)
  66. (zk_lc2_add B)
  67. (zk_enforce)
  68. (zk_comment "Compute P.y = (U - A - B) / (1 - C)")
  69. (zk_set (jj_point-v result) U)
  70. (zk_sub (jj_point-v result) A)
  71. (zk_sub (jj_point-v result) B)
  72. ; Re-use the tmp variable from earlier here
  73. (zk_load tmp const_one)
  74. (zk_sub tmp C)
  75. (zk_divide (jj_point-v result) tmp)
  76. (zk_lc0_add_one)
  77. (zk_lc0_sub C)
  78. (zk_lc1_add (jj_point-v result))
  79. (zk_lc2_add U)
  80. (zk_lc2_sub A)
  81. (zk_lc2_sub B)
  82. (zk_enforce)
  83. )
  84. )
  85. (create_zk_output "jj.psm")
  86. (define const_d (zk_constant
  87. "d" "0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1"))
  88. (define const_one (zk_constant
  89. "one" "0x0000000000000000000000000000000000000000000000000000000000000001"))
  90. (zk_contract_begin "foo")
  91. (define namespace (list "_"))
  92. (define a (create_jj_param_point "a"))
  93. (define b (create_jj_param_point "b"))
  94. (define result (create_jj_public_point "result"))
  95. (zk_jj_add namespace result a b)
  96. (zk_contract_end)