Oráculo aleatorio basado en la firma digital blockchain

De la idea a la implementación: modificar el esquema de firma de la curva elíptica existente para que sea determinista y proporcionar funciones en él para obtener verificables dentro de los números pseudoaleatorios de blockchain.



Idea


En el otoño de 2018, cuando se activaron los primeros contratos inteligentes en la cadena de bloques Waves, el tema de obtener números pseudoaleatorios de manera confiable surgió naturalmente.


Pensando en ello, llegué a la conclusión de que cualquier blockchain es una especie de jaula, y es imposible obtener una fuente confiable de entropía en un sistema cerrado.


Sin embargo, me gustó una idea. Si un oráculo aleatorio firma los datos del usuario con un algoritmo determinista, el usuario siempre podrá verificar dicha firma mediante la clave pública para asegurarse de que el valor obtenido sea único. El oráculo no podría realizar ningún cambio porque el algoritmo presenta un resultado de un solo valor. Básicamente, el usuario corrige el resultado, pero no lo sabe hasta que el oráculo lo publica. Por lo tanto, es posible que no confíe en el oráculo en absoluto, pero aún así podrá verificar el resultado de su operación. Luego, en caso de verificación exitosa, dicha firma puede ser una fuente de entropía para un número pseudoaleatorio.


En la cadena de bloques Waves, se utiliza el esquema de firma EdDSA variante Ed25519 . En ese esquema, la firma consta de los valores R y S. R depende de un valor aleatorio y S se calcula sobre la base de un mensaje firmado, una clave privada y el mismo número aleatorio que R. No existe una dependencia única. y existen varias firmas válidas para el mismo mensaje de usuario.


Aparentemente, este tipo de firma por sí solo no puede usarse como fuente de números pseudoaleatorios porque es indeterminado y, por lo tanto, el oráculo puede manipularlo fácilmente.


Sin embargo, resulta que en realidad es posible hacerlo determinista.


Mis grandes esperanzas estaban establecidas para la función aleatoria verificable (VRF) , pero, después de estudiar sus detalles, tengo que rechazar esa opción. Aunque VRF ofrece una versión determinada de una firma y sus pruebas, el algoritmo tiene un lugar extraño que abre un agujero negro para las manipulaciones por parte del oráculo (esta afirmación es incorrecta, consulte Actualización ). Específicamente, para calcular el valor de k ( sección 5.1 ), se utiliza una clave privada, que sigue siendo desconocida para el usuario, por lo que el usuario no puede verificar la exactitud del cálculo de k. Como resultado, el oráculo puede usar cualquier valor de k que necesite y, simultáneamente, ejecutar una base de datos para las correlaciones entre k y los datos firmados para poder volver a calcular siempre un resultado correcto para VRF. Si ve un sorteo basado en VRF sin revelar la clave privada, puede presumir y señalar la necesidad de revelar la clave o eliminarla del cálculo de k para que se revele automáticamente después de la primera firma. En general, como se dijo anteriormente, este es un esquema extraño para el oráculo aleatorio.


Tras cierta reflexión y con el apoyo de analistas locales, nació un esquema para la operación VECRO.


VECRO representa el Oráculo aleatorio de curva elíptica verificable. Resultó ser bastante simple. Para lograr la determinación, necesitamos fijar el valor de R antes de la aparición de un mensaje a firmar. Si R es fijo y R es parte del mensaje, lo que además garantiza que R se arregla antes del mensaje. El valor de S está completamente determinado por un mensaje de usuario y, por lo tanto, puede usarse como fuente de números pseudoaleatorios.


En un esquema de este tipo, la forma exacta en que se fija R es irrelevante y permanece en la zona de responsabilidad del oráculo. Lo importante es que S está completamente determinado por el usuario, pero su valor no se revela hasta que el oráculo lo publique. ¡Esto es exactamente lo que queríamos!


Hablando de arreglar R, tenga en cuenta que la reutilización de R para firmar varios mensajes revela completamente la clave privada en el esquema EdDSA. Para el propietario del oráculo, es vital excluir la reutilización de R para firmar varios mensajes de usuario. Es decir, en cualquier manipulación o colusión, el oráculo siempre correrá el riesgo de perder su clave privada.


Entonces, el oráculo ofrecerá dos funciones al usuario: inicialización, que fija el valor de R y una firma, que devuelve el valor de S. Mientras tanto, el par R, S es una firma verificable regular para un mensaje de usuario que contiene un mensaje fijo valor de R y los datos aleatorios del usuario.


Se puede argumentar que para blockchain, esto no es más que un esquema de confirmación de confirmación regular. Básicamente, eso es lo que es. Pero hay algunos matices. Primero, el oráculo usa la misma clave en todas las transacciones, lo que, por ejemplo, es conveniente para los contratos. En segundo lugar, existe el riesgo de perder una clave privada por el oráculo debido a un rendimiento incorrecto. Por ejemplo, si el oráculo facilita las pruebas del resultado, solo dos pruebas serán suficientes para descubrir la clave privada y acceder a la billetera. En tercer lugar, una firma verificada de forma nativa en la cadena de bloques, que es la fuente de la aleatoriedad, es simplemente hermosa.


Durante unos seis meses, esta idea estuvo germinando, hasta que llegó una motivación para implementarla en forma de una subvención de Waves Labs . ¡Con la gran donación viene una gran responsabilidad, significa que el proyecto debe ser!


Implementación


VECRO se implementó en la cadena de bloques Waves en el modo de solicitud / respuesta utilizando transacciones de transferencia entre el usuario y el oráculo. En la cuenta del oráculo, se establece un script que controla la operación estrictamente de acuerdo con la lógica descrita anteriormente. Las transacciones del oráculo se verifican mediante la recreación de toda la cadena de interacción del usuario. Las cuatro transacciones están involucradas en la verificación del valor final. Un contrato inteligente los agrega a todos a un estricto hilo de verificación, verificando los valores paso a paso y sin dejar espacio para ninguna manipulación.


Tratemos de ponerlo en términos simples. El oráculo no solo funciona bajo un esquema propuesto. Su funcionamiento está totalmente controlado a nivel de blockchain mediante un contrato inteligente estrictamente estricto . Cualquier pequeña desviación conduciría al rechazo de la transacción. Entonces, si la transacción está en la cadena de bloques, los usuarios no tienen que verificar nada, ya que toda la verificación ya ha sido realizada por cientos de nodos de la cadena de bloques.


Por el momento, un VECRO es operable en la red principal de Waves. En realidad, podría lanzar el suyo: es simple, solo mire el ejemplo de configuración . El código actual funciona en PHP (en WavesKit , que discutí anteriormente ).


Para usar el oráculo, necesitas:


  • Fixate R
    • Envíe un mínimo de 0.005 ONDAS al alias del oráculo init @ vecr;
    • Reciba un código R en el campo adjunto en la transferencia de token 1 R-vecr del oráculo al usuario;
  • Obtener una firma;
    • Envíe un mínimo de 0.005 ONDAS al alias del oráculo random @ vecr. También SE REQUIERE que ingrese en el campo adjunto el código R recibido y los datos adicionales del usuario;
    • Reciba un código S en el campo adjunto en la transferencia de token 1 S-vecr del oráculo al usuario;
  • Use 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 tarifas para la transacción de devolución al usuario, hasta un máximo de 1 ONDAS;
  • El código R es una concatenación del byte del símbolo 'R' y el valor R de 32 bytes en la codificación base58;
  • El código R en el archivo adjunto debe preceder a los datos del usuario;
  • El código S es una concatenación del byte del símbolo 'S' y el valor S de 32 bytes en la codificación base58;
  • S es el resultado de una división de módulo y no puede usarse como un número pseudoaleatorio apropiado de 256 bits (puede considerarse un número pseudoaleatorio de 252 bits como máximo);
  • La opción más fácil es el uso del hash de S-code como fuente del número pseudoaleatorio.

Ejemplos de recepción de código S:



Desde un punto de vista técnico, el oráculo está en pleno funcionamiento, puede usarlo con seguridad. Desde el punto de vista de un usuario común, no hay suficiente GUI fácil de usar, que tendrá que esperar.


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


Actualización (8 de mayo de 2019)


Me equivoqué en VRF. Sí, es cierto que la firma ECVRF no se puede usar como fuente de un número pseudoaleatorio, pero no se usa para este propósito. La firma es necesaria para demostrar la unicidad del valor Gamma ( sección 5.3 , paso 6). Y el valor verificado de Gamma se utilizará como fuente de un número pseudoaleatorio ( sección 5.2 , paso 5). Gracias a Oleg Taraskin Crittografo por señalar en este momento, admito mi error. ECVRF tiene pleno derecho a vivir.


Desafortunadamente, todavía no hay posibilidad de usar ECVRF en el nivel de cadena de bloques de Waves, debido a la falta de la funcionalidad matemática necesaria en los contratos inteligentes.


Cuando esta funcionalidad o soporte RSA esté disponible, se pueden crear nuevos oráculos. En cuanto al esquema VECRO, ocupa su nicho en cualquier caso y le permite trabajar sin ninguna funcionalidad adicional.

Source: https://habr.com/ru/post/449342/


All Articles