Conheça a tecnologia por trás da privacidade do Monero

A privacidade no Monero tem uma abordagem diferente das outras criptomoedas. Ao invés de adicionar um serviço de privacidade sobre uma blockchain transparente, o Monero tem diversas tecnologias de privacidade já embutidas em seu protocolo padrão, fazendo com que a sua blockchain principal não seja transparente.

Além disso, a privacidade no Monero não é opcional: para fazer uma transação, o usuário é obrigado a utilizar todas as funções de privacidade da moeda. Como todas as transações da rede são anônimas e privadas, nenhuma transação acaba chamando mais a atenção do que as outras, o que acaba aumentando o anonimato geral dos usuários.

A seguir, iremos explicar em maior detalhes como cada uma destas tecnologias funciona.

De maneira simplificada, o Monero esconde o remetente, a quantia, a transmissão da transação e o recipiente através das seguintes tecnologias:

  • Remetente: assinaturas em anel (ring signatures)
  • Quantia: transações confidenciais usando assinaturas em anel (RingCT)
  • Transmissão da transação: Kovri (roteador I2P)
  • Destinatário: endereços stealth (camuflados)

Transações confidenciais usando assinaturas em anel (RingCT) — escondendo o remetente e a quantia

Assim como a oferta do dinheiro brasileiro é dividida em diferentes notas e moedas de real (BRL), a oferta monetária da Monero é dividida em outputs. Cada output armazena um determinado valor de Monero e o valor que eles armazenam pode mudar ao longo do tempo. Suponha que, na figura abaixo, estes são todos os outputs que existem na rede, e o output que você controla e pode gastar está destacado em vermelho.

Tenha em mente que, ao contrário do Bitcoin, esses outputs não estão vinculados a endereços. Falaremos mais sobre isso mais adiante.

Cada transação Monero contém:

  • um ou mais inputs (entradas): débitos na carteira do pagador
    • Inputs = Outputs + taxa da transação
  • um ou mais outputs (saídas): créditos na carteira do recipiente
    • Outputs = Inputs – taxa da transação
  • taxa da transação: créditos na carteira do minerador
    • Taxa da transação = inputs – outputs

Ao receber uma quantia de alguém, sua carteira recebe outputs. Quando você for fazer uma nova transação, esses outputs serão usados como inputs da nova transação.

Os inputs seriam equivalentes às moedas que você tem em sua carteira. Como analogia, você precisa juntar 4 moedas de R$0,50 para pagar R$2,00 para alguém. Então você junta 4 inputs de R$0,50.

Quando você faz um pagamento com Monero, você na verdade está pagando para duas pessoas: o recipiente e o minerador.

Os outputs equivalem às moedas que chegam à pessoa que recebe o pagamento.

A taxa da transação equivale às moedas que chegam para o minerador. Ela corresponde à diferença entre os inputs e os outputs.

Assinaturas em anel

Ao criar uma transação com Monero, você irá usar uma assinatura em anel para esconder qual output realmente está sendo gasto. Para fazer isso, a sua carteira automaticamente escolhe diferentes outputs aleatórios de outras pessoas, que serão usados como chamarizes. Para um observador externo, todos esses outputs são um possível remetente.

Veja o seguinte exemplo. A carteira de Alice quer criar uma transação enviando 1 XMR para Bob. Para preservar sua privacidade, a carteira de Alice cria uma transação com um tamanho de anel de 11. Para criar a assinatura em anel, ela usa o seu output verdadeiro (em vermelho) e o combina com outros dez outputs que Alice não controla (em azul), de outras dez pessoas. Estes dez outputs chamarizes são também conhecidos como “mixin“, pois eles serão “inseridos” na transação e “misturados” ao output verdadeiro.

  • Transação com um input e tamanho de anel =11 (=1 output + 10 outputs chamarizes):
  • Input (assinatura em anel com 11 membros):
    • Output verdadeiro: Input pertencente à Alice  (1 XMR)
    • Chamariz 1: Output pertencente à Maria (??? XMR)
    • Chamariz 2: Output pertencente a Paulo (??? XMR)
    • Chamariz 3: Output pertencente a Luis (??? XMR)
    • Chamariz 4: Output pertencente a João (??? XMR)
    • Chamariz 5: Output pertencente a Paula (??? XMR)
    • Chamariz 6: Output pertencente a Fábio (??? XMR)
    • Chamariz 7: Output pertencente a José (??? XMR)
    • Chamariz 8: Output pertencente a Ana (??? XMR)
    • Chamariz 9: Output pertencente a Carlos (??? XMR)
    • Chamariz 10: Output pertencente a Fernando (??? XMR)

No exemplo acima, o output que realmente está sendo gasto no input está indicado vermelho, e os dez outputs selecionados como chamarizes estão indicados em azul. Para cada input que a transação tiver (para cada output que for gasto), obrigatoriamente devem ser selecionados dez outputs chamarizes para fazer parte do anel.

Os outputs que são usados como chamarizes podem ser controlados por qualquer pessoa: você não precisa da permissão de outras pessoas para adicioná-los à assinatura em anel. Além disso, a carteira pode escolher esses outputs chamarizes de maneira completamente offline, basta que ela tenha uma cópia da blockchain.

A seguir a carteira irá assinar todos esses outputs de maneira que um observador externo não consiga determinar qual é o output que realmente está sendo gasto.

Portanto, continuando nosso exemplo, a carteira de Alice irá enviar para rede a seguinte informação: “quero realizar uma transação com um input, que irá gastar um destes 11 outputs

  • Transação com um input + um output (1/1) e tamanho de anel = 11:
    • Input (assinatura em anel com 11 membros):
      • Membro 1 do anel: (??? XMR)
      • Membro 2 do anel: (??? XMR)
      • Membro 3 do anel: (??? XMR)
      • Membro 4 do anel: (??? XMR)
      • Membro 5 do anel: (??? XMR)
      • Membro 6 do anel: (??? XMR)
      • Membro 7 do anel: (??? XMR)
      • Membro 8 do anel: (??? XMR)
      • Membro 9 do anel: (??? XMR)
      • Membro 10 do anel: (??? XMR)
      • Membro 11 do anel: (??? XMR)
    • Output:
      • Endereço stealth

As pessoas que observarem a transação na rede (e, mais tarde, na blockchain) só obterão a seguinte informação: “foi incluída na rede uma transação com 1 input contendo um anel de 11 membros (composto por 1 output verdadeiro + 10 outputs chamarizes)“. Com a exceção das pessoas envolvidas na transação, mais ninguém sabe quais outputs realmente estão sendo gastos, quais outputs são os chamarizes, qual o valor da transação e para quem ela está sendo paga.

Uma vez selecionados os outros inputs, a carteira de Alice precisa finalizar a criação da assinatura em anel da RingCT. Essa assinatura inclui vários outros elementos importantes.

Imagem chave

A imagem chave é de importância fundamental no Monero, pois ela é o mecanismo que impede o gasto duplo, ou seja, ela impede que um input seja gasto mais de uma vez.

Cada input na blockchain possui uma única imagem chave possível. A blockchain contém uma lista de todas as imagens chave que já foram utilizadas, permitindo que os mineradores verifiquem que nenhum input foi gasto duas vezes.

Cada imagem chave é uma referência de sentido único para o seu input. Isso significa que quem controla o input consegue gerar uma imagem chave a partir dele, mas observadores externos não conseguem determinar qual input gerou uma determinada imagem chave.

Portanto, ao criar a transação, Alice incluirá uma imagem chave nova, que jamais apareceu na blockchain. Essa imagem chave é uma referência de sentido único para o input verdadeiro (qual membro da assinatura em anel que realmente está sendo gasto na transação).

