plonk-naive.sage 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #import numpy as np
  2. from groth_poly_commit import Scalar, poly_commit, create_proof, verify_proof
  3. K = Scalar
  4. #R.<x> = LaurentPolynomialRing(K)
  5. R.<x> = PolynomialRing(K)
  6. var_one = K(1)
  7. var_x = K(4)
  8. var_y = K(6)
  9. var_s = K(1)
  10. var_xy = var_x * var_y
  11. var_x_y = var_x + var_y
  12. var_1_neg_s = var_one - var_s
  13. var_sxy = var_s * var_xy
  14. var_1_neg_s_x_y = var_1_neg_s * var_x_y
  15. #var_s_neg_1 = -var_1_neg_s
  16. var_zero = K(0)
  17. public_value = var_s * (var_x * var_y) + (1 - var_s) * (var_x + var_y)
  18. # x * y = xy
  19. a1 = var_x
  20. b1 = var_y
  21. c1 = var_xy
  22. Ql1 = 0
  23. Qr1 = 0
  24. Qm1 = 1
  25. Qo1 = -1
  26. Qc1 = 0
  27. assert Ql1 * a1 + Qr1 * b1 + Qm1 * a1 * b1 + Qo1 * c1 + Qc1 == 0
  28. # x + y = (x + y)
  29. a2 = var_x
  30. b2 = var_y
  31. c2 = var_x_y
  32. Ql2 = 1
  33. Qr2 = 1
  34. Qm2 = 0
  35. Qo2 = -1
  36. Qc2 = 0
  37. assert Ql2 * a2 + Qr2 * b2 + Qm2 * a2 * b2 + Qo2 * c2 + Qc2 == 0
  38. # 1 - s = (1 - s)
  39. a3 = var_one
  40. b3 = var_s
  41. c3 = var_1_neg_s
  42. Ql3 = 1
  43. Qr3 = -1
  44. Qm3 = 0
  45. Qo3 = -1
  46. Qc3 = 0
  47. assert Ql3 * a3 + Qr3 * b3 + Qm3 * a3 * b3 + Qo3 * c3 + Qc3 == 0
  48. # s * (xy) = sxy
  49. a4 = var_s
  50. b4 = var_xy
  51. c4 = var_sxy
  52. Ql4 = 0
  53. Qr4 = 0
  54. Qm4 = 1
  55. Qo4 = -1
  56. Qc4 = 0
  57. assert Ql4 * a4 + Qr4 * b4 + Qm4 * a4 * b4 + Qo4 * c4 + Qc4 == 0
  58. # (1 - s) * (x + y) = [(1 - s)(x + y)]
  59. a5 = var_1_neg_s
  60. b5 = var_x_y
  61. c5 = var_1_neg_s_x_y
  62. Ql5 = 0
  63. Qr5 = 0
  64. Qm5 = 1
  65. Qo5 = -1
  66. Qc5 = 0
  67. assert Ql5 * a5 + Qr5 * b5 + Qm5 * a5 * b5 + Qo5 * c5 + Qc5 == 0
  68. # (sxy) + [(1 - s)(x + y)] = public_value
  69. a6 = var_sxy
  70. b6 = var_1_neg_s_x_y
  71. # Unused
  72. c6 = var_zero
  73. Ql6 = 1
  74. Qr6 = 1
  75. Qm6 = 0
  76. Qo6 = 0
  77. Qc6 = -public_value
  78. assert Ql6 * a6 + Qr6 * b6 + Qm6 * a6 * b6 + Qo6 * c6 + Qc6 == 0
  79. # one == 1
  80. a7 = var_one
  81. # Unused
  82. b7 = var_zero
  83. # Unused
  84. c7 = var_zero
  85. Ql7 = 1
  86. Qr7 = 0
  87. Qm7 = 0
  88. Qo7 = 0
  89. Qc7 = -1
  90. assert Ql7 * a7 + Qr7 * b7 + Qm7 * a7 * b7 + Qo7 * c7 + Qc7 == 0
  91. a = [a1, a2, a3, a4, a5, a6, a7]
  92. b = [b1, b2, b3, b4, b5, b6, b7]
  93. c = [c1, c2, c3, c4, c5, c6, c7]
  94. Ql = [Ql1, Ql2, Ql3, Ql4, Ql5, Ql6]
  95. Qr = [Qr1, Qr2, Qr3, Qr4, Qr5, Qr6]
  96. Qm = [Qm1, Qm2, Qm3, Qm4, Qm5, Qm6]
  97. Qo = [Qo1, Qo2, Qo3, Qo4, Qo5, Qo6]
  98. Qc = [Qc1, Qc2, Qc3, Qc4, Qc5, Qc6]
  99. # 0 1 2 3 4 5 6
  100. # a: x, x, 1, s, 1 - s, sxy, 1
  101. #
  102. # 7 8 9 10 11 12 13
  103. # b: y, y, s, xy, x + y, (1 - s)(x + y), -
  104. #
  105. # 14 15 16 17 18 19 20
  106. # c: xy, x + y, 1 - s, sxy, (1 - s)(x + y), -, -
  107. permuted_indices = [
  108. 1, 0, 6, 9, 16, 17, 2,
  109. 8, 7, 3, 14, 15, 18, 13,
  110. 10, 11, 4, 5, 12, 19, 20
  111. ]
  112. eval_domain = range(0, len(permuted_indices))
  113. witness = a + b + c
  114. for i, val in enumerate(a + b + c):
  115. assert val == witness[permuted_indices[i]]
  116. #def lagrange(domain, codomain):
  117. # S.<x> = PolynomialRing(K)
  118. # p = S.lagrange_polynomial(zip(eval_domain, permuted_indices))
  119. # # Convert to a Laurent polynomial
  120. # return R(p)
  121. # This is what the prover passes to the verifier
  122. witness_y = R.lagrange_polynomial(enumerate(witness))
  123. assert witness_y(12) == witness[12]
  124. witness_x_a = R.lagrange_polynomial(
  125. zip(eval_domain[0:7], eval_domain[0:7]))
  126. witness_x_b = R.lagrange_polynomial(
  127. zip(eval_domain[7:14], eval_domain[7:14]))
  128. witness_x_c = R.lagrange_polynomial(
  129. zip(eval_domain[14:], eval_domain[14:]))
  130. assert witness_x_a(2) == eval_domain[2]
  131. assert witness_x_b(8) == eval_domain[8]
  132. assert witness_x_c(16) == eval_domain[16]
  133. witness_x_a_prime = R.lagrange_polynomial(
  134. zip(eval_domain[0:7], permuted_indices[0:7]))
  135. witness_x_b_prime = R.lagrange_polynomial(
  136. zip(eval_domain[7:14], permuted_indices[7:14]))
  137. witness_x_c_prime = R.lagrange_polynomial(
  138. zip(eval_domain[14:], permuted_indices[14:]))
  139. assert witness_x_a_prime(2) == permuted_indices[2]
  140. assert witness_x_b_prime(8) == permuted_indices[8]
  141. assert witness_x_c_prime(16) == permuted_indices[16]
  142. v1 = K(2)
  143. v2 = K(3)
  144. px = 1
  145. for i in range(0, len(a)):
  146. px *= v1 + witness_x_a(i) + v2 * witness_y(i)
  147. for i in range(len(a), 2 * len(a)):
  148. px *= v1 + witness_x_b(i) + v2 * witness_y(i)
  149. for i in range(2 * len(a), 3 * len(a)):
  150. px *= v1 + witness_x_c(i) + v2 * witness_y(i)
  151. px_prime = 1
  152. for i in range(0, len(a)):
  153. px_prime *= v1 + witness_x_a_prime(i) + v2 * witness_y(i)
  154. for i in range(len(a), 2 * len(a)):
  155. px_prime *= v1 + witness_x_b_prime(i) + v2 * witness_y(i)
  156. for i in range(2 * len(a), 3 * len(a)):
  157. px_prime *= v1 + witness_x_c_prime(i) + v2 * witness_y(i)
  158. assert px == px_prime