mint2.psm 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. constant edwards_d 0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1
  2. constant one 0x0000000000000000000000000000000000000000000000000000000000000001
  3. {% macro square(x2, x) %}
  4. private {{x2}}
  5. set {{x2}} {{x}}
  6. mul {{x2}} {{x}}
  7. lc0_add {{x}}
  8. lc1_add {{x}}
  9. lc2_add {{x2}}
  10. enforce
  11. {% endmacro %}
  12. {% macro jubjub_witness(p, u, v) %}
  13. # -u^2 + v^2 = 1 + du^2v^2
  14. {{ square(p + "_u2", u) }}
  15. {{ square(p + "_v2", v) }}
  16. private {{p}}_u2v2
  17. set {{p}}_u2v2 {{p + "_u2"}}
  18. mul {{p}}_u2v2 {{p + "_v2"}}
  19. # on curve check
  20. lc0_sub {{p + "_u2"}}
  21. lc0_add {{p + "_v2"}}
  22. lc1_add_one
  23. lc2_add_one
  24. lc2_add_coeff edwards_d {{p}}_u2v2
  25. enforce
  26. {% endmacro %}
  27. {% macro jubjub_double(p, u, v) %}
  28. # Compute T = (u + v) * (v - EDWARDS_A*u)
  29. # = (u + v) * (u + v)
  30. private {{p}}_t
  31. set {{p}}_t {{u}}
  32. add {{p}}_t {{v}}
  33. local {{p}}_t1
  34. set {{p}}_t1 {{u}}
  35. add {{p}}_t1 {{v}}
  36. mul {{p}}_t {{p}}_t1
  37. lc0_add {{u}}
  38. lc0_add {{v}}
  39. lc1_add {{u}}
  40. lc1_add {{v}}
  41. lc2_add {{p}}_t
  42. enforce
  43. # Compute A = u * v
  44. private {{p}}_A
  45. set {{p}}_A {{u}}
  46. mul {{p}}_A {{v}}
  47. # Compute C = d*A*A
  48. private {{p}}_C
  49. load {{p}}_C edwards_d
  50. mul {{p}}_C {{p}}_A
  51. mul {{p}}_C {{p}}_A
  52. lc0_add_coeff edwards_d {{p}}_A
  53. lc1_add {{p}}_A
  54. lc2_add {{p}}_C
  55. enforce
  56. # Compute u3 = (2.A) / (1 + C)
  57. private {{p}}_u
  58. set {{p}}_u {{p}}_A
  59. add {{p}}_u {{p}}_A
  60. local {{p}}_u3_t1
  61. load {{p}}_u3_t1 one
  62. add {{p}}_u3_t1 {{p}}_C
  63. divide {{p}}_u {{p}}_u3_t1
  64. lc0_add_one
  65. lc0_add {{p}}_C
  66. lc1_add {{p}}_u
  67. lc2_add {{p}}_A
  68. lc2_add {{p}}_A
  69. enforce
  70. # Compute v3 = (T + (EDWARDS_A-1)*A) / (1 - C)
  71. # = (T - 2.A) / (1 - C)
  72. private {{p}}_v
  73. set {{p}}_v {{p}}_t
  74. local {{p}}_2A
  75. set {{p}}_2A {{p}}_A
  76. add {{p}}_2A {{p}}_A
  77. sub {{p}}_v {{p}}_2A
  78. local {{p}}_v3_t1
  79. load {{p}}_v3_t1 one
  80. sub {{p}}_v3_t1 {{p}}_C
  81. divide {{p}}_v {{p}}_v3_t1
  82. lc0_add_one
  83. lc0_sub {{p}}_C
  84. lc1_add {{p}}_v
  85. lc2_add {{p}}_t
  86. lc2_sub {{p}}_A
  87. lc2_sub {{p}}_A
  88. enforce
  89. {% endmacro %}
  90. contract mint_contract
  91. param public_u
  92. param public_v
  93. {{ jubjub_witness("public", "public_u", "public_v") }}
  94. {{ jubjub_double("pub_dbl", "public_u", "public_v") }}
  95. # Use this code for testing point doubling
  96. #public dbl_u
  97. #set dbl_u pub_dbl_u
  98. #lc0_add dbl_u
  99. #lc1_add_one
  100. #lc2_add pub_dbl_u
  101. #enforce
  102. #public dbl_v
  103. #set dbl_v pub_dbl_v
  104. #lc0_add dbl_v
  105. #lc1_add_one
  106. #lc2_add pub_dbl_v
  107. #enforce
  108. end