Vamos voltar ao nosso exemplo

  • Transação com um input + um output (1/1) e tamanho de anel = 11:
  • Input (assinatura em anel com 11 membros):
    • Membro 1 do anel: (??? XMR)
      • a638c2996fd6fd549abb5b446cdb376a204256acbe342f891aa1634d950eb0c8
    • Membro 2 do anel: (??? XMR)
      • 41b6f0944606d6c1a43545ae6834ac36aa9786e90a1d611e376103d6c2d835b8
    • Membro 3 do anel: (??? XMR)
      • 49dee81438b9179a8fa24faca90113a3d9ab18929679f27f2cb4785b4afa595e
    • Membro 4 do anel: (??? XMR)
      • 4511a10c5c01df4a8b7bf7b200e726065c43abfcf75051ec1348ef77bb6d90b9
    • Membro 5 do anel: (??? XMR)
      • 63bfd00dfd9eda2922dcb0444d02ef5e84f3814f1c05e684ab0aacf30d93a749
    • Membro 6 do anel: (??? XMR)
      • 91c5dd8666fd08f91491db060ad419b4e202b56437a6360af41f317f49f1966a
    • Membro 7 do anel: (??? XMR)
      • ae7623d0b7d07ff77aeea29e614e943cedaccc5a6dd57bdaf3c457d63eab5967
    • Membro 8 do anel: (??? XMR)
      • 0a99cfd7e094ac673d3436a9c816e15182dc266c1d366a5978abc499d53ccbfa
    • Membro 9 do anel: (??? XMR)
      • 1e29ab1ba6863591b3269e376d710063179048a740b4438140532ef40a626cb8
    • Membro 10 do anel: (??? XMR)
      • ff4162870f3ada4f913c498e9277ecbafa7c16cbdc799efbd29579c3195b59f2
    • Membro 11 do anel: (??? XMR)
      • c911630c190d9096a19bfd2f99459dde05ef0385bd5736caf84b0f20986d2a94
  • Imagem chave
    • d810537b568727ab42e458cf3a72f894a5503633b8c8caaa615c183edee5ba8a

A rede verificará se a imagem chave não foi utilizada anteriormente (prevenindo um gasto duplo) e se ela não é um número inventado (prevenindo que pessoas gastem inputs que não pertencem a elas). Graças à imagem chave, a rede consegue verificar essas informações sem saber qual é o input que realmente está sendo gasto na assinatura em anel.

Comprometimento Pedersen

O próximo passo é o comprometimento Pedersen, que é usado para prevenir que outras pessoas fiquem sabendo a quantia que está sendo gasta na transação. Ao usá-lo, você consegue comprovar aos demais usuários que você tem a permissão para usar uma certa quantia, mas sem precisar revelar essa quantia.

O comprometimento Pedersen é um componente fundamental das transações confidenciais (CT) em anel (Ring), também conhecidas como RingCTs. Ele esconde a quantia a ao adicionar um número aleatório x. O valor do comprometimento é calculado para um conjunto de inputs e outputs na transação, e é então transmitido à rede. Vamos ver um exemplo simplificado:

Alice está enviando 1 XMR para Bob. Alice cria o comprometimento da seguinte maneira:

Quantia real (a): 1
Número aleatório (x): 273
Comprometimento (número fornecido à rede): 274

A carteira do Alice irá fornecer o número 274 para a rede. A rede irá então verificar se as somas dos inputs e outputs no comprometimento é mesmo 274. Se elas forem diferentes, a transação é rejeitada. Se elas forem 274, então a transação é autorizada.

Agora, tudo o que eu expliquei anteriormente é usado para formar uma assinatura em anel da RingCT. Isso resulta em uma quantia desconhecida de Monero sendo gasta. A chave pública do comprometimento é o que será utilizado pela rede para verificar o comprometimento.

Então como os outputs são utilizados ao longo do tempo? Vamos comparar o Bitcoin e o Monero para descobrir.

Como funcionam as assinaturas em anel e as RingCTs

Na figura acima, eu criei um histórico teórico para o output que você controla. Todos os blocos destacados em vermelho são blocos onde o output aparece. Se isso fosse no Bitcoin, seria fácil notar que esse output foi transferido do usuário A para o B para o C, etc. No entanto, com o Monero isso não é tão simples.

Transações coinbase – Recompensando os mineradores e controlando quantas moedas há em circulação

Você pode estar se perguntando: “se ninguém sabe quantas moedas há em cada endereço, e ninguém sabe quantas moedas são transmitidas em cada transação, como é que as pessoas sabem quantas moedas de Monero estão em circulação?” Para respondermos essa pergunta, vamos aprender sobre as transações coinbase.

As transações coinbase são transações criadas pelos mineradores. Nesta transação o minerador cria a sua recompensa por ter minerado o bloco, ou seja, ele envia uma moeda nova para um endereço que ele próprio controla. Portanto, ela é uma transação muito especial, pois cria moedas novas e as insere em circulação. Por ter essa característica, a transação coinbase é diferente das demais transações do Monero: ela é a única transação que revela o valor que está sendo transmitido. Em outras palavras, as transações coinbase são as únicas transações que não são confidenciais e não utilizam a assinatura em anel.

Por que as assinaturas em anel funcionam?

No Monero, um output pode aparecer em um bloco por três motivos:

  1. Uma nova moeda surgindo em uma transação coinbase criada por um minerador
  2. Uma moeda sendo gasta em uma transação criada por um usuário comum
  3. Um output sendo usado como um chamariz na assinatura em anel de uma transação criada por um usuário comum

Como não há uma maneira de se diferenciar entre as situações Nº2 e Nº3, observadores externos não fazem idéia se um output realmente está sendo gasto ou se está sendo usado como um chamariz em uma assinatura anel, mesmo que ele apareça na blockchain diversas vezes. Como cada transação inclui dez chamarizes e um input verdadeiro, apesar de estar aparecendo em um bloco, a probabilidade de que um membro do anel não esteja sendo gasto (90,9% de probabilidade) é muito maior do que a probabilidade de qeue ele esteja sendo gasto (9,09% de probabilidade).

Se você quer ver outras explicação sobre as assinaturas em anel e sobre o RingCT, veja esses ótimos vídeos:

Kovri — escondendo a transmissão das transações

Toda vez que a sua carteira de criptomoeda se conecta a uma rede ponto-a-ponto (P2P) para transmitir uma transação, ela vaza algumas informações, como o seu endereço IP e alguns metadados (ex: a data e a hora).

Toda vez que você se conecta a uma rede P2P, o seu endereço IP é revelado para outros nodos. Alguns destes nodos podem estar registrando o seu endereço IP e os IDs das transações que são transmitidas por ele. A fim de esconder essas informações vazadas, o Monero está trabalhando em um projeto chamado Kovri.

O Kovri é um roteador anonimizador. No futuro, os nodos da Monero irão se conectar uns aos outros através da internet comum e de uma rede anônima. Haverá maneiras de se rodar tanto na internet comum (clearnet) ou na darknet.

O Kovri irá prevenir que nodos maliciosos rejeitem transações originadas de certos endereços IPs ou monitorem quais IPs transmitem essas transações. Talvez a características mais empolgante é que o Kovri funciona com qualquer projeto que quiser incorporá-lo, incluindo outras criptomoedas. Seria relativamente simples outra moeda adotá-lo.

As pessoas podem usar o Tor para reduzir esse risco, mas elas se expõem para vários outros riscos.

Veja o vídeo abaixo para entender melhor como o Kovri funciona:

Endereços stealth  —  escondendo o recipiente

A Monero possui uma tecnologia que quebra o vínculo existente entre os outputs e os endereços públicos das carteiras Monero. Este mecanismo, chamado endereço stealth, fornece um mecanismo para esconder o destino da transação.

Com o Bitcoin, cada usuário possui uma única chave privada para cada endereço público. Cada endereço público corresponde a um output. Quando você envia bitcoins para alguém, a sua carteira escreve na blockchain o endereço público do destinatário. Para poder gastar os bitcoins vinculados ao endereço público, a pessoa precisará usar a sua chave privada. E, ao fazer isso, este endereço público irá aparecer novamente na rede.

Portanto, a carteira bitcoin possui apenas dois tipos de chaves:

  • Chave pública: usada para gerar o endereço público. O endereço público é usado para receber os bitcoins e ver o saldo da carteira.
  • Chave privada: é usada para gastar os bitcoins vinculados ao endereço público.

Com o Monero, as coisas são mais complexas. Cada endereço stealth corresponde a um output. Quando você envia Monero para alguém, a sua carteira jamais escreve na blockchain o endereço público do destinatário.

No Monero cada carteira possui quatro tipos de chaves, um par de chaves públicas e um par de chaves privadas:

  • Chaves públicas (2): usadas para gerar o endereço público e o endereço stealth (chave pública de uso único)
    • Chave pública de visualização
    • Chave pública de gasto
  • Chaves privadas (2): usadas para ver o saldo ou criar transações
    • Chave privada de visualização: usada para verificar o saldo da carteira. Ela verifica na blockchain se há algum output (endereço stealth) que a carteira pode usar
    • Chave privada de gasto: usada para criar transações

Vamos explicar como funcionam os endereços stealth na Monero:

  1. Alice quer enviar dinheiro para Bob.
  2. Bob envia a sua chave pública de visualização para Alice.
  3. A carteira de Alice usa a chave pública de visualização de Bob para criar um endereço stealth, que é uma chave pública de uso único. Este endereço será utilizado uma única vez e somente Bob será capaz de acessá-lo no futuro.
  4. Para saber quanto tem de saldo, a carteira de Bob precisa vasculhar a blockchain, procurando cada um desses endereços stealth, para ver quais deles ela é capaz de abrir com as suas chaves privadas.
  5. Ao detectar um endereço stealth na blockchain, Bob conseguirá calcular uma chave privada de uso único correspondente ao endereço stealth.
  6. Quando Bob realizar um pagamento no futuro, ele irá usar sua chave privada de gasto e combiná-la com a chave privada de uso único para poder pegar os inputs de seu endereço stealth e colocá-los em um endereço stealth de outra pessoa.

Ao analisar a blockchain do Monero, um observador externo só irá enxergar endereços stealth, que não apresentam nenhum vínculo identificável ao endereço público de Alice ou de Bob. Um exemplo de endereço stealth: 19ee620a7f66c880ce7ad3f7add65871e7f00eb33b1f8c352b8c4899b817aa50

Se Alice precisar provar que ela enviou o dinheiro para Bob, a carteira de Alice consegue verificar e comprovar que o pagamento foi realizado.

Como funcionam os trocos?

Os trocos no Monero não funcionam como na vida real. Ao criar uma transação, Alice cria na verdade duas “caixas”, uma com o quanto ela quer pagar e outra com o quanto ela quer receber de troco. O que acontece é que Alice paga uma quantia extra, mas envia o seu troco de volta para sua própria carteira. Veja o exemplo abaixo:

Suponha que Alice tem 10 XMR e gostaria de enviar 1 XMR para Bob; nesse caso, você irá criar dois outputs:

  1. Um output para Bob contendo 1 XMR
  2. Outro output de troco para ela mesma contendo 9 XMR.

Se você quer ver outra explicação sobre os endereços stealth, veja esse ótimo vídeo:

Um resumo sobre a tecnologia

Se você chegou até aqui, parabéns, você já é um profundo conhecedor da tecnologia Monero. Vamos fazer uma breve revisão sobre os conceitos apresentados neste artigo.

Como pudemos aprender, uma transação no Monero possui pelo menos um input, cuja assinatura em anel contém onze membros/outputs (um que realmente está sendo gasto e outros dez chamarizes), uma quantia desconhecida (escondida através de um comprometimento Petersen de uma transação confidencial) e um recipiente desconhecido (escondido em um endereço stealth). Todas as informações sobre as transações realizadas são armazenadas de maneira ofuscada na blockchain. A única exceção são as transações coinbase, nas quais os mineradores criam sua própria recompensa por ter minerado o bloco. Estas transações não utilizam assinatura em anele não são confidenciais, pois elas criam novas moedas que entram em circulação.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *