jubjub.py 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. from finite_fields.modp import IntegersModP
  2. q = 0x73eda753299d7d483339d80809a1d80553bda402fffe5bfeffffffff00000001
  3. modq = IntegersModP(q)
  4. a = modq(-1)
  5. print("a:", hex(a.n))
  6. d = -(modq(10240)/modq(10241))
  7. params = (a, d)
  8. def is_jubjub(params, x, y):
  9. a, d = params
  10. return a * x**2 + y**2 == 1 + d * x**2 * y**2
  11. def add(params, point_1, point_2):
  12. # From here: https://z.cash/technology/jubjub/
  13. a, d = params
  14. x1, y1 = point_1
  15. x2, y2 = point_2
  16. x3 = (x1 * y2 + y1 * x2) / (1 + d * x1 * x2 * y1 * y2)
  17. y3 = (y1 * y2 + x1 * x2) / (1 - d * x1 * x2 * y1 * y2)
  18. return (x3, y3)
  19. def fake_zk_add(params, point_1, point_2):
  20. # From here: https://z.cash/technology/jubjub/
  21. a, d = params
  22. x1, y1 = point_1
  23. x2, y2 = point_2
  24. # Compute U = (u1 + v1) * (v2 - EDWARDS_A*u2)
  25. # = (u1 + v1) * (u2 + v2)
  26. U = (x1 + y1) * (x2 + y2)
  27. assert (x1 + y1) * (x2 + y2) == U
  28. # Compute A = v2 * u1
  29. A = y2 * x1
  30. # Compute B = u2 * v1
  31. B = x2 * y1
  32. # Compute C = d*A*B
  33. C = d * A * B
  34. assert (d * A) * (B) == C
  35. # Compute u3 = (A + B) / (1 + C)
  36. # NOTE: make sure we check for (1 + C) has an inverse
  37. u3 = (A + B) / (1 + C)
  38. assert (1 + C) * (u3) == (A + B)
  39. # Compute v3 = (U - A - B) / (1 - C)
  40. # We will also need to check inverse here as well.
  41. v3 = (U - A - B) / (1 - C)
  42. assert (1 - C) * (v3) == (U - A - B)
  43. return u3, v3
  44. x = 0x15a36d1f0f390d8852a35a8c1908dd87a361ee3fd48fdf77b9819dc82d90607e
  45. y = 0x015d8c7f5b43fe33f7891142c001d9251f3abeeb98fad3e87b0dc53c4ebf1891
  46. x3, y3 = add(params, (x, y), (x, y))
  47. print(hex(x3.n), hex(y3.n))
  48. u3, v3 = fake_zk_add(params, (x, y), (x, y))
  49. print(hex(u3.n), hex(v3.n))
  50. print(is_jubjub(params, x, y))
  51. print(is_jubjub(params, x3, y3))
  52. print()
  53. print("Identity (0, 1) is jubjub?", is_jubjub(params, 0, 1))
  54. print("Torsion (0, -1) is jubjub?", is_jubjub(params, 0, -1))
  55. double_torsion = add(params, (0, -1), (0, -1))
  56. print("Double torsion is:", hex(double_torsion[0].n), hex(double_torsion[1].n))
  57. dbl_ident = add(params, (0, 1), (0, 1))
  58. print("Double identity is:", hex(dbl_ident[0].n), hex(dbl_ident[1].n))