Transações confidenciais em Monero, ou como transferi-lo, não se sabe o que é desconhecido para onde

Continuamos nosso ciclo sobre o dispositivo blockchain Monero, e o artigo de hoje será dedicado ao protocolo RingCT (Ring Confidential Transactions), que apresenta transações confidenciais e novas assinaturas de anel. Infelizmente, há pouca informação na Internet sobre como funciona e tentamos preencher essa lacuna.

imagem

Falaremos sobre como a rede oculta a quantidade de transferências usando este protocolo, por que recusamos as assinaturas de toque clássicas do cryptonote e como essa tecnologia se desenvolverá ainda mais.

Como esse protocolo é uma das tecnologias mais complexas em Monero, o leitor precisará de conhecimentos básicos sobre o dispositivo desse blockchain e conhecimento superficial em criptografia em curvas elípticas (para atualizar esse conhecimento, você pode ler os primeiros capítulos de nosso artigo anterior sobre multi-assinaturas ).

Protocolo RingCT


Um dos possíveis ataques às moedas criptografadas é a análise de blockchain com base no conhecimento da quantidade e do tempo da transação enviada. Permite reduz significativamente a busca pelos resultados de interesse do invasor. Para se proteger contra essa análise, Monero introduziu um protocolo de transação anônima que oculta completamente a quantidade de transferências na rede.

Vale ressaltar que a idéia de ocultar valores não é nova. Um dos primeiros a descrevê-lo foi o desenvolvedor do Bitcoin Core, Greg Maxwell, em seu artigo Confidential Transactions . A implementação atual do RingCT é sua modificação com a possibilidade de usar assinaturas em anel (sem elas) e, portanto, recebeu seu nome - Transações confidenciais em anel.

Entre outras coisas, o protocolo ajuda a se livrar de problemas com a mistura de saídas de poeira - saídas por uma pequena quantidade (geralmente obtida na forma de alteração de transações), o que criou mais problemas do que eles próprios custam.

Em janeiro de 2017, foi realizada a rede de hard fork da Monero, permitindo o uso opcional de transações confidenciais. E em setembro daquele ano, com a versão 6 do hard fork, essas transações se tornaram as únicas permitidas na rede.

O RingCT usa vários mecanismos ao mesmo tempo: assinaturas de grupos espontâneos anônimos vinculáveis ​​em várias camadas (doravante - MLSAG), compromissos de Pedersen e provas de alcance (este termo não possui tradução estabelecida para o russo).

O protocolo RingCT apresenta dois tipos de transações anônimas: simples e completas. A primeira carteira gera quando uma transação usa mais de uma entrada, a segunda - na situação oposta. Eles diferem na validação dos valores das transações e dos dados assinados pela assinatura do MLSAG (falaremos mais sobre isso abaixo). Além disso, transações do tipo completo podem ser geradas com qualquer número de entradas, não há diferença fundamental. O livro “Zero para Monero” sobre esse assunto diz que a decisão de limitar as transações completas a uma entrada foi tomada às pressas e pode mudar no futuro.

Assinatura MLSAG


Lembre-se de quais são as entradas assinadas de uma transação. Cada transação gasta algum dinheiro e gera. Os fundos são gerados através da criação de resultados de transações (uma analogia direta é notas de banco), e o resultado que uma transação gasta (porque na vida real gastamos dinheiro em notas de banco) se torna um insumo (com cuidado, é muito fácil confundir aqui).

A entrada se refere a várias saídas, mas gasta apenas uma, criando assim uma "cortina de fumaça" para dificultar a análise do histórico das traduções. Se uma transação tiver mais de uma entrada, essa estrutura poderá ser representada na forma de uma matriz, onde as linhas são entradas e as colunas estão amassando saídas. Para provar à rede que a transação gasta suas saídas (conhece suas chaves secretas), as entradas são assinadas com uma assinatura de toque. Essa assinatura garante que o assinante conhecia as chaves secretas de todos os elementos de qualquer uma das colunas.

As transações confidenciais não usam mais as assinaturas de anel de criptografia clássicas, elas foram substituídas pelo MLSAG, uma versão com várias entradas das assinaturas de anel de camada única semelhantes, LSAG .

