From 5e446de801f30b56cb54759cddcd34ed11e87366 Mon Sep 17 00:00:00 2001 From: Yogesh Swami Date: Mon, 21 Jul 2025 10:44:03 -0700 Subject: [PATCH 1/3] Updating ZK document Updating ZK document with details about sampling randomness. --- .../Zero Knowledge for WHIR.md | 170 ++++++++++++--- .../Zero_Knowledge_for_WHIR.pdf | Bin 0 -> 234840 bytes sage/fri-and-friends/coding_theory.ipynb | 196 ------------------ 3 files changed, 143 insertions(+), 223 deletions(-) create mode 100644 sage/fri-and-friends/Zero_Knowledge_for_WHIR.pdf delete mode 100644 sage/fri-and-friends/coding_theory.ipynb diff --git a/sage/fri-and-friends/Zero Knowledge for WHIR.md b/sage/fri-and-friends/Zero Knowledge for WHIR.md index 46ffab1d..70125bf8 100644 --- a/sage/fri-and-friends/Zero Knowledge for WHIR.md +++ b/sage/fri-and-friends/Zero Knowledge for WHIR.md @@ -4,15 +4,15 @@ The following scheme describes a Zero-Knowledge variant of WHIR as a PCS. The original ideas came from other people. The scheme uses a single run of non-ZK WHIR as a subprotocol. The scheme is zero knowledge in the bounded query model. -Given a witness polynomial $f(x_1,\cdots, x_\mu)$, the protocol works as follows: +Given a multilinear witness polynomial $f(x_1,\cdots, x_\mu)$, the protocol works as follows: 1. Prover ($\mathsf{P}$) masks $f$ by adding a new variable $y$ to create a new randomized *multilinear* polynomial - + $$ \hat{f}(x_1,\cdots,x_{\mu},y) := f(x_1,\cdots,x_{\mu}) + y\cdot \mathsf{msk}(x_1, \cdots, x_\mu) $$ - where $\mathsf{msk}(\vec{x})$ should be random with at least as many non-zero coefficients as the *total* query bound. Furthermore, it must also not evaluate to zero on the NTT evaluation domain. (Looking ahead, the oracle corresponding to $\hat{f}$ will only be queried on NTT evaluation domain and never as part of queries to the Sumcheck protocol.) + where $\mathsf{msk}(\vec{x})$ should be random with at least as many non-zero coefficients as the *total* query bound. Furthermore, it must also not evaluate to zero on the NTT evaluation domain w.h.p. (Looking ahead, the oracle corresponding to $\hat{f}$ will only be queried on NTT evaluation domain and never as part of queries to the Sumcheck protocol.) 2. $\mathsf{P}$ additionally samples a random $\mu + 1$-variate *multilinear polynomial* $g(x_1,\cdots,x_\mu, y)$. 3. **Commitment**: $\mathsf{P}$ commits to $f$ by sending two FRI oracles $([[\hat{f}]], [[g]])$, to the verifier $\mathsf{V}$. @@ -24,9 +24,7 @@ Given a witness polynomial $f(x_1,\cdots, x_\mu)$, the protocol works as follow - $\mathsf{V} \longrightarrow \mathsf{P}$: Verifier sends a random challenge $\rho$ to the prover. Verifier expects $\mathsf{P}$ to prove the claim $$ - \rho\cdot F + G = \rho\cdot f(\vec{a}) + g(\vec{a}, 0) - $$ - Prover and Verifier proceed with non-ZK WHIR opening proof of the previous claim as follows: @@ -34,52 +32,46 @@ Given a witness polynomial $f(x_1,\cdots, x_\mu)$, the protocol works as follow - Creates the **virtual oracle** $L := \rho \cdot [[\hat{f}]] + [[g]]$ and sets it as the first WHIR FRI oracle. - Verifier creates the WHIR weight polynomial $w(z,x_1,\cdots,x_\mu, y) := z\cdot\mathsf{eq}(\vec{x},y;\; \vec{a},0)$. - Verifier runs the standard WHIR Sumcheck rounds receiving new folded FRI oracles as usual. If the prover is honest, the folded FRI oracles will consist of the - folding of the polynomial - - $$ + folding of the polynomial + + $$ h(\vec{x}, y) := \rho\cdot \hat{f}(x_1,\cdots,x_\mu, y) + g(x_1,\cdots,x_\mu, y) - $$ - + $$ + And an honest prover's Sumcheck rounds will prove the claim: - - $$ + + $$ \rho\cdot F + G = \rho\cdot \hat{f}(\vec{a},0) + g(\vec{a},0) = \sum_{\vec{x} \in \{0,1\}^{\mu+1}} \left [\rho\cdot\hat{f}(\vec{x}) + g(\vec{x}) \right ]\mathsf{eq}(\vec{x};\; \vec{a}, 0) - $$ - + $$ + Notice that since $f(\vec{a}) = \hat{f}(\vec{a}, 0)$, the Sumcheck opening proof is indeed a proof of evaluation of $f$ and is therefore binding, in spite of the mask! - + - **OOD Queries**: The verifier should make its out-of-domain (OOD) queries as usual. - **Shift Queries**: At the end of the first Sumcheck round and on receiving the first *folded* oracle corresponding to $h(\vec{x},y)$, the Verifier should compute it's shift-query response using the virtual oracle $L$. For subsequent rounds, the protocol should follow normal WHIR operations. - **Termination Check**: The verifier should do termination check as normal WHIR terminal check, i.e., locally compute the Sumcheck over final $w(z,\vec{x},y)$, with $z$ replaced by the last round of FRI oracle $h(\vec{r},y)$ now sent in clear. Verifier should also check that the final FRI oracle is not a constant, i.e., it must have a non-zero $y$-coefficient. (Degree of $y$ should also be one.) - + Note that at the $\mu$-th Sumcheck round, an honest prover would have sent $$ - h(\vec{r}, y)\cdot \mathsf{eq}(\vec{r}, y; \vec{a},0) = (\rho\cdot[f(\vec{r}) + y\cdot \mathsf{msk}(\vec{r})] + g(\vec{r},y) )\cdot \mathsf{eq}(\vec{r}, y; \vec{a},0) - $$ and the corresponding FRI oracle, sent in clear to the Verifier will be $$ - \rho\cdot[f(\vec{r}) + y\cdot \mathsf{msk}(\vec{r})] + g(\vec{r},y) - $$ where $\vec{r}$ is the randomness sent during Sumcheck. Since the verifier had set $\vec{w}(z,\vec{x},y) = z\cdot\mathsf{eq}(\vec{x},y;\; \vec{a},0)$ at the start of the protocol, the result of locally computing $$ - \sum_{y\in\{0,1\}} h(\vec{r},y)\cdot\mathsf{eq}(\vec{r}, y; \vec{a},0)) = h(\vec{r}, 0) = \rho\cdot f(\vec{r}) + g(\vec{r},0) - $$ - + - Honest Prover - On receiving verifier's challenge $\rho$, the prover starts WHIR PCS evaluation proof for $(\vec{a}, 0)$ on the polynomial $h(\vec{x}, y) = \rho\cdot \hat{f}(x_1,\cdots,x_\mu, y) + g(x_1,\cdots,x_\mu, y)$. However, unlike a standard proof, the Prover should not compute the first proof oracle. - **OOD Queries**: For an out-of-domain (OOD) query $q_o$, the prover should respond with the evaluation of $h\left(\textsf{pow2}(q_o), q_o^{2^\mu}\right )$ (i.e., without setting y to zero) to the verifier. Notice that out-of-domain queries are meant for $h(\vec{x})$, which by construction is blinded by $g$, and therefore doesn't leak information about $f$. @@ -111,7 +103,7 @@ $$ $$ - Prover computes - + $$ G = \sum_{\vec{b}\in \{0,1\}^{\mu}} g(\vec{b}, 0)\cdot W(\vec{b}) $$ @@ -120,7 +112,7 @@ $$ - $\mathsf{P} \longrightarrow \mathsf{V}$: Prover sends the quadruple $(F, G, [[\hat{f}]], [[g]])$ to the verifier. 3. **Proof Verification**: After receiving $(F,G, [[\hat{f}]], [[g]])$, the protocol starts verification as follows: - $\mathsf{V} \longrightarrow \mathsf{P}$: Verifier sends a random challenge $\rho$ to the prover. Verifier expects $\mathsf{P}$ to prove the claim - + $$ \rho\cdot F + G = \sum_{\vec{b}\in \{0,1\}^\mu} [\rho\cdot f(\vec{b}) + g(\vec{b},0)]\cdot W(\vec{b}) $$ @@ -129,7 +121,7 @@ $$ - Verifier: - Creates the **virtual oracle** $L := \rho \cdot [[\hat{f}]] + [[g]]$ and sets it as the first WHIR FRI oracle. - Verifier creates a new WHIR weight polynomial - + $$ \hat{w}(z,x_1,\cdots,x_\mu, y) := z\cdot (1-y) \cdot W(x_1,\cdots, x_\mu) $$ @@ -138,4 +130,128 @@ $$ and runs non-ZK WHIR as usual, expecting $\mathsf{P}$ to prove the $\Sigma$-IOP claim on $\rho\cdot F + G$. - Rest of the protocol should follow the same algorithm for OOD-queries, Shift-queries, and Termination checks as in the case of WHIR PCS. - - Honest Prover should use the weight polynomial computed during the commitment phase, and follow rest of the protocol as in case of WHIR PCS. \ No newline at end of file + - Honest Prover should use the weight polynomial computed during the commitment phase, and follow rest of the protocol as in case of WHIR PCS. + +## Sampling Randomness + +### Sampling $\textsf{msk}$ polynomial + +Assuming desired round-by-round soundness error of $2^{-\lambda}$ and the corresponding first-round query complexity $\frac{\lambda}{1 - \log_2(1+\rho)}$ targeting unique-decoding radius (for the *virtual oracles only*), the number of non-zero coefficients should be set to + +$$ +C(n) := c \cdot n \cdot\frac{\lambda}{1 - \log_2(1+\rho)};\quad 0 < \rho \leq \frac{1}{2} +$$ + +Where $n$ is the number of evaluation points on which the PCS will be opened ($n = 1$ for $\Sigma$-IOP) and $c$ is a small constant ($c \approx 10$ should be sufficient, but $c$ must be strictly greater than the degree of the Sumcheck round polynomial, which in case of WHIR is 2). This number takes into account those coefficients of $\textsf{msk}$ that *may contribute* to the last round of Sumcheck polynomial when $y$ is a free variable. Apart from the last round, coefficients of $\textsf{msk}$ do not contribute any information to Sumcheck round polynomial $h(\vec{x}, y)$. + +### **Sampling Sumcheck blinding polynomial $g(\vec{x}, y)$** + +Since $f(\vec{x})$ is multilinear, it’s sufficient for to sample $g(\vec{x}, y)$ such that $g$ is a linear polynomial in each $x_i$. In more detail, $g$ is the following polynomial + +$$ +g(x_1, \cdots, x_\mu;\; y) = (a_{\mu + 1}\cdot y + b_{\mu+1}) + \sum_{i = 1}^\mu (a_i\cdot x_i + b_i) +$$ + +where for all $i = 1,2,\cdots, \mu +1$, $a_i$ and $b_i$ are sampled uniformly at random from $\mathbb{F}_q$. + +**NOTE:** $g(\vec{x};\; y)$ is an extremely sparse polynomial with only $\mu + 2$ non zero coefficients, and it will be more time and memory efficient to compute the FRI oracle for $g$ using direct evaluation instead of using NTT. + +## Soundness + +Since WHIR has round-by-round soundness, if zk-WHIR verifier accepts, that means the virtual oracle $L := \rho \cdot [[\hat{f}]] + [[g]]$ must have been close to a RS codeword. Therefore, by proximity gaps, with high probability, $\hat{f}$ must be a low degree polynomial in its univariate basis. Therefore, to compute soundness, we need to compute the following probability over the random choices of the WHIR verifier, (namely $\rho,$ Sumcheck round randomness, and STIR and OOD query round randomness): + +$$ +\mathbf{Pr}_\rho[F \neq \hat{f}(\vec{a}, 0)\;|\;\textsf{whir}\,\textsf{accepts} ] +$$ + +Let $\textsf{s}_\textsf{whir}$ be the overall soundness for a non-ZK WHIR verifier. For a given $\rho$, let $H(\rho) := G + \rho\cdot F$ and $h_\rho(\vec{x}, y) := g(\vec{x}, y) + \rho\cdot f(\vec{x}, y)$ . Then + +$$ +\begin{aligned} +& \mathbf{Pr}_\rho[F \neq \hat{f}(\vec{a},0)\;|\; \textsf{whir accepts}] \\ + +&= \mathbf{Pr}_\rho[F \neq \hat{f}(\vec{a},0) \wedge H(\rho) = h_\rho(\vec{a},0) \;|\; \textsf{whir accepts}] \\&\quad+ \mathbf{Pr}_\rho[F \neq \hat{f}(\vec{a},0) \wedge H(\rho) \neq h_\rho(\vec{a},0) \;|\; \textsf{whir accepts}]\\ + +& \leq \mathbf{Pr}_\rho[F \neq \hat{f}(\vec{a},0) \wedge H(\rho) = h_\rho(\vec{a},0)] + \textsf{s}_{\textsf{whir}} +\end{aligned} +$$ + +The last inequality follows from the fact that WHIR has perfect completeness, so $\mathbf{Pr}[H(\rho) = h_\rho(\vec{a}, 0)\;|\; \textsf{whir accepts}] = \frac{1}{1+\textsf{s}_\textsf{whir}}$ and $\mathbf{Pr}[H(\rho) \neq h_\rho(\vec{a}, 0)\;|\; \textsf{whir accepts}] = \frac{\textsf{s}_\textsf{whir}}{1+\textsf{s}_\textsf{whir}}$. + +Furthermore, + +$$ +\begin{aligned} +&\mathbf{Pr}_\rho[F \neq \hat{f}(\vec{a}, 0) \wedge H(\rho) = h_\rho(\vec{a},0)] \\ + +&= \mathbf{Pr}_\rho[H(\rho) = h_\rho(\vec{a},0) | F \neq \hat{f}(\vec{a}, 0)]\cdot \mathbf{Pr}_\rho[F \neq \hat{f}(\vec{a}, 0)] \\ + +&= \mathbf{Pr}_\rho[H(\rho) = h_\rho(\vec{a},0) | F \neq \hat{f}(\vec{a}, 0)] \\ + +&= \mathbf{Pr}_\rho\left[\rho = \frac{g(\vec{a}, 0) - G}{F - \hat{f}(\vec{a}, 0)} | F \neq \hat{f}(\vec{a}, 0)\right ] \\ + +&= \frac{1}{|\mathbb{F}_q|} + +\end{aligned} +$$ + +Therefore: + +$$ +\mathbf{Pr}_\rho[F \neq \hat{f}(\vec{a},0)\;|\; \textsf{whir accepts}] \leq \frac{1}{|\mathbb{F}_q|} + \textsf{s}_\textsf{whir} +$$ + +**NOTE**: This only establishes a bound for $\hat{f}(\vec{a}, 0)$ and not on $f(\vec{a}).$ Since a polynomial commitment only needs to be binding, the above scheme is sufficient, because given a commitment $\mathcal{C}$ and an evaluation point $\vec{a}$, the above scheme cannot be opened as two different values $F$ and $F'$ for the same $\mathcal{C}$. + +However, for a randomized commitment scheme where the same polynomial $f(\vec{x})$ can have multiple random commitments, a stronger notion of binding is possible. Let $\mathcal{C}_1,\cdots,\mathcal{C}_t \xleftarrow{\$} \textsf{commit}(f)$ be the randomized commitments for the same polynomial $f(x)$ let $\vec{a}$ be an arbitrarily chosen evaluation point. Then the randomized commitment scheme is strongly binding if opening any $\mathcal{C}_i$ at $\vec{a}$ must return the same value with w.h.p., i.e., $\forall \vec{a} \in \mathbb{F}_q^n :\;\mathbf{Pr}_{i \neq j}[\textsf{open}(\mathcal{C}_i, \vec{a}) \neq \textsf{open}(\mathcal{C}_j, \vec{a})] < \textsf{negl(n)}$. + +The zk-WHIR protocol described above can be trivially modified to achieve this stronger notion of binding: Instead of setting $y = 0$ deterministically, if $y$ is chosen uniformly at random by the verifier (and the weight polynomial computed accordingly), the resulting scheme is guaranteed to open to the same value except with probability $1/|\mathbb{F}_q|$. To achieve this, steps-4 and 5 should be modified as follows: + +1. **Opening**: Verifier sends the evaluation point $\vec{a} := (a_1, \cdots, a_\mu)$ to the prover who opens $f$ by computing the following: + - Honest Prover computes $F = f(a_1, \cdots, a_\mu)$ + - Honest Prover computes $F' := \textsf{msk}(a_1, \cdots, a_\mu)$ + - Honest Prover writes $g(x_1,\cdots, x_\mu, y) := g_1(x_1,\cdots, x_\mu) + y\cdot g_1(x_1,\cdots, x_\mu)$. Since $g(x_1,\cdots,x_\mu, y)$ is expected to be multilinear for a honest prover, this form of decomposition is always possible. + - Honest Prover computes $G := g_1(a_1, \cdots, a_\mu)$ and $G' := g_2(a_1, \cdots, a_\mu)$ + - $\mathsf{P} \longrightarrow \mathsf{V}$: Prover sends *four field elements* $(F, F', G, G')$ to the verifier. +2. **Proof Verification**: After receiving $(F, F', G, G')$, the protocol starts verification as follows: + - $\mathsf{V} \longrightarrow \mathsf{P}$: Verifier sends *two random challenges* $\rho$ and $\gamma$ to the prover. Verifier expects $\mathsf{P}$ to prove the claim. + + $$ + \rho\cdot (F + \gamma\cdot F') + (G + \gamma\cdot G') = \rho\cdot \hat{f}(\vec{a}, \gamma) + g(\vec{a}, \gamma) + $$ + + - Prover and Verifier proceed with non-ZK WHIR opening proof of the previous claim as follows: + - Verifier: + - Creates the **virtual oracle** $L := \rho \cdot [[\hat{f}]] + [[g]]$ and sets it as the first WHIR FRI oracle. + - Verifier creates the WHIR weight polynomial $w(z,x_1,\cdots,x_\mu, y) := z\cdot\mathsf{eq}(\vec{x},y;\; \vec{a},\gamma)$. + - Verifier runs the standard WHIR Sumcheck rounds receiving new folded FRI oracles as usual. If the prover is honest, the folded FRI oracles will consist of the + folding of the polynomial + + $$ + + h(\vec{x}, y) := \rho\cdot \hat{f}(x_1,\cdots,x_\mu, y) + g(x_1,\cdots,x_\mu, y) + + $$ + + And an honest prover's Sumcheck rounds will prove the claim: + + $$ + + \rho\cdot F + G + \gamma\cdot(\rho\cdot F' + G') = \rho\cdot \hat{f}(\vec{a},\gamma) + g(\vec{a},\gamma) = \sum_{\vec{x} \in \{0,1\}^{\mu+1}} \left [\rho\cdot\hat{f}(\vec{x}) + g(\vec{x}) \right ]\mathsf{eq}(\vec{x};\; \vec{a}, \gamma) + + $$ + + Notice that since $\gamma$ is chosen randomly by the verifier, the probability with which two different randomized commitments can open to different values is $O(\frac{1}{|\mathbb{F}_q|})$, i.e., + + $$ + \begin{aligned} & \mathbf{Pr}_{\gamma_i \in \mathbb{F}_q^\times }\left[F_1 + \gamma_1\cdot F'_1 = F_2 + \gamma_2\cdot F'_2 \quad|\quad F_1 \neq F_2 \right] \\ + &= \sum_{\gamma\in \mathbb{F}_q^\times}\mathbf{Pr}_{\gamma_1}\left[F_1 + \gamma_1\cdot F'_1 = F_2 + \gamma\cdot F'_2 \;|\; (F_1 \neq F_2) \wedge (\gamma_2 = \gamma) \right]\cdot \mathbf{Pr}[\gamma_2 = \gamma ] \\ + &= \sum_{\gamma\in \mathbb{F}_q^\times}\mathbf{Pr}_{\gamma_1}\left[\frac{1}{\gamma_1} = \frac{F'_1}{(F_2 + \gamma\cdot F'_2 - F_1)}\;|\; (F_1 \neq F_2) \wedge (\gamma_2 = \gamma) \right]\cdot \mathbf{Pr}[\gamma_2 = \gamma ] \\ + + &= \sum_{\gamma\in \mathbb{F}_q^\times}\frac{1}{|\mathbb{F}_q| - 1} \cdot \mathbf{Pr}[\gamma_2 = \gamma ] \\ + + &= \sum_{\gamma\in \mathbb{F}_q^\times} \left (\frac{1}{|\mathbb{F}_q| - 1} \right )^2 \\ + + &= \frac{1}{|\mathbb{F}_q|-1} + \end{aligned} + $$ \ No newline at end of file diff --git a/sage/fri-and-friends/Zero_Knowledge_for_WHIR.pdf b/sage/fri-and-friends/Zero_Knowledge_for_WHIR.pdf new file mode 100644 index 0000000000000000000000000000000000000000..5c5687765ab369c3739c5759da9d9e409340973c GIT binary patch literal 234840 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