sonic.sage 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. import numpy as np
  2. p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
  3. K = FiniteField(p)
  4. R.<x, y> = LaurentPolynomialRing(K)
  5. var_one = K(1)
  6. var_x = K(4)
  7. var_y = K(6)
  8. var_s = K(1)
  9. var_xy = var_x * var_y
  10. var_sxy = var_s * var_xy
  11. var_1_neg_s = var_one - var_s
  12. var_x_y = var_x + var_y
  13. var_1_neg_s_x_y = var_1_neg_s * var_x_y
  14. var_s_neg_1 = -var_1_neg_s
  15. var_zero = K(0)
  16. public_v = var_s * (var_x * var_y) + (1 - var_s) * (var_x + var_y)
  17. a = np.array([
  18. var_one, var_x, var_xy, var_1_neg_s, var_s
  19. ])
  20. b = np.array([
  21. var_one, var_y, var_s, var_x_y, var_s_neg_1
  22. ])
  23. c = np.array([
  24. var_one, var_xy, var_sxy, var_1_neg_s_x_y, var_zero
  25. ])
  26. assert len(a) == len(b)
  27. assert len(b) == len(c)
  28. for i, (a_i, b_i, c_i) in enumerate(zip(a, b, c), 1):
  29. try:
  30. assert a_i * b_i == c_i
  31. except AssertionError:
  32. print("Error for %i" % i)
  33. raise
  34. # 1 - s = -(s - 1)
  35. u1 = np.array([0, 0, 0, 1, 0])
  36. v1 = np.array([0, 0, 0, 0, 1])
  37. w1 = np.array([0, 0, 0, 0, 0])
  38. k1 = 0
  39. assert a.dot(u1) + b.dot(v1) + c.dot(w1) == k1
  40. # xy = xy
  41. u2 = np.array([0, 0, 1, 0, 0])
  42. v2 = np.array([0, 0, 0, 0, 0])
  43. w2 = np.array([0, -1, 0, 0, 0])
  44. k2 = 0
  45. assert a.dot(u2) + b.dot(v2) + c.dot(w2) == k2
  46. # s = s
  47. u3 = np.array([0, 0, 0, 0, -1])
  48. v3 = np.array([0, 0, 1, 0, 0])
  49. w3 = np.array([0, 0, 0, 0, 0])
  50. k3 = 0
  51. assert a.dot(u3) + b.dot(v3) + c.dot(w3) == k3
  52. # zero = 0
  53. u4 = np.array([0, 0, 0, 0, 0])
  54. v4 = np.array([0, 0, 0, 0, 0])
  55. w4 = np.array([0, 0, 0, 0, 1])
  56. k4 = 0
  57. assert a.dot(u4) + b.dot(v4) + c.dot(w4) == k4
  58. # 1 - s
  59. u5 = np.array([1, 0, 0, -1, 0])
  60. v5 = np.array([0, 0, -1, 0, 0])
  61. w5 = np.array([0, 0, 0, 0, 0])
  62. k5 = 0
  63. assert a.dot(u5) + b.dot(v5) + c.dot(w5) == k5
  64. # x + y
  65. u6 = np.array([0, 1, 0, 0, 0])
  66. v6 = np.array([0, 1, 0, -1, 0])
  67. w6 = np.array([0, 0, 0, 0, 0])
  68. k6 = 0
  69. assert a.dot(u6) + b.dot(v6) + c.dot(w6) == k6
  70. # Final check:
  71. # v = s(xy) + (1 - s)(x + y)
  72. u7 = np.array([0, 0, 0, 0, 0])
  73. v7 = np.array([0, 0, 0, 0, 0])
  74. w7 = np.array([0, 0, 1, 1, 0])
  75. k7 = public_v
  76. assert a.dot(u7) + b.dot(v7) + c.dot(w7) == k7
  77. u = np.vstack((u1, u2, u3, u4, u5, u6, u7))
  78. v = np.vstack((v1, v2, v3, v4, v5, v6, v7))
  79. w = np.vstack((w1, w2, w3, w4, w5, w6, w7))
  80. assert u.shape == v.shape
  81. assert u.shape == w.shape
  82. k = np.array((k1, k2, k3, k4, k5, k6, k7))
  83. p = K(0)
  84. for i, (a_i, b_i, c_i) in enumerate(zip(a, b, c), 1):
  85. #print(a_i, "\t", b_i, "\t", c_i)
  86. p += y**i * (a_i * b_i - c_i)
  87. print(p)
  88. p = K(0)
  89. for q, (u_q, v_q, w_q, k_q) in enumerate(zip(u, v, w, k)):
  90. p += y**q * (a.dot(u_q) + b.dot(v_q) + c.dot(w_q) - k_q)
  91. print(p)
  92. n = len(a)
  93. assert len(b) == n
  94. assert len(c) == n
  95. assert u.shape == (7, n)
  96. assert v.shape == u.shape
  97. assert w.shape == u.shape
  98. assert k.shape == (7,)
  99. r_x_y = 0
  100. s_x_y = 0
  101. for i, (a_i, b_i, c_i) in enumerate(zip(a, b, c), 1):
  102. assert 1 <= i <= n
  103. r_x_y += x**i * y**i * a_i
  104. r_x_y += x**-i * y**-i * b_i
  105. r_x_y += x**(-i - n) * y**(-i - n) * c_i
  106. u_i = u.T[i - 1]
  107. v_i = v.T[i - 1]
  108. w_i = w.T[i - 1]
  109. u_i_Y = 0
  110. v_i_Y = 0
  111. w_i_Y = 0
  112. for q, (u_q_i, v_q_i, w_q_i) in enumerate(zip(u_i, v_i, w_i), 1):
  113. assert 1 <= q <= 7
  114. u_i_Y += y**(q + n) * u_q_i
  115. v_i_Y += y**(q + n) * v_q_i
  116. w_i_Y += -y**i - y**(-i) + y**(q + n) * v_q_i
  117. s_x_y += u_i_Y * x**-i + v_i_Y * x**i + w_i_Y * x**(i + n)
  118. k_y = 0
  119. for q, k_q in enumerate(k, 1):
  120. assert 1 <= q <= 7
  121. k_y += y**(q + n) * k_q
  122. # Section 6, Figure 2
  123. #
  124. # zkP1
  125. # 4 blinding factors since we evaluate r(X, Y) 3 times
  126. # Blind r(X, Y)
  127. for i in range(1, 4 + 1):
  128. blind_c_i = K.random_element()
  129. r_x_y += x**(-2*n - i) * y**(-2*n - i) * blind_c_i
  130. # Commit to r(X, Y)
  131. r_prime_x_y = r_x_y + s_x_y
  132. r_x_1 = r_x_y(y=K(1))
  133. t_x_y = r_x_1 * r_prime_x_y - k_y
  134. print(t_x_y.constant_coefficient())
  135. # zkV1
  136. # Send a random y
  137. challenge_y = K.random_element()
  138. # zkP2
  139. # Commit to t(X, y)
  140. # zkV2
  141. # Send a random z
  142. challenge_z = K.random_element()
  143. # zkP3
  144. # Evaluate a = r(z, 1)
  145. a = r_x_y(x=challenge_z, y=K(1))
  146. # Evaluate b = r(z, y)
  147. b = r_x_y(x=challenge_z, y=challenge_y)
  148. # Evaluate t = t(z, y)
  149. t = t_x_y(x=challenge_z, y=challenge_y)
  150. # Evaluate s = s(z, y)
  151. s = s_x_y(x=challenge_z, y=challenge_y)
  152. # zkV3
  153. # Recalculate t from a, b and s
  154. k = k_y(y=challenge_y)
  155. t_new = a * (b + s) - k
  156. assert t_new == t
  157. # Verify polynomial commitments