Oráculo aleatorio baseado na sinatura dixital en blockchain

Da idea á implementación: modificamos o esquema de sinatura dixital de curva elíptica existente para que sexa determinista, e en base a el proporcionamos funcións para a obtención de números pseudoaleatorios verificables dentro da cadea de bloques.

Oráculo aleatorio baseado na sinatura dixital en blockchain

Idea

No outono de 2018 incluíuse a cadea de bloques Waves primeiros contratos intelixentes activados, inmediatamente xurdiu a pregunta sobre a posibilidade de obter números pseudoaleatoriosque podes confiar.

Desconcertado con esta pregunta, finalmente cheguei á conclusión: calquera cadea de bloques é unha célula; é imposible obter unha fonte de entropía fiable nun sistema pechado.

Pero aínda me gustou unha idea: se oráculo aleatorio asinará os datos do usuario cun algoritmo determinista, entón o usuario sempre poderá verificar tal sinatura mediante a chave pública e asegurarase de que o valor resultante é único. O oráculo, por moito que queira, é incapaz de cambiar nada; o algoritmo produce un resultado inequívoco. Esencialmente, o usuario rexistra o resultado, pero non o coñece ata que o oráculo o publica. Acontece que non podes confiar en absoluto no oráculo, pero comprobar o resultado do seu traballo. Entón, en caso de verificación exitosa, tal sinatura pódese considerar unha fonte de entropía para un número pseudoaleatorio.

A plataforma de cadea de bloques Waves usa un esquema de sinatura EdDSA opción Ed25519. Neste esquema, a sinatura consta dos valores R e S, onde R depende dun valor aleatorio, e S calcúlase en función da mensaxe que se asina, a clave privada e o mesmo número aleatorio que R. Resulta que non hai unha dependencia única para o mesmo. Hai moitas sinaturas válidas para unha mensaxe de usuario.

Obviamente, na súa forma pura, tal sinatura non se pode utilizar como fonte de números pseudoaleatorios, xa que non é determinista e, polo tanto, pode ser facilmente manipulada polo oráculo.

Pero, como se viu, é realmente posible facelo determinista.

Tiña grandes esperanzas función aleatoria verificable (VRF), pero despois de estudar o hardware, tiven que abandonar esta opción. Aínda que VRF ofrece unha versión determinista da sinatura e da súa proba, hai un lugar estraño no algoritmo que abre un buraco negro para a manipulación do oráculo. É dicir, ao calcular o valor de k (apartado 5.1) utilízase unha clave privada, que segue sendo descoñecida para o usuario, o que significa que o usuario non pode verificar a corrección do cálculo de k, o que significa que o oráculo pode utilizar calquera valor de k que necesite e, ao mesmo tempo, manter unha base de datos de correspondencias. de k e os datos asinados para poder volver calcular sempre o resultado correcto dende o punto de vista de VRF . Se ves un debuxo baseado en VRF sen revelar a clave privada, podes ser intelixente: indica a necesidade de revelar a clave ou excluíla do cálculo de k, entón a clave privada revelarase automaticamente cando apareza a primeira sinatura. . En xeral, como xa se mencionou, un estraño esquema para un oráculo aleatorio.

Despois dun pouco de reflexión e de contar co apoio dos analistas locais, naceu o esquema de traballo VECRO.

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

Todo resultou moi sinxelo; para conseguir o determinismo, cómpre fixar o valor de R antes de que apareza a mensaxe que se quere asinar. Se R está confirmado e forma parte da mensaxe que se asina, o que asegura ademais que R está confirmado na mensaxe que se asina, o valor de S está determinado de forma exclusiva pola mensaxe do usuario e, polo tanto, pode usarse como fonte de números pseudoaleatorios.

Neste esquema, non importa como se arranxe R; esta segue sendo responsabilidade do oráculo. É importante que S sexa determinado de forma única polo usuario, pero o seu valor é descoñecido ata que o oráculo o publica. Todo o que queriamos!

Falando de R fixo, teña en conta que reutilizado R ao asinar varias mensaxes, revela de forma única a clave privada no esquema EdDSA. Faise extremadamente importante para o propietario do oráculo eliminar a posibilidade de reutilizar R para asinar diferentes mensaxes de usuario. É dicir, con calquera manipulación ou connivencia, o oráculo sempre correrá o risco de perder a súa clave privada.

