Evaluar un Programa Aritmético Cuadrático (QAP) en una configuración confiable permite a un probador demostrar que un QAP se satisface sin revelar el testigo mientras usa una prueba de tamaño constante.
Específicamente, los polinomios del QAP se evalúan en un punto desconocido τ. La ecuación del QAP
Dado que tenemos 3 filas, significa que nuestros polinomios de interpolación serán de grado 2. Debido a que tenemos 4 columnas, cada matriz resultará en 4 polinomios (para un total de 12 polinomios).
Nos referimos a los puntos generadores de la curva elíptica en los grupos G1 y G2 como G1 y G2 respectivamente. Un elemento en G1 se denota como [X]1. Un elemento en G2 se denota como [X]2. Donde pueda haber ambigüedad con los subíndices referidos a índices en una lista, decimos X∈G1 o X∈G2. Un emparejamiento de curva elíptica entre dos puntos se denota como [X]1∙[Y]2.
Sea L(∗,j) la j-ésima columna de L. En nuestro ejemplo, las filas serán (1,2,3) y las columnas (1,2,3,4). Sea L(L(∗,j)) el polinomio obtenido al ejecutar la interpolación de Lagrange en la j-ésima columna de L usando los valores x(1,2,3) y siendo los valores y los valores de la j-ésima columna.
Puesto que tenemos 4 columnas, obtenemos cuatro polinomios de L
Los grados de los polinomios en el QAP con respecto al tamaño del R1CS
Un par de observaciones sobre los grados de los polinomios en el caso general:
El grado de u(x) y v(x) podría ser tan alto como n−1 porque interpolan n puntos, donde n es el número de filas en el R1CS.
El grado de w(x) podría ser tan bajo como 0 si la suma de los polinomios ∑i=0maiwi(x) da como resultado el polinomio cero, es decir, si los coeficientes se cancelan aditivamente entre sí.
t(x) es de grado n por definición.
Multiplicar polinomios suma sus grados, y dividir polinomios resta sus grados.
Por lo tanto, h(x) será como máximo de grado n−2 porque
degu(x)n−1+degv(x)n−1−degt(x)n=n−2
Expandiendo los términos
Si expandimos las sumas de nuestro ejemplo anterior, obtenemos lo siguiente
En cada uno de los casos, dado que estamos sumando 4 polinomios de grado 2, obtenemos un polinomio de grado 2.
En general, la expresión ∑i=1maipi(x) produce un polinomio con a lo sumo la misma potencia que p(x) (podría ser menor, si por ejemplo (a1w12+a2w22+a3w32+a4w42)x2 sumara 0). Por conveniencia, hemos introducido los coeficientes pia donde i es la potencia del coeficiente y a significa que combinamos los polinomios con el testigo a.
Aquí están los polinomios después de reducirlos de esta manera:
Aquí, ui(τ),vi(τ),wi(τ) significan que los polinomios fueron evaluados usando la cadena de referencia estructurada generada a partir de τ en la configuración confiable, no significa “sustituir τ y evaluar los polinomios”. Dado que τ fue destruido después de la configuración confiable, el valor τ es desconocido.
Hemos calculado la mayor parte del QAP utilizando el srs, pero aún no hemos calculado h(x)t(x):
Recuerde que el grado de t(x) es 3 (generalmente n) y el grado de h(x) es 1 (generalmente n−2). Si los multiplicamos, podríamos obtener hasta un polinomio de grado 3, lo cual es más de lo que proporciona la ceremonia de potencias de tau. En su lugar, la ceremonia de potencias de tau debe ajustarse para proporcionar una cadena de referencia estructurada para h(x)t(x).
La persona que realiza la configuración confiable conoce t(x), que es simplemente (x−1)(x−2)...(x−n). Sin embargo, h(x) es un polinomio calculado por el probador y modificado en base a los valores de a, por lo que no puede conocerse durante la configuración confiable.
Tenga en cuenta que no podemos evaluar h(τ) y t(τ) por separado (usando una cadena de referencia estructurada) y luego emparejarlos. Eso no daría como resultado un elemento G1 que es lo que necesitamos.
SRS para productos de polinomios
Observe que todos los siguientes cálculos dan como resultado el mismo valor:
El polinomio h(x)t(x) evaluado en u, o (h(x)t(x))(u)
h(u) multiplicado por t(u), o h(u)t(u) (h evaluado en u y t evaluado en u)
h(x) multiplicado por la evaluación t(u), luego evaluado en u, es decir (h(x)t(u))(u)
Usaremos el tercer método para calcular h(τ)t(τ). Suponga, sin pérdida de generalidad, que h(x) es 3x2+6x+2 y t(u)=4. El cálculo sería
h(x)t(u)=(3x2+6x+2)⋅4=12x2+24x+8
Si sustituimos u en 12x2+24x+8, eso sería h(u)t(u).
Sin embargo, evaluar este polinomio en τ requeriría que el probador conociera τ. La idea clave aquí es que el cálculo anterior puede estructurarse como:
h(u)t(u)=⟨[3,6,2],[4u2,4u,4]⟩=12u2+24u+8
Si la configuración confiable proporciona [4u2,4u,4], y el probador proporciona [3,6,2], entonces el probador puede calcular h(u)t(u) sin conocer u, porque todo lo que involucra a u está en el vector derecho del producto interno.
Cadena de referencia estructurada para h(τ)t(τ)
Para crear una cadena de referencia estructurada para h(τ)t(τ), creamos n−1 evaluaciones de t(τ) multiplicadas por potencias sucesivas de τ.
(De forma un poco confusa, un polinomio de grado k tiene k+1 términos, por lo tanto generamos k−1 evaluaciones para un polinomio de grado k−2. Tenga en cuenta que Upsilon comienza en n−1 y termina en 0).
Aquí, n es el número de filas en el R1CS, y establecimos que h no puede tener un grado mayor a n−2.
Para usar la cadena de referencia estructurada para calcular h(τ)t(τ), el probador hace lo siguiente:
Ahora unimos todo. Supongamos que tenemos un R1CS con matrices de n filas y m columnas. A partir de esto, podemos aplicar la interpolación de Lagrange para convertirlo en un QAP
Los términos de la suma producirán cada uno un polinomio de grado n−1 (un polinomio de Lagrange tiene un grado menos que el número de puntos que interpola), y el polinomio h(x) tendrá a lo sumo grado n−2, y t(x) tendrá grado n.
Una configuración confiable genera un elemento de campo aleatorio τ y calcula:
El probador publica ([A]1,[B]2,[C]1) y el verificador puede comprobar que
[A]1∙[B]2=?[C]1∙G2
Si el testigo a satisface el QAP, entonces la ecuación anterior estará equilibrada. Pero el hecho de que la ecuación esté equilibrada no garantiza que el probador conozca un a que la satisfaga porque el probador puede publicar puntos arbitrarios de la curva elíptica y el verificador no sabe si realmente se derivan del QAP.
La prueba es muy pequeña
Observe que la prueba solo consta de tres puntos de la curva elíptica. Si un elemento de G1 tiene un tamaño de 64 bytes, y un elemento de G2 tiene un tamaño de 128 bytes, entonces la prueba es de solo 256 bytes. ¡Esto es cierto independientemente del tamaño del R1CS!
Cuanto mayor sea el R1CS, más trabajo tiene el probador, pero el trabajo del verificador permanece constante.
La solución a este problema se describe en el siguiente capítulo sobre el protocolo Groth16.
La prueba sigue siendo de tamaño constante en Groth16, como se puede ver en el código fuente de Tornado Cash en el struct llamado Proof.