Capítulo 4

A Rede Monero

Neste capítulo, você aprenderá os principais conceitos por trás da tecnologia blockchain e como os mineradores Monero mantém o registro seguro. Começaremos explicando a estrutura dos blocos, a forma como eles são associados em uma cadeia à prova de alteração e como os mineradores utilizam prova de trabalho para formar um consenso e concordar sobre a versão do registro. No tópico sobre mineradores, discutiremos a origem de novos moneroj e como essas novas moedas entram no ecossistema. Próximo ao final do capítulo, teremos um primeiro contato com alguns conceitos criptográficos (hashes e nonces) para realmente entender o processo de mineração.

4.1 Anatomia simplificada de um bloco

O capítulo anterior discutiu como transações são construídas. Em resumo, sua carteira cria uma mensagem com instruções para transferir uma de suas saídas para um novo destinatário. As informações sensíveis da mensagem (remetente, destinatário e valor) são ocultadas criptograficamente antes da sua carteira autorizar a mensagem, assinando-a digitalmente com sua chave privada.

Neste capítulo, você aprenderá como a mensagem da transação é processada para realizar a transação de fato. Quando sua carteira transmite essa mensagem, a rede armazena temporariamente a solicitação em uma lista de transações pendentes, conhecida como memory pool. Os mineradores do Monero recolhem então essas transações não-confirmadas da memory pool e agrupam-as em blocos. Um bloco simplificado é mostrado abaixo:

Figura 4.1

Figura 4.1 – Cada bloco de transações sequencialmente enumerado deve incluir tanto um nonce quanto uma referência ao hash do bloco anterior.

Cada bloco contém um conjunto de transações, uma associação criptográfica com o bloco anterior (chamado hash) e um local para os mineradores incluírem um número especial que completa o bloco (chamado nonce).

Se quiser aprender como hashes e nonces funcionam, próximo ao final deste capítulo você encontrará uma introdução intuitiva com exemplos (se estiver curioso sobre a criptografia e quiser ler agora, fique a vontade para pular para a última seção do Capítulo 4). Existem basicamente dois conceitos que você precisa conhecer para entender como essas técnicas funcionam para manter a blockchain segura:

  1. O hash é um mecanismo de segurança que prova que cada bloco está diretamente associado à uma versão inalterada do bloco anterior. Se um adversário tentar alterar qualquer ponto do registro, mesmo a menor tentativa de modificação será descaradamente óbvia, pois os hashes emitirão uma espécie de sinal de alerta em cada bloco subsequente.

  2. O nonce é um sequência alfanumérica especial que completa o bloco e marca-o como pronto para entrar na blockchain. É computacionalmente muito difícil encontrar um nonce que satisfaça os requisitos necessários para finalizar e lacrar um bloco. Os mineradores gastam a maior parte do seu tempo e energia procurando por nonces válidos. É impossível planejar com antecedência o cálculo de um nonce, assim a procura precisa recomeçar do zero para cada bloco novo. Os nonces não têm nenhum significado matemático; são apenas uma sequência única de caracteres aleatórios.

4.2 Os nós são a base da rede

4.2.1 Nós retransmitem dados da rede aos pares

Até agora, referências feitas à “rede Monero” não descreveram os detalhes da sua composição. Como suas transações são realmente propagadas a mineradores e demais usuários através dessa “rede” nebulosa? Milhares de nós Monero espalhados por todo o planeta estão conectados uns aos outros, compartilhando rapidamente notícias sobre transações e blocos.

Esses nós formam uma rede ponto-a-ponto, permitindo aos usuários Monero uma forma de comunicação resiliente e eficiente. Executar um nó não requer nenhum conhecimento ou equipamento especial – se você baixar e instalar o software do Monero agora, você poderá ter seu nó rodando antes mesmo de terminar este capítulo!

Figura 4.2

Figura 4.2 – O Monero utiliza uma rede ponto-a-ponto distribuída, formada por uma rede de dispositivos voluntários compartilhando novos dados uns com os outros. Os nós mantém uma cópia completa da blockchain e formam a base da rede. Dado que executar um nó requer uma quantidade significativa de espaço em disco, alguns dispositivos (especialmente carteiras para dispositivos móveis) conectam-se a um nó remoto para requisitar informação e transmitir transações.

Não existem “nós especiais” ou “super nós” na rede ponto-a-ponto do Monero; todos os nós (incluindo o seu) participam igualmente no compartilhamento de recursos e volume de trabalho. Os nós são hospedados em computadores de todos os tipos e tamanhos – notebooks, desktops, servidores e até máquinas virtuais.

4.2.2 Nós armazenam a blockchain

Quando um nó é inicializado, primeiro ele deve baixar a blockchain inteira e verificar as associações criptográficas, como os hashes e nonces. Essa sincronização inicial pode levar algumas horas, conforme o nó constrói sua cópia local da blockchain, confirmando a validade de cada transação e de cada bloco. Ao invés de baixar a blockchain usando uma única conexão com um servidor central, cada nó recebe transmissões de vários pares de nós. Os nós não precisam identificar ou confiar em seus pares, uma vez que a validade dos dados é confirmada criptograficamente.

Qualquer software de carteira Monero (por exemplo, a Monero GUI, um aplicativo no celular, etc.) precisa ter acesso a uma cópia da blockchain para desempenhar as tarefas de recuperar o histórico de transações, calcular saldos em conta e criar transações. Uma carteira não pode criar transações antes de se comunicar com um nó sincronizado, já que o software precisa encontrar e registrar todas as saídas não gastas pertinentes. Porém, seu endereço pode receber moneroj estando sua carteira conectada ou não a um nó sincronizado (a transação simplesmente não aparecerá no seu saldo até que a carteira baixe e verifique aquele bloco).

4.2.3 “Nós locais” versus “nós remotos”

O processo de armazenar e verificar localmente a blockchain inteira, de forma que sua carteira possa interagir com sua própria cópia do registro, é chamado de executar um nó local. Quando você utiliza este tipo de configuração, sua carteira só irá interagir com sua cópia pessoal da blockchain. Executar um nó local requer uma quantidade considerável de espaço em disco (aprox. 70 GB no momento em que escrevo), o que não é viável em todos os dispositivos, como celulares, por exemplo.