En total, o oráculo debe proporcionar aos usuarios dúas funcións: inicialización, que fixa o valor R, e sinatura, que devolve o valor S. Neste caso, o par R, S é a sinatura verificable habitual dunha mensaxe de usuario que contén un valor fixo. valor R e datos de usuario arbitrarios.

Pódese argumentar que este esquema para a cadea de bloques non é máis que normal esquema commit-expand. En esencia, si, é ela. Pero hai varios matices. En primeiro lugar, o oráculo sempre funciona coa mesma clave en todas as operacións, por exemplo, é conveniente usar en contratos. En segundo lugar, existe o risco de que o oráculo perda a clave privada se se comporta de forma incorrecta, por exemplo, o oráculo permítelle facer mostras do resultado, entón é suficiente con facer só dúas probas para descubrir a clave privada e obter a súa totalidade. acceso á carteira. En terceiro lugar, unha sinatura que é verificable nativamente na cadea de bloques e é unha fonte de aleatoriedade é fermosa.

Durante seis meses, a idea da implementación coceu na miña cabeza, ata que finalmente apareceu a motivación no formulario subvención de Waves Labs. Cunha gran subvención vén unha gran responsabilidade, o que significa que o proxecto estará aí!

Implantación

Así, neste proxecto Implementouse VECRO na cadea de bloques Waves en modo solicitude-resposta mediante transaccións de transferencia entre o usuario e o oráculo. Ao mesmo tempo, instálase un script na conta de Oracle, que controla o traballo estrictamente de acordo coa lóxica descrita anteriormente. Verifícanse as transaccións de Oracle e restablece toda a cadea de interacción do usuario. As catro transaccións están implicadas na verificación do valor final; o contrato intelixente as encadea cun estrito fío de verificación, comprobando todos os valores paso a paso e non deixa espazo para ningunha manipulación.

Unha vez máis, para deixalo de lado e deixalo máis claro. O oráculo non só funciona segundo o esquema proposto. O seu traballo está completamente controlado a nivel de blockchain polo establecido estreitamente cun contrato intelixente. Da un paso á esquerda e a transacción simplemente non se realizará. Polo tanto, se se inclúe unha transacción na cadea de bloques, o usuario nin sequera precisa comprobar nada; centos de nodos de rede xa comprobaron todo por el.

Actualmente, hai un VECRO funcionando na rede principal de Waves (podes executar o teu propio, non é difícil, só bótalle un ollo ao exemplo de configuración). O código actual execútase en PHP (on WavesKit, sobre o que Xa cho dixen antes).

Para utilizar o servizo de Oracle debes:

  • corrixir R;
    • Enviar polo menos 0.005 ondas ao alias de oracle init@vecr;
    • Reciba o código R no campo adxunto na transferencia de 1 token R-vecr do oráculo ao usuario;
  • Obter unha sinatura;
    • Envía polo menos 0.005 Waves ao alias do oráculo random@vecr, e tamén DEBE indicar o código R recibido previamente e os datos adicionais do usuario no campo do anexo;
    • Reciba o código S no campo adxunto na transferencia de 1 token S-vecr do oráculo ao usuario;
  • Use o código S como fonte de números pseudoaleatorios.

Matices da implementación actual:

  • As ondas enviadas ao oráculo úsanse como comisión para a transacción de devolución ao usuario, ata un máximo de 1 Waves;
  • O código R é a concatenación dun byte do carácter "R" e un valor R codificado en base32 de 58 bytes;
  • O código R no anexo debe ser o primeiro, os datos do usuario veñen despois do código R;
  • O código S é a concatenación dun byte do carácter 'S' e un valor de 32 bytes codificado en base58 de S;
  • S é o resultado da división de módulo, polo que non pode usar S como un número pseudoaleatorio completo de 256 bits (este número pódese considerar como un número pseudoaleatorio de 252 bits como máximo);
  • A opción máis sinxela é usar o hash do código S como un número pseudoaleatorio.

Exemplo de recepción de código S:

Desde o punto de vista técnico, o oráculo está completamente listo para traballar, podes usalo con seguridade. Dende o punto de vista do uso por parte do usuario medio, falta unha interface gráfica conveniente, que terá que esperar.

Estarei encantado de responder preguntas e aceptar comentarios, grazas.

Fonte: www.habr.com

Engadir un comentario