Dificuldade

O que é a dificuldade no Bitcoin?

Ilustração mostrando a dificuldade controlando o tempo que leva para adicionar um novo bloco à blockchain.
Dificuldade (exemplo):
138.955.357.012.247,30
Altura: 952.333

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 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.

Diagrama mostrando um eixo y entre 1 e 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:

Diagrama mostrando o número 50 em um eixo y entre 1 e 100.

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:

Diagrama mostrando o número 20 em um eixo y entre 1 e 100.

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:

Diagrama mostrando um número sendo usado para controlar a altura do alvo em um eixo y entre 1 e 100.

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:

Diagrama mostrando como diferentes valores de dificuldade podem ajustar o valor alvo em um eixo y entre 1 e 100.

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:

Diagrama mostrando um hash de bloco tentando ficar abaixo de um 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:

Diagrama mostrando um eixo y entre 1 e um número muito grande.

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:

Diagrama mostrando o alvo sendo muito baixo em relação à escala do eixo y.

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.

Diagrama mostrando o alvo e o intervalo em hexadecimal.

É 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):

Ícone Ferramenta Conversor de Números
Ícone Ferramenta

Conversor de Números

Converta um número entre bases diferentes (binário, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
Hexadecimal000000000004864c000000000000000000000000000000000000000000000000
Decimal1861311314983800126815643622927230076368334845814253369901973504
Alvo do bloco 100.000
Hexadecimal000000000003ba27aa200b1cecaad478d2b00432346c3f1f3986da1afd33e506
Decimal1533267872647776902154320487930659211795065581998445848740226310
Hash do bloco 100.000

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:

Diagrama mostrando o alvo e o intervalo em hexadecimal.
O alvo é hexadecimal, mas é armazenado em um formato compacto no cabeçalho do bloco chamado bits.

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?

Ícone Ferramenta

Dificuldade

Converta entre um alvo (target) e a dificuldade.

0x
0x
0 bytes
0d

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:

Ícone Ferramenta Conversor de Números
Ícone Ferramenta

Conversor de Números

Converta um número entre bases diferentes (binário, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
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.

Ícone Ferramenta Conversor de Números
Ícone Ferramenta

Conversor de Números

Converta um número entre bases diferentes (binário, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
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:

Ícone Ferramenta Conversor de Números
Ícone Ferramenta

Conversor de Números

Converta um número entre bases diferentes (binário, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
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:

Captura de tela mostrando o resultado de um comando 'getdifficulty' no cliente Bitcoin Core.

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.

Recursos