Oráculo aleatorio basado en firma digital en blockchain

De la idea a la implementación: modificamos el esquema de firma digital de curva elíptica existente para que sea determinista y, en base a él, proporcionamos funciones para obtener números pseudoaleatorios verificables dentro de la cadena de bloques.

Oráculo aleatorio basado en firma digital en blockchain

Idea

En el otoño de 2018, la cadena de bloques Waves incluyó primeros contratos inteligentes activados, inmediatamente surgió la pregunta sobre la posibilidad de obtener números pseudoaleatoriospuedes confiar.

Mientras reflexionaba sobre esta pregunta, finalmente llegué a la conclusión: cualquier cadena de bloques es una célula; es imposible obtener una fuente confiable de entropía en un sistema cerrado.

Pero todavía me gustaba una idea: si oráculo aleatorio firmará los datos del usuario con un algoritmo determinista, entonces el usuario siempre podrá verificar dicha firma utilizando la clave pública y estará seguro de que el valor resultante es único. El oráculo, por mucho que lo desee, no puede cambiar nada; el algoritmo produce un resultado inequívoco. Básicamente, el usuario registra el resultado, pero no lo sabe hasta que el oráculo lo publica. Resulta que no puedes confiar en absoluto en el oráculo, pero comprueba el resultado de su trabajo. Luego, en caso de una verificación exitosa, dicha firma puede considerarse una fuente de entropía para un número pseudoaleatorio.

La plataforma blockchain de Waves utiliza un esquema de firma EdDSA вариант Ed25519. En este esquema, la firma consta de los valores R y S, donde R depende de un valor aleatorio y S se calcula en función del mensaje que se firma, la clave privada y el mismo número aleatorio que R. Resulta que no existe una dependencia única para el mismo. Hay muchas firmas válidas para un mensaje de usuario.

Obviamente, en su forma pura, dicha firma no puede usarse como fuente de números pseudoaleatorios, ya que no es determinista y, por lo tanto, puede ser fácilmente manipulada por el oráculo.

Pero resultó que en realidad es posible hacerlo determinista.

tenía grandes esperanzas función aleatoria verificable (VRF), pero después de estudiar el hardware, tuve que abandonar esta opción. Aunque VRF ofrece una versión determinista de la firma y su prueba, hay un lugar extraño en el algoritmo que abre un agujero negro para la manipulación del oráculo. Es decir, al calcular el valor de k (Sección 5.1) se utiliza una clave privada, que permanece desconocida para el usuario, lo que significa que el usuario no puede verificar la exactitud del cálculo de k, lo que significa que el oráculo puede usar cualquier valor de k que necesite y al mismo tiempo mantener una base de datos de correspondencias de k y los datos firmados para poder siempre volver a calcular el resultado correcto desde el punto de vista de VRF. Si ve un dibujo basado en VRF sin revelar la clave privada, puede ser inteligente: indique la necesidad de revelar la clave o excluirla del cálculo de k, luego la clave privada se revelará automáticamente cuando aparezca la primera firma. . En general, como ya se mencionó, un esquema extraño para un oráculo aleatorio.

Después de pensarlo un poco y contar con el apoyo de analistas locales, nació el esquema de trabajo VECRO.

VECRO es una abreviatura de Verifiable Elliptic Curve Random Oracle, que en ruso significa oráculo aleatorio verificable sobre curvas elípticas.

Todo resultó ser bastante simple: para lograr el determinismo, es necesario fijar el valor de R antes de que aparezca el mensaje a firmar. Si R se confirma y es parte del mensaje que se firma, lo que garantiza además que R se confirma en el mensaje que se firma, el valor de S está determinado únicamente por el mensaje del usuario y, por lo tanto, puede usarse como fuente para números pseudoaleatorios.

En tal esquema, no importa cómo se fije R; esto sigue siendo responsabilidad del oráculo. Es importante que S esté determinado únicamente por el usuario, pero su valor se desconoce hasta que Oracle lo publique. ¡Todo lo que queríamos!

Hablando de R fijo, tenga en cuenta que reutilizado R al firmar varios mensajes, revela de forma única la clave privada en el esquema EdDSA. Se vuelve extremadamente importante para el propietario del oráculo eliminar la posibilidad de reutilizar R para firmar diferentes mensajes de usuario. Es decir, ante cualquier manipulación o colusión, el oráculo siempre correrá el riesgo de perder su clave privada.