Felizmente, carteiras de software podem ser configuradas para usar um nó remoto ao invés do seu próprio nó local. Isso significa que sua carteira se conectará ao nó de outra pessoa e simplesmente requisitará informações sobre suas saídas. A maioria das carteira Monero para dispositivos móveis utilizam nós remotos por padrão, com o objetivo de manter o app leve. As carteiras Monero GUI e CLI podem ser configuradas para usar tanto um nó local quanto um nó remoto.

Não existe nenhum risco de segurança ao usar um nó remoto; sua semente e suas chaves nunca serão reveladas, então o operador do nó remoto não será capaz de controlar seus fundos ou descriptografar qualquer informação que esteja protegida pelas características de privacidade do Monero, como RingCT (ocultando o valor da transação) ou endereços sigilosos (ofuscando o endereço do destinatário).

Existem pequenas concessões em privacidade que surgem ao se usar nós remotos, já que o operador do nó saberá os horários e os endereços IP usados pelo seu dispositivo para transmitir transações ou realizar atualizações.

4.3 Mineradores criam novos blocos

4.3.1 Mineradores adicionam novos blocos à cadeia mais longa

Os mineradores recolhem transações pendentes da memory pool, verificam sua autenticidade conferindo se as provas criptográficas e assinaturas são válidas, e verificam se a imagem-chave já não foi usada anteriormente (veja a seção “3.2.3 Assinaturas em anel” para relembrar porquê isso é importante).

Para preparar um bloco, o minerador cria uma lista de transações a serem incluídas, juntamente com o hash do bloco anterior para fornecer uma associação criptográfica. Por fim, o minerador trabalha para encontrar um nonce que possa ser usado para completar o bloco.

A cada instante, existem milhares de mineradores trabalhando separadamente (ou em grupos, conhecido como pools de mineração) para encontrar um nonce que complete o bloco atual de transações. Assim que um minerador ou pool encontra um nonce para finalizar seu bloco, ele anuncia sua versão para o restante da rede. Ao receber esse bloco completado, os outros mineradores e nós adicionam-o a sua cópia da blockchain, aumentando a altura da cadeira em um bloco.

4.3.2 Uma tarefa difícil garante estabilidade e imparcialidade

Pela natureza globalizada do ecossistema Monero e por atrasos imprevisíveis nas transmissões ponto-a-ponto por conta da latência da rede, se dois mineradores completarem duas versões diferentes e independentes de um mesmo bloco na mesma altura, eles podem, ocasionalmente, causar separações momentâneas na blockchain. Suponha que um minerador na América do Sul seja o primeiro a completar um bloco, mas um outro minerador na Europa finaliza sua própria cópia antes de receber a transmissão vinda da América do Sul. Neste exemplo, o hemisfério sul pode estar temporariamente usando uma cópia diferente da blockchain do que o hemisfério norte. Por um breve momento, existem dois registros concorrentes da blockchain do Monero que possivelmente possuem pequenas diferenças entre si (dependendo de quais transações pendentes cada minerador selecionou na memory pool). Alguém pode pensar que isso seria um acontecimento catastrófico!

Figura 4.3

Figura 4.3 – Mineradores competem para aumentar a cadeia com um novo bloco. (Acima) A blockchain está na altura “3”, então cada minerador trabalha em sua própria versão do bloco “4”. (Abaixo) O bloco “4” foi completado primeiro pelo minerador do meio, então sua versão é adicionada à blockchain compartilhada, e todos os mineradores passam a procurar um nonce para o bloco “5”.

Pelo contrário, essa situação é facilmente resolvida ao elegantemente impor uma regra simples: todos os mineradores concordam em minerar o próximo bloco na cadeia mais longa. Esta é uma peça fundamental do protocolo de consenso descentralizado do Monero e permite que a rede Monero rapidamente se una em uma única cadeia após uma separação acidental. Ao invés de tentar resolver a discrepância entre os blocos imediatamente, os mineradores simplesmente continuam trabalhando para completar o próximo bloco na versão deles.

Dentro dos próximos minutos, um dos mineradores resolverá um bloco subsequente e o adicionará à sua cadeia. Assim que isso aconteçe, sua versão da cadeia torna-se a mais longa, fazendo com que os demais mineradores e nós rapidamente adotem aquela cópia e descartem o bloco órfão alternativo. Qualquer transação que só tenha sido incluída no bloco órfão permanecerá na memory pool da cadeia principal e será minerada em um bloco subsequente. Ao simplesmente seguir a cadeia mais longa, criada com o maior esforço, a rede resolve todas essas separações e retorna ao consenso sobre um único registro universal.

4.3.3 Os “táxis” do Monero utilizam um desafio difícil para garantir a imparcialidade

Validar um conjunto de transações e listá-las em um bloco não é computacionalmente difícil. A tarefa que consome mais tempo do minerador é encontrar um nonce que permita que o bloco seja completado. Este é um desafio projetado para ser extremamente difícil e capaz de ser solucionado somente ao usar força bruta para testar todas as possibilidades; não existem formas de encurtar o processo ou restringir matematicamente a busca por um nonce válido. Os mineradores simplesmente escolhem um número aleatório e testam se ele completa o bloco, um processo puramente de tentativa e erro.

A existência desse obstáculo arbitrário pode parecer peculiar em um primeiro momento! Os mineradores desempenham um papel crucial e computacionalmente fácil para a rede (validar transações) mas são obrigados a realizar uma tarefa inútil e difícil (encontrar um nonce) para submeter seus resultados.

Para entender o motivo por trás disso, imagine uma Rede de Táxis do Monero com poucos veículos mas muitos motoristas que podem utilizar esses carros temporariamente se eles submeterem um trajeto aprovado. Ao longo do dia, passageiros interessados ligam e solicitam corridas por toda a cidade. Todas as solicitações dos passageiros que ainda não foram pegas são listadas em tempo-real em uma “pool” de corridas pendentes.

Figura 4.4

