Oráculo aleatório baseado em assinatura digital em blockchain

Da ideia à implementação: modificamos o esquema de assinatura digital da curva elíptica existente para que seja determinístico e, com base nele, fornecemos funções para obter números pseudo-aleatórios verificáveis ​​dentro do blockchain.

Oráculo aleatório baseado em assinatura digital em blockchain

Idéia

No outono de 2018, o blockchain Waves incluiu primeiros contratos inteligentes ativados, surgiu imediatamente a questão sobre a possibilidade de obter números pseudoaleatóriosque você pode confiar.

Confuso com esta questão, finalmente cheguei à conclusão: qualquer blockchain é uma célula; é impossível obter uma fonte confiável de entropia em um sistema fechado.

Mas ainda gostei de uma ideia: se oráculo aleatório assinará os dados do usuário com um algoritmo determinístico, então o usuário sempre poderá verificar tal assinatura usando a chave pública e terá certeza de que o valor resultante é único. O oráculo, por mais que queira, não consegue mudar nada; o algoritmo produz um resultado inequívoco. Essencialmente, o usuário registra o resultado, mas não sabe até que o oráculo o publique. Acontece que você não pode confiar no oráculo de forma alguma, mas sim verificar o resultado de seu trabalho. Então, no caso de verificação bem-sucedida, tal assinatura pode ser considerada uma fonte de entropia para um número pseudoaleatório.

A plataforma blockchain Waves usa um esquema de assinatura EdDSA opção Ed25519. Neste esquema, a assinatura consiste nos valores R e S, onde R depende de um valor aleatório, e S é calculado com base na mensagem que está sendo assinada, na chave privada e no mesmo número aleatório de R. Acontece que não há dependência única para a mesma. Existem muitas assinaturas válidas para uma mensagem do usuário.

Obviamente, em sua forma pura, tal assinatura não pode ser utilizada como fonte de números pseudo-aleatórios, pois é não determinística e, portanto, pode ser facilmente manipulada pelo oráculo.

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

Eu tinha grandes esperanças função aleatória verificável (VRF), mas depois de estudar o hardware tive que abandonar essa opção. Embora o VRF ofereça uma versão determinística da assinatura e sua prova, há um lugar estranho no algoritmo que abre um buraco negro para manipulação do oráculo. Ou seja, ao calcular o valor de k (seção 5.1) é utilizada uma chave privada, que permanece desconhecida do usuário, o que significa que o usuário não pode verificar a exatidão do cálculo de k, o que significa que o oráculo pode usar qualquer valor de k que precisar e ao mesmo tempo manter um banco de dados de correspondências de k e dos dados assinados para poder sempre recalcular o resultado correto do ponto de vista do VRF. Se você vir um desenho baseado em VRF sem divulgar a chave privada, você pode ser esperto: indique a necessidade de revelar a chave ou excluí-la do cálculo de k, então a chave privada se revelará automaticamente quando a primeira assinatura aparecer . Em geral, como já mencionado, um esquema estranho para um oráculo aleatório.

Depois de pensar um pouco e contar com o apoio de analistas locais, nasceu o esquema de trabalho VECRO.

VECRO é uma abreviatura de Verifiable Elliptic Curve Random Oracle, que em russo significa oráculo aleatório verificável em curvas elípticas.

Tudo acabou sendo bem simples: para conseguir o determinismo é preciso fixar o valor de R antes que apareça a mensagem a ser assinada. Se R for confirmado e fizer parte da mensagem que está sendo assinada, o que garante ainda que R seja confirmado na mensagem que está sendo assinada, o valor de S é determinado exclusivamente pela mensagem do usuário e pode, portanto, ser usado como fonte para números pseudoaleatórios.

Nesse esquema, não importa como R é fixado; isso continua sendo 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 o que queríamos!

Falando em R fixo, observe que R reutilizado ao assinar várias mensagens, revela exclusivamente a chave privada no esquema EdDSA. Torna-se extremamente importante para o proprietário do oráculo eliminar a possibilidade de reutilizar R para assinar diferentes mensagens do usuário. Ou seja, com qualquer manipulação ou conluio, o oráculo sempre correrá o risco de perder sua chave privada.

