Bloque oráculo basado en oráculo aleatorio basado en firma digital

Desde la idea hasta la implementación: modificamos el esquema de firma digital existente en una curva elíptica para que sea determinista, y proporcionamos sobre su base las funciones de obtener números pseudoaleatorios verificados dentro de la cadena de bloques.



Idea


En el otoño de 2018, los primeros contratos inteligentes se activaron en la cadena de bloques Waves, de inmediato surgió la pregunta sobre la posibilidad de obtener números pseudoaleatorios en los que pueda confiar.


Rompiendo la cabeza sobre este problema, finalmente llegué a la conclusión: cualquier blockchain es una célula, es imposible obtener una fuente confiable de entropía en un sistema cerrado.


Pero todavía me gustó una idea: si un oráculo aleatorio hará que la firma de los datos del usuario sea un algoritmo determinista, el usuario siempre podrá verificar dicha firma con la clave pública y se asegurará de que el valor recibido sea único. El oráculo, con todo el deseo, no tiene poder para cambiar nada, el algoritmo produce un resultado claro. De hecho, el usuario captura el resultado, pero no lo sabe hasta que el oráculo lo publica. Resulta que no puedes confiar en el oráculo en absoluto, pero verifica el resultado de su trabajo. Luego, en el caso de una verificación exitosa, dicha firma puede considerarse una fuente de entropía para un número pseudoaleatorio.


La plataforma de cadena de bloques Waves utiliza el esquema de firma EdDSA, una variante de Ed25519 . En este esquema, la firma consta de los valores de R y S, donde R depende de un valor aleatorio, y S se calcula sobre la base del mensaje que se firma, la clave privada y el mismo número aleatorio que R. Resulta que no hay dependencia uno a uno para el mismo Un mensaje personalizado tiene muchas firmas válidas.


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, como resultó, es realmente posible determinarlo.


Tenía muchas esperanzas de una función aleatoria probada (VRF) , pero después de estudiar el material, tuve que rechazar esta opción. Aunque VRF ofrece una versión determinista de la firma y su prueba, el algoritmo tiene un lugar extraño que abre un agujero negro para manipular el oráculo (esta es una declaración falsa, ver Actualización ). Es decir, al calcular el valor de k ( sección 5.1 ), se usa una clave privada, que el usuario desconoce, entonces el usuario no puede verificar la exactitud del cálculo de k, entonces el oráculo puede usar cualquier valor de k que necesite y al mismo tiempo mantener una base de datos de correspondencias k y los datos firmados para que Siempre podrá recalcular el resultado correcto desde el punto de vista de VRF. Verá un sorteo basado en VRF sin revelar la clave privada, puede pensar en ello: indique la necesidad o abra la clave, o excluya del cálculo de k, luego la clave privada se abrirá automáticamente cuando aparezca la primera firma. En general, como ya se mencionó, un esquema extraño para un oráculo aleatorio.


Con un poco de reflexión y recabando el apoyo de analistas locales, nació el flujo de trabajo VECRO.


VECRO es una abreviatura de Verificable Curva Elíptica Oráculo Aleatorio, que en ruso significa un oráculo aleatorio verificado en curvas elípticas.


Todo resultó ser bastante simple, para lograr el determinismo, es necesario fijar el valor de R antes de la aparición de un mensaje firmado. Si R es fijo y es parte de un mensaje firmado, lo que además garantiza que R está fijo en el mensaje firmado en sí, el valor de S está determinado únicamente por el mensaje del usuario y, por lo tanto, puede usarse como fuente de números pseudoaleatorios.


En tal esquema, no importa cómo se arregle R, permanece en el área de responsabilidad del oráculo. Es importante que el usuario determine únicamente S, pero su valor se desconoce hasta que el oráculo lo publica. Todo lo que quisimos!


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


En total, el oráculo debe proporcionar a los usuarios dos funciones: inicialización, que fija el valor de R, y una firma, que devuelve el valor de S. Además, el par R, S es una firma verificada regular de un mensaje de usuario que contiene un valor fijo de R y datos de usuario arbitrarios.