Figura 4.4 – No primeiro estágio de preparação para montar um plano de corridas, cada motorista olha para pool de corridas pendentes e faz um rascunho do trajeto completo.

Ao invés de uma autoridade central de táxis designar cada corrida que chega à determinado carro ou motorista, cada taxista olha para a pool e monta sua própria lista com 5 a 10 corridas que ele seria capaz de completar nos próximos 30 minutos. Essa etapa de planejar o trajeto é fácil e rápida para os taxistas mais experientes! Assim que um motorista monta a lista de viagens que consegue incluir no próximo “bloco” de corridas, ele completa uma última tarefa descrita abaixo, e depois submete seu trajeto para a Rede de Táxis do Monero.

Se o taxista propôs um trajeto válido usando corridas pendentes reais, seu plano está aprovado! Assim, as corridas incluídas no plano desse taxista são removidas da pool de corridas pendentes, ele escolhe um carro e os passageiros logo são transportados para seus destinos. O motorista recebe de cada passageiro o valor da corrida realizada e a Rede de Táxis do Monero paga um bônus em dinheiro ao taxista por ele ter sido o primeiro a submeter um plano completo.

Até agora, esse processo parece bastante intuitivo! Viagens não realizadas são listadas na pool; quando um taxista submete com sucesso um bloco de corridas, os passageiros são transportados até seu destino e removidos da pool de corridas pendentes.

Figura 4.5

Figura 4.5 – Após os taxistas terem completado a tarefa (relativamente) fácil de planejar um trajeto, eles devem resolver um desafio difícil – nessa analogia, encontrar uma forma de reorganizar as letras dos endereços para formar uma frase.

