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 seja opaca (não-transparente).

De maneira simplificada, o Monero utiliza cinco elementos fundamentais para garantir a privacidade de seus usuários. Eles são os seguintes:

  • Privacidade obrigatória: aumenta o conjunto do anonimato
  • Assinaturas em anel: escondem o remetente da transação
  • RingCT (transações confidenciais usando assinaturas em anel): escondem a quantia
  • Redes de anonimato (I2P e TOR): escondem a transmissão da transação (o endereço IP de quem envia)
  • Endereços stealth (camuflados): escondem o destinatário
O uso obrigatório dos recursos de privacidade é uma medida que protege todos os usuários da rede. O conjunto do anonimato aumenta sempre que aumenta o número de usuários que não podem ser distinguidos uns dos outros.

Privacidade obrigatória

Um conceito importante a ser aprendido é o conjunto do anonimato. Em qualquer sistema ou moeda, o conjunto do anonimato corresponde ao número de pessoas participantes indistinguíveis umas das outras.

Quanto maior é o conjunto do anonimato, mais privado (anônimo) é o sistema. Se o conjunto do anonimato for pequeno, as pessoas que estão no sistema dificilmente terão privacidade, mesmo que elas utilizem excelentes ferramentas e recursos para isso.

Para dar um exemplo, vamos imaginar duas moedas que tem o mesmo número de transações diárias. A moeda A tem privacidade opcional, e apenas 1% das transações da rede utilizam os recursos de privacidade. A moeda B tem privacidade obrigatória, e 100% de suas transações utilizam os recursos de privacidade.

Na moeda A, como o conjunto do anonimato é menor, será muito mais fácil rastrear as transações de alguém. Além disso, os usuários poderão ser rotulados como suspeitos quando decidirem usar os recursos de privacidade.

Na moeda B, como o conjunto do anonimato é maior (todos os participantes usam recursos de privacidade), se torna muito mais difícil isolar algum usuário específico na multidão. Além disso, como todos usuários obrigatoriamente estão usando os recursos de privacidade, nenhum deles se tornará mais suspeito do que outro.

Os desenvolvedores do Monero entendem que as transações de uma criptomoeda devem ser o mais indistinguíveis o possível uma das outras. Ou seja, nenhuma deve chamar mais atenção do que a outra, e os seus registros na blockchain devem ser um monte de caracteres monótonos e sem sentido para um observador externo. Em função disso, o Monero tem tecnologias para esconder cada um dos elementos que diferenciam as transações umas das outras: o endereço do remetente, a quantia, o endereço IP de quem envia e o endereço do destinatário. Continue lendo o artigo para aprender quais as soluções que os desenvolvedores do Monero usaram para mascarar cada uma destas informações.

Como funcionam os outputs e inputs no Monero

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.

Ao contrário do que essa imagem sugere, a assinatura em anel do Monero não é interativa. Isso significa que você não precisa falar com as outras pessoas para poder usar os outputs delas como chamarizes no anel da sua transação.

Assinaturas em anel – escondendo o remetente

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):
    • Membro 1 do anel: Output verdadeiro: Output pertencente à Alice  (1 XMR)
    • Membro 2 do anel: Chamariz 1: Output pertencente à Maria (??? XMR)
    • Membro 3 do anel: Chamariz 2: Output pertencente a Paulo (??? XMR)
    • Membro 4 do anel: Chamariz 3: Output pertencente a Luis (??? XMR)
    • Membro 5 do anel: Chamariz 4: Output pertencente a João (??? XMR)
    • Membro 6 do anel: Chamariz 5: Output pertencente a Carla (??? XMR)
    • Membro 7 do anel: Chamariz 6: Output pertencente a Fábio (??? XMR)
    • Membro 8 do anel: Chamariz 7: Output pertencente a José (??? XMR)
    • Membro 9 do anel: Chamariz 8: Output pertencente a Ana (??? XMR)
    • Membro 10 do anel: Chamariz 9: Output pertencente a Carlos (??? XMR)
    • Membro 11 do anel: 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.

Transações confidenciais em anel (RingCT) – escondendo a quantia

Esta é a tecnologia que esconde a quantia que está sendo transmitida em cada transação.

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.

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:

Redes de anonimato — 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, as carteiras oficiais do Monero oferecem conexão através das redes de anonimato I2P e Tor.

Para se informar mais sobre esse assunto, leia mais nosso artigo sobre as redes de anonimato no Monero e assista o vídeo abaixo para entender melhor como as redes de anonimato funcionam no Monero:

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 da tecnologia RingCT) e um recipiente desconhecido (escondido através de um endereço stealth). Todas as informações sobre as transações realizadas são armazenadas de maneira ofuscada na blockchain, ou seja, um observador externo não sabe qual output está sendo gasto, quantos Moneros existem em cada output e qual o endereço público do destinatário. A única exceção são as transações coinbase, nas quais os mineradores criam sua própria recompensa por ter minerado o bloco. Como essas transações estão criando novas moedas que entram em circulação, elas não utilizam assinatura em anel (não escondem o output que está sendo gasto) e não são confidenciais (a quantia contida no output é visível).