En total, Oracle debe proporcionar a los usuarios dos funciones: inicialización, que fija el valor R, y firma, que devuelve el valor S. En este caso, el par R, S es la firma verificable habitual de un mensaje de usuario que contiene un valor fijo. valor R y datos de usuario arbitrarios.

Se puede argumentar que este esquema para blockchain no es más que ordinario. esquema de compromiso-expansión. Básicamente, sí, esto es todo. Pero hay varios matices. En primer lugar, Oracle siempre trabaja con la misma clave en todas las operaciones, por ejemplo, esto es conveniente de usar en los contratos. En segundo lugar, existe el riesgo de que Oracle pierda la clave privada si se comporta incorrectamente, por ejemplo, Oracle le permite tomar muestras del resultado, entonces basta con hacer solo dos pruebas para descubrir la clave privada y obtener la clave privada. acceso a la billetera. En tercer lugar, una firma que sea verificable de forma nativa en la cadena de bloques y sea una fuente de aleatoriedad es hermosa.

Durante seis meses la idea de implementar estuvo hirviendo en mi cabeza, hasta que finalmente apareció la motivación en la forma. subvención de Waves Labs. Una gran subvención conlleva una gran responsabilidad, ¡así que el proyecto estará ahí!

implementación

Entonces, en este proyecto VECRO fue implementado en la cadena de bloques Waves en modo solicitud-respuesta mediante transacciones de transferencia entre el usuario y el oráculo. Al mismo tiempo, se instala un script en la cuenta de Oracle que controla el trabajo estrictamente de acuerdo con la lógica descrita anteriormente. Se verifican las transacciones de Oracle y se restaura toda la cadena de interacción del usuario. Las cuatro transacciones están involucradas en la verificación del valor final; el contrato inteligente las une con un hilo de verificación estricto, verificando todos los valores paso a paso y sin dejar lugar a ninguna manipulación.

Una vez más, dejarlo de lado y dejarlo más claro. El oráculo no sólo funciona según el esquema propuesto. Su trabajo está completamente controlado a nivel blockchain por lo establecido. estrechamente con un contrato inteligente. Da un paso a la izquierda y la transacción simplemente no se realizará. Entonces, si una transacción se incluye en la cadena de bloques, el usuario ni siquiera necesita verificar nada; cientos de nodos de la red ya lo han verificado todo por él.

Actualmente, hay un VECRO ejecutándose en la red principal de Waves (puedes ejecutar el tuyo propio, no es difícil, solo echa un vistazo al ejemplo de configuración). El código actual se ejecuta en PHP (en OlasKit, sobre cuál Te dije mas temprano).

Para utilizar el servicio de Oracle debe:

  • Arreglar R;
    • Envíe al menos 0.005 ondas a Oracle alias init@vecr;
    • Recibir el código R en el campo adjunto en la transferencia de 1 token R-vecr del oráculo al usuario;
  • Obtenga una firma;
    • Envíe al menos 0.005 ondas al alias de Oracle random@vecr, y también DEBE indicar el código R recibido previamente y datos de usuario adicionales en el campo adjunto;
    • Reciba el código S en el campo adjunto en la transferencia de 1 token S-vecr del oráculo al usuario;
  • Utilice el código S como fuente de números pseudoaleatorios.

Matices de la implementación actual:

  • Las ondas enviadas al oráculo se utilizan como comisión por la transacción de devolución al usuario, hasta un máximo de 1 onda;
  • El código R es la concatenación de un byte del carácter 'R' y un valor R codificado en base32 de 58 bytes;
  • El código R adjunto debe ir primero, los datos del usuario vienen después del código R;
  • El código S es la concatenación de un byte del carácter 'S' y un valor de S codificado en base32 de 58 bytes;
  • S es el resultado de la división de módulo, por lo que no puede utilizar S como un número pseudoaleatorio completo de 256 bits (este número puede considerarse un máximo de un número pseudoaleatorio de 252 bits);
  • La opción más sencilla es utilizar el hash del código S como un número pseudoaleatorio.

Ejemplo de recepción de código S:

Desde un punto de vista técnico, Oracle está completamente listo para funcionar, puede usarlo de manera segura. Desde el punto de vista del uso por parte del usuario medio, falta una interfaz gráfica cómoda, esto tendrá que esperar.

Estaré encantado de responder preguntas y aceptar comentarios, gracias.

Fuente: habr.com

Añadir un comentario