Dificuldade
O que é a dificuldade no Bitcoin?
A dificuldade é um número que representa o quão difícil é para os mineradores adicionar novos blocos de transações à blockchain.
Ela se ajusta a cada 2 semanas para garantir que leve 10 minutos (em média) para adicionar novos blocos à blockchain.
Por que a dificuldade é importante?
A dificuldade garante que blocos de transações sejam adicionados à blockchain em intervalos regulares durante a mineração, mesmo conforme mais mineradores entram na rede.
Se a dificuldade permanecesse a mesma, gradualmente levaria cada vez menos tempo para adicionar novos blocos à blockchain conforme novos mineradores entrassem na rede.
Então os ajustes de dificuldade significam que a blockchain é atualizada de forma consistente.
Quando a dificuldade muda?
A dificuldade se ajusta a cada 2.016 blocos (aproximadamente a cada 2 semanas).
Nesse intervalo, cada nó pega o tempo esperado para os últimos 2.016 blocos serem minerados (2016 × 10 minutos) e o divide pelo tempo real que levou:
esperado / real
20160 / real
Se os mineradores conseguiram resolver cada bloco mais rápido do que o esperado; digamos, 9 minutos por bloco, você obteria um número assim:
20160 / 18144 = 1,11
Cada nó então usa esse número para ajustar a dificuldade dos próximos 2.016 blocos:
dificuldade x 1,11 = nova dificuldade
- Se o número for maior que 1 (blocos foram minerados mais rápido que o esperado), a dificuldade aumenta.
- Se o número for menor que 1 (blocos foram minerados mais devagar que o esperado), a dificuldade diminui.
E é isso. Todo minerador da rede bitcoin agora trabalha com essa nova dificuldade pelos próximos 2.016 blocos.
A dificuldade só se ajusta por um fator de 4 no máximo (ou seja, um multiplicador não maior que 4 nem menor que 0,25). Isso é para evitar mudanças abruptas de um período de dificuldade para o próximo.
Como a dificuldade controla o tempo entre os blocos?
Certo, vou começar com um exemplo simples e construir a partir daí.
1. Exemplo simples
Digamos que eu te dê um intervalo de números de 1 a 100.
Agora, digamos que você consiga gerar aleatoriamente um número entre 1 e 100 uma vez por minuto, e seu objetivo é gerar um número abaixo do meu número alvo.
Então, digamos que eu defina o alvo em 50:
Como você só consegue gerar um número uma vez por minuto, isso deve levar, em média, 2 minutos para você encontrar um número abaixo desse valor alvo.
Mas isso é fácil demais. Então, digamos que eu baixe o alvo para 20, o que significa que você só vai conseguir gerar um número vencedor 1/5 das vezes, ou uma vez a cada 5 minutos:

Quanto mais baixo o alvo, mais difícil fica gerar um número vencedor.
Então, como você pode ver, eu posso usar a altura do alvo para controlar quanto tempo leva para você encontrar um número vencedor (dependendo de quantos números você consegue gerar por minuto, claro).
Não vai ser exatamente 5 minutos toda vez, porque você poderia ter sorte na primeira tentativa. Porém, no longo prazo, dá uma média de intervalos de 5 minutos.
Então, o que é a dificuldade?
Em vez de te dizer o valor alvo diretamente, eu poderia te dar o alvo dividindo o intervalo de números por um novo número:
Esse novo número é a dificuldade, e é usado para modificar a altura do alvo.
Aqui está a equação para definir o alvo usando a dificuldade:
alvo = alvo máximo / dificuldade
Então agora eu posso usar esse valor de dificuldade para me ajudar a definir o alvo em qualquer nível que eu quiser:
Portanto, eu uso a dificuldade para controlar o alvo, que por sua vez controla quanto tempo leva para você gerar um número vencedor abaixo do alvo.
- A dificuldade é basicamente outra forma de representar o alvo atual.
- Quanto maior a dificuldade, menor o alvo.
2. Exemplo do Bitcoin
A dificuldade no bitcoin funciona exatamente da mesma forma – é usada para definir um valor alvo, e os mineradores ficam gerando números (fazendo o hash dos seus blocos candidatos) na esperança de encontrar um hash de bloco abaixo do valor alvo:
E como os mineradores conseguem gerar milhares de números (hashes) por segundo, o bitcoin usa números extremamente grandes para o alvo:
E devido ao fato de agora haver milhares de mineradores tentando encontrar números vencedores, para garantir que um número vencedor seja encontrado a cada 10 minutos (em vez de a cada poucos segundos), o intervalo de números bem-sucedidos acaba sendo absolutamente minúsculo:

Mesmo que esse número de dificuldade pareça grande, o alvo ainda é absurdamente difícil de ficar abaixo. É como uma loteria.
Números hexadecimais
Como esses números de alvo são tão grandes, normalmente os exibimos no formato hexadecimal, mais curto.
É por isso que os hashes de bloco se parecem com isto: 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
Mas, mesmo contendo letras, ele ainda é um número. Então o alvo é um valor hexadecimal, e os mineradores estão tentando obter um hash de bloco hexadecimal abaixo do alvo.
Na verdade, você pode converter facilmente entre hexadecimal e números "normais" (ou seja, números decimais):
Conversor de Números
| Hexadecimal | 000000000004864c000000000000000000000000000000000000000000000000 |
|---|---|
| Decimal | 1861311314983800126815643622927230076368334845814253369901973504 |
| Hexadecimal | 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506 |
|---|---|
| Decimal | 1533267872647776902154320487930659211795065581998445848740226310 |
Então é por isso que você normalmente vê o hash e o alvo como conjuntos de números e letras – eles estão em hexadecimal em vez de decimal (que é o que os humanos conhecem melhor).
Apenas lembre que tanto esses números decimais quanto os hexadecimais têm o mesmo valor, e você pode converter facilmente entre os dois.
Curiosamente, a dificuldade normalmente é dada em formato decimal, enquanto os hashes de bloco e os alvos em hexadecimal:
Mas, como eu disse, ambos são números, então você ainda pode trabalhar com eles se convertê-los para o mesmo formato.
Como você calcula a dificuldade?
A dificuldade é calculada dividindo o valor máximo possível do alvo pelo alvo do bloco atual.
O alvo máximo é o alvo que foi definido para o primeiro bloco:
alvo máximo = 0x00000000ffff0000000000000000000000000000000000000000000000000000
Então, para calcular a dificuldade do bloco 100.000, por exemplo, só precisamos descobrir qual era o alvo daquele bloco:
alvo = 0x000000000004864c000000000000000000000000000000000000000000000000
Agora, se convertermos ambos os valores para decimal e os dividirmos, obtemos a dificuldade:
Conversor de Números
dificuldade = alvo máximo / alvo
dificuldade = 0x00000000ffff...0000 / 0x000000000004864c...0000
dificuldade = 26959535291011309493156476344723991336010898738574164086137773096960 / 1861311314983800126815643622927230076368334845814253369901973504
dificuldade = 14484,162361
Então, como você pode ver, a dificuldade é só uma representação de quão longe o alvo atual se moveu do valor máximo possível do alvo.
Internamente no Bitcoin, é só o alvo que se ajusta. Então a dificuldade é só uma forma de representar a mudança.
Como você calcula o alvo a partir da dificuldade?
A dificuldade é calculada a partir do alvo. Porém, você sempre pode trabalhar de trás para frente e calcular o alvo a partir da dificuldade, se quiser.
Vamos usar a dificuldade para calcular o alvo do bloco 100.000.
Vamos fazer isso usando números decimais (na maior parte), porque são mais fáceis de entender.
Aqui está a dificuldade:
bitcoin-cli getblockheader 000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
{
"hash" : "000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506",
...
"height" : 100000,
...
"difficulty" : 14484.16236123,
...
}
Maravilha.
Agora, vamos anotar a equação que vamos usar para encontrar o alvo:
alvo = alvo máximo / dificuldade
Vamos deixar o alvo máximo e a dificuldade prontos para inserir na equação.
alvo máximo = 0x00000000ffff0000000000000000000000000000000000000000000000000000
dificuldade = 14484,162361
- O alvo máximo é um valor fixo; é o alvo inicial que foi definido para o primeiro bloco.
- O prefixo 0x é usado para indicar valores hexadecimais (o 0x não faz parte do número). A presença de letras no valor costuma ser um indício (mas nem sempre).
- Peguei a dificuldade nas informações do cabeçalho do bloco acima.
O alvo máximo está em formato hexadecimal, então vamos convertê-lo para decimal.
Conversor de Números
alvo máximo = 26959535291011309493156476344723991336010898738574164086137773096960
Agora podemos simplesmente inserir esses números na equação e pronto:
alvo = alvo máximo / dificuldade
alvo = 26959535291011309493156476344723991336010898738574164086137773096960 / 14484,162361
alvo = 1861311315012765306929610463010191006516769515973403833769533170
Pronto.
Então, quando a mineradora estava tentando resolver o bloco 100.000, ela queria obter um hash para o seu bloco candidato que ficasse abaixo de 1861311315012765306929610463010191006516769515973403833769533170.
Conferindo os resultados
Vamos comparar esse valor alvo com o hash que ela obteve para o bloco para conferir que ela foi realmente bem-sucedida (ou seja, que o hash dela ficou abaixo do alvo):
alvo = 1861311315012765306929610463010191006516769515973403833769533170
hash = 0x000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
Ah sim, o hash está em formato hexadecimal. Vamos converter de hexadecimal para decimal de novo para podermos comparar os dois números:
Conversor de Números
alvo = 1861311315012765306929610463010191006516769515973403833769533170
hash = 1533267872647776902154320487930659211795065581998445848740226310
Sim, esse hash é menor que o alvo, então o bloco pode ser adicionado à blockchain.
Onde posso encontrar a dificuldade atual?
Você pode encontrar a dificuldade atual usando o comando bitcoin-cli getdifficulty:
- A dificuldade atual também pode ser encontrada em
bitcoin-cli getmininginfo. - Aqui está um gráfico mostrando a mudança da dificuldade ao longo do tempo: blockchain.com/explorer/charts/difficulty
Resumo
O alvo é a barra do limbo de verdade que os hashes de bloco precisam ficar abaixo para que um novo bloco seja adicionado à blockchain.
A dificuldade é só uma medida de quanto o alvo se moveu do seu valor inicial. Ou, em outras palavras, quão mais difícil é minerar um bloco em comparação a quando a blockchain começou.