Eles são chamados de várias camadas porque assinam várias entradas ao mesmo tempo, cada uma delas misturada com várias outras, ou seja, uma matriz é assinada, e não uma linha. Como veremos mais adiante, isso ajuda a economizar no tamanho da assinatura.

Vejamos como uma assinatura de anel é formada, usando o exemplo de uma transação que gasta 2 saídas reais e usa m - 1 aleatórias da blockchain para amassar. Indique as chaves públicas dos resultados que gastamos como
imagem
e imagens principais para eles, respectivamente:
imagem
Assim, obtemos uma matriz de 2 x m . Primeiro, precisamos calcular os chamados desafios para cada par de produtos:
imagem

Iniciamos os cálculos com os resultados que gastamos usando suas chaves públicas:
imagem
e números aleatórios
imagem
Como resultado, obtemos os valores:
imagem
que usamos para calcular o desafio
imagem
o próximo par de saídas (para facilitar a compreensão de onde estamos substituindo, destacamos esses valores em cores diferentes). Todos os seguintes valores são calculados em um círculo de acordo com as fórmulas fornecidas na primeira ilustração. O desafio para um par de saídas reais é calculado por último.

Como podemos ver, em todas as colunas, exceto a que contém as saídas reais, são usados ​​números gerados aleatoriamente imagem . Para a quarta coluna, também precisamos deles. Converter imagem em s:
imagem

A assinatura em si é uma tupla de todos esses valores:

imagem


Além disso, esses dados são gravados na transação.

Como podemos ver, o MLSAG contém apenas um desafio c 0 , que economiza no tamanho da assinatura (que já exige muito espaço). Em seguida, qualquer revisor que use os dados imagem , restaura os valores c 1 , ..., c m e verifica se imagem . Assim, nosso anel foi fechado e a assinatura passou na verificação.

Para transações RingCT do tipo full, mais uma linha é adicionada à matriz com saídas mistas, mas falaremos sobre isso abaixo.

Compromissos de Pedersen


Esquemas de compromisso (geralmente usam o termo em inglês - compromissos) são usados ​​para que um lado possa provar que conhece um certo segredo (número), sem realmente revelá-lo. Por exemplo, você joga um certo número nos ossos, considera o comprometimento e o passa para a terceira parte confiável. Assim, no momento de revelar o número secreto, o inspetor considera independentemente o compromisso, garantindo assim que você não o enganou.

Os compromissos Monero são usados ​​para ocultar a quantidade de transferências e usar a opção mais comum - compromissos Pedersen. A propósito, um fato curioso - a princípio, os desenvolvedores sugeriram ocultar os valores com o amassado habitual, ou seja, adicionar saídas a valores arbitrários para introduzir incerteza, mas depois trocaram para compromissos (não o fato de economizarem no tamanho da transação, como veremos abaixo).
Em geral, o compromisso é o seguinte:
imagem
Onde C é o valor do compromisso em si, a é a quantidade a ser oculta, H é o ponto fixo na curva elíptica (gerador adicional) e x é uma máscara arbitrária que oculta o fator gerado aleatoriamente. A máscara é necessária aqui para que terceiros não possam selecionar o valor do compromisso com uma força bruta simples.

Ao gerar uma nova saída, a carteira calcula um compromisso para ela e, ao gastá-lo, pega o valor calculado durante a geração ou o reconta novamente, dependendo do tipo de transação.

Ringct simple


No caso de transações simples do RingCT, para garantir que a transação criada tenha saídas iguais à soma dos insumos (não gerou dinheiro no ar), os compromissos do primeiro e do segundo devem ser os mesmos, ou seja:
imagem

As comissões de compromisso consideram um pouco diferente - sem uma máscara:
imagem
, onde a é o valor da comissão, ela está disponível ao público.

Essa abordagem nos permite provar à terceira parte que usamos as mesmas quantias sem revelá-las.

Para tornar as coisas mais claras, vejamos um exemplo. Suponha que uma transação gaste duas saídas (ou seja, elas se tornem entradas) em 10 e 5 XMRs e gere três saídas totalizando 12 XMRs: 3, 4 e 5 XMRs. Ao mesmo tempo, paga uma comissão de 3 XMR. Assim, a quantia gasta mais a quantia gerada e a comissão é igual a 15 XMR. Vamos tentar calcular compromissos e observar a diferença em seus valores (lembre-se da matemática):

