Bloquear oracle baseado em oracle aleatório com base em assinatura digital

Da ideia à implementação: modificamos o esquema de assinatura digital existente em uma curva elíptica para que seja determinístico e fornecemos com base as funções de obtenção de números pseudo-aleatórios verificados no blockchain.



Idéia


No outono de 2018, os primeiros contratos inteligentes foram ativados no blockchain Waves, imediatamente surgiu a questão sobre a possibilidade de obter números pseudo-aleatórios nos quais você pode confiar.


Quebrando a cabeça sobre esse problema, finalmente cheguei à conclusão: qualquer blockchain é uma célula, é impossível obter uma fonte confiável de entropia em um sistema fechado.


Mas eu ainda gostei de uma idéia: se um oráculo aleatório tornar a assinatura dos dados do usuário um algoritmo determinístico, o usuário sempre poderá verificar essa assinatura com a chave pública e garantirá que o valor recebido seja único. O oráculo, com todo o desejo, não é capaz de mudar nada, o algoritmo produz um resultado claro. De fato, o usuário captura o resultado, mas não o conhece até que o oráculo o publique. Acontece que você não pode confiar no oráculo, mas verifique o resultado de seu trabalho. Então, no caso de uma verificação bem-sucedida, essa assinatura pode ser considerada uma fonte de entropia para um número pseudo-aleatório.


A plataforma blockchain Waves usa o esquema de assinatura EdDSA, uma variante do Ed25519 . Nesse esquema, a assinatura consiste nos valores de R e S, em que R depende de um valor aleatório, e S é calculado com base na mensagem sendo assinada, na chave privada e no mesmo número aleatório que R. Acontece que não há dependência individual para o mesmo Uma mensagem personalizada possui muitas assinaturas válidas.


Obviamente, em sua forma pura, essa assinatura não pode ser usada como fonte de números pseudo-aleatórios, uma vez que é não determinística e, portanto, pode ser facilmente sujeita a manipulação pelo oráculo.


Mas, como se viu, torná-lo determinado é realmente possível.


Eu tinha grandes esperanças de uma função aleatória testada (VRF) , mas, tendo estudado o material, tive que recusar essa opção. Embora o VRF ofereça uma versão determinística da assinatura e sua prova, o algoritmo possui um lugar estranho que abre um buraco negro para manipular o oráculo (esta é uma afirmação falsa, consulte Atualização ). Ou seja, ao calcular o valor de k ( seção 5.1 ), uma chave privada é usada, que permanece desconhecida para o usuário, o usuário não pode verificar a exatidão do cálculo de k, o oráculo pode usar qualquer valor de k que ele precisa e, ao mesmo tempo, manter um banco de dados de correspondências k e os dados assinados para sempre seja capaz de recalcular o resultado correto do ponto de vista do VRF. Você verá um sorteio baseado em VRF sem divulgar a chave privada, pode pensar nisso: indique a necessidade ou abra a chave ou exclua-a do cálculo de k, a chave privada se abrirá automaticamente quando a primeira assinatura aparecer. Em geral, como já mencionado, um esquema estranho para um oráculo aleatório.


Pensando um pouco e contando com o apoio de analistas locais, nasceu o fluxo de trabalho da VECRO.


VECRO é uma abreviação de Oracle aleatório de curva elíptica verificável, que em russo significa um oráculo aleatório verificado nas curvas elípticas.


Tudo se mostrou bastante simples, para alcançar o determinismo, é necessário fixar o valor de R antes do aparecimento de uma mensagem assinada. Se R for fixo e fizer parte de uma mensagem assinada, o que adicionalmente garante que R seja corrigido na própria mensagem assinada, o valor de S é determinado exclusivamente pela mensagem do usuário e, portanto, pode ser usado como uma fonte para números pseudo-aleatórios.


Nesse esquema, não importa como R seja corrigido, ele permanece na área de responsabilidade do oráculo. É importante que S seja determinado exclusivamente pelo usuário, mas seu valor é desconhecido até que o oráculo o publique. Tudo como queríamos!


Por falar em R fixo, observe que o R reutilizado ao assinar várias mensagens revela exclusivamente a chave privada no esquema EdDSA. Para o proprietário do oráculo, torna-se extremamente importante excluir a possibilidade de reutilizar R para assinar diferentes mensagens do usuário. Ou seja, durante qualquer manipulação ou conspiração, o oráculo sempre corre o risco de perder sua chave privada.


No total, o oracle deve fornecer aos usuários duas funções: inicialização, que fixa o valor de R, e uma assinatura, que retorna o valor de S. Além disso, o par R, S é uma assinatura verificada regularmente de uma mensagem do usuário contendo um valor fixo de R e dados arbitrários do usuário.


