Descomplicando o Bitcoin: Mineração

No artigo anterior foi abordada a estrutura e o funcionamento da Blockchain. Neste, o processo de manutenção conhecido como mineração é apresentado, incluindo a forma com que os campos do cabeçalho do bloco são utilizados, o que é taxa de transferência e o porque da recomendação de aguardar 1 hora para se considerar uma transação como realizada.
Mineração
Para garantir a consistência da Blockchain, os nodos da rede executam um processo que é conhecido como mineração. Este processo, além de garantir a manutenção da Blockchain, garante que novos Bitcoins sejam postos em circulação. Em outras palavras, a mineração é o que garante que as transações sejam efetuadas e os valores sejam transferidos.
Quando um nodo está minerando, ele irá coletar uma certa quantia de transações pendentes, criar um bloco com elas e tentar anexar à Blockchain. Para ele consiga, o bloco deve ser considerado válido pela rede. Neste ponto entra a prova de trabalho: para o bloco ser anexado ele deve gerar um hash específico para este bloco. Ele deve iniciar com uma quantidade zeros em sequência. Como isto é uma tarefa difícil, reduz a probabilidade de mais de um nodo tentar anexar o seu bloco a Blockchain ao mesmo tempo. Esta prova de trabalho foi projetada para que a criação de um bloco válido demore em média 10 minutos.
Na criação do hash são utilizados todos os campos do cabeçalho do bloco. Dentre os valores inclusos está a raíz da árvore merkle que representa todas as transações contidas no bloco e o campo nonce. O nonce é um número inteiro que o nodo vai incrementando a cada tentativa de obtenção de um hash válido. É este campo que permite a geração dos diferentes tipos de hash. Sendo assim, a sua obtenção torna-se um processo de tentativa e erro que exige um certo poder computacional, serão vários e vários hashes por segundo. Se por um lado a obtenção do hash é difícil, a sua validação é simples, basta aplicar a função hash sobre o bloco, com o determinado valor de nonce, e verificar se o hash obtido é menor ou igual que o valor especificado no campo target. Este campo é o que determina a dificuldade da rede, quanto menor o número, maior o número de zeros a esquerda, e portanto mais difícil de se obter.
No momento em que o bloco está sendo criado, o nodo tem o direito que adicionar uma transação extra, chamada coinbase, no início da lista de transações. Esta representa a recompensa que o minerador recebe pela criação do bloco e pela descoberta do hash, é ela que coloca mais Bitcoins em circulação, uma vez que não possui origem apenas destino: a carteira do minerador.
Essa recompensa, iniciada em 50 Bitcoins (BTC), é cortada pela metade a cada 210.000 blocos, aproximadamente 4 anos, e irá continuar assim até 2140 quando o último Bitcoin será minerado. A partir deste momento os mineradores terão de lucro apenas com as taxas de transferência. Essas taxas são valores que os mineradores cobram para que determinada transferência seja inclusa no bloco. Não são obrigatórias porém, o não pagamento das mesmas pode causar a não inclusão da transferência no bloco e, portanto, a não ocorrência da mesma.
Quando um hash válido é encontrado, um novo bloco é criado e anexado à Blockchain do minerador. Esta, por sua vez, é propagada pela rede, os nodos que receberem esta mudança vão verificá-la e validá-la. O processo de validação consiste em verificar:
- Se a estrutura do bloco é correta
- Se o hash gerado satisfaz o target
- Se o tamanho do bloco está dentro do limite aceito, que inicialmente foi de 1MB e atualmente varia entre 2 MB e 4 MB
- Se o conjunto de transações dentro do bloco é válido, ou seja, se as transações satisfazem a raiz da árvore de merkle
- Se coinbase, a primeira transação de cada bloco, respeita as regras estabelecida pela rede
Esse processo de validação é indiferente ao pagamento da taxa de transferência, uma vez que este é apenas para a inclusão da transferência no bloco. A partir deste momento ela não interfere em mais nada.
Quando todos os nodos recebem essa mudança na Blockchain e consideram o novo bloco válido, a mineração parte para o próximo bloco. Há casos, raros, em que mais de um nodo descobre um hash válido. Causando uma bifurcação, com duas Blockchains de mesmo tamanho com hashes válidos circulando pela rede. Cada nodo vai considerar válida aquela que receber primeiro.