Porém, a Rede de Táxis do Monero possui uma regra bem peculiar: para que um motorista submeta seu plano com um bloco de corridas à rede Monero, eles devem realizar antes uma tarefa difícil e ao mesmo tempo inútil. Imagine que o motorista precise pegar as letras de todos os endereços de destino dos passageiros e usar algumas delas para formar cinco frases em seu idioma local (com mais de 50 palavras no total) que digam qualquer coisa, mas que precisam estar gramaticalmente corretas. Um taxista submetendo um trajeto que tenha planejado precisa incluir tanto a lista de corridas quanto uma frase sem sentido ("nonce") que contenha as letras dos destinos, ou seu trajeto será automaticamente rejeitado. Existem várias frases sem sentido válidas que podem ser formadas usando a maioria das letras (por exemplo, {a,e,e,g,i,m,n,r,r,s,t,o,o} pode ser reorganizado para formar “Rims enrage too!” e “Monero is great!"), e as frases resultantes não têm qualquer utilidade senão permitir o envio do conjunto de corridas à Rede de Táxis do Monero.

Uma propriedade desse tipo de tarefa, que terá paralelos com a criptomoeda Monero, é que é muito difícil encontrar um nonce, mas ao mesmo tempo muito fácil verificá-lo. Neste exemplo dos táxis, é bastante difícil reorganizar manualmente uma dúzia de endereços em 50 palavras que formem uma frase válida. No entanto, é bastante trivial para qualquer um revisar o resultado do nonce e verificar que ele completa o bloco de corridas. Quando um taxista submete seu nonce no formato mostrado abaixo, você rapidamente consegue ver que “Apple jam is very bad” é uma sentença válida e que as letras dos destinos dos passageiros foram utilizadas de maneira correta. Essa verificação é praticamente instantânea comparada ao tempo que os taxistas levam para reorganizar as letras e formar várias frases.

Figura 4.6

Figura 4.6 – Encontrar uma frase nonce ao reorganizar os endereços é complicado e requer tempo. Porém, a validade das frases enviadas é fácil de ser verificada ao rapidamente conferir se elas usam somente letras dos endereços das corridas incluídas no trajeto.

Um taxista experiente seria capaz de planejar um trajeto a partir da lista de corridas em menos de 60 segundos, ainda assim, ele provavelmente levaria uns bons minutos para reorganizar as letras manualmente para encontrar frases nonces. Na verdade, grande parte do seu esforço para preparar um bloco de corridas será gasto tentando encontrar esse nonce desnecessário.

Imagine esse processo pela perspectiva do taxista, começando logo depois que o último bloco foi aprovado. Você rapidamente planeja um trajeto que inclui várias viagens da lista de corridas pendentes. Em seguida, começa a trabalhar desenfreadamente para reorganizar as letras dos endereços de destino para formar alguma frase nonce. Durante alguns minutos, você e os demais taxistas estão trabalhando na mesma lista de corridas pendentes, cada um tentando elaborar um nonce longo suficiente, ou seja, com mais de 50 palavras. De repente, outro taxista submete uma lista de corridas juntamente com um nonce completo. Todas as viagens em que você estava trabalhando desaparecem da pool! Você precisa jogar todo seu trabalho feito naquele bloco fora (já que os passageiros já estão em trânsito) e trocar para um novo conjunto de corridas pendentes. O processo de encontrar um nonce válido para aquele conjunto de corridas começa novamente do zero, baseado no conjunto de letras dos novos endereços de destino.

Por que a Rede de Táxis do Monero impõe uma tarefa tão difícil e inútil a seus taxistas? Na verdade, essa é uma forma infalível de garantir que seus clientes sejam servidos de forma justa e imparcial! Imagine que alguns taxistas hajam de forma antiética, talvez ignorando corridas que venham de algumas regiões da cidade ou só selecionando corridas de passageiros que estão indo às empresas que tenham pago suborno a eles. Sem a obrigatoriedade do nonce, esse pequeno grupo de taxistas mal-intencionados poderia dominar o processo de seleção de corridas da empresa toda ao constantemente submeter seus trajetos (injustos e excludentes) assim que um carro fica disponível. Desta forma, eles poderiam sistematicamente tratar alguns grupos de clientes de forma inferior, o que é absolutamente antiético de acordo com os princípios da Rede de Táxis do Monero, que se dedica a servir todos os passageiros com igualdade e imparcialidade.

A competição entre os muitos taxistas para completar a tarefa do nonce é crucial para o objetivo do Monero de garantir que os carros e as corridas sejam oferecidos de forma justa. Considerando que todos os taxistas conseguem reorganizar as letras aproximadamente na mesma velocidade, a frequência com que cada taxista conseguirá ser o primeiro a encontrar uma solução e submeter seu bloco de corridas será um tanto quanto aleatória. É pouco provável que qualquer taxista consiga ser o primeiro a submeter muitos blocos de corridas em sequência (ou seja, ser o primeiro a encontrar frases nonce por muitos blocos consecutivos) já que cada taxista está individualmente competindo contra um grupo grande de outros taxistas.

A maioria dos motoristas serão pessoas honestas, submetendo blocos com planos de corridas justos para manter a cidade rodando sem problemas. Se existir um grupo de taxistas mal-intencionados, mesmo em pequeno número, e eles submeterem planos injustos, a tarefa do nonce impedirá que tal grupo controle o sistema inteiro. Estatisticamente, eles ocasionalmente serão os primeiros a encontrar um nonce e assim poderão submeter seus planos com trajetos excludentes para aquele bloco. Porém, o restante dos taxistas, cuja maioria é honesta, imediatamente começará a trabalhar em seus bloco justos para propor o próximo conjunto de corridas! Devido à natureza aleatória de quem tem a sorte de ser o primeiro a encontrar um nonce, o próximo conjunto de corridas provavelmente será desempenhado por um taxista honesto cujo plano acrescentará as corridas excluídas anteriormente. Esse sistema de impor um trabalho sem utilidade para aleatorizar quais trajetos dos taxistas são aceitos permite que a Rede de Táxis do Monero certifique-se que a minoria de taxistas mal-intencionados não consiga impedir um usuário ou grupo de usuários a solicitar corridas.

Por esse motivo, a Rede de Táxis do Monero não conta com uma autoridade central que seja responsável por controlar a atribuição e a realização de corridas. Em vez disso, essa tarefa é distribuída aos taxistas individuais, empregando a competição do nonce sem utilidade para selecioar aleatoriamente qual proposta de trajeto é aceita. Isso garante que, estatisticamente, os carros sejam frequentemente atribuídos aos taxistas honestos, e por consequência, que a Rede de Táxis do Monero tenha uma excelente reputação por prover um serviço justo à todos os clientes.

Você provavelmente deva estar de se perguntando como essa longa metáfora dos táxis está relacionada com a criptomoeda que é amplamente falada neste livro! Ou talvez já tenha descoberto que a rede descentralizada de Táxis do Monero é uma óbvia analogia à rede da criptomoeda Monero, que precisa prover um serviço global e justo sem nenhuma autoridade central.

Cada corrida corresponde a uma transação Monero, pendente na memory pool até que ela seja selecionada para um lugar no carro/bloco. Os taxistas representam os mineradores. Ambos desempenhando um trabalho simples e importante (taxistas planejam trajetos; mineradores coletam e validam transações), e são igualmente forçados a competir contra outros taxistas/mineradores em uma tarefa de nonce simples e ao mesmo tempo inútil. Essa barreira torna aleatório quem terá sucesso primeiro – assim, distribuindo estatisticamente a maior parte dos carros/blocos para os taxistas/mineradores honestos. Qualquer taxista que seja o primeiro a submeter seu trajeto é recompensado com um bônus da Empresa de Táxis Monero e recebe os valores das corridas pagos pelos passageiros que foram transportados. Da mesma forma, os mineradores são recompensados com uma comissão (chamada recompensa do bloco ou coinbase) por completarem os blocos e também coletam as taxas das transações que foram incluídas no bloco em questão.

4.3.4 Os mineradores são pagos pelo seu serviço

Toda vez que um minerador minera um bloco com sucesso (ou seja, é o primeiro a encontrar um nonce que completa o próximo bloco da cadeia mais longa) ele é pago de duas formas diferentes.

  1. Primeiro, o minerador recebe uma recompensa por ter contribuído com um bloco completo de transações validadas. Essa recompensa do bloco é análoga ao bônus em dinheiro que os taxistas recebem por terem submetido trajetos completos. Logo que tenham recebido e confirmado o bloco solucionado, todos mineradores adicionam essas moedas recém cunhadas ao endereço do primeiro minerador que encontrou um nonce válido.

  2. Em segundo lugar, o minerador coleta as taxas que foram incluídas com as transações. Os usuários do Monero podem aumentar as chances de um minerador incluir suas transações mais rapidamente se optarem por usar uma taxa maior.

Uma percepção errônea e comum que se tem é pensar que os mineradores estão “encontrando” ou “criando” moedas. Na verdade, os mineradores estão simplesmente validando transações e eles são pagos por seu trabalho usando moedas novas. Essa introdução de novos moneroj é chamada de emissão de moedas.

Quando o Monero foi lançado, a taxa de emissão de moedas era de mais de 30 XMR a cada 2 minutos. Essa recompensa irá decrescer suavemente até atingir 0,6 XMR por bloco (2 minutos) em 2022. O decrescimento contínuo do Monero foi projetado para oferecer um ambiente econômico mais estável para os mineradores, quando comparado aos eventos dramáticos de halving das outras criptomoedas, quando a recompensa do bloco é abruptamente reduzida à metade. Após 2022, a emissão em cauda do Monero permanecerá constante, garantindo que a mineração de um bloco sempre venha acompanhada de uma recompensa de 0,6 XMR.

Muitas criptomoedas possuem um limite fixo na emissão de moedas, ou seja, um limite máximo na oferta. Uma vez que o limite na oferta é atingido, novas moedas não serão mais dadas aos mineradores, que serão forçados a subsistir a partir das taxas. Por exemplo, no Bitcoin, essa mudança de paradigma nos incentivos financeiros acontecerá por volta de 2140, quando a oferta atingir 21 milhões de Bitcoins e parar de crescer além desse número. Essa abordagem muitas vezes é tida como benéfica para manter a moeda “deflacionária”, entretanto, esses argumentos são frequentemente usados misturando-se o conceito de uma oferta monetária inflacionária com um uso distorcido da palavra “inflação” para descrever a perda indesejada do poder de compra de uma moeda.

O crescimento na oferta de Monero a partir da emissão em cauda de 0,6 XMR será menor que 1% ao ano. Embora os desenvolvedores tenham criado a emissão em cauda para incentivar os mineradores a longo prazo, uma consequência interessante é que ela é fácil de ser comparada com sistemas financeiros baseados em ativos e garantias. A taxa de crescimento na oferta de Monero devido à emissão em cauda é comparável ao crescimento anual na oferta de ouro, que na era da civilização moderna é, historicamente, considerado a forma mais pura e estável de dinheiro. Uma vez que os mineradores sempre serão capazes de coletar taxas, os pagamentos garantidos através das recompensas do bloco (coinbase) provém elevada estabilidade financeira para eles no longo prazo. Esse contrato social garante que os mineradores se mantenham incentivados a usar seus equipamentos para proteger a rede Monero.

Figura 4.7

Figura 4.7 – Um minerador recebe dois tipos de pagamento toda vez que mineram um bloco: 1) as taxas incluídas em cada transação, e 2) a recompensa do bloco na forma de moneroj recém cunhados.

