def random_polynomial(degree): """ Returns a random polynomial of a prescribed degree which is NOT the zero polynomial. """ leading = FieldElement.random_element( exclude_elements=[FieldElement.zero()]) p = [FieldElement.random_element() for i in range(degree)] + [leading] return Polynomial(p)
def test_compose(): for _ in range(10): outer_poly = random_polynomial(randint(0, 1024)) inner_poly = random_polynomial(randint(0, 16)) # Validate the evaluation of the composition poly outer_poly(inner_poly) on a random point. point_to_eval = FieldElement.random_element() assert ((outer_poly.compose(inner_poly) ).eval(point_to_eval) == outer_poly.eval( inner_poly.eval(point_to_eval)))
def test_poly_interpolation(): for _ in range(10): # Generate a random polynomial. degree = randint(0, 100) p = random_polynomial(degree) # Evaluate it on a number of points that is at least its degree. x_vals = set() while len(x_vals) < degree + 1: x_vals.add(FieldElement.random_element()) x_vals = list(x_vals) y_vals = [p.eval(x) for x in x_vals] # Obtain a polynomial from the evaluation. interpolated_p = interpolate_poly(x_vals, y_vals) # Check equality. assert p == interpolated_p
def test_merkle_get_authentication_path(): for _ in range(10): data_length = randint(0, 2000) data = [FieldElement.random_element() for _ in range(data_length)] m = MerkleTree(data) leaf_id = randint(0, data_length - 1) decommitment = m.get_authentication_path(leaf_id) # Check a correct decommitment. content = data[leaf_id] assert verify_decommitment(leaf_id, content, decommitment, m.root) # Check that altering the decommitment causes verification to fail. altered = decommitment[:] random_index = randint(0, len(altered) - 1) altered[random_index] = sha256( altered[random_index].encode()).hexdigest() assert not verify_decommitment(leaf_id, content, altered, m.root) # Check that altering the content causes verification to fail. other_content = data[randint(0, data_length - 1)] assert not verify_decommitment(leaf_id, other_content, decommitment, m.root) or other_content == content
def test_field_div(): for _ in range(100): t = FieldElement.random_element(exclude_elements=[FieldElement.zero()]) t_inv = FieldElement.one() / t assert t_inv == t.inverse() assert t_inv * t == FieldElement.one()