Desde la idea hasta la implementación: modificamos el esquema existente de firma digital sobre curvas elípticas para que sea determinista, y proporcionamos en su base funciones para obtener números pseudorandom verificables dentro de la blockchain.

La idea
En otoño de 2018, en la blockchain Waves se , inmediatamente surgió la pregunta sobre la posibilidad de obtener , en los que se pueda confiar.
Reflexionando sobre esta cuestión, llegué a la conclusión final: cualquier blockchain es una celda, obtener una fuente confiable de entropía en un sistema cerrado es imposible.
Pero una idea me agradó: si un firma los datos del usuario con un algoritmo determinista, entonces el usuario siempre podrá verificar dicha firma con la clave pública, y estará seguro de que el valor obtenido es único. El oráculo, por mucho que quiera, no puede cambiar nada, el algoritmo produce un resultado único. De hecho, el usuario fija el resultado, pero no lo conoce hasta que el oráculo lo publique. Así, se puede no confiar en absoluto en el oráculo, pero verificar el resultado de su trabajo. Entonces, en caso de que la verificación sea exitosa, tal firma puede considerarse una fuente de entropía para un número pseudorandom.
En la plataforma blockchain Waves se utiliza un esquema de firma una variante . En este esquema, la firma consiste en los valores R y S, donde R depende de un valor aleatorio, y S se calcula sobre la base del mensaje firmado, la clave privada y el mismo número aleatorio que R. Por lo tanto, no hay una dependencia única; para el mismo mensaje del usuario existe una multitud de firmas válidas.
Es evidente que tal firma en su forma pura no se puede utilizar como fuente de números pseudorandom, ya que es no determinista y, por lo tanto, puede ser fácilmente manipulada por el oráculo.
Pero, como se descubrió, en realidad es posible hacerla determinista.
Tenía grandes esperanzas en un , pero después de estudiar el material, se tuvo que renunciar a esta variante. Aunque VRF ofrece una variante determinista de firma y su prueba, hay un punto extraño en el algoritmo que abre un agujero negro para las manipulaciones del oráculo. Específicamente, al calcular el valor de k () se utiliza una clave privada que permanece desconocida para el usuario, lo que significa que el usuario no puede verificar la corrección del cálculo de k, lo que permite al oráculo usar cualquier valor de k que necesite y al mismo tiempo mantener una base de datos de correspondencias entre k y los datos firmados, para siempre poder volver a calcular el resultado correcto según VRF. Si ves un sorteo basado en VRF sin revelar la clave privada, puedes ser astuto: señalar la necesidad de o revelar la clave, o excluirla del cálculo de k, entonces la clave privada se revelará automáticamente con la primera firma que aparezca. En resumen, como se ha mencionado, es un esquema extraño para un oráculo aleatorio.
Después de reflexionar un poco y con el apoyo de analistas locales, nació el esquema de trabajo de VECRO.
VECRO es un acrónimo de Verifiable Elliptic Curve Random Oracle, que en español significa oráculo aleatorio verificable en curvas elípticas.
Todo resultó ser bastante simple, para lograr la determinación es necesario fijar el valor de R antes de que aparezca el mensaje firmado. Si R está fijado y es parte del mensaje firmado, lo que garantiza adicionalmente la fijación de R en el mismo mensaje firmado, el valor de S se determina de manera única por el mensaje del usuario y, por lo tanto, puede usarse como fuente de números pseudoaleatorios.
En este esquema no importa cómo se fija R, eso queda en la responsabilidad del oráculo. Lo importante es que S se determina de manera única por el usuario, pero su valor es desconocido hasta que el oráculo lo publique. ¡Todo como queríamos!
Hablando de R fijo, ten en cuenta que Al firmar diferentes mensajes, se revela sin ambigüedades la clave privada en el esquema EdDSA. Para el propietario del oráculo, es crucial eliminar la posibilidad de reutilizar R para firmar distintos mensajes del usuario. Es decir, en cualquier manipulación o conspiración, el oráculo siempre arriesgará la pérdida de su clave privada.
En resumen, el oráculo debe proporcionar a los usuarios dos funciones: la inicialización, que fija el valor R, y la firma, que devuelve el valor S. De este modo, el par R, S es una firma verificable común del mensaje del usuario que contiene el valor R fijo y datos arbitrarios del usuario.
Se podría argumentar que este esquema para blockchain no es más que un simple . En esencia, sí, lo es. Pero hay varios matices. En primer lugar, el oráculo siempre trabaja con la misma clave en todas las operaciones, lo cual es conveniente para utilizar en contratos. En segundo lugar, existe el riesgo de que el oráculo pierda su clave privada debido a un comportamiento incorrecto. Por ejemplo, si el oráculo permite hacer pruebas del resultado, bastaría con hacer solo dos pruebas para conocer la clave privada y obtener acceso completo a la billetera. En tercer lugar, la firma nativamente verificable en blockchain, que es la fuente de aleatoriedad, es algo interesante.
Durante seis meses, la idea de implementación estuvo latente en mi mente hasta que finalmente apareció la motivación en forma de . Con una gran subvención viene una gran responsabilidad, ¡así que el proyecto debe llevarse a cabo!
Implementación
Así que, en este proyecto, en la blockchain de Waves en modo de solicitud-respuesta mediante transacciones de transferencia entre el usuario y el oráculo. Al mismo tiempo, en la cuenta del oráculo se instaló un script que controla su funcionamiento estrictamente de acuerdo con la lógica descrita anteriormente. Las transacciones del oráculo son verificadas restaurando toda la cadena de interacción con el usuario. En la verificación del valor final participan las cuatro transacciones, el contrato inteligente las enlaza en un hilo de verificación estricto, verificando paso a paso todos los valores y sin dejar lugar para ninguna maniobra.
Una vez más, para que quede claro y comprensible. El oráculo no simplemente opera según el esquema propuesto. Su funcionamiento está completamente controlado a nivel de blockchain. . Un paso a la izquierda y la transacción simplemente no se procesará. Así que, si la transacción ha entrado en la blockchain, el usuario ni siquiera necesita verificar nada, ya que cientos de nodos de la red lo han comprobado todo por él.
En este momento, en la red principal de Waves se ha lanzado un VECRO (puedes lanzar el tuyo, no es difícil, solo ). El código actual funciona en PHP (en , del cual ).
Para poder utilizar el servicio del oráculo, es necesario:
- Fijar R;
- Enviar un mínimo de 0.005 Waves al alias del oráculo init@vecr;
- Obtener el R-code en el campo de adjunto en la transferencia de 1 token R-vecr del oráculo al usuario;
- Obtener la firma;
- Enviar un mínimo de 0.005 Waves al alias del oráculo random@vecr, y también OBLIGATORIAMENTE indicar en el campo de adjunto el R-code obtenido anteriormente y datos adicionales del usuario;
- Obtener el S-code en el campo de adjunto en la transferencia de 1 token S-vecr del oráculo al usuario;
- Utilizar el S-code como fuente de número pseudoaleatorio.
Particularidades de la implementación actual:
- Los Waves enviados al oráculo se utilizan como comisión para la transacción inversa al usuario, hasta un máximo de 1 Waves;
- El R-code es la concatenación del byte del carácter ‘R’ y del valor de 32 bytes R en codificación base58;
- El R-code en el adjunto debe ser el primero, los datos del usuario van después del R-code;
- El S-code es la concatenación del byte del carácter ‘S’ y del valor de 32 bytes S en codificación base58;
- S es el resultado de una división módulo, por lo que no se puede usar S como un número pseudoaleatorio de 256 bits (este número puede considerarse como un número pseudoaleatorio de máximo 252 bits);
- La opción más sencilla es usar el hash del S-code como número pseudoaleatorio.
Ejemplo de obtención del S-code:
- Inicialización:
- Obtención del R-code:
- Solicitud del resultado de la firma del R-code y los datos del usuario 'random':
- Obtención del S-code:
Desde un punto de vista técnico, el oráculo está completamente listo para funcionar, puedes usarlo sin problemas. Desde el punto de vista del usuario promedio, falta una interfaz gráfica conveniente, eso aún tendrá que esperar.
Estaré encantado de responder preguntas y recibir comentarios, gracias.
Fuente: habr.com