Neste ponto a prova de trabalho tem um papel importante pois, probabilisticamente falando, uma situação destas é muito difícil de ocorrer. Quando ocorre, é praticamente impossível que ocorra de novo, portanto o próximo nodo que criar um bloco válido, anexar à sua Blockchain e propagá-la pela rede vai estabilizar a situação. Com um bloco a mais ela será considerada válida por toda a rede e ela volta a estabilidade.

Por causa de situações com esta que é recomendado aguardar ao menos uma hora (6 blocos) para considerar uma transação como válida. Pois as transações do bloco da Blockchain que foi rejeitada, podem voltar ao estado de pendência caso não estejam inclusas na Blockchain que foi aceita.

Um fato interessante é que desde 2011 apenas o campo nonce, com os seus 4 bilhões de possibilidades, já não é mais suficiente para gerar um hash válido. Isto porque o algoritmo da prova de trabalho necessita de mais de 1 quatrilhão de hashes para encontrar um hash válido. Isto ocorre devido ao aumento da dificuldade de mineração ao longo dos anos. Desde então, os mineradores passam a considerar outros campos como o timestamp (alterando este em alguns segundos), a ordem das transações, e a transação coinbase.
Dificuldade
A dificuldade é o que mantém a Blockchain estável, quanto maior mais difícil gerar um bloco válido, mais poder computacional é necessário. Ela é regulada pelo campo target, que é inversamente proporcional: quanto maior o target menor a dificuldade. Target é o objetivo dos mineradores, ou seja, o hash que eles devem computar deve ser menor que ele. Portanto quanto maior, mais possibilidades de respostas válidas existem e, portanto, mais fácil. De fato, com a dificuldade 1 o target é 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF.
A dificuldade foi projetada para aumentar a cada 2016 blocos, aproximadamente 2 semanas, uma vez que um bloco novo é gerado a cada 10 minutos. O ajuste é feito com base no tempo real levado para gerar últimos 2016 blocos, desse modo o novo target é calculado com a fórmula a seguir:

A relação entre target e dificuldade é da pela fórmula:

Onde “difficulty-1-target” é o target para a dificuldade 1.
Através destas fórmulas a dificuldade da rede vai se ajustando conforme o desempenho dos nodos em obter os blocos, se os últimos 2016 blocos demorarem mais de 2 semanas para serem obtidos, a dificuldade cai, caso contrário aumenta. O gráfico abaixo mostra o aumento da dificuldade ao longo dos anos, observa-se que atualmente esta encontra-se na casa dos trilhões.

Atualmente, devido a esta dificuldade elevada, é inviável uma mineração solo de Bitcoin, ou seja, um computador sozinho tentando encontrar o hash válido. O que os mineradores tem feito é se organizado nas chamadas pools de mineração, onde vários mineradores compartilham seu poder de processamento e trabalham em conjunto para obter um bloco. A recompensa então é dividida de acordo com o quanto de poder computacional cada minerador disponibilizou, ou de acordo com as regras de cada pool. O gráfico abaixo mostra a distribuição atual de cada pool na rede (ano de 2019), o campo unknown não indica um ataque apenas que o site Blockchain.com (de onde vem este gráfico) não conseguiu determinar a origem dos blocos.

Um fato interessante no que diz respeito à estas pools é que as maiores restringem o seu crescimento a uma certa quantidade para não quebrar a descentralização do Bitcoin. Isto porque quando uma pool cresce muito, podendo passar de 50%, ela pode, em teoria, controlar a Blockchain, já que ela detêm mais de 50% da rede Bitcoin. Isto é conhecido como ataque dos 51%.
O fato de existirem as pools pode ser o motivo do rápido aumento da dificuldade da mineração.
Esta foi a sexta parte da série “Descomplicando o Bitcoin”. No próximo artigo, tudo que foi tratado nesta série será juntado e será apresentado um exemplo de modo a tornar mais simples ainda o que foi tratado nesta série. Será apresentado passo por passo a transferência de Bitcoins de um usuário para outro.
Referências
Bitcoin: A Peer-to-Peer Electronic Cash System, disponível em https://bitcoin.org/bitcoin.pdf, 2008
Target — Bitcoin Wiki, disponível em https://en.bitcoin.it/wiki/Target
Bitcoin para programadores, disponível em https://btcparaprogramadores.marcoagner.org
Blockchain e a Revolução do Consenso sob Demanda, disponível em http://www.sbrc2018.ufscar.br/wp-content/uploads/2018/04/Capitulo5.pdf
Série Descomplicando o Bitcoin:

