jubjub.psm 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. constant a 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000000
  2. constant d 0x2a9318e74bfa2b48f5fd9207e6bd7fd4292d7f6d37579d2601065fd6d6343eb1
  3. constant one 0x0000000000000000000000000000000000000000000000000000000000000001
  4. {% macro jubjub_add(P, x1, y1, x2, y2) -%}
  5. # Compute U = (x1 + y1) * (y2 - EDWARDS_A*x2)
  6. # = (x1 + y1) * (x2 + y2)
  7. private {{P}}_U
  8. set {{P}}_U {{ x1 }}
  9. add {{P}}_U {{ y1 }}
  10. local {{P}}_tmp
  11. set {{P}}_tmp {{ x2 }}
  12. add {{P}}_tmp {{ y2 }}
  13. mul {{P}}_U {{P}}_tmp
  14. # assert (x1 + y1) * (x2 + y2) == U
  15. lc0_add {{ x1 }}
  16. lc0_add {{ y1 }}
  17. lc1_add {{ x2 }}
  18. lc1_add {{ y2 }}
  19. lc2_add {{P}}_U
  20. enforce
  21. # Compute A = y2 * x1
  22. private {{P}}_A
  23. set {{P}}_A {{ y2 }}
  24. mul {{P}}_A {{ x1 }}
  25. # Compute B = x2 * y1
  26. private {{P}}_B
  27. set {{P}}_B {{ x2 }}
  28. mul {{P}}_B {{ y1 }}
  29. # Compute C = d*A*B
  30. private {{P}}_C
  31. load {{P}}_C d
  32. mul {{P}}_C {{P}}_A
  33. mul {{P}}_C {{P}}_B
  34. # assert (d * A) * (B) == C
  35. lc0_add_coeff d {{P}}_A
  36. lc1_add {{P}}_B
  37. lc2_add {{P}}_C
  38. enforce
  39. # Compute P.x = (A + B) / (1 + C)
  40. private {{P}}_x
  41. set {{P}}_x {{P}}_A
  42. add {{P}}_x {{P}}_B
  43. local {{P}}_x_denom
  44. load {{P}}_x_denom one
  45. add {{P}}_x_denom {{P}}_C
  46. divide {{P}}_x {{P}}_x_denom
  47. lc0_add_one
  48. lc0_add {{P}}_C
  49. lc1_add {{P}}_x
  50. lc2_add {{P}}_A
  51. lc2_add {{P}}_B
  52. enforce
  53. # Compute P.y = (U - A - B) / (1 - C)
  54. private {{P}}_y
  55. set {{P}}_y {{P}}_U
  56. sub {{P}}_y {{P}}_A
  57. sub {{P}}_y {{P}}_B
  58. local {{P}}_y_denom
  59. load {{P}}_y_denom one
  60. sub {{P}}_y_denom {{P}}_C
  61. divide {{P}}_y {{P}}_y_denom
  62. lc0_add_one
  63. lc0_sub {{P}}_C
  64. lc1_add {{P}}_y
  65. lc2_add {{P}}_U
  66. lc2_sub {{P}}_A
  67. lc2_sub {{P}}_B
  68. enforce
  69. {%- endmacro %}
  70. contract input_spend
  71. param x1
  72. param y1
  73. param x2
  74. param y2
  75. {{ jubjub_add("P", "x1", "y1", "x2", "y2") }}
  76. public x3
  77. set x3 P_x
  78. public y3
  79. set y3 P_y
  80. lc0_add x3
  81. lc1_add_one
  82. lc2_add P_x
  83. enforce
  84. lc0_add y3
  85. lc1_add_one
  86. lc2_add P_y
  87. enforce
  88. end