| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- import numpy as np
- from groth_poly_commit import K, create_proof, verify_proof
- # Just use the same finite field we put in the polynomial commitment scheme file
- #p = 0x40000000000000000000000000000000224698fc094cf91b992d30ed00000001
- #K = FiniteField(p)
- R.<x, y> = LaurentPolynomialRing(K)
- var_one = K(1)
- var_x = K(4)
- var_y = K(6)
- var_s = K(1)
- var_xy = var_x * var_y
- var_sxy = var_s * var_xy
- var_1_neg_s = var_one - var_s
- var_x_y = var_x + var_y
- var_1_neg_s_x_y = var_1_neg_s * var_x_y
- var_s_neg_1 = -var_1_neg_s
- var_zero = K(0)
- public_v = var_s * (var_x * var_y) + (1 - var_s) * (var_x + var_y)
- a = np.array([
- var_one, var_x, var_xy, var_1_neg_s, var_s
- ])
- b = np.array([
- var_one, var_y, var_s, var_x_y, var_s_neg_1
- ])
- c = np.array([
- var_one, var_xy, var_sxy, var_1_neg_s_x_y, var_zero
- ])
- assert len(a) == len(b)
- assert len(b) == len(c)
- for i, (a_i, b_i, c_i) in enumerate(zip(a, b, c), 1):
- try:
- assert a_i * b_i == c_i
- except AssertionError:
- print("Error for %i" % i)
- raise
- # 1 - s = -(s - 1)
- u1 = np.array([0, 0, 0, 1, 0])
- v1 = np.array([0, 0, 0, 0, 1])
- w1 = np.array([0, 0, 0, 0, 0])
- k1 = 0
- assert a.dot(u1) + b.dot(v1) + c.dot(w1) == k1
- # xy = xy
- u2 = np.array([0, 0, 1, 0, 0])
- v2 = np.array([0, 0, 0, 0, 0])
- w2 = np.array([0, -1, 0, 0, 0])
- k2 = 0
- assert a.dot(u2) + b.dot(v2) + c.dot(w2) == k2
- # s = s
- u3 = np.array([0, 0, 0, 0, -1])
- v3 = np.array([0, 0, 1, 0, 0])
- w3 = np.array([0, 0, 0, 0, 0])
- k3 = 0
- assert a.dot(u3) + b.dot(v3) + c.dot(w3) == k3
- # zero = 0
- u4 = np.array([0, 0, 0, 0, 0])
- v4 = np.array([0, 0, 0, 0, 0])
- w4 = np.array([0, 0, 0, 0, 1])
- k4 = 0
- assert a.dot(u4) + b.dot(v4) + c.dot(w4) == k4
- # 1 - s
- u5 = np.array([1, 0, 0, -1, 0])
- v5 = np.array([0, 0, -1, 0, 0])
- w5 = np.array([0, 0, 0, 0, 0])
- k5 = 0
- assert a.dot(u5) + b.dot(v5) + c.dot(w5) == k5
- # x + y
- u6 = np.array([0, 1, 0, 0, 0])
- v6 = np.array([0, 1, 0, -1, 0])
- w6 = np.array([0, 0, 0, 0, 0])
- k6 = 0
- assert a.dot(u6) + b.dot(v6) + c.dot(w6) == k6
- # Final check:
- # v = s(xy) + (1 - s)(x + y)
- u7 = np.array([0, 0, 0, 0, 0])
- v7 = np.array([0, 0, 0, 0, 0])
- w7 = np.array([0, 0, 1, 1, 0])
- k7 = public_v
- assert a.dot(u7) + b.dot(v7) + c.dot(w7) == k7
- u = np.vstack((u1, u2, u3, u4, u5, u6, u7))
- v = np.vstack((v1, v2, v3, v4, v5, v6, v7))
- w = np.vstack((w1, w2, w3, w4, w5, w6, w7))
- assert u.shape == v.shape
- assert u.shape == w.shape
- k = np.array((k1, k2, k3, k4, k5, k6, k7))
- p = K(0)
- for i, (a_i, b_i, c_i) in enumerate(zip(a, b, c), 1):
- #print(a_i, "\t", b_i, "\t", c_i)
- p += y**i * (a_i * b_i - c_i)
- print(p)
- p = K(0)
- for q, (u_q, v_q, w_q, k_q) in enumerate(zip(u, v, w, k)):
- p += y**q * (a.dot(u_q) + b.dot(v_q) + c.dot(w_q) - k_q)
- print(p)
- n = len(a)
- assert len(b) == n
- assert len(c) == n
- assert u.shape == (7, n)
- assert v.shape == u.shape
- assert w.shape == u.shape
- assert k.shape == (7,)
- r_x_y = 0
- s_x_y = 0
- for i, (a_i, b_i, c_i) in enumerate(zip(a, b, c), 1):
- assert 1 <= i <= n
- r_x_y += x**i * y**i * a_i
- r_x_y += x**-i * y**-i * b_i
- r_x_y += x**(-i - n) * y**(-i - n) * c_i
- u_i = u.T[i - 1]
- v_i = v.T[i - 1]
- w_i = w.T[i - 1]
- u_i_Y = 0
- v_i_Y = 0
- w_i_Y = 0
- for q, (u_q_i, v_q_i, w_q_i) in enumerate(zip(u_i, v_i, w_i), 1):
- assert 1 <= q <= 7
- u_i_Y += y**(q + n) * u_q_i
- v_i_Y += y**(q + n) * v_q_i
- w_i_Y += -y**i - y**(-i) + y**(q + n) * w_q_i
- s_x_y += u_i_Y * x**-i + v_i_Y * x**i + w_i_Y * x**(i + n)
- k_y = 0
- for q, k_q in enumerate(k, 1):
- assert 1 <= q <= 7
- k_y += y**(q + n) * k_q
- # Section 6, Figure 2
- #
- # zkP1
- # 4 blinding factors since we evaluate r(X, Y) 3 times
- # Blind r(X, Y)
- #for i in range(1, 4 + 1):
- # blind_c_i = K.random_element()
- # r_x_y += x**(-2*n - i) * y**(-2*n - i) * blind_c_i
- # Commit to r(X, Y)
- r_prime_x_y = r_x_y + s_x_y
- r_x_1 = r_x_y(y=K(1))
- t_x_y = r_x_1 * r_prime_x_y - k_y
- print(t_x_y.constant_coefficient())
- # zkV1
- # Send a random y
- challenge_y = K.random_element()
- # zkP2
- # Commit to t(X, y)
- t_x = t_x_y(y=challenge_y)
- t_x = t_x.univariate_polynomial()
- print(t_x.constant_coefficient())
- # zkV2
- # Send a random z
- challenge_z = K.random_element()
- # zkP3
- # Evaluate a = r(z, 1)
- a = r_x_y(x=challenge_z, y=K(1))
- # Evaluate b = r(z, y)
- b = r_x_y(x=challenge_z, y=challenge_y)
- # Evaluate t = t(z, y)
- t = t_x_y(x=challenge_z, y=challenge_y)
- # Evaluate s = s(z, y)
- s = s_x_y(x=challenge_z, y=challenge_y)
- # zkV3
- # Recalculate t from a, b and s
- k = k_y(y=challenge_y)
- t_new = a * (b + s) - k
- assert t_new == t
- # Verify polynomial commitments
|