singleround.sage 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. q = 0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000001
  2. K = GF(q)
  3. a = K(0x00)
  4. b = K(0x05)
  5. E = EllipticCurve(K, (a, b))
  6. G = E(0x40000000000000000000000000000000224698fc0994a8dd8c46eb2100000000, 0x02)
  7. p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
  8. assert E.order() == p
  9. Scalar = GF(p)
  10. a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 = (
  11. Scalar(110), Scalar(56), Scalar(89), Scalar(6543), Scalar(2),
  12. Scalar(110), Scalar(44), Scalar(78), Scalar(77), Scalar(4))
  13. G1, G2, G3, G4, G5, G6, G7, G8, G9, G10 = (
  14. E.random_element(), E.random_element(), E.random_element(),
  15. E.random_element(), E.random_element(), E.random_element(),
  16. E.random_element(), E.random_element(), E.random_element(),
  17. E.random_element())
  18. A = (int(a1) * G1 + int(a2) * G2 + int(a3) * G3 + int(a4) * G4
  19. + int(a5) * G5 + int(a6) * G6 + int(a7) * G7 + int(a8) * G8
  20. + int(a9) * G9 + int(a10) * G10)
  21. # This function is homomorphic, so:
  22. #
  23. # H(a_lo_1, a_hi_1) + H(a_lo_2, a_hi_2) = H(a_lo_1 + a_lo_2, a_hi_1 + a_hi_2)
  24. #
  25. # This function is actually the same as the dot product:
  26. #
  27. # H(a_lo, a_hi) = <a_lo, G_lo> + <a_hi, G_hi>
  28. #
  29. def hash(a_lo, a_hi):
  30. return (int(a_lo[0]) * G1 + int(a_lo[1]) * G2 + int(a_lo[2]) * G3
  31. + int(a_lo[3]) * G4 + int(a_lo[4]) * G5 + int(a_hi[0]) * G6
  32. + int(a_hi[1]) * G7 + int(a_hi[2]) * G8 + int(a_hi[3]) * G9
  33. + int(a_hi[4]) * G10)
  34. x = Scalar.random_element()
  35. zeros = [Scalar(0)] * 5
  36. a_lo = vector([a1, a2, a3, a4, a5])
  37. a_hi = vector([a6, a7, a8, a9, a10])
  38. L = hash(zeros, a_lo)
  39. R = hash(a_hi, zeros)
  40. P = hash(a_lo, a_hi)
  41. # Same value
  42. assert P == A
  43. a_prime = x * a_lo + x^-1 * a_hi
  44. assert len(a_prime) == 5
  45. # See section 3 of the bulletproofs paper
  46. P_prime = hash(x^-1 * a_prime, x * a_prime)
  47. assert P_prime == int(x^2) * L + P + int(x^-2) * R
  48. # Proof is 5 + 2 elements instead of 10 commitments to each value a_i
  49. proof = (L, R, a)
  50. # Using dot product notation, we can write:
  51. #
  52. # P_prime = <a_prime, G>
  53. # = <x a_lo + x^-1 a_hi, x^-1 G_lo + x G_hi>
  54. # = <a_lo, G_lo> + <a_hi, G_hi> + x^2 <a_lo, G_hi> + x^-2 <a_hi, G_lo>
  55. # = P + x^2 L + x^-2 R
  56. #
  57. # See also P_{k - 1} from:
  58. # https://doc-internal.dalek.rs/bulletproofs/notes/inner_product_proof/index.html