mint2.psm 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409
  1. constant edwards_d 0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1
  2. constant one 0x0000000000000000000000000000000000000000000000000000000000000001
  3. constant zero 0x0000000000000000000000000000000000000000000000000000000000000000
  4. constant G_VCR_u 0x6800f4fa0f001cfc7ff6826ad58004b4d1d8da41af03744e3bce3b7793664337
  5. constant G_VCR_v 0x6d81d3a9cb45dedbe6fb2a6e1e22ab50ad46f1b0473b803b3caefab9380b6a8b
  6. constant G_VCV_u 0x273f910d9ecc1615d8618ed1d15fef4e9472c89ac043042d36183b2cb4d7ef51
  7. constant G_VCV_v 0x466a7e3a82f67ab1d32294fd89774ad6bc3332d0fa1ccd18a77a81f50667c8d7
  8. {% macro square(x2, x) %}
  9. ########################################################
  10. # square({{x2}}, {{x}})
  11. ########################################################
  12. private {{x2}}
  13. set {{x2}} {{x}}
  14. mul {{x2}} {{x}}
  15. lc0_add {{x}}
  16. lc1_add {{x}}
  17. lc2_add {{x2}}
  18. enforce
  19. {% endmacro %}
  20. {% macro jubjub_witness(p, u, v) %}
  21. ########################################################
  22. # jubjub_witness({{p}}, {{u}}, {{v}})
  23. ########################################################
  24. # -u^2 + v^2 = 1 + du^2v^2
  25. {{ square(p + "_u2", u) }}
  26. {{ square(p + "_v2", v) }}
  27. private {{p}}_u2v2
  28. set {{p}}_u2v2 {{p + "_u2"}}
  29. mul {{p}}_u2v2 {{p + "_v2"}}
  30. # on curve check
  31. lc0_sub {{p + "_u2"}}
  32. lc0_add {{p + "_v2"}}
  33. lc1_add_one
  34. lc2_add_one
  35. lc2_add_coeff edwards_d {{p}}_u2v2
  36. enforce
  37. {% endmacro %}
  38. {% macro jubjub_double(p, u, v) %}
  39. ########################################################
  40. # jubjub_double({{p}}, {{u}}, {{v}})
  41. ########################################################
  42. # Compute T = (u + v) * (v - EDWARDS_A*u)
  43. # = (u + v) * (u + v)
  44. private {{p}}_t
  45. set {{p}}_t {{u}}
  46. add {{p}}_t {{v}}
  47. local {{p}}_t1
  48. set {{p}}_t1 {{u}}
  49. add {{p}}_t1 {{v}}
  50. mul {{p}}_t {{p}}_t1
  51. lc0_add {{u}}
  52. lc0_add {{v}}
  53. lc1_add {{u}}
  54. lc1_add {{v}}
  55. lc2_add {{p}}_t
  56. enforce
  57. # Compute A = u * v
  58. private {{p}}_A
  59. set {{p}}_A {{u}}
  60. mul {{p}}_A {{v}}
  61. # Compute C = d*A*A
  62. private {{p}}_C
  63. load {{p}}_C edwards_d
  64. mul {{p}}_C {{p}}_A
  65. mul {{p}}_C {{p}}_A
  66. lc0_add_coeff edwards_d {{p}}_A
  67. lc1_add {{p}}_A
  68. lc2_add {{p}}_C
  69. enforce
  70. # Compute u3 = (2.A) / (1 + C)
  71. private {{p}}_u
  72. set {{p}}_u {{p}}_A
  73. add {{p}}_u {{p}}_A
  74. local {{p}}_u3_t1
  75. load {{p}}_u3_t1 one
  76. add {{p}}_u3_t1 {{p}}_C
  77. divide {{p}}_u {{p}}_u3_t1
  78. lc0_add_one
  79. lc0_add {{p}}_C
  80. lc1_add {{p}}_u
  81. lc2_add {{p}}_A
  82. lc2_add {{p}}_A
  83. enforce
  84. # Compute v3 = (T + (EDWARDS_A-1)*A) / (1 - C)
  85. # = (T - 2.A) / (1 - C)
  86. private {{p}}_v
  87. set {{p}}_v {{p}}_t
  88. local {{p}}_2A
  89. set {{p}}_2A {{p}}_A
  90. add {{p}}_2A {{p}}_A
  91. sub {{p}}_v {{p}}_2A
  92. local {{p}}_v3_t1
  93. load {{p}}_v3_t1 one
  94. sub {{p}}_v3_t1 {{p}}_C
  95. divide {{p}}_v {{p}}_v3_t1
  96. lc0_add_one
  97. lc0_sub {{p}}_C
  98. lc1_add {{p}}_v
  99. lc2_add {{p}}_t
  100. lc2_sub {{p}}_A
  101. lc2_sub {{p}}_A
  102. enforce
  103. {% endmacro %}
  104. {% macro jubjub_assert_not_small_order(p, u, v) %}
  105. ########################################################
  106. # jubjub_assert_not_small_order({{p}}, {{u}}, {{v}})
  107. ########################################################
  108. # First doubling
  109. {{ jubjub_double(p + "1", u, v) }}
  110. # Second doubling
  111. {{ jubjub_double(p + "2", p + "1_u", p + "1_v") }}
  112. # Third doubling
  113. {{ jubjub_double(p + "3", p + "2_u", p + "2_v") }}
  114. # (0, -1) is a small order point, but won't ever appear here
  115. # because cofactor is 2^3, and we performed three doublings.
  116. # (0, 1) is the neutral element, so checking if u is nonzero
  117. # is sufficient to prevent small order points here.
  118. # Check u != 0
  119. # Constrain a * inv = 1, which is only valid
  120. # iff a has a multiplicative inverse, untrue
  121. # for zero.
  122. private {{p}}_u3_inv
  123. set {{p}}_u3_inv {{p}}3_u
  124. invert {{p}}_u3_inv
  125. lc0_add {{p}}3_u
  126. lc1_add {{p}}_u3_inv
  127. lc2_add_one
  128. enforce
  129. {% endmacro %}
  130. {% macro jubjub_add(P, x1, y1, x2, y2) %}
  131. ########################################################
  132. # jubjub_add({{P}}, {{x1}}, {{y1}}, {{x2}}, {{y2}})
  133. ########################################################
  134. # Compute U = (x1 + y1) * (y2 - EDWARDS_A*x2)
  135. # = (x1 + y1) * (x2 + y2)
  136. private {{P}}_U
  137. set {{P}}_U {{ x1 }}
  138. add {{P}}_U {{ y1 }}
  139. local {{P}}_tmp
  140. set {{P}}_tmp {{ x2 }}
  141. add {{P}}_tmp {{ y2 }}
  142. mul {{P}}_U {{P}}_tmp
  143. # assert (x1 + y1) * (x2 + y2) == U
  144. lc0_add {{ x1 }}
  145. lc0_add {{ y1 }}
  146. lc1_add {{ x2 }}
  147. lc1_add {{ y2 }}
  148. lc2_add {{P}}_U
  149. enforce
  150. # Compute A = y2 * x1
  151. private {{P}}_A
  152. set {{P}}_A {{ y2 }}
  153. mul {{P}}_A {{ x1 }}
  154. # Compute B = x2 * y1
  155. private {{P}}_B
  156. set {{P}}_B {{ x2 }}
  157. mul {{P}}_B {{ y1 }}
  158. # Compute C = d*A*B
  159. private {{P}}_C
  160. load {{P}}_C edwards_d
  161. mul {{P}}_C {{P}}_A
  162. mul {{P}}_C {{P}}_B
  163. # assert (d * A) * (B) == C
  164. lc0_add_coeff edwards_d {{P}}_A
  165. lc1_add {{P}}_B
  166. lc2_add {{P}}_C
  167. enforce
  168. # Compute P.x = (A + B) / (1 + C)
  169. private {{P}}_u
  170. set {{P}}_u {{P}}_A
  171. add {{P}}_u {{P}}_B
  172. local {{P}}_u_denom
  173. load {{P}}_u_denom one
  174. add {{P}}_u_denom {{P}}_C
  175. divide {{P}}_u {{P}}_u_denom
  176. lc0_add_one
  177. lc0_add {{P}}_C
  178. lc1_add {{P}}_u
  179. lc2_add {{P}}_A
  180. lc2_add {{P}}_B
  181. enforce
  182. # Compute P.y = (U - A - B) / (1 - C)
  183. private {{P}}_v
  184. set {{P}}_v {{P}}_U
  185. sub {{P}}_v {{P}}_A
  186. sub {{P}}_v {{P}}_B
  187. local {{P}}_v_denom
  188. load {{P}}_v_denom one
  189. sub {{P}}_v_denom {{P}}_C
  190. divide {{P}}_v {{P}}_v_denom
  191. lc0_add_one
  192. lc0_sub {{P}}_C
  193. lc1_add {{P}}_v
  194. lc2_add {{P}}_U
  195. lc2_sub {{P}}_A
  196. lc2_sub {{P}}_B
  197. enforce
  198. {% endmacro %}
  199. {% macro jubjub_conditionally_select(p, u, v, condition) %}
  200. ########################################################
  201. # jubjub_conditionally_select({{p}}, {{u}}, {{v}}, {{condition}})
  202. ########################################################
  203. # Compute u' = self.u if condition, and 0 otherwise
  204. private {{p}}_u
  205. set {{p}}_u {{u}}
  206. mul {{p}}_u {{condition}}
  207. # condition * u = u'
  208. # if condition is 0, u' must be 0
  209. # if condition is 1, u' must be u
  210. lc0_add {{u}}
  211. lc1_add {{condition}}
  212. lc2_add {{p}}_u
  213. enforce
  214. # Compute v' = self.v if condition, and 1 otherwise
  215. # v' = condition * v + 1 - condition
  216. private {{p}}_v
  217. set {{p}}_v {{v}}
  218. mul {{p}}_v {{condition}}
  219. local {{p}}_one
  220. load {{p}}_one one
  221. add {{p}}_v {{p}}_one
  222. sub {{p}}_v {{condition}}
  223. # condition * v = v' - (1 - condition)
  224. # if condition is 0, v' must be 1
  225. # if condition is 1, v' must be v
  226. lc0_add {{v}}
  227. lc1_add {{condition}}
  228. lc2_add {{p}}_v
  229. lc2_sub_one
  230. lc2_add {{condition}}
  231. enforce
  232. {% endmacro %}
  233. {% macro jubjub_mul(p, u, v, x, n) %}
  234. ########################################################
  235. # jubjub_mul({{p}}, {{u}}, {{v}}, {{x}}, {{n}})
  236. ########################################################
  237. # Performs a scalar multiplication of this twisted Edwards
  238. # point by a scalar represented as a sequence of booleans
  239. # in little-endian bit order.
  240. {% for i in range(n) %}
  241. {% if i == 0 %}
  242. {{ jubjub_conditionally_select(
  243. p + "_this_base_" + i|string,
  244. u,
  245. v,
  246. x + "_" + i|string
  247. ) }}
  248. debug {{x + "_" + i|string}}
  249. debug {{p + "_this_base_" + i|string}}_u
  250. debug {{p + "_this_base_" + i|string}}_v
  251. {% else %}
  252. {{ jubjub_conditionally_select(
  253. p + "_this_base_" + i|string,
  254. p + "_currbase_" + i|string + "_u",
  255. p + "_currbase_" + i|string + "_v",
  256. x + "_" + i|string
  257. ) }}
  258. debug {{x + "_" + i|string}}
  259. debug {{p + "_this_base_" + i|string}}_u
  260. debug {{p + "_this_base_" + i|string}}_v
  261. {% endif %}
  262. {% if i == 0 %}
  263. # Do nothing on first round
  264. {% elif i == 1 %}
  265. {{ jubjub_add(
  266. p + "_result_2",
  267. p + "_this_base_1_u",
  268. p + "_this_base_1_v",
  269. p + "_this_base_0_u",
  270. p + "_this_base_0_v"
  271. ) }}
  272. debug {{p + "_result_" + (i + 1)|string}}_u
  273. debug {{p + "_result_" + (i + 1)|string}}_v
  274. {% elif i == (n - 1) %}
  275. {{ jubjub_add(
  276. p,
  277. p + "_this_base_" + i|string + "_u",
  278. p + "_this_base_" + i|string + "_v",
  279. p + "_result_" + i|string + "_u",
  280. p + "_result_" + i|string + "_v",
  281. ) }}
  282. debug {{p}}_u
  283. debug {{p}}_v
  284. {% else %}
  285. {{ jubjub_add(
  286. p + "_result_" + (i + 1)|string,
  287. p + "_this_base_" + i|string + "_u",
  288. p + "_this_base_" + i|string + "_v",
  289. p + "_result_" + i|string + "_u",
  290. p + "_result_" + i|string + "_v",
  291. ) }}
  292. debug {{p + "_result_" + (i + 1)|string}}_u
  293. debug {{p + "_result_" + (i + 1)|string}}_v
  294. {% endif %}
  295. {% if i == 0 %}
  296. {{ jubjub_double(
  297. p + "_currbase_" + (i + 1)|string,
  298. u,
  299. v
  300. ) }}
  301. {% else %}
  302. {{ jubjub_double(
  303. p + "_currbase_" + (i + 1)|string,
  304. p + "_currbase_" + i|string + "_u",
  305. p + "_currbase_" + i|string + "_v"
  306. ) }}
  307. {% endif %}
  308. {% endfor %}
  309. {% endmacro %}
  310. contract mint_contract
  311. param public_u
  312. param public_v
  313. {{ jubjub_witness("public", "public_u", "public_v") }}
  314. {{ jubjub_assert_not_small_order("not_small", "public_u", "public_v") }}
  315. {% for i in range(256) %}
  316. param vc_randomness_{{i}}
  317. lc0_add vc_randomness_{{i}}
  318. enforce
  319. {% endfor %}
  320. private g_vcr_u
  321. private g_vcr_v
  322. load g_vcr_u G_VCR_u
  323. load g_vcr_v G_VCR_v
  324. {{ jubjub_mul("rcv", "g_vcr_u", "g_vcr_v", "vc_randomness", 256) }}
  325. public rcvu
  326. set rcvu rcv_u
  327. lc0_add rcvu
  328. lc1_add_one
  329. lc2_add rcv_u
  330. enforce
  331. public rcvv
  332. set rcvv rcv_v
  333. lc0_add rcvv
  334. lc1_add_one
  335. lc2_add rcv_v
  336. enforce
  337. #############
  338. {#
  339. {{ jubjub_double("pub_dbl_pre", "public_u", "public_v") }}
  340. private condition
  341. load condition zero
  342. {{ jubjub_conditionally_select("pub_dbl", "pub_dbl_pre_u", "pub_dbl_pre_v", "condition") }}
  343. # Use this code for testing point doubling
  344. public dbl_u
  345. set dbl_u pub_dbl_u
  346. lc0_add dbl_u
  347. lc1_add_one
  348. lc2_add pub_dbl_u
  349. enforce
  350. public dbl_v
  351. set dbl_v pub_dbl_v
  352. lc0_add dbl_v
  353. lc1_add_one
  354. lc2_add pub_dbl_v
  355. enforce
  356. #}
  357. end