Usando el esquema de compromiso polinómico del capítulo anterior, un probador (prover) puede demostrar que tiene tres polinomios l(x), r(x) y t(x) y probar que t(x)=l(x)r(x).
Para que este algoritmo funcione, el verificador debe creer que las evaluaciones polinómicas son correctas – pero esto es algo que mostramos en el capítulo anterior. La mayoría de los pasos aquí son simplemente repetir el algoritmo de compromiso polinómico que hicimos previamente.
A un alto nivel, el probador se compromete con l(x), r(x) y t(x) y envía los compromisos al verificador. Luego, el verificador elige un valor aleatorio para x como u y le pide al probador que evalúe los polinomios en u. El verificador entonces comprueba que las evaluaciones se hicieron correctamente y que la evaluación de l(x) multiplicada por la evaluación de r(x) es igual a la evaluación de t(x).
Por ejemplo, supongamos que el primer polinomio es l(x)=2x y el segundo es r(x)=x+1. Entonces t(x)=2x(x+1)=2x2+2. El verificador puede muestrear cualquier valor aleatorio x, y el resultado del producto l(x)r(x) será t(x). El gráfico a continuación muestra un ejemplo donde el verificador elige x=2:
El verificador luego comprobaría que 3×4=12 y aceptaría la afirmación del probador.
El lema de Schwartz-Zippel establece que si f(x)=g(x) entonces la probabilidad de que f(u)=g(u) para algún valor aleatorio u es menor que d/p donde d es el grado máximo de los dos polinomios y p es el orden del campo finito. Si d≪p (d mucho menor que p), entonces la probabilidad de que u sea un punto de intersección de dos polinomios no iguales es insignificante.
Específicamente, supongamos que el probador está mintiendo y l(x)r(x)=t(x). En ese caso, para un u aleatorio, l(u)r(u)=t(u) con una probabilidad extremadamente alta. Si l(x)r(x)=t(x), entonces l(x)r(x) y t(x) solo se intersectan en como máximo d puntos (el grado máximo ya sea de l(x)r(x) o de t(x)), y es extremadamente improbable que el verificador elija aleatoriamente un u que sea uno de los d puntos de intersección.
Para tener una idea de la escala, d en nuestro caso es 2, pero el orden de la curva de nuestras curvas elípticas (y por lo tanto el orden del campo) es de aproximadamente 2254. Así que si t(x)=l(x)r(x), entonces la probabilidad de t(u)=l(u)r(u) es 1/2253, la cual es insignificantemente pequeña.
Ahora describimos el algoritmo en detalle, y luego mostramos una optimización.
Pasos para probar el conocimiento de la multiplicación de polinomios
El probador se compromete con dos polinomios lineales (de grado 1) l(x), r(x), un polinomio cuadrático (de grado 2) t(x), y envía los compromisos al verificador. El verificador responde con un valor aleatorio u, y el probador evalúa lu=l(u), ru=r(u), y tu=t(u) junto con las pruebas de evaluación πl,πr,πt. El verificador comprueba que todos los polinomios fueron evaluados correctamente y que tu=luru.
Configuración
El probador y el verificador acuerdan los puntos de la curva elíptica G y B con una relación de logaritmo discreto desconocida (es decir, los puntos se eligen aleatoriamente).
Por lo tanto, necesitan producir un total de 7 compromisos de Pedersen para cada uno de los coeficientes, lo que requerirá siete términos de cegamiento α0,α1,β0,β1,τ0,τ1,τ2
L0L1R0R1T0T1T2=aG+α0B=sLG+α1B=bG+β0B=sRG+β1B=abG+τ0B=(asR+bsL)G+τ1B=sLsRG+τ2B// coeficiente constante de l(x)// coeficiente lineal de l(x)// coeficiente constante de r(x)// coeficiente lineal de r(x)// coeficiente constante de t(x)// coeficiente lineal de t(x)// coeficiente cuadraˊtico de t(x)
El probador envía (L0,L1,R0,R1,T0,T1,T2) al verificador.
El verificador genera un escalar aleatorio u
… y envía el elemento del campo u al probador.
El probador evalúa los tres polinomios y crea tres pruebas
El probador sustituye u en los polinomios y calcula la suma de los términos de cegamiento de los compromisos de los coeficientes polinómicos cuando se aplica u.
El probador envía los valores (lu,ru,tu,πl,πr,πt) al verificador. Ten en cuenta que todos estos son elementos del campo, no puntos de la curva elíptica.
Paso final de verificación
El verificador comprueba que cada uno de los polinomios fue evaluado correctamente y que la evaluación de t(u) es el producto de la evaluación de l(u) y r(u). Las primeras tres comprobaciones son pruebas de que el polinomio se evaluó correctamente con respecto al compromiso de los coeficientes, y la última comprobación verifica que la salida de los polinomios tiene la relación de producto afirmada.
luG+πlBruG+πrBtuG+πtBtu=?L0+L1u=?R0+R1u=?T0+T1u+T2u2=?luru// Comprobar que l(u) fue evaluado correctamente// Comprobar que r(u) fue evaluado correctamente// Comprobar que t(u) fue evaluado correctamente// Comprobar que t(u)=l(u)r(u)
Cuando expandimos los términos, vemos que se equilibran si el probador fue honesto:
En el primer paso, el probador envía 7 puntos de la curva elíptica, y en el paso final, el verificador comprueba 4 igualdades. Podemos mejorar el algoritmo para enviar solo 5 puntos de la curva elíptica y hacer 3 comprobaciones de igualdad.
Esto se hace poniendo los coeficientes constantes de l(x) y r(x) en un solo compromiso y los coeficientes lineales de esos polinomios en un compromiso separado. A modo de recordatorio, definimos l(x) y r(x) como
l(x)r(x)=a+sLx=b+sRx
así que a y b son los coeficientes constantes, y sL y sR son los coeficientes lineales.
Esto es similar a cómo comprometeríamos un vector. En cierto sentido, estamos comprometiendo los coeficientes constantes como un vector y los coeficientes lineales como otro vector.
Configuración
Durante la configuración, ahora necesitamos 3 puntos de la curva elíptica: G, H y B.
Compromiso polinómico
AST0T1T2=aG+bH+αB=sLG+sRH+βB=abG+τ0B=(asR+bsL)G+τ1B=sLsRG+τ2B// comprometer los teˊrminos constantes// comprometer los teˊrminos lineales// comprometer el coeficiente constante de t(x)// coeficiente lineal de t(x)// coeficiente cuadraˊtico de t(x)
Nota que los coeficientes de l(x) se aplican a G y los coeficientes de r(x) se aplican a H. El probador envía (A,S,T0,T1,T2) al verificador, quien responde con u.
lu, ru, tu, πlr y πt se calculan como antes, pero la prueba de evaluaciones para l(x) y r(x), que antes eran πl y πr, se combinan en una sola: πlr.
Con cierta reorganización en el lado izquierdo, podemos ver que la comprobación de igualdad verifica simultáneamente que tanto l(x) como r(x) fueron evaluados correctamente.
Nuestra prueba de que multiplicamos dos polinomios correctamente para obtener un tercero puede ser usada para probar que multiplicamos dos escalares para obtener un tercero. No se necesitan cambios en el algoritmo, solo un cambio menor en la semántica (cómo interpretamos los compromisos).
Supongamos que queremos probar que llevamos a cabo la multiplicación ab=v.
Planteamiento del problema
A es un compromiso de a y b, y V es un compromiso de v donde v=ab. Deseamos probar que A y V están comprometidos según lo afirmado sin revelar a, b o v.
Solución
La idea a alto nivel es que un escalar puede convertirse en un polinomio agregando un término lineal elegido arbitrariamente, por ejemplo, a se convierte en a+sLx y b se convierte en b+sRx. sL y sR son elegidos aleatoriamente por el probador.
Cuando los polinomios a+sLx y b+sRx se multiplican entre sí, la multiplicación de ab ocurre “dentro” de la multiplicación polinómica.
(a+sLx)(b+sRx)=ab+(asR+bsL)x+sLsrx2
Recuerda que el probador comienza el algoritmo enviando compromisos:
ASVT1T2=aG+bH+αB=sLG+sRH+βB=abG+τ0B=(asR+bSL)G+τ1B=sLsRG+τ2B// compromiso de a y b// comprometer los teˊrminos lineales// comprometer el producto V// coeficiente lineal de t(x)// coeficiente cuadraˊtico de t(x)
Simplemente cambiamos la “interpretación” de A de ser los términos constantes de los polinomios a las constantes a y b que estamos multiplicando. Cambiamos T0 a V para reflejar el cambio de interpretación como un compromiso de V en la multiplicación que estamos tratando de probar que hicimos correctamente, es decir, v=ab.
Ejercicio: Completa el código Python faltante para implementar el algoritmo descrito anteriormente.