4.4 Sistemas prova de trabalho

Nos distanciaremos agora da analogia dos táxis e passaremos a discutir os sistemas empregados para garantir a imparcialidade no Monero. Esse processo de atrelar funções importantes da rede com a procura por um nonce sem utilidade é chamado de prova de trabalho (Proof of Work ou PoW, em inglês). Muitas criptomoedas foram construídas baseadas no consenso de prova de trabalho, e por isso, existem diferenças entre as várias implementações e suas características. Porém, essas criptomoedas compartilham o mesmo conceito: impor descentralização ao requerer que a validação seja submetida juntamente com um nonce. Ocasionalmente, nos referimos ao nonce como sendo a “prova de trabalho” em si, no sentido de referir-se à porção de dados que foi difícil de encontrar e fácil de verificar, como os anagramas feitos pelos taxistas.

Os mineradores usam a notação “hashes por segundo”, abreviado para H/s, para medir quão rápido eles conseguem trabalhar na mineração dos blocos. Qualquer minerador pode medir sua própria taxa de hash (hashrate, em inglês), que varia dependendo do equipamento que se esteja utilizando para minerar. A “taxa de hash da rede” refere-se à soma do hashrate de todos os mineradores que estão trabalhando na preparação dos blocos.

4.4.1 Benefícios

4.4.1.1 Resistência à censura

Nos sistemas prova de trabalho descritos acima, a competição para encontrar o nonce aleatoriza qual versão dos mineradores é aceita como o último bloco da cadeia mais longa. Como mencionado na analogia dos táxis, a estrutura da prova de trabalho efetivamente previne a censura. Alguns mineradores mal-intencionados da rede Monero podem tentar oferecer um tratamento preferencial ou ignorar certas transações da memory pool, porém, um minerador Monero honesto invariavelmente as incluirá no próximo bloco.

4.4.1.2 Prevenção ao ataque de gasto duplo

Existe outro desafio para as blockchains que não foi mencionado na analogia dos táxis, mas que é resolvido pelos sistemas prova de trabalho. Especificamente, um minerador mal-intencionado pode tentar gastar duas vezes uma mesma saída. Tal fato refere-se a um ataque onde o minerador cria blocos alternativos para desfazer suas transações antigas, “roubando de volta” o dinheiro que havia gasto. Esse tipo de ataque precisaria ser executado da seguinte forma:

  • O minerador mal-intencionado “Martin” transmite uma transação enviando alguns de seus moneroj para a vítima “Valerie”.
  • Quando a transação “Martin » Valerie” é minerada na blockchain, Valerie acredita que foi paga.
  • Martin pega os itens que estava comprando de Valerie…
  • … em seguinda, Martin minera uma versão diferente do bloco que originalmente continha a transação Martin » Valerie.
  • Nessa versão alternativa de Martin, a transação para Valerie não existe! Na verdade, sua segunda versão contém uma transação que envia aqueles moneroj para uma de suas carteiras (Martin » Martin), ao invés da carteira de Valerie.
  • Se Martin puder rapidamente minerar blocos suficientes para fazer da sua versão a cadeia mais longa, a rede irá aceitar sua realidade alternativa. Na prática, a inviabilidade desta etapa previne que ataques de gasto duplo aconteçam.
  • Dado que a imagem-chave da saída de Martin aparece na cadeia (agora associada com a transação para si mesmo), a rede não irá mais aceitar a transação “Martin » Valerie” como válida pois a imagem-chave associada com aquela saída já foi gasta.

A essa altura, Martin ficou com os itens que comprou de Valerie e também roubou de volta os moneroj que ele inicialmente tinha usado para pagá-la.

Felizmente, sistemas prova de trabalho impedem que um adversário consiga realizar esse tipo de ataque de gasto duplo ao limitar a velocidade com que blocos podem ser gerados. Lembre-se que os mineradores sempre seguirão a blockchain mais longa, assim, o minerador mal-intencionado teria que alterar o bloco contendo a transação antiga e depois reminerar cada bloco subsequente rápido o suficiente para ultrapassar o comprimento da cadeia principal. Uma vez que o minerador mal-intencionado estará trabalhando sozinho para gerar os blocos alterados, contra o hashrate total do restante da rede que está mantendo a versão original da blockchain, ele não será capaz de alcançá-los. Esse tipo de ataque só poderia ser bem sucedido se o minerador mal-intencionado tiver tanto poder computacional quanto todo o restante da rede combinada. Por essa razão, o termo ataque de 51% muitas vezes é usado para representar que algum tipo de atividade mal-intencionada precisaria controlar mais da metade do hashrate.

Figura 4.8

Figura 4.8 – O minerador desonesto, na parte de baixo, tenta executar um ataque de gasto duplo criando uma versão diferente de um bloco já minerado. Todos os mineradores honestos trabalhando juntos produzem blocos mais rapidamente que o minerador mal-intencionado, e assim a cadeia do malfeitor com a transação alternativa é descartada.