No total, o oráculo deve fornecer aos usuários duas funções: inicialização, que fixa o valor R, e assinatura, que retorna o valor S. Nesse caso, o par R, S é a assinatura verificável usual de uma mensagem do usuário contendo um fixo valor R e dados arbitrários do usuário.

Pode-se argumentar que este esquema para o blockchain nada mais é do que comum esquema de confirmação-expansão. Essencialmente, sim, é ela. Mas existem várias nuances. Em primeiro lugar, o oráculo funciona sempre com a mesma chave em todas as operações, por exemplo, é conveniente usar em contratos. Em segundo lugar, existe o risco do oráculo perder a chave privada se ele se comportar incorretamente, por exemplo, o oráculo permite fazer amostras do resultado, então basta fazer apenas dois testes para descobrir a chave privada e obter o total acesso à carteira. Em terceiro lugar, uma assinatura que seja nativamente verificável no blockchain e seja uma fonte de aleatoriedade é linda.

Durante seis meses a ideia de implementação ferveu na minha cabeça, até que finalmente a motivação apareceu na forma bolsa da Waves Labs. Com uma grande doação vem uma grande responsabilidade, então o projeto estará lá!

Implementação

Então, neste projeto VECRO foi implementado no blockchain Waves no modo solicitação-resposta usando transações de transferência entre o usuário e o oráculo. Ao mesmo tempo, é instalado na conta oracle um script que controla o trabalho estritamente de acordo com a lógica descrita acima. As transações Oracle são verificadas e toda a cadeia de interação do usuário é restaurada. Todas as quatro transações estão envolvidas na verificação do valor final; o contrato inteligente as une com um thread de verificação rigoroso, verificando todos os valores passo a passo e não deixando espaço para qualquer manipulação.

Mais uma vez, para deixar isso de lado e deixar mais claro. O oráculo não funciona apenas de acordo com o esquema proposto. Seu trabalho é totalmente controlado no nível do blockchain pelo estabelecido firmemente com um contrato inteligente. Dê um passo para a esquerda e a transação simplesmente não será concluída. Assim, se uma transação estiver incluída no blockchain, o usuário nem precisa verificar nada; centenas de nós da rede já verificaram tudo para ele.

Atualmente, existe um VECRO rodando na rede principal da Waves (você pode rodar o seu próprio, não é difícil, apenas dê uma olhada no exemplo de configuração). O código atual é executado em PHP (em Kit Ondas, sobre o qual Eu te disse antes).

Para usar o serviço oracle você deve:

  • Corrigir R;
    • Envie pelo menos 0.005 Waves para o alias do Oracle init@vecr;
    • Receba o código R no campo anexo na transferência de 1 token R-vecr do oráculo para o usuário;
  • Obtenha uma assinatura;
    • Envie pelo menos 0.005 Waves para o alias do oráculo random@vecr, e também DEVE indicar o código R recebido anteriormente e dados adicionais do usuário no campo de anexo;
    • Receber o código S no campo anexo na transferência de 1 token S-vecr do oráculo para o usuário;
  • Use o código S como fonte de número pseudo-aleatório.

Nuances da implementação atual:

  • As ondas enviadas ao oráculo são utilizadas como comissão pela transação de devolução ao usuário, até no máximo 1 Onda;
  • O código R é a concatenação de um byte do caractere 'R' e um valor R codificado em base32 de 58 bytes;
  • O código R em anexo deve ser o primeiro, os dados do usuário vêm depois do código R;
  • O código S é a concatenação de um byte do caractere 'S' e um valor de S codificado em base32 de 58 bytes;
  • S é o resultado da divisão do módulo, portanto você não pode usar S como um número pseudoaleatório completo de 256 bits (esse número pode ser considerado um número pseudoaleatório máximo de 252 bits);
  • A opção mais simples é usar o hash do código S como um número pseudo-aleatório.

Exemplo de recebimento do código S:

Do ponto de vista técnico, o oráculo está totalmente pronto para funcionar, você pode utilizá-lo com segurança. Do ponto de vista da utilização pelo usuário médio, falta uma interface gráfica conveniente, isso terá que esperar.

Terei prazer em responder perguntas e aceitar comentários, obrigado.

Fonte: habr.com

Adicionar um comentário