imagem

Aqui vemos que a equação converge - as somas das máscaras das entradas e saídas de que precisamos são as mesmas. Para fazer isso, a carteira gera aleatoriamente x 1 , y 1 , y 2 e y 3 , e o x 2 restante calcula da seguinte maneira:
imagem

Usando essas máscaras, podemos provar a qualquer pessoa que verifique que não geramos mais fundos do que gastamos sem revelar o valor. Original, certo?

RingCT full


Nas transações completas do RingCT, verificar a quantidade de transferências é um pouco mais complicado. Nessas transações, a carteira não contabiliza compromissos para entradas, mas usa os calculados quando são gerados. Nesse caso, devemos assumir que a diferença nos valores não será mais igual a zero, mas:
imagem

Aqui z é a diferença entre as máscaras das entradas e saídas. Se considerarmos zG como uma chave pública (que é de fato), então z é uma chave privada. Assim, conhecemos as chaves privadas públicas e correspondentes. Tendo esses dados, podemos usá-los na assinatura do anel MLSAG junto com as chaves públicas das saídas de amassamento:
imagem

Assim, uma assinatura de anel válida garantirá que conhecemos todas as chaves privadas de uma das colunas e só podemos conhecer a chave privada na última linha se a transação não gerar mais fundos do que gasta. A propósito, aqui está a resposta para a pergunta “por que a diferença na quantidade de compromissos não está levando a zero” - se zG = 0 , abriremos a coluna com resultados reais.

Mas como o destinatário sabe quanto dinheiro lhe enviou? Tudo é simples aqui - o remetente da transação e o destinatário trocam chaves usando o protocolo Diffie-Hellman, usando a chave de transação e a chave de visualização do destinatário e calculam o segredo compartilhado. O remetente grava nos campos especiais dos dados da transação as somas das saídas criptografadas com essa chave compartilhada.

Provas de alcance


Mas o que acontece se você usar um número negativo como o valor dos compromissos? Isso pode levar à geração de moedas adicionais! Esse resultado é inaceitável; portanto, precisamos de uma garantia de que os valores que usamos não sejam negativos (sem divulgar esses valores, é claro, caso contrário, é muito trabalho e tudo por nada). Em outras palavras, devemos provar que a soma está no intervalo [0, 2 n - 1] .

Para isso, a soma de cada saída é dividida em dígitos binários e o comprometimento para cada dígito é considerado separadamente. Como isso acontece, é melhor considerar um exemplo.

Suponha que tenhamos pequenas quantidades e caibamos em 4 bits (na prática, isso é 64 bits) e criamos uma saída para a quantidade de 5 XMR. Consideramos compromissos para cada categoria e um compromisso geral para todo o valor:
imagem

Em seguida, cada compromisso é misturado com um substituto (C i -2 i H) e é assinado em pares pela assinatura de anel Borromeo (outra assinatura de anel) proposta por Greg Maxwell em 2015 (mais sobre isso pode ser encontrado aqui ):
imagem
Juntos, isso é chamado de prova de intervalo e garante que os compromissos usem valores no intervalo [0, 2 n - 1] .

O que vem a seguir?


Na implementação atual, as provas de intervalo ocupam muito espaço - 6176 bytes por saída. Isso gera grandes transações e, consequentemente, maiores comissões. Para reduzir o tamanho da transação do Monero, os desenvolvedores estão introduzindo, em vez das assinaturas da Borromeo, à prova de balas - um mecanismo à prova de intervalo sem compromissos bit a bit. Segundo algumas estimativas , eles podem reduzir o tamanho da prova de intervalo para 94%. A propósito, em meados de julho, a tecnologia foi auditada pela Kudelski Security, que não revelou deficiências significativas na própria tecnologia ou em sua implementação. A tecnologia já é usada na rede de teste e, com o novo hard fork, provavelmente pode ser movida para a rede principal.

Faça suas perguntas, sugira tópicos para novos artigos sobre tecnologias de criptomoeda e assine nosso grupo no Facebook para acompanhar nossos eventos e publicações.

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


All Articles