Pode-se argumentar que esse esquema para a blockchain nada mais é do que um esquema normal de divulgação e confirmação . De fato, sim, é ela. Mas existem algumas nuances. Primeiro, o oráculo sempre trabalha com a mesma chave em todas as operações, por exemplo, é conveniente usar em contratos. Em segundo lugar, existe o risco de perder a chave privada pelo oráculo devido a um comportamento incorreto; por exemplo, o oráculo permite que você faça amostras do resultado; basta fazer apenas dois testes para descobrir a chave privada e obter acesso total à carteira. Em terceiro lugar, a assinatura que é nativamente verificada na blockchain, que é uma fonte de aleatoriedade, é linda.


Por meio ano, a ideia de implementação estava na minha cabeça, até que finalmente houve uma motivação na forma de uma concessão do Waves Labs . Com uma grande doação, chega uma grande responsabilidade, o que significa que o projeto será!


Implementação


Portanto, neste projeto, o VECRO foi implementado no blockchain Waves no modo de solicitação-resposta usando transações de transferência entre o usuário e o oracle. Ao mesmo tempo, um script é instalado na conta oracle que monitora a operação estritamente de acordo com a lógica descrita acima. As transações do Oracle são verificadas para restaurar toda a cadeia de interação do usuário. Todas as quatro transações participam da verificação do valor final, o contrato inteligente as amarra em um rigoroso encadeamento de verificação, verificando passo a passo todos os valores e não deixando espaço para manipulações.


Mais uma vez, ser adiado e esclarecido. O oráculo não funciona apenas de acordo com o esquema proposto. Seu trabalho é totalmente controlado no nível da blockchain por um contrato inteligente firmemente estabelecido. Um passo para a esquerda e a transação simplesmente não funcionará. Portanto, se a transação caiu no blockchain, o usuário nem precisa verificar nada, centenas de nós da rede já verificaram tudo para ele.


No momento, um VECRO está sendo executado na rede principal do Waves (você pode executar o seu próprio, não é difícil, basta ver o exemplo de configuração ). O código atual funciona em PHP (no WavesKit , sobre o qual falei anteriormente ).


Para usar o serviço oracle, você deve:


  • Fix R;
    • Envie um mínimo de 0,005 Waves para o alias do oracle init @ vecr;
    • Obtenha o código R no campo de anexo na transferência de 1 token R-vecr do oracle para o usuário;
  • Obter uma assinatura
    • Envie um mínimo de 0,005 Waves para o alias oracle random @ vecr e SEMPRE especifique o código R recebido anteriormente e os dados adicionais do usuário no campo de anexo;
    • Obtenha o código S no campo de anexo na transferência de 1 token S-vecr do oracle para o usuário;
  • Use o código S como fonte de número pseudo-aleatório.

As nuances da implementação atual:


  • As ondas enviadas ao oráculo são usadas como comissão para uma transação reversa para o usuário, até no máximo 1 Waves;
  • O código R é a concatenação do byte do caractere 'R' e o valor de 32 bytes de R na codificação base58;
  • O código R em anexo deve ser o primeiro; os dados do usuário vêm após o código R;
  • Código S é a concatenação do byte do caractere 'S' e 32 bytes do valor S na codificação base58;
  • S é o resultado da divisão do módulo; portanto, S não pode ser usado como um número pseudo-aleatório completo de 256 bits (esse número pode ser considerado um máximo de número pseudo-aleatório de 252 bits);
  • A opção mais simples é usar o hash do código S como um número pseudo-aleatório.

Um exemplo de obtenção do código S:



Do ponto de vista técnico, o oráculo está completamente pronto para o trabalho, você pode usá-lo com segurança. Do ponto de vista do uso por um usuário comum, uma interface gráfica conveniente não é suficiente, isso terá que esperar.


Ficarei feliz em responder a perguntas e aceitar comentários, obrigado.


Atualização 8 de maio de 2019


Estava errado sobre VRF. Sim, de fato, a assinatura ECVRF não pode ser usada como fonte de um número pseudo-aleatório, mas não é usada para essa finalidade. É necessária uma assinatura para criar uma prova da exclusividade do valor Gamma ( seção 5.3 , etapa 6). Mas o valor Gamma verificado usando a assinatura já está participando como fonte de um número pseudo-aleatório ( seção 5.2 , etapa 5). Agradeço a Oleg Taraskin Crittografo por apontar neste momento, admito meu erro. O ECVRF tem todo o direito à vida.


Infelizmente, ainda não há oportunidade de usar o ECVRF no nível da blockchain Waves, devido à falta do aparato matemático necessário em contratos inteligentes.


Quando essa funcionalidade ou suporte ao RSA estiver disponível, você poderá escrever novos oráculos. Quanto ao esquema VECRO, em qualquer caso, ele ocupa seu próprio nicho e permite que você trabalhe sem nenhuma funcionalidade adicional.

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


All Articles