[Reimprimir] Introducción a mimble y Grin
MimbleWimble es un formato y protocolo blockchain que proporciona muy buena escalabilidad, confidencialidad y fungibilidad basado en primitivas criptográficas robustas. Resuelve la brecha entre casi todas las cadenas de bloques implementadas (y las necesidades reales). El documento técnico de MimbleWimble se puede encontrar en la WiKi del proyecto, que está abierta.
Grin es un proyecto de software de código abierto que implementa la cadena de bloques MimbleWimble, completando algunas de las cosas necesarias para implementar una cadena de bloques y una criptomoneda completa que falta en el protocolo MimbleWimble.
Los principales propósitos y características del proyecto Grin son los siguientes:
Nota: MimbleWimble proviene de un hechizo de "Harry Potter". Para obtener más información, consulte: Maldición de la lengua pegada. El significado de este título debe ser que todos los que lean esta introducción puedan venir y contribuir a esta comunidad abierta. Realmente lo espero.
Este artículo está dirigido a personas que ya conocen blockchain y algo de criptografía básica. Intentamos explicar la estructura técnica de MimbleWimble y cómo se aplica a Grin. Esperamos que esta introducción sea sencilla y fácil de entender. Nuestra intención es alentarlo a que se interese en Grin, se una a la comunidad abierta de Grin y contribuya a ella en todo lo que pueda.
Para lograr este objetivo, introduciremos un concepto principal: Grin es una implementación de Mimi. Comenzaremos con una breve descripción de la criptozoología de curva elíptica (ECC), que es una base importante para Grin. Luego, describa todos los elementos clave de las transacciones y bloques de mimble blockchain.
Primero, introduzcamos brevemente la criptografía de curva elíptica (en lo sucesivo, ECC) y expliquemos solo brevemente las propiedades de ECC necesarias para comprender cómo funciona Mimi. La ECC no se estudiará ni discutirá en profundidad aquí. Los lectores que quieran saber más sobre ECC pueden consultar esta introducción: Obtenga más información.
Una curva elíptica utilizada con fines criptográficos es solo un gran conjunto de puntos que llamamos c. Estos puntos se pueden sumar, restar o multiplicar por números enteros (también llamados escalares). Dado un número entero k, usando la multiplicación escalar, podemos calcular k * H, que también es un punto en la curva c. Dado otro número entero j, también podemos calcular (k j) * H, que es igual a k * H j *. Elipse H La suma y la multiplicación escalar en la curva mantienen la tasa conmutativa y la asociatividad de la suma y la multiplicación;
En ECC, si elegimos un número muy grande K como clave privada, entonces k * H es la correspondiente clave pública. Incluso si uno supiera el valor de la clave pública k * H, sería casi imposible deducir k (o en otras palabras, la multiplicación en los puntos de la curva elíptica es insignificante, mientras que la división en los puntos de la curva es extremadamente difícil. Consulte Cifrado de curva elíptica.
En la fórmula anterior (k j)* H = k * H j * H, k y j son claves privadas, lo que demuestra que la clave pública (k j) se puede obtener de la suma de las dos. claves privadas. * H es equivalente a la suma de las claves públicas correspondientes a cada clave privada (k * H j * H). En la cadena de bloques de Bitcoin, las billeteras deterministas jerárquicas (billetera HD/bip 32) dependen en gran medida de esto. es cierto para MimbleWimble y Grin
El diseño de la estructura de transacciones refleja un principio clave de MimbleWimble: fuerte privacidad y confidencialidad
La confirmación de las transacciones de MimbleWimble depende de dos atributos básicos. :
A continuación se presenta el saldo de la cuenta, la atribución, el cambio y la prueba, y se explica cómo se realizan los dos atributos básicos anteriores.
La transacción real se basa en los atributos ECC anteriores. value Puede ocultarse en los datos de la transacción
Si V es el valor de entrada o salida de la transacción y H es la curva elíptica, simplemente podemos incrustar v * H en la transacción en lugar de V.
Esto se debe a que al usar operaciones ECC, aún podemos verificar que la suma de las salidas de la transacción es igual a la suma de las entradas:
Validar esta propiedad de cada transacción permite que el protocolo verifique la transacción sin saber cuál es el valor real. El valor de la transacción es. Crear dinero. Sin embargo, los valores disponibles son limitados y un atacante puede probar todos los valores posibles para adivinar el valor de su transacción. Además, conocer v1 (del ejemplo de transacción anterior) y v1 * H equivale a exponer una transacción igual a v1 en toda la cadena de bloques. Por estas razones, introducimos la segunda curva elíptica G (en realidad G es simplemente otro punto generador en el mismo grupo de curvas que H) y la clave privada R como factor ciego.
El valor de entrada o salida en la transacción se puede expresar como:
Incluyendo:
Ni V ni R se pueden exportar, lo que aprovecha la elíptica Criptografía de curvas Propiedades básicas. R * G v * H se llama compromiso de Peterson.
Por ejemplo, supongamos que queremos crear una transacción con dos entradas y una salida. Tenemos (ignorando los costos):
Satisface:
Generar una clave privada para cada valor de entrada como factor cegador y reemplazar cada valor con ellos mismos mediante la ecuación anterior. De la promesa de Pedersen, tenemos obtener:
Y pedir:
Este es el primer pilar de mimble: las operaciones aritméticas que verifican las transacciones se pueden realizar sin ningún conocimiento del valor real de la transacción. Finalizar.
Para agregar un punto final, esta idea en realidad proviene de las "Transacciones confidenciales" de Greg Maxwell, que a su vez se desarrolló a partir de la propuesta homomórfica de Adam Buck para Bitcoin.
En el capítulo anterior, introdujimos una clave privada como factor de encubrimiento para enmascarar el valor real de la transacción. La segunda idea de MimbleWimble es que esta clave privada se puede utilizar para demostrar la propiedad del valor.
Alicia te dio tres monedas y escondió el número. Usted eligió 28 como factor ciego (tenga en cuenta que el factor ciego es en realidad una clave privada, que es un número muy grande). El siguiente resultado de transacción se muestra en algún lugar de la cadena de bloques, para su uso exclusivo (para entrada de transacciones):
x, el valor de resultado de la suma anterior, es visible para todos. Pero sólo tú y Alice conocéis el valor de 3, y sólo tú conocéis el valor de 28.
Para poder transferir las tres monedas nuevamente, el protocolo requiere que (el comerciante) sepa de alguna manera 28. Para demostrar cómo funciona esto, suponga que desea transferir estas tres monedas idénticas a Carol. Necesita crear una transacción simple para:
Donde Xi es una entrada que toma el valor de salida X que obtuvo anteriormente e Y es la salida de Carroll. Si no conoce su clave privada 28, no hay forma de establecer esta transacción. De hecho, si Carol quiere equilibrar esta transacción, necesita saber el valor enviado y su clave privada para que:
Al verificar que todo esté limpio, podamos volver a verificar que no se haya creado dinero nuevo. .
¡Espera! Detener. Ahora conoces la clave privada en la salida de Carol (en el ejemplo anterior, debe ser la misma que la tuya para equilibrar ambos lados de la ecuación), ¡así que puedes robarle el dinero a Carol!
Para resolver este problema, permitimos que Carol incremente otro valor de su elección. 113, el resultado final de la cadena de bloques es:
Ahora la transacción no se restablecerá a cero. Tenemos un valor excedente (85) en G, que es la suma de todos los factores ciegos. Pero como 85 * G es una clave pública válida en la curva elíptica G, 85, para cualquier X e Y, sólo y = 0 es una clave pública válida en G para x * G y * H.
Por lo tanto, lo que el protocolo necesita verificar es que (Y-Xi) sea una clave pública válida en G, y que el comerciante conozca la clave privada (85 en nuestra transacción con Carol). La forma más sencilla es solicitar una firma con un valor excedente (85) y luego verificar:
Esta firma asociada a cada transacción, más algunos datos adicionales (como la tarifa de transacción), se denomina núcleo de transacción.
Esta sección explica la creación de transacciones, analiza el mecanismo de cambio de transacciones y los requisitos para la prueba de rango, de modo que se pueda demostrar que todos los valores no son negativos. Estos no son necesarios para entender a Mimi y Grin, por lo que si quieres aprender sobre ellos rápidamente, siempre puedes saltarte esta sección y simplemente juntarlos todos.
En el ejemplo anterior, debes compartir tu clave privada (el factor ciego) con Carol. En términos generales, este no es un enfoque muy preferible incluso si la clave privada nunca se reutiliza. En realidad, esto no es un problema ya que la transacción incluye el resultado del cambio.
Por ejemplo, quieres enviarle solo dos monedas a Carol de las tres monedas que recibió Alice. Simplemente genera otra clave privada (como 12) como factor ciego para proteger su salida de cambios y le dice a Carol que le está enviando 2 monedas. Carol usa su clave privada como antes:
La transacción final en la cadena es básicamente el proceso anterior. La firma utiliza un valor excesivo, como 97 en este ejemplo.
En todos los cálculos anteriores, nos basamos en el hecho de que el valor de la transacción es siempre positivo. Introducir valores negativos sería problemático si fuera posible, ya que cada transacción podría crear nueva moneda de la nada.
Por ejemplo, puede crear una transacción con una entrada de 2 y salidas de 5 y -3 y aún así obtener la transacción equilibrada definida en el capítulo anterior. Esto no es fácil de notar porque incluso si x es negativo, el punto correspondiente x.H en la curva ECDSA parece un valor arbitrario.
Para resolver este problema, MimbleWimble utiliza otro concepto criptográfico (también de Confidential Transactions) llamado prueba de rango: demostrar que un número cae dentro de un rango determinado sin exponer el número. No entraré en detalles sobre la prueba de rango. Solo sabemos que para cualquier r.G v.H, podemos crear una prueba de que V es mayor que cero y no se desbordará.
También es importante tener en cuenta que para crear una prueba de rango válida basada en el ejemplo anterior, debe conocer los valores 113 y 28 utilizados al crear y firmar el valor excedente. Los motivos y el alcance de la certificación se describen con más detalle en el documento de certificación del alcance.
Las transacciones de MimbleWimble incluyen lo siguiente:
Hemos explicado anteriormente cómo las transacciones de Mimi brindan sólidas garantías de anonimato mientras mantienen las propiedades requeridas para una cadena de bloques válida, es decir, las transacciones no crearán moneda a partir de En el aire, los certificados de propiedad se establecerán mediante claves privadas.
El formato de bloque Mimi se basa en la introducción de un concepto adicional: el paso a través. Con esta adición, puede obtener una cadena MimbleWimble:
Ver la composición de la transacción:
Por ejemplo:
La clave pública de firma utilizada en este ejemplo es 28 *g.
Cualquier transacción debe cumplir las siguientes condiciones: (aquí se omiten las tarifas de transacción para simplificar la descripción)
Esta condición también se aplica a los bloques, porque un bloque es solo una serie de transacciones agregadas. entradas, salida de transacciones y núcleo de transacciones. Podemos sumar todos los resultados de las transacciones, restar todas las entradas de las transacciones y comparar el resultado con la suma del exceso de núcleos en todos los núcleos de las transacciones:
En términos simples, (nuevamente ignorando las tarifas de transacción), podemos pensar que el método de procesamiento del bloque Mimi y el método de procesamiento de la transacción Mimi sean estrictamente consistentes.
Existe un pequeño problema en el diseño de los bloques y transacciones mimble anteriores. Las transacciones se pueden reconstruir a partir de los datos de un bloque (es decir, encontrar una o varias transacciones completas y distinguir qué entrada de transacción corresponde a qué salida de transacción). Sin duda, esto es malo para la privacidad. Este problema también se denomina problema del "subconjunto": dada una serie de entradas de transacciones, salidas de transacciones y núcleos de transacciones, es posible distinguir un subconjunto de ellos para volver a ensamblar la transacción completa correspondiente (muy parecido a un rompecabezas).
Por ejemplo, supongamos que existen las siguientes dos transacciones:
Podemos agregarlas y construir el siguiente bloque (o transacción agregada):
Usando la ecuación relación de equilibrio, es fácil Es fácil utilizar el método exhaustivo para probar todas las combinaciones posibles para encontrar la relación de transacción original:
Siempre que se encuentre una transacción, el resto, por supuesto, cumplirá con la equilibrio de la ecuación, por lo que es fácil reconstruir otra transacción:
Para reducir en gran medida la posibilidad de tal mosaico y así mitigar los efectos adversos de este problema, hemos diseñado un factor de compensación central de transacción. para cada núcleo de transacción. Este también es un factor ciego (o clave privada) que debe agregarse al exceso del núcleo para verificar que la ecuación se equilibre:
Cuando agregamos estas transacciones en un bloque, almacenamos un (y solo uno) ) factor de compensación agregado (es decir, la suma de todos los factores de compensación básicos de la transacción). De esta manera, dado que solo tenemos un factor de compensación en un bloque, ya no podemos dividirlo en los factores de compensación centrales de la transacción correspondientes a cada transacción, por lo que no podemos juntar ninguna transacción del bloque.
El método de implementación específico es dividir K en k1 k2 al crear una transacción. Para el núcleo de la transacción (k1 k2)*G, publicamos k1*G (llamado exceso) y k2 (llamado compensación) en el núcleo de la transacción, y usamos k1*G como clave pública para firmar la transacción como antes. Cuando un minero construye un bloque, sumamos los k2 (compensaciones) de todas las transacciones empaquetadas para producir un único desplazamiento k2 agregado de todas las transacciones empaquetadas en el bloque. Una vez que un bloque es empaquetado, distribuido y aceptado por la cadena, su k2 (compensación) original correspondiente a cada transacción se vuelve irrecuperable.
Los bloques permiten a los mineros combinar múltiples transacciones en un conjunto y agregarlas a la cadena. En la representación de bloque a continuación, hay tres transacciones y solo mostramos las entradas y salidas de las transacciones. Entradas salidas en relación con sus costos. Las etiquetas de salida contenidas en el bloque anterior están marcadas con una x minúscula.
Notamos las siguientes dos propiedades:
De manera similar a una sola transacción, todo lo que se necesita verificar en un bloque es que se haya confirmado la propiedad (desde el núcleo de la transacción) y que no se haya agregado todo el bloque. Cualquier suministro de moneda (excepto lo que permite coinbase). Por lo tanto, las entradas y salidas coincidentes pueden eliminarse porque sus contribuciones a la suma se cancelan. Esto da como resultado el siguiente bloque más compacto:
Tenga en cuenta que se elimina toda la estructura de transacciones y el orden de entrada y salida ya no es un problema. Sin embargo, se garantiza que la suma de todas las salidas menos las entradas del módulo será cero.
Los bloques se crean a partir de:
Al construir bloques de esta manera, los bloques Mimi brindan muy buenas garantías de privacidad:
Sin embargo, los bloques aún se pueden verificar. !
Volviendo al bloque de ejemplo anterior, las salidas x1 y x2 consumidas por I1 e I2 deben haber aparecido previamente en la blockchain. Por tanto, tras añadir este bloque, estas salidas e I1 e I2 también se pueden eliminar de toda la cadena, ya que no afectarán a toda la suma.
En resumen, concluimos que el estado de la cadena en cualquier momento (excluyendo los encabezados de bloque) se puede resumir usando esta información:
La primera información se puede resumir usando el altura del bloque (distancia desde la distancia desde el bloque inicial) para derivar. Los núcleos de salida y transacciones no utilizados son muy compactos. Esto tiene dos consecuencias importantes:
Además, el conjunto completo de salidas de transacciones no utilizadas (es decir, UTXO) no se puede alterar, incluso si solo desea agregar o eliminar algunas salidas de transacciones. Hacerlo hará que la suma de todos los factores ciegos en el núcleo de la transacción sea diferente de la suma de los factores ciegos en la salida.
Este artículo presenta los principios básicos de blockchain basado en MimbleWimble. Al utilizar las propiedades adicionales de la criptografía de curva elíptica, podemos crear transacciones que son completamente opacas pero que aún pueden verificarse correctamente. Al combinar estas propiedades, podemos eliminar grandes cantidades de datos de blockchain, lo que permite una implementación a gran escala y una rápida sincronización de nuevos pares.