Da ideia à implementação: modificando o esquema de assinatura de curva elíptica existente para ser determinístico e fornecendo funções nele para ser verificável dentro dos números pseudo-aleatórios da blockchain.

Idéia
No outono de 2018, quando os primeiros contratos inteligentes foram ativados no blockchain Waves, o tópico de obter números pseudo-aleatórios de maneira confiável surgiu naturalmente.
Pensando nisso, cheguei à conclusão de que qualquer blockchain é uma espécie de gaiola, e é impossível obter uma fonte confiável de entropia em um sistema fechado.
No entanto, gostei de uma ideia. Se um oráculo aleatório assinar dados do usuário com um algoritmo determinístico, o usuário sempre poderá verificar essa assinatura pela chave pública para garantir que o valor obtido seja exclusivo. O oráculo não seria capaz de fazer alterações porque o algoritmo apresenta um resultado de valor único. Basicamente, o usuário corrige o resultado, mas não o conhece até que seja publicado pelo oracle. Portanto, você pode não confiar no oráculo, mas ainda assim pode verificar o resultado de sua operação. Então, em caso de verificação bem-sucedida, essa assinatura pode ser uma fonte de entropia para um número pseudo-aleatório.
Na blockchain Waves, é usado o esquema de assinatura Ed25A variante Ed25519 . Nesse esquema, a assinatura consiste nos valores R e S. R é dependente de um valor aleatório e S é calculado com base em uma mensagem assinada, uma chave privada e o mesmo número aleatório que R. Não há dependência única, e várias assinaturas válidas existem para a mesma mensagem do usuário.
Aparentemente, esse tipo de assinatura por si só não pode ser usado como fonte de números pseudo-aleatórios porque é indeterminado e, portanto, pode ser facilmente manipulado pelo oráculo.
No entanto, como se vê, é realmente possível torná-lo determinístico.
Minhas grandes esperanças foram definidas para a função aleatória verificável (VRF) , mas, depois de estudar suas especificidades, tenho que rejeitar essa opção. Embora o VRF ofereça uma versão determinada de uma assinatura e suas provas, o algoritmo possui um local estranho que abre um buraco negro para manipulações pelo oráculo (esta declaração está errada, consulte Atualização ). Especificamente, para calcular o valor de k ( seção 5.1 ), é usada uma chave privada, que permanece desconhecida para o usuário, para que o usuário não possa verificar a exatidão do cálculo de k. Como resultado, o oracle pode usar qualquer valor de k necessário e, simultaneamente, executar um banco de dados para correlações entre ke dados assinados, para poder sempre recalcular um resultado correto para VRF. Se você vir um sorteio baseado em VRF sem revelar a chave privada, poderá mostrar e apontar a necessidade de revelar a chave ou removê-la do cálculo k, para que ele se revele automaticamente após a primeira assinatura. No geral, como dito acima, esse é um esquema ímpar para o oráculo aleatório.
Após alguma reflexão e com o apoio de analistas locais, nasceu um esquema para a operação do VECRO.
VECRO significa Oracle aleatório verificável de curva elíptica. Acabou sendo bastante simples. Para obter determinação, precisamos corrigir o valor de R antes da aparência de uma mensagem a ser assinada. Se R for corrigido e R fizer parte da mensagem, garante adicionalmente que R seja corrigido antes da mensagem. O valor de S é completamente determinado por uma mensagem do usuário e, portanto, pode ser usado como fonte de números pseudo-aleatórios.
Em um esquema desse tipo, como exatamente R é fixado é irrelevante e permanece na zona de responsabilidade do oráculo. O importante é que S seja completamente determinado pelo usuário, mas seu valor não é revelado até que seja publicado pelo oráculo. É exatamente isso que queríamos!
Falando em fixar R, observe que a reutilização de R para assinar várias mensagens revela completamente a chave privada no esquema EdDSA. Para o proprietário do oracle, é vital excluir a reutilização do R para assinar várias mensagens do usuário. Ou seja, em qualquer manipulação ou conluio, o oráculo sempre corre o risco de perder sua chave privada.
Portanto, o oracle oferecerá duas funções ao usuário: inicialização, que fixa o valor de R e uma assinatura, que retorna o valor de S. Enquanto isso, o par R, S é uma assinatura verificável regular para uma mensagem de usuário que contém uma mensagem fixa. valor de R e os dados aleatórios do usuário.
Pode-se argumentar que, para blockchain, isso não passa de um esquema de revelação de confirmação regular. Basicamente, é isso que é. Mas existem algumas nuances. Primeiro, o oráculo usa a mesma chave em todas as transações, o que, por exemplo, é conveniente para contratos. Segundo, existe o risco de perder uma chave privada pelo oracle devido ao desempenho incorreto. Por exemplo, se o oráculo facilitar testes do resultado, apenas dois testes serão suficientes para descobrir a chave privada e obter acesso à carteira. Terceiro, uma assinatura verificada nativamente na blockchain, que é a fonte da aleatoriedade, é simplesmente linda.
Por cerca de seis meses, essa idéia germinou, até que uma motivação para implementá-la chegou na forma de uma concessão do Waves Labs . Com a grande concessão vem uma grande responsabilidade, significa que o projeto será!
Implementação
O VECRO foi implementado na blockchain Waves no modo de solicitação / resposta usando transações de transferência entre o usuário e o oracle. Na conta do oracle, é definido um script que controla a operação estritamente de acordo com a lógica descrita acima. As transações do oracle são verificadas pela recreação de toda a cadeia de interação do usuário. Todas as quatro transações estão envolvidas na verificação do valor final. Um contrato inteligente adiciona todos eles a um rigoroso encadeamento de verificação, verificando valores passo a passo e não deixando espaço para manipulações.
Vamos tentar colocá-lo em termos simples. O oráculo não funciona apenas sob um esquema proposto. Sua operação é totalmente controlada no nível da blockchain por um contrato inteligente totalmente estrito . Qualquer desvio minúsculo levaria à rejeição da transação. Portanto, se a transação estiver no blockchain, os usuários não precisam verificar nada, pois toda a verificação já foi feita por centenas de nós do blockchain.
No momento, um VECRO é operável na rede principal do Waves. Você pode realmente iniciar o seu: é simples, basta ver o exemplo de configuração . O código atual funciona no PHP (no WavesKit , que discuti anteriormente ).
Para usar o oracle, você precisa:
- Fixate R
- Envie um mínimo de 0,005 WAVES para o alias do oracle init @ vecr;
- Receba um código R no campo de anexo na transferência de 1 token R-vecr do oracle para o usuário;
- Consiga uma assinatura;
- Envie um mínimo de 0,005 WAVES para o alias do oracle random @ vecr. Você também é obrigado a inserir no campo de anexo o código R recebido e os dados adicionais do usuário;
- Receba um código S no campo de anexo na transferência de token 1 S-vecr do oracle para o usuário;
- Use o código S como fonte de números pseudo-aleatórios.
Nuances da implementação atual:
- ONDAS enviadas ao oráculo são usadas como taxas pela transação de devolução ao usuário, até o máximo de 1 ONDAS;
- O código R é uma concatenação do byte do símbolo 'R' e do valor R de 32 bytes na codificação base58;
- O código R no anexo deve preceder os dados do usuário;
- O código S é uma concatenação do byte do símbolo 'S' e do valor S de 32 bytes na codificação base58;
- S é o resultado de uma divisão de módulo e não pode ser usado como um número pseudo-aleatório adequado de 256 bits (pode ser considerado no máximo um número pseudo-aleatório de 252 bits);
- A opção mais fácil é o uso do hash do código S como fonte do número pseudoaleatório.
Exemplos de recebimento de código S:
Do ponto de vista técnico, o oráculo está totalmente operacional, você pode usá-lo com segurança. Do ponto de vista de um usuário comum, não há GUI fácil de usar, que precisará esperar.
Ficarei feliz em responder a perguntas e aceitar comentários, obrigado.
Atualização (8 de maio de 2019)
Eu estava errado em VRF. Sim, é verdade que a assinatura ECVRF não pode ser usada como fonte de um número pseudo-aleatório, mas não é usada para essa finalidade. A assinatura é necessária para provar a exclusividade do valor Gamma ( seção 5.3 , etapa 6). E o valor verificado de Gamma será usado 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 de viver.
Infelizmente, ainda não há possibilidade de usar o ECVRF no nível da blockchain Waves, devido à falta da funcionalidade matemática necessária em contratos inteligentes.
Quando essa funcionalidade ou suporte ao RSA ficar disponível, novos oráculos poderão ser criados. Quanto ao esquema VECRO, ele ocupa seu nicho em qualquer caso e permite que você trabalhe sem nenhuma funcionalidade adicional.