Se puede argumentar que este esquema para blockchain no es más que un esquema normal de compromiso-divulgación . De hecho, sí, esa es ella. Pero hay algunos matices. En primer lugar, el oráculo siempre funciona con la misma clave en todas las operaciones, por ejemplo, es conveniente usarlo en contratos. En segundo lugar, existe el riesgo de perder la clave privada por el oráculo debido a un comportamiento incorrecto, por ejemplo, el oráculo le permite tomar muestras del resultado, luego es suficiente hacer solo dos pruebas para descubrir la clave privada y obtener acceso completo a la billetera. En tercer lugar, la firma que se verifica de forma nativa en blockchain, que es una fuente de aleatoriedad, es hermosa.


Durante medio año, la idea de implementación estuvo en mi cabeza, hasta que finalmente hubo una motivación en forma de una subvención de Waves Labs . Con una gran donación, viene una gran responsabilidad, lo que significa que el proyecto debe ser.


Implementación


Entonces, en este proyecto, 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. Al mismo tiempo, se instala un script en la cuenta de Oracle que supervisa la operación estrictamente de acuerdo con la lógica descrita anteriormente. Las transacciones de Oracle se verifican para restaurar toda la cadena de interacción del usuario. Las cuatro transacciones participan en la verificación del valor final, el contrato inteligente los colocó en un estricto hilo de verificación, verificando paso a paso todos los valores y sin dejar espacio para ninguna manipulación.


Una vez más, se pospondrá y se hará más claro. El oráculo no solo funciona de acuerdo con el esquema propuesto. Su trabajo está totalmente controlado a nivel de blockchain por un contrato inteligente bien establecido. Un paso a la izquierda, y la transacción simplemente no funcionará. Entonces, si la transacción cayó en la cadena de bloques, el usuario ni siquiera necesita verificar nada, cientos de nodos de red ya lo han verificado todo.


En este momento, un VECRO se está ejecutando en la red principal de Waves (puede ejecutar el suyo propio, no es difícil, solo mire el ejemplo de configuración ). El código actual funciona en PHP (en WavesKit , del que hablé anteriormente ).


Para utilizar el servicio Oracle debe:


  • Fix R;
    • Envíe un mínimo de 0.005 Ondas al alias del oráculo init @ vecr;
    • Obtenga el código R en el campo adjunto en la transferencia de 1 token R-vecr del oráculo al usuario;
  • Consigue una firma
    • Envíe un mínimo de 0.005 Ondas al alias del oráculo random @ vecr, y SIEMPRE especifique el código R recibido previamente y los datos adicionales del usuario en el campo adjunto;
    • Obtenga 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úmero pseudoaleatorio.

Los matices de la implementación actual:


  • Las ondas enviadas al oráculo se utilizan como comisión para una transacción inversa para el usuario, hasta un máximo de 1 ondas;
  • El código R es la concatenación del byte del carácter 'R' y el valor de 32 bytes de R en la codificación base58;
  • El código R en el archivo adjunto debe ser el primero, los datos del usuario vienen después del código R;
  • El código S es la concatenación del byte del carácter 'S' y el byte 32 del valor S en la codificación base58;
  • S es el resultado de la división del módulo; por lo tanto, S no puede usarse 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 simple es usar el hash del código S como un número pseudoaleatorio.

Un ejemplo de obtención de código S:



Desde un punto de vista técnico, el oráculo está completamente listo para el trabajo, puede usarlo con seguridad. Desde el punto de vista del uso por parte de un usuario común, una interfaz gráfica conveniente no es suficiente, esto tendrá que esperar.


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


Actualización 8 de mayo de 2019


Estaba equivocado acerca de VRF. Sí, de hecho, la firma ECVRF no se puede usar como fuente de un número pseudoaleatorio, pero no se usa para este propósito. Se necesita una firma para crear una prueba de la unicidad del valor Gamma ( sección 5.3 , paso 6). Pero el valor Gamma verificado utilizando la firma ya está participando como fuente de un número pseudoaleatorio ( sección 5.2 , paso 5). Gracias a Oleg Taraskin Crittografo por señalar en este punto, admito mi error. ECVRF tiene todo el derecho a la vida.


Desafortunadamente, todavía no hay oportunidad de usar ECVRF en el nivel de cadena de bloques de Waves, debido a la falta del aparato matemático necesario en los contratos inteligentes.


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

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


All Articles