Uma criptomoeda com mais mineradores e maior taxa total de hash será mais difícil de atacar dessa forma, já que o minerador mal-intencionado precisaria ter mais poder computacional do que o restante da rede global. Aumentar o hashrate total ao incluir mais mineradores ajuda a proteger a rede contra ataques.

4.4.2 A “dificuldade” ajusta o tempo entre blocos

A rede Monero tem por objetivo adicionar um novo bloco à cadeia a cada dois minutos, aproximadamente. A cada bloco minerado, algumas transações são movidas da memory pool de transações pendentes e vão para a blockchain como confirmadas. Se o tempo médio do bloco for muito longo, as transações demorarão muito para serem confirmadas. Se o tempo médio do bloco for muito curto, a rede sairá de sincronia com mais frequência.

A rede influencia quão rápido os blocos são minerados ajustando a dificuldade do desafio do nonce. Com mais mineradores juntado-se à rede ao longo do tempo, o maior poder coletivo de adivinhar (ou hashrate) resulta em blocos sendo completados mais frequentemente (conceitualmente: se você duplicar o número de pessoas procurando por algo, o grupo provavelmente encontrará o que procura na metade do tempo). Estatisticamente, isso faria com que os mineradores encontrassem blocos mais rápido do que o tempo de bloco pretendido, de 2 minutos. Para compensar esse efeito, a dificuldade do desafio é aumentada, fazendo com que se demore mais para encontrar um nonce que cumpra os requisitos estipulados. Da mesma forma, a dificuldade pode ser ajustada “para baixo” se o poder de mineração coletivo diminuir, ou seja, quando a frequência com que os blocos são completados é reduzida.

Na analogia sobre a rede de táxis da seção anterior, a dificuldade da tarefa de reorganização das letras poderia ser arbitrariamente ajustada, exigindo mais ou menos palavras para formar as frases nonce. Se 20% dos taxistas (mineradores) não trabalhassem um dia, os blocos com planos de trajetos demorariam mais que o normal para serem submetidos (completos com o nonce), e alguns carros ficariam ociosos por falta de motoristas. Para corrigir isso, os taxistas poderiam concordar em reduzir o requisito do nonce de 50 para 40 palavras. Essa redução colocaria os taxistas de volta em sincronia com a quantidade de carros disponíveis.

A dificuldade aumenta proporcionalmente ao hashrate total da rede para manter o fluxo de blocos constante.

4.4.3 O algoritmo CryptoNight

O Monero utiliza uma variação do algoritmo CryptoNight e ele é bastante diferente dos sistemas utilizados pela maioria das outras criptomoedas. Uma das características que definem o Monero é o uso de uma função de prova de trabalho difícil de ser otimizada em equipamentos especializados de mineração.

Na maioria dos contextos, “otimização” é uma coisa boa. Talvez você esteja surpreso que o algoritmo de prova de trabalho do Monero propositalmente combata o aumento da velocidade de mineração. Isso acontece porque a habilidade de criar equipamentos de mineração mais potentes pode levar a uma perigosa centralização de mineradores. Esses riscos são perfeitamente observados na história da mineração do Bitcoin.

4.4.3.1 Contexto: A história da mineração do Bitcoin

Quando as criptomoedas entraram em cena com o aparecimento do Bitcoin em 2009, a mineração era feita exclusivamente usando-se o processador (CPU) dos computadores. Uma vez que a dificuldade de mineração da rede se ajusta ao hashrate total disponível, minerar com CPU era adequadamente lucrativo naquela época. Usando processadores para minerar Bitcoin, os mineradores tinham poder de mineração na ordem de 1.000.000 H/s, também escrito como 1MH/s.

Em pouco tempo, placas de vídeo (chamadas GPU) foram reaproveitadas para minerar criptomoedas. As GPUs são capazes de minerar muito mais rápido, na ordem de 100 MH/s. Dado que a dificuldade da rede se ajustou com base nos mineradores que usavam GPU, quem minerava com processador não conseguia mais competir (por exemplo, a recompensa pela mineração não era suficiente para pagar pelo equipamento nem pelos custos com eletricidade).

Em seguida, circuitos integrados de aplicação específica (Application Specific Integrated Circuits ou ASICs, em inglês) foram desenvolvidos com o único propósito de minerar Bitcoin. Esses dispositivos especiais são bastante caros e mineram a taxas milhares de vezes mais rápidas que GPUs – mais de 1.000.000 MH/s. Hoje, a dificuldade da rede Bitcoin aumentou para acomodar os ASICs, expulsando, por consequência, os mineradores que usavam processadores e GPUs.

O Bitcoin foi inicialmente lançado com a visão de que qualquer pessoa no mundo que tivesse um computador pudesse começar a minerar para proteger a rede e receber, assim, alguns bitcoins como recompensa. Infelizmente, a criação e proliferação dos ASICs efetivamente acabou com esse sonho. Se você deseja começar a minerar Bitcoin agora, terá que comprar um ASIC pagando centenas ou até milhares de Euros.

O domínio dos ASICs forçou a maioria esmagadora dos mineradores de Bitcoin a abandonar o negócio. No início da sua existência, a rede era protegida por um grande número de nerds espalhados pelo globo, todos participando com seus computadores pessoais e placas de vídeo. Infelizmente, essa era do Bitcoin com verdadeira e legítima descentralização se foi. Hoje a rede é dominada por grandes corporações com enormes fazendas de mineração ASIC, que efetivamente tornaram-se a base da rede.

4.4.3.2 ASICs possibilitam uma centralização perigosa

Já que muitas das principais criptomoedas são dominadas por mineradores usando ASICs, é válido levantar algumas considerações sobre o tópico e seus riscos. A centralização acontece de duas formas: os ASICs só são produzidos por um pequeno número de empresas (centralização da fabricação) e posteriormente a mineração tende a ser limitada a algumas grandes fazendas (centralização da mineração).

A centralização da fabricação dos ASICs e da mineração por parte de poucas corporações pertimite que hackers, criminosos e governos exerçam enorme e desproporcional influência sobre a rede e sua operação. Esse fenômeno faz com que muitos dos benefícios da descentralização comecem a desaparecer. Por exemplo:

O acesso universal à mineração prosperava nos tempos de mineração com processadores e GPUs, quando usava-se, em sua maioria, equipamentos de uso geral e sem restrições. Hoje em dia, porém, a mineração requer equipamentos especializados que correm grande risco de regulação e controle. É possível que alguns governos imponham proibições ou exijam licenças para fabricar e possuir ASICs.

A resistência a censura é enfraquecida se a maior parte do poder de mineração do Monero for controlada por grandes fazendas de mineração que podem sofrer pressão para confirmar ou censurar determinadas transações. Seria muito difícil exercer esse tipo de influencia sobre um conjunto global de mineradores amadores, e muito mais fácil de impor esse tipo de situação a corporações centralizadas de mineração.

A resiliência da rede pode ser catastroficamente comprometida se um fabricante mal-intencionado (ou que esteja seguindo ordens de um governo) incluir um interruptor secreto nos ASICs para controlar ou até desligar os equipamentos de mineração remotamente. Isso cria um ponto único de falha cuja ativação acabaria instantaneamente com a maior parte do hashrate da rede. Tal acontecimento subitamente colocaria a rede em um estado de vulnerabilidade com muito menos hashrate para proteger a moeda. Esse risco é ainda maior se um pequeno grupo de fabricantes ASICs controlar a maior parcela da produção.

O controle dos ASICs sobre o Bitcoin está completo. Embora ainda existam pequenos mineradores amadores usando ASICs em pools, são as grandes fazendas de mineração que dominam o hashrate da rede. O que é preocupante, é que a maioria dos ASICs para Bitcoin são projetados, produzidos e enviados por um único fabricante – em forte contraste com os dias iniciais do Bitcoin, onde os mineradores utilizavam processadores e GPUs de todas as marcas, modelos e tipos para minerar. A predominância dos ASICs seria muito menos arriscada se houvesse um mercado diversificado e competitivo em torno dos ASICs.

4.4.3.3 O Monero resiste ativamente aos ASICs

Devido a seus princípios de igualdade, a comunidade Monero não aprova os ASICs e a inevitável centralização do poder de mineração que os acompanha. Enquanto o algoritmo de hash “intensivo para processadores” (SHA-256) utilizado no Bitcoin é passível de ser otimizado em ASICs, o Monero previne o desenvolvimento de ASICs usando um algoritmo “intensivo para a memória” que é mais difícil de acelerar (CryptoNight).

Consequentemente, é possível minerar Monero com processador e placa de vídeo, mesmo em 2018. Existem atualmente bilhões de dispositivos (qualquer processador x86 moderno e várias GPUs) capazes de minerar Monero, tornando o processo acessível a qualquer pessoa que tenha uma conexão com a internet. Na verdade, pode-se minerar Monero usando até mesmo um navegador web a partir de qualquer celular ou computador!

No início de Março de 2018 a comunidade Monero ficou surpresa ao descobrir que ASICs para o algoritmo CryptoNight haviam sido secretamente produzidos e usados para minerar Monero! Esses dispositivos eram capazes de minerar Monero 25 vezes mais rápido que as placas de vídeo mais potentes, e uma análise sobre o hashrate feita posteriormente sugeria que os ASICs correspondiam a aproximadamente metade do hashrate da rede Monero entre o final de 2017 e início de 2018.

Dado que o algoritmo CryptoNight foi projetado usando uma função intensiva para a memória especificamente para “encurtar a distância entre os mineradores CPU (maioria) e GPU/FPGA/ASIC (minoria)”, a existência desses ASICs foi uma descoberta inesperada. Embora os autores do CryptoNote observem que “É apropriado que alguns usuários tenham certa vantagem sobre os demais”, eles propõe que “o investimento deles deva crescer linearmente com o poder de mineração”. Naturalmente, um computador mais novo ou uma placa de vídeo mais moderna irá minerar com mais eficiência do que um equipamento antigo, porém, os ASICs criam uma distribuição de hashrate extremamente desproporcional.

A comunidade Monero reagiu rapidamente, tomando medidas de forma proativa para mitigar a mineração ASIC antes mesmo que a existência destes dispositivos tivesse sido completamente confirmada. A atualização rotineira do Monero realizada no segundo trimestre de 2018 incluiu uma pequena alteração no algoritmo CryptoNight projetada para afetar os mineradores ASICs de forma diferente dos que usavam processador ou GPU. Essa pequena alteração não mudou a dificuldade ou o comportamento do algoritmo, assim os mineradores CPU e GPU foram capazes de se adaptar facilmente à nova variante quando eles atualizaram para a nova versão da rede.

Os ASICs, em contrapartida, são fundamentalmente incapazes de se adaptar a novas variantes (sejam elas pequenas ou grandes). Pode-se pensar nos ASICs como trabalhadores que são treinados para executar uma única tarefa com extrema velocidade, mas que não são capazes de aprender qualquer outra coisa. O algoritmo a ser executado é fisicamente gravado nos circuitos dos ASICs, e por isso eles não podem ser reprogramados nem reaproveitados.

Quando a pequena alteração no CryptoNote foi implementada no bloco 1546000, os ASICs instantaneamente tornaram-se incompatíveis e aproximadamente metade do hashrate total da rede desapareceu. Já que os ASICs eram incapazes de se ajustar para processar blocos usando o algoritmo modificado, qualquer bloco que eles produziam eram agora imediatamente rejeitados pela rede Monero como inválidos.

Por enquanto, parece que a rede Monero tem mitigado a ameaça inesperada dos ASICs com sucesso. Para continuar desencorajando os ASICs, agora o Monero faz pequenas alterações no algoritmo de mineração a cada atualização da rede. O projeto também está explorando algoritmos completamente novos para proteger a rede de ASICs a longo prazo. Uma vez que o Monero realiza atualizações de rotina (também chamados hard forks) a cada 6 meses, tal medida deve desincentivar as tentativas de se produzir ASICs para o Monero, já que cada reformulação, além de ser demorada e cara, tornaria-se obsoleta imediatamente.

4.4.4 Breve nota sobre provas de trabalho alternativas

