Appearance
Towards ZKP
Note that although we have focused on a malicious prover so far, the verifier may deviate from the honest protocol to learn secret data from the verifier. For example, they can choose adaptive off-domain points or collude across multiple openings with the goal of extracting intermediate witness values or private inputs.
Blinding via vanishing-polynomial multiples
To defend against this, we mask each witness polynomial (f(x)) by adding a random multiple of the vanishing polynomial.
Concretely, before committing we form
where
One fresh blinding factor per opening
Each time the verifier opens
which yields one linear equation in the coefficients of
- If the same
were reused for multiple openings, a malicious verifier could gather enough of these equations to solve for , then subtract and recover the original . - To preserve zero-knowledge, we therefore allocate one independent random polynomial
for each distinct off-domain opening query.
Example
Consider the following example for blinding the witness polynomial
python
k = 2
p = R.random_element(degree=k-1)
print("p(x) =", p)
a_blind = a + p*ZH
show(a_blind)
print("Degree of a_blind:",a_blind.degree())
Exercise 18
Assuming
python
beta = gamma = 42
b_blind = #?
c_blind = #?
z_poly = #?
N_poly = #?
D_poly = #?
z_poly_blind = #?
If computed correctly the following check should still pass on the blinded polynomials, because the roots of the polynomial do not change (points of the domain).
python
assert (ZH).divides( z_poly_blind*N_poly -D_poly*z_poly_blind(x*ω)) == True, "Something went wrong"