La Prueba de almacenamiento para VideoCoin se define en la "Sección 7.1.1 Prueba de recuperación" del documento técnico VideoCoin (1). Usamos pruebas basadas en el árbol de merkle como se describe en el documento técnico de VideoCoin, pero también contiene una mejora para usar pruebas de conocimiento cero basadas en zkSnarks. El probador (trabajador de Almacenamiento / Transcodificación) genera y confirma una prueba basada en la construcción de zkSnarks Merkel a partir de fragmentos de fotogramas del segmento de video almacenado. El validador verifica la prueba presentada, utilizándola como entrada para el proceso de verificación de zkSnarks junto con el testigo público (desafío presentado previamente por el cliente / editor). El uso de zkSnarks ayuda en la verificación rápida no interactiva y en cadena para la prueba.
Un segmento de video HLS / DASH típico de 10 segundos de duración que contiene 300 cuadros a 30 fps puede representarse usando un árbol de merkle de profundidad 9. Cada hoja del árbol de merkle contiene el hash de Pedersen del pHash de un cuadro del segmento de video . El método se ilustra usando un árbol de merkle simplificado con 4 nodos de hoja en este blog. La implementación real y la evaluación del rendimiento se llevan a cabo utilizando 300 nodos hoja que corresponden a segmentos de video de 10 segundos.
Presentaremos una descripción general en profundidad del sistema de prueba junto con una introducción suave a los conceptos de zkSanrks cuando sea necesario.
El diagrama anterior muestra un árbol de merkle con nodos de cuatro hojas. Cada nodo de hoja se construye utilizando el hash de Pedersen del pHash correspondiente al marco. Un trabajador de almacenamiento que tenga el segmento de video podrá generar el árbol de merkle completo. Sin embargo, utilizaremos un sistema de prueba zkSnarks donde el probador necesita suministrar los nodos que se muestran con color verde en el diagrama junto con los nodos que se muestran en color rojo que constituyen el desafío del verificador. Los nodos azules que se muestran en el diagrama están construidos por el sistema de prueba y son opacos para el probador.
El sistema de prueba, después de una configuración inicial única, proporciona un CRS (cadena de referencia común). El probador genera tres puntos de curva elíptica en BLS12–381 utilizando las entradas públicas y privadas (que se muestran en colores verde y rojo en el diagrama anterior). El verificador actualizará uno de los puntos de curva con entradas públicas (mostradas en rojo) y verificará la relación bilineal entre los puntos para aceptar la prueba. El proceso de verificación es determinista y toma 5 milisegundos en un sistema i7–4core y es adecuado para la verificación en cadena en una cadena de bloques.
zKSnarks es un tema muy investigado para y una buena cantidad de literatura está disponible en la Web. Una innovación reciente de Zcash (2) permite el uso de un algoritmo de hash eficiente llamado hash de Pedersen en lugar de Sha256 para la construcción del circuito zkSnarks.
El diagrama anterior ilustra cómo pHash de un marco se convierte en un hash de Pedersen usando un circuito. Cada elemento computacional forma una puerta en el circuito. El circuito anterior se utiliza para convertir pHashes en hash de pedersen en los nodos foliares, así como para generar hash de pedersen nodos no foliares. El flujo de bits de entrada se segmenta en ventanas de 3 bits y se asigna a un punto de curva elíptica. El circuito también contiene primitivas para agregar estos puntos y finalmente asigna un solo punto al flujo de bits de entrada que da el hash. La curva elíptica que se usa se llama Jubjub (curva Edwards retorcida construida sobre el campo escalar BLS12-381) y las bibliotecas Zcash implementaron varias primitivas para esta curva.
El circuito zkSnarks que construimos para las pruebas de almacenamiento basadas en pHash contiene varios miles de instancias del circuito primitivo que se muestra en el diagrama anterior.
Los circuitos de hash de Pedersen junto con otras primitivas utilizan varias variables que serán operadas por varios elementos computacionales. El circuito que se está formando se puede representar como un conjunto de compuertas de multiplicación y un conjunto de variables que entran y salen de las compuertas computacionales. Las variables junto con las entradas se tratan como formando un vector solución. El vector solución comprende el estado completo del circuito. Una puerta que realiza una operación de multiplicación tendrá operandos izquierdo y derecho y una salida. Se puede pensar que la izquierda y la derecha se forman multiplicando el vector solución con un vector de coeficientes.
El siguiente diagrama muestra el vector de solución para el árbol de merkle de muestra que estamos usando
El vector consiste en un conjunto de entradas públicas (o desafío). El verificador usa estas entradas mientras verifica la corrección de la prueba. La prueba generada por el circuito que consta de tres puntos de curva EC de los cuales un punto EC necesita actualizarse utilizando las entradas públicas.
Las entradas en el vector solución son el resultado de un cálculo realizado por el probador. En el caso de nuestro ejemplo de árbol de merkle, estas entradas consisten en hash de pedersen en el nodo hoja (Ha) y un nodo intermedio (Hcd) junto con las entradas públicas Hb, Habcd y Path1, Path2 para especificar la ruta de Hb a Habcd.
El circuito zkSnarks generará otras variables y también compuertas para comparar si alguna de las variables generadas debe ser igual a las entradas (que es el caso de Habcd y Habcd 'que representan el nodo raíz del árbol de merkle).
El circuito contiene varios miles de puertas de multiplicación y cada puerta está asociada con un vector de coeficientes izquierdo y derecho y un vector de coeficiente de salida, cada uno con el tamaño del vector de solución.
El siguiente diagrama ilustra estos vectores en una puerta, por ejemplo, la puerta "i". El vector solución tiene un tamaño my los coeficientes del vector izquierdo se designan como a1i, a2i … ami. Del mismo modo, el coeficiente de entrada y salida correcta se muestra como b1i, b2i, … bmi y c1i, c2i..cmi.
La operación en la puerta "i" se representa como Si.Aj (i) * Si.Bj (i) = Si.Cj (i)
Donde Si Aj (i) es aji, Bj (i) es bji y Cj (i) es cji en el diagrama anterior.
Tenga en cuenta que Aj, Bj y Cj forman vectores que consisten en coeficientes de la variable j en todas las puertas.
Un sistema de restricción descrito en la sección anterior forma la base para la representación de QAP que está asignando un circuito booleano a un conjunto de ecuaciones polinómicas sobre un campo y allanar el camino para PCP (pruebas probabilísticamente comprobables).
Los vectores de coeficientes formulados en la sección anterior se pueden organizar de tal manera que los coeficientes de cada variable de un vector solución formen un polinomio de n-1 ° grado donde n es el número de puertas.
Polinomios similares se formulan para vectores de coeficientes B y C. Ahora el sistema de polinomios representa el circuito.
El conjunto de polinomios formulados en la sección anterior se puede usar para obtener un vector de coeficiente en un desplazamiento aleatorio. Además de este desplazamiento aleatorio (Tau), la generación de claves también incluye otros parámetros de aleatoriedad (alfa, beta, gamma y delta). Este desplazamiento aleatorio forma parte de los desechos tóxicos que deben ser destruidos.
Un vector de solución que satisface una puerta en el desplazamiento aleatorio es la base para la clave de prueba y las claves de verificación. Sin embargo, esta satisfacción se demuestra indirectamente usando álgebra polinómica de manera que A * B – C es divisible por el polinomio Z mínimo (objetivo).
Se usa criptografía bilineal adicional para mapear estos coeficientes a un punto de curva EC y la clave de prueba es un conjunto de 3 puntos de curva EC (G_a, G_b y G_c) correspondientes a los vectores de coeficientes A, B y C.
La clave de verificación incluye coeficientes para multiplicar las entradas públicas y actualizar el punto de curva CE correspondiente a A. También incluye coeficientes utilizados en la verificación del mapeo bilineal de los puntos de curva CE A, B, C.
El sistema de prueba de almacenamiento utiliza curvas elípticas que no son compatibles con la cadena de bloques de VideoCoin (Ethereum) actual. Podemos personalizar la implementación actual o habilitarla en futuras versiones (basadas en Cosmos)
El nodo validador admite la verificación en cadena de las pruebas de almacenamiento de zkSnarks. El cliente que desea externalizar el almacenamiento, registra una solicitud con la cadena de bloques VideoCoin junto con la recompensa en un depósito en garantía. Un trabajador de almacenamiento puja por la solicitud y retiene el archivo. El paso anterior ocurre fuera del sistema de prueba. En el momento del registro, el cliente también proporciona un conjunto de información pública que consiste en (a) un nodo hoja, (b) nodo raíz. Al final del período acordado de alquiler de almacenamiento, el trabajador de almacenamiento presenta un comprobante de la posesión del archivo y lo envía al nodo del validador. El validador utiliza la verificación de zkSnark y transfiere fondos en custodia en la verificación exitosa de la prueba.
El alquiler de almacenamiento se puede dividir en varias épocas. Es posible que cada epch necesite un nuevo conjunto de testigos públicos (desafío) para evitar la repetición de pruebas anteriores y cualquier prueba de pH almacenada en caché. El almacenamiento en caché de pHash se puede evitar especificando la generación de pHash desde una región del marco y la región de señalización como parte del testimonio público.
Mantiene una base de datos de solicitudes de almacenamiento de los editores de VideoCoin junto con un testigo público (desafío) para verificar la prueba.
Proporciona verificación en cadena de las pruebas de almacenamiento y transfiere las recompensas asociadas del depósito en garantía.
Proporciona almacenamiento para segmentos de video. Genera pruebas utilizando el CRS y las claves de prueba proporcionadas por la red.
Subcontrata el almacenamiento de un archivo y deposita fondos en custodia. También presenta un testigo público (impugnación) para la verificación de la prueba presentada por el trabajador de almacenamiento.
Nuestra implementación anterior de la prueba de transcodificación usando el enfoque zkSnarks / tinyRAM tiene enormes cuellos de botella en el rendimiento. La siguiente tabla muestra la comparación de implementaciones del circuito SSIM con tinyRAM y Zcash Bellman. El número de restricciones y variables del circuito influye en el tiempo de generación de pruebas. Vemos una reducción de 90 veces en las restricciones y una reducción de 70 veces en las variables.
El sistema a prueba de almacenamiento aprovecha las optimizaciones recientes en las implementaciones de la biblioteca Zcash / Bellman. Además, integramos estrechamente la generación de pHash con algoritmos de escala ffmpeg para evitar los gastos generales de transferencia de datos y crear una tubería de alto rendimiento entre los diferentes módulos del sistema de prueba.
1. VideoCoin: una red descentralizada de codificación, almacenamiento y distribución de contenido de video
https://storage.googleapis.com/videocoin-preico/VideoCoin-Whitepaper.pdf
2. Bellman: zk-SNARKs en Rust