Bulletproofs: a atualização que diminuirá as transações e as taxas em 80%

Tradução do artigo original escrito por Sarang Noether e publicado em 7 de dezembro de 2017.

Este artigo é uma atualização rápida sobre as bulletproofs e o que elas irão representar para o Monero. O resumo da história: elas são incríveis, funcionam, reduzirão as taxas e já estão sendo  implementadas na testnet.

Provas de faixa (range proofs)

As transações confidenciais do Monero escondem as quantias envolvidas. Para garantir que os inputs e os outputs se equilibrem adequadamente de maneira que possam ser verificados por qualquer participante da rede, nós usamos os comprometimentos (commitments), que possuem propriedades algébricas úteis. Mas isso não basta. Nós também precisamos garantir que cada quantia é um valor positivo que não irá arriscar um overflow, e é aí que atuam as  provas de faixa (range proofs).

Uma prova de faixa permite que qualquer um verifique que um comprometimento representa uma quantia dentro de uma faixa especificada, sem revelar para ninguém o seu valor. O tamanho das provas de faixa aumentam de tamanho de maneira linear em relação ao número de outputs e ao número de bits na faixa (atualmente 64 bits), o que significa que elas compõem a maior parte do tamanho de uma transação. Além disso, isso significa que uma transação com múltiplos outputs precisa de múltiplas provas de faixa separadas. Isso não é bom.

Bulletproofs

Graças ao fantástico paper escrito por Bünz, Bootle e outros colaboradores (disponível gratuitamente aqui), agora sabemos que existe uma maneira mais eficiente de lidarmos com as provas de faixa. O tamanho de um bulletproof aumenta logaritmicamente tanto com o número de outputs quanto com o tamanho da faixa.

Existem dois tipos de bulletproofs:

  • Bulletproof de output único
  • Bulletproof de múltiplos outputs

Uma transação com múltiplos outputs pode incluir provas de duas maneiras diferentes:

  • Incluir várias provas de output único (uma prova separada para cada output)
  • Incluir uma única prova de múltiplos outputs (que é menor do que as provas separadas).

Vamos examinar uma transação típica com dois outputs, na qual eu envio para você alguns XMR e direciono o troco de volta para mim. Com nossas provas de faixa atuais, a transação tem cerca de 13,2 kB de tamanho. Se a transação usasse bulletproofs de output único, ela reduziria para apenas 2,5 kB! Ou seja, um redução de 80% no tamanho, o que resulta em uma redução de 80% nas taxas. E a economia de espaço será ainda maior com bulletproofs de múltiplos outputs. Tudo isso representará uma redução significativa no tamanho das transações. Além disso, nossos testes iniciais demonstraram que o tempo para verificar uma transação com bulletproof é menor do que o tempo com as provas de faixa atuais, ou seja, a validação da blockchain será ainda mais rápida.

Implementação

Nós já temos (nesse repositório do GitHub) um código em Java em funcionamento, ainda em testes, que implementa bulletproofs tanto para outputs únicos quanto múltiplos.  O código para bulletproofs de output único já foi migrado para C++ pelo moneromooo (ver o pull request) e em breve estará disponível na testnet. Atualmente o código está sendo amplamente testado e revisado.

Os outputs múltiplos levantam algumas questões que precisam ser melhor analisadas. Como a verificação do bulletproof é linear em relação ao número de outputs (enquanto o tamanho escala logaritmicamente), alguém poderia fazer um ataque enchendo uma transação com vários outputs; essa pequena transação exigiria poucas taxas mas seria computacionalmente cara de se verificar, abrindo uma porta para possíveis ataques de negação de serviço (DoS). Por causa disso, nós ainda precisamos ajustar a estrutura das taxas para que elas considerem menos o tamanho da transação e consideram mais a escalabilidade da verificação. Mas isso não significa que as taxas irão aumentar! Isso só significa que as taxas irão escalar de uma maneira adequada e segura.

Para evitar quaisquer problemas, nós implementaremos as bulletproofs em duas fases. Inicialmente iremos lançar apenas as provas de output único. Uma transação com dois outputs irá inicialmente usar duas provas de output único separadas, o que já irá oferecer uma grande redução no tamanho das transações em relação ao que nós temos agora. As taxas serão mais baixas e os tempos de verificação serão mais rápidos. Nós iremos continuar as discussões sobre a estrutura das taxas enquanto nós testamos as provas de outputs múltiplos, as quais serão implementadas mais tarde, em uma segunda etapa.  Nós queremos encorajar os mineradores a utilizarem as provas de múltiplos outputs ao mesmo tempo em que eles se sintam seguros sobre a escalabilidade das taxas.

Em suma, as bulletproofs representam um enorme avanço nas transações do Monero. Nós iremos economizar muito espaço na blockchain, teremos tempos de verificação mais rápidos e taxas mais baixas. Se você é um fã da testnet, fique de olho nas bulletproofs!