mint2.psm 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. constant edwards_d 0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1
  2. constant one 0x0000000000000000000000000000000000000000000000000000000000000001
  3. {% macro square(x2, x) %}
  4. ########################################################
  5. # square({{x2}}, {{x}})
  6. ########################################################
  7. private {{x2}}
  8. set {{x2}} {{x}}
  9. mul {{x2}} {{x}}
  10. lc0_add {{x}}
  11. lc1_add {{x}}
  12. lc2_add {{x2}}
  13. enforce
  14. {% endmacro %}
  15. {% macro jubjub_witness(p, u, v) %}
  16. ########################################################
  17. # jubjub_witness({{p}}, {{u}}, {{v}})
  18. ########################################################
  19. # -u^2 + v^2 = 1 + du^2v^2
  20. {{ square(p + "_u2", u) }}
  21. {{ square(p + "_v2", v) }}
  22. private {{p}}_u2v2
  23. set {{p}}_u2v2 {{p + "_u2"}}
  24. mul {{p}}_u2v2 {{p + "_v2"}}
  25. # on curve check
  26. lc0_sub {{p + "_u2"}}
  27. lc0_add {{p + "_v2"}}
  28. lc1_add_one
  29. lc2_add_one
  30. lc2_add_coeff edwards_d {{p}}_u2v2
  31. enforce
  32. {% endmacro %}
  33. {% macro jubjub_double(p, u, v) %}
  34. ########################################################
  35. # jubjub_double({{p}}, {{u}}, {{v}})
  36. ########################################################
  37. # Compute T = (u + v) * (v - EDWARDS_A*u)
  38. # = (u + v) * (u + v)
  39. private {{p}}_t
  40. set {{p}}_t {{u}}
  41. add {{p}}_t {{v}}
  42. local {{p}}_t1
  43. set {{p}}_t1 {{u}}
  44. add {{p}}_t1 {{v}}
  45. mul {{p}}_t {{p}}_t1
  46. lc0_add {{u}}
  47. lc0_add {{v}}
  48. lc1_add {{u}}
  49. lc1_add {{v}}
  50. lc2_add {{p}}_t
  51. enforce
  52. # Compute A = u * v
  53. private {{p}}_A
  54. set {{p}}_A {{u}}
  55. mul {{p}}_A {{v}}
  56. # Compute C = d*A*A
  57. private {{p}}_C
  58. load {{p}}_C edwards_d
  59. mul {{p}}_C {{p}}_A
  60. mul {{p}}_C {{p}}_A
  61. lc0_add_coeff edwards_d {{p}}_A
  62. lc1_add {{p}}_A
  63. lc2_add {{p}}_C
  64. enforce
  65. # Compute u3 = (2.A) / (1 + C)
  66. private {{p}}_u
  67. set {{p}}_u {{p}}_A
  68. add {{p}}_u {{p}}_A
  69. local {{p}}_u3_t1
  70. load {{p}}_u3_t1 one
  71. add {{p}}_u3_t1 {{p}}_C
  72. divide {{p}}_u {{p}}_u3_t1
  73. lc0_add_one
  74. lc0_add {{p}}_C
  75. lc1_add {{p}}_u
  76. lc2_add {{p}}_A
  77. lc2_add {{p}}_A
  78. enforce
  79. # Compute v3 = (T + (EDWARDS_A-1)*A) / (1 - C)
  80. # = (T - 2.A) / (1 - C)
  81. private {{p}}_v
  82. set {{p}}_v {{p}}_t
  83. local {{p}}_2A
  84. set {{p}}_2A {{p}}_A
  85. add {{p}}_2A {{p}}_A
  86. sub {{p}}_v {{p}}_2A
  87. local {{p}}_v3_t1
  88. load {{p}}_v3_t1 one
  89. sub {{p}}_v3_t1 {{p}}_C
  90. divide {{p}}_v {{p}}_v3_t1
  91. lc0_add_one
  92. lc0_sub {{p}}_C
  93. lc1_add {{p}}_v
  94. lc2_add {{p}}_t
  95. lc2_sub {{p}}_A
  96. lc2_sub {{p}}_A
  97. enforce
  98. {% endmacro %}
  99. {% macro assert_not_small_order(p, u, v) %}
  100. ########################################################
  101. # assert_not_small_order({{p}}, {{u}}, {{v}})
  102. ########################################################
  103. # First doubling
  104. {{ jubjub_double(p + "1", u, v) }}
  105. # Second doubling
  106. {{ jubjub_double(p + "2", p + "1_u", p + "1_v") }}
  107. # Third doubling
  108. {{ jubjub_double(p + "3", p + "2_u", p + "2_v") }}
  109. # (0, -1) is a small order point, but won't ever appear here
  110. # because cofactor is 2^3, and we performed three doublings.
  111. # (0, 1) is the neutral element, so checking if u is nonzero
  112. # is sufficient to prevent small order points here.
  113. # Check u != 0
  114. # Constrain a * inv = 1, which is only valid
  115. # iff a has a multiplicative inverse, untrue
  116. # for zero.
  117. private {{p}}_u3_inv
  118. set {{p}}_u3_inv {{p}}3_u
  119. invert {{p}}_u3_inv
  120. lc0_add {{p}}3_u
  121. lc1_add {{p}}_u3_inv
  122. lc2_add_one
  123. enforce
  124. {% endmacro %}
  125. contract mint_contract
  126. param public_u
  127. param public_v
  128. {{ jubjub_witness("public", "public_u", "public_v") }}
  129. {{ assert_not_small_order("not_small", "public_u", "public_v") }}
  130. {#
  131. {{ jubjub_double("pub_dbl", "public_u", "public_v") }}
  132. # Use this code for testing point doubling
  133. #public dbl_u
  134. #set dbl_u pub_dbl_u
  135. #lc0_add dbl_u
  136. #lc1_add_one
  137. #lc2_add pub_dbl_u
  138. #enforce
  139. #public dbl_v
  140. #set dbl_v pub_dbl_v
  141. #lc0_add dbl_v
  142. #lc1_add_one
  143. #lc2_add pub_dbl_v
  144. #enforce
  145. #}
  146. end