Além da prova de trabalho, existem sistemas alternativos para manter a justiça e a igualdade; alguns exemplos incluem prova de participação, prova de espaço, prova de largura de banda e até sistemas híbridos usando mais de um tipo. Cada sistema tem suas próprias vantagens e desvantagens. Prova de trabalho é o sistema de consenso distribuído mais utilizado atualmente e também o que mais foi testado “em campo”. Esse é o único mecanismo utilizado no Monero atualmente.

4.5 Conceitos criptográficos para provas de trabalho

Ao longo desse capítulo, focamos na funcionalidade dos hashes e dos nonces, descrevendo-os principalmente através de analogias. Se você deseja aprender como eles realmente funcionam, o restante do capítulo apresenta os verdadeiros princípios criptográficos.

4.5.1 Hashes (conceito geral)

Funções hash são uma ferramenta criptográfica que pode receber qualquer informação de entrada e produzir uma impressão digital única como saída. Esses algoritmos foram projetados de forma que qualquer alteração na informação de entrada, mesmo a menor das alterações, produzirá uma saída completamente diferente. O termo hash pode ser usado para referir-se tanto à função em si quanto à saída resultante de uma entrada em particular.

Adicionar, remover ou mesmo alterar um único caractere produzirá um hash totalmente diferente. Considere a mensagem “Envie 50 euros a Jen, por favor.” Nós podemos executar essa mensagem através de um desses algoritmos para produzir seu hash: 4ba085ea2f7a9e36. A tabela abaixo mostra como a saída do hash muda drasticamente com qualquer modificação na entrada:

Entrada Saída Comentário
Envie 50 euros a Jen, por favor. 4ba085ea2f7a9e36 Mensagem original
Envie 500 euros a Jen, por favor. e3691dd17764af6e Adicionando um “0” a mais
Envie 60 euros a Jen, por favor. af75592fc4f27e1d Trocando o “5” por “6”
Envie 50 euros a Jon, por favor. 4e52ccf6f35cd535 Trocando o destinatário para “Jon”
Envie 50 euros a Jen, por favor. 4ba085ea2f7a9e36 Mesma entrada = mesma saída!

Os exemplos de saída são os primeiros 16 caracteres do hash SHA-256 de cada entrada.

$ echo {entrada} | sha256sum | cut -c1-16

Funções hash são amplamente utilizadas nos mecanismos de segurança de muitas criptomoedas. E essas funções hash criptográficas foram projetadas para serem resistentes a colisão, o que significa que é difícil encontrar duas mensagens de entrada que colidam para produzir a mesma saída. Essa propriedade é fundamental para a imutabilidade (prova de alteração) da blockchain, já que qualquer tentativa de mudar informações em um bloco anterior irá resultar em uma saída hash completamente diferente para aquele bloco e também para os subsequentes.

Essa noção de expandir um banco de dados que só aceita adições, onde cada grupo de registros é criptograficamente protegido por hashes associados aos blocos anteriores, é o conceito principal por trás da revolução das blockchains.

4.5.2 Nonces (conceito geral)

O termo nonce refere-se a um desafio (no sentido de “quebra-cabeça” ou “enigma”) que não possui um significado físico ou matemático inerente. Por exemplo, considere os seguintes exercícios de “preencher as lacunas” que uma professora passaria a seus alunos:

A) A palavra em Esperando “m _ _ _ _” inspirou o nome “Monero”.

  • Resposta aceita: “moeda”

B) 1 quilograma é igual a “_ _ _ _” gramas.

  • Resposta aceita: 1000

C) Número primo de 3 dígitos “3 _ _” que não repete nenhum algarismo.

  • Nonces aceitos: qualquer um dentre {307, 317, 347, 349, 359, etc}

D) Número primo de 5 dígitos “7 _ _ _ _” que não repete nenhum algarismo.

  • Nonces aceitos: qualquer um dentre {71263, 72169, 73609, 74869, etc}

Tanto o desafio A quanto o B têm um significado, e cada um possui uma única resposta correta (A: “moeda”, B: “1000”) que o aluno precisará lembrar no futuro. Assim, essas respostas não são consideradas “nonces”.

Os desafios C e D, em contrapartida, são tarefas “exaustivas”, difíceis de resolver e que não contribuem em nada com qualquer problema real. Existem várias soluções que satisfazem os requerimentos do nonce; por exemplo, a resposta “359” da questão C é igualmente válida a resposta “307”.

Um aluno que gaste uma hora testando vários números para finalmente chegar à reposta “359” para o desafio C terá que recomeçar sua procura por um nonce válido do zero quando lhe for apresentada a uma variação do desafio que diga, por exemplo, “Número primo de 3 dígitos “6 _ _” que não repete nenhum algarismo.”

Se você tivesse somente um lápis e papel (ou até mesmo uma calculadora), conseguiria resolver o desafio C ou o D? Provavelmente o desafio C, já que você certamente encontraria uma resposta válida com 3 dígitos mais rapidamente do que uma com 5 dígitos. Note que é possível ajustar a dificuldade do problema de forma arbitrária, simplesmente alterando quantos dígitos são necessários.

4.6 Resumo sobre o conceito de prova de trabalho

As criptomoedas utilizam o hash de cada bloco para garantir que seu conteúdo não foi alterado, já que a mudança de um único caractere seria imediatamente óbvia devido ao hash completamente diferente (que se propaga através dos blocos seguintes). O hash de um bloco engloba todo seu conteúdo: transações, cabeçalhos, o hash do bloco anterior e o campo do nonce.

Para executar o trabalho de completar um bloco, os mineradores devem testar valores aleatórios de nonce até que o hash do bloco inteiro produza uma saída que esteja abaixo de um certo limiar, este determinado com base na dificuldade atual da rede. Uma vez que é impossível prever como mudanças na entrada de uma função hash afetarão sua saída, os mineradores precisam usar “força bruta”, num processo de tentativa e erro, até que encontrem um valor de nonce que produza um hash de saída que satisfaça a dificuldade atual da rede.

A rede aumenta ou diminui esse limiar para influenciar a dificuldade de mineração, mantendo assim o tempo de bloco em 2 minutos, independentemente das mudanças no hashrate total.