mint2.psm 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. constant edwards_d 0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1
  2. constant one 0x0000000000000000000000000000000000000000000000000000000000000001
  3. constant G_VCR_u 0x6800f4fa0f001cfc7ff6826ad58004b4d1d8da41af03744e3bce3b7793664337
  4. constant G_VCR_v 0x6d81d3a9cb45dedbe6fb2a6e1e22ab50ad46f1b0473b803b3caefab9380b6a8b
  5. constant G_VCV_u 0x273f910d9ecc1615d8618ed1d15fef4e9472c89ac043042d36183b2cb4d7ef51
  6. constant G_VCV_v 0x466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c8d7
  7. {% macro square(x2, x) %}
  8. ########################################################
  9. # square({{x2}}, {{x}})
  10. ########################################################
  11. private {{x2}}
  12. set {{x2}} {{x}}
  13. mul {{x2}} {{x}}
  14. lc0_add {{x}}
  15. lc1_add {{x}}
  16. lc2_add {{x2}}
  17. enforce
  18. {% endmacro %}
  19. {% macro jubjub_witness(p, u, v) %}
  20. ########################################################
  21. # jubjub_witness({{p}}, {{u}}, {{v}})
  22. ########################################################
  23. # -u^2 + v^2 = 1 + du^2v^2
  24. {{ square(p + "_u2", u) }}
  25. {{ square(p + "_v2", v) }}
  26. private {{p}}_u2v2
  27. set {{p}}_u2v2 {{p + "_u2"}}
  28. mul {{p}}_u2v2 {{p + "_v2"}}
  29. # on curve check
  30. lc0_sub {{p + "_u2"}}
  31. lc0_add {{p + "_v2"}}
  32. lc1_add_one
  33. lc2_add_one
  34. lc2_add_coeff edwards_d {{p}}_u2v2
  35. enforce
  36. {% endmacro %}
  37. {% macro jubjub_double(p, u, v) %}
  38. ########################################################
  39. # jubjub_double({{p}}, {{u}}, {{v}})
  40. ########################################################
  41. # Compute T = (u + v) * (v - EDWARDS_A*u)
  42. # = (u + v) * (u + v)
  43. private {{p}}_t
  44. set {{p}}_t {{u}}
  45. add {{p}}_t {{v}}
  46. local {{p}}_t1
  47. set {{p}}_t1 {{u}}
  48. add {{p}}_t1 {{v}}
  49. mul {{p}}_t {{p}}_t1
  50. lc0_add {{u}}
  51. lc0_add {{v}}
  52. lc1_add {{u}}
  53. lc1_add {{v}}
  54. lc2_add {{p}}_t
  55. enforce
  56. # Compute A = u * v
  57. private {{p}}_A
  58. set {{p}}_A {{u}}
  59. mul {{p}}_A {{v}}
  60. # Compute C = d*A*A
  61. private {{p}}_C
  62. load {{p}}_C edwards_d
  63. mul {{p}}_C {{p}}_A
  64. mul {{p}}_C {{p}}_A
  65. lc0_add_coeff edwards_d {{p}}_A
  66. lc1_add {{p}}_A
  67. lc2_add {{p}}_C
  68. enforce
  69. # Compute u3 = (2.A) / (1 + C)
  70. private {{p}}_u
  71. set {{p}}_u {{p}}_A
  72. add {{p}}_u {{p}}_A
  73. local {{p}}_u3_t1
  74. load {{p}}_u3_t1 one
  75. add {{p}}_u3_t1 {{p}}_C
  76. divide {{p}}_u {{p}}_u3_t1
  77. lc0_add_one
  78. lc0_add {{p}}_C
  79. lc1_add {{p}}_u
  80. lc2_add {{p}}_A
  81. lc2_add {{p}}_A
  82. enforce
  83. # Compute v3 = (T + (EDWARDS_A-1)*A) / (1 - C)
  84. # = (T - 2.A) / (1 - C)
  85. private {{p}}_v
  86. set {{p}}_v {{p}}_t
  87. local {{p}}_2A
  88. set {{p}}_2A {{p}}_A
  89. add {{p}}_2A {{p}}_A
  90. sub {{p}}_v {{p}}_2A
  91. local {{p}}_v3_t1
  92. load {{p}}_v3_t1 one
  93. sub {{p}}_v3_t1 {{p}}_C
  94. divide {{p}}_v {{p}}_v3_t1
  95. lc0_add_one
  96. lc0_sub {{p}}_C
  97. lc1_add {{p}}_v
  98. lc2_add {{p}}_t
  99. lc2_sub {{p}}_A
  100. lc2_sub {{p}}_A
  101. enforce
  102. {% endmacro %}
  103. {% macro jubjub_assert_not_small_order(p, u, v) %}
  104. ########################################################
  105. # jubjub_assert_not_small_order({{p}}, {{u}}, {{v}})
  106. ########################################################
  107. # First doubling
  108. {{ jubjub_double(p + "1", u, v) }}
  109. # Second doubling
  110. {{ jubjub_double(p + "2", p + "1_u", p + "1_v") }}
  111. # Third doubling
  112. {{ jubjub_double(p + "3", p + "2_u", p + "2_v") }}
  113. # (0, -1) is a small order point, but won't ever appear here
  114. # because cofactor is 2^3, and we performed three doublings.
  115. # (0, 1) is the neutral element, so checking if u is nonzero
  116. # is sufficient to prevent small order points here.
  117. # Check u != 0
  118. # Constrain a * inv = 1, which is only valid
  119. # iff a has a multiplicative inverse, untrue
  120. # for zero.
  121. private {{p}}_u3_inv
  122. set {{p}}_u3_inv {{p}}3_u
  123. invert {{p}}_u3_inv
  124. lc0_add {{p}}3_u
  125. lc1_add {{p}}_u3_inv
  126. lc2_add_one
  127. enforce
  128. {% endmacro %}
  129. {% macro jubjub_add(P, x1, y1, x2, y2) -%}
  130. # Compute U = (x1 + y1) * (y2 - EDWARDS_A*x2)
  131. # = (x1 + y1) * (x2 + y2)
  132. private {{P}}_U
  133. set {{P}}_U {{ x1 }}
  134. add {{P}}_U {{ y1 }}
  135. local {{P}}_tmp
  136. set {{P}}_tmp {{ x2 }}
  137. add {{P}}_tmp {{ y2 }}
  138. mul {{P}}_U {{P}}_tmp
  139. # assert (x1 + y1) * (x2 + y2) == U
  140. lc0_add {{ x1 }}
  141. lc0_add {{ y1 }}
  142. lc1_add {{ x2 }}
  143. lc1_add {{ y2 }}
  144. lc2_add {{P}}_U
  145. enforce
  146. # Compute A = y2 * x1
  147. private {{P}}_A
  148. set {{P}}_A {{ y2 }}
  149. mul {{P}}_A {{ x1 }}
  150. # Compute B = x2 * y1
  151. private {{P}}_B
  152. set {{P}}_B {{ x2 }}
  153. mul {{P}}_B {{ y1 }}
  154. # Compute C = d*A*B
  155. private {{P}}_C
  156. load {{P}}_C d
  157. mul {{P}}_C {{P}}_A
  158. mul {{P}}_C {{P}}_B
  159. # assert (d * A) * (B) == C
  160. lc0_add_coeff d {{P}}_A
  161. lc1_add {{P}}_B
  162. lc2_add {{P}}_C
  163. enforce
  164. # Compute P.x = (A + B) / (1 + C)
  165. private {{P}}_x
  166. set {{P}}_x {{P}}_A
  167. add {{P}}_x {{P}}_B
  168. local {{P}}_x_denom
  169. load {{P}}_x_denom one
  170. add {{P}}_x_denom {{P}}_C
  171. divide {{P}}_x {{P}}_x_denom
  172. lc0_add_one
  173. lc0_add {{P}}_C
  174. lc1_add {{P}}_x
  175. lc2_add {{P}}_A
  176. lc2_add {{P}}_B
  177. enforce
  178. # Compute P.y = (U - A - B) / (1 - C)
  179. private {{P}}_y
  180. set {{P}}_y {{P}}_U
  181. sub {{P}}_y {{P}}_A
  182. sub {{P}}_y {{P}}_B
  183. local {{P}}_y_denom
  184. load {{P}}_y_denom one
  185. sub {{P}}_y_denom {{P}}_C
  186. divide {{P}}_y {{P}}_y_denom
  187. lc0_add_one
  188. lc0_sub {{P}}_C
  189. lc1_add {{P}}_y
  190. lc2_add {{P}}_U
  191. lc2_sub {{P}}_A
  192. lc2_sub {{P}}_B
  193. enforce
  194. {%- endmacro %}
  195. contract mint_contract
  196. param public_u
  197. param public_v
  198. {{ jubjub_witness("public", "public_u", "public_v") }}
  199. {{ jubjub_assert_not_small_order("not_small", "public_u", "public_v") }}
  200. {% for i in range(256) %}
  201. param vc_randomness_{{i}}
  202. lc0_add vc_randomness_{{i}}
  203. enforce
  204. {% endfor %}
  205. #############
  206. {#
  207. {{ jubjub_double("pub_dbl", "public_u", "public_v") }}
  208. # Use this code for testing point doubling
  209. #public dbl_u
  210. #set dbl_u pub_dbl_u
  211. #lc0_add dbl_u
  212. #lc1_add_one
  213. #lc2_add pub_dbl_u
  214. #enforce
  215. #public dbl_v
  216. #set dbl_v pub_dbl_v
  217. #lc0_add dbl_v
  218. #lc1_add_one
  219. #lc2_add pub_dbl_v
  220. #enforce
  221. #}
  222. end