Alvo (Target)

O número que o hash de um bloco precisa ficar abaixo

O alvo (target) é um número que o hash de um bloco candidato precisa ficar igual ou abaixo para que o bloco seja adicionado à blockchain. Ele é usado durante a mineração.

O alvo é ajustado a cada 2016 blocos (aproximadamente a cada duas semanas) para tentar garantir que os blocos sejam minerados a cada 10 minutos em média. Isso cria um tempo consistente entre os blocos e uma emissão consistente de novos bitcoins (via recompensa de bloco).

Para compensar o aumento da velocidade do hardware e o interesse variável em rodar nós ao longo do tempo, a dificuldade da prova de trabalho é determinada por uma média móvel que mira um número médio de blocos por hora. Se eles são gerados rápido demais, a dificuldade aumenta.
Satoshi Nakamoto, Whitepaper do Bitcoin

Período

Quando o alvo se ajusta?

O alvo se ajusta a cada 2016 blocos, que é aproximadamente a cada duas semanas.

Os blocos são minerados a cada 10 minutos (aproximadamente), e há 20.160 minutos em duas semanas (2016 × 10).

Histórico

Aqui estão a altura, o alvo e a variação de cada ajuste de dificuldade na história do Bitcoin (do mais recente para o gênese — role para carregar mais):

Altura Alvo Variação da Dificuldade Data
Carregando…

Ajuste

Como o alvo é calculado?

Ícone Ferramenta

Ajuste de Dificuldade

Calcule o novo alvo a partir do alvo atual e do tempo real de mineração de um período de 2016 blocos.

0x
0 bytes
Tempo (segundos)
0d
0d

O período de ajuste de dificuldade é de 2016 blocos. Em média, um bloco é minerado a cada 600 segundos (10 minutos), então o tempo esperado é 2016 × 600 = 1.209.600 segundos.

Razão

O tempo real dividido pelo tempo esperado. Multiplicamos o alvo atual por essa razão para obter o novo alvo.

0x
0x
0 bytes

Nota: esse valor de alvo é levemente truncado para ser armazenado no campo bits do cabeçalho do bloco, e é esse o alvo de fato usado na mineração.

O alvo do primeiro bloco (gênese) foi definido como:

00000000ffff0000000000000000000000000000000000000000000000000000

Esse valor inicial é fixo no código-fonte de todo nó Bitcoin (chainparams.cpp). É também o valor máximo possível do alvo. Foi provavelmente um palpite do Satoshi sobre um bom ponto de partida para um alvo difícil o suficiente para resultar em um intervalo de 10 minutos.

A cada 2016º bloco, cada nó olha o tempo entre os 2015 blocos anteriores e calcula se eles foram minerados mais rápido ou mais devagar que 10 minutos em média.

Cada bloco contém um timestamp no seu cabeçalho, em Unix Time (segundos desde 01/01/1970, 00:00:00).

Ícone Ferramenta Unix Time
Ícone Ferramenta

Unix Time

Converta entre um timestamp Unix (segundos desde 01/01/1970) e uma data legível (UTC).

Se os blocos desse período forem minerados mais rápido que 10 minutos, o alvo é ajustado para baixo, tornando mais difícil ficar abaixo dele no próximo período. Inversamente, se forem minerados mais devagar, o alvo é ajustado para cima, tornando menos difícil.

Como resultado, cada nó recalcula regularmente o alvo para manter um intervalo médio de 10 minutos conforme os mineradores entram e saem da rede.

Sincronização

Como os nós calculam o mesmo alvo?

Cada nó opera de forma independente, então não há uma autoridade central para determinar o alvo atual. Porém, como os nós sempre adotam a cadeia mais longa de blocos, eles calculam o mesmo alvo. Apesar de calcularem o alvo independentemente, todos chegam ao mesmo valor porque compartilham a mesma visão da blockchain.

Propósito

Por que o Bitcoin usa um alvo?

O alvo regula a velocidade com que novos blocos são adicionados à blockchain. Isso tem dois benefícios:

1. Dá tempo para os blocos se propagarem pela rede.

É preferível que os mineradores trabalhem para estender a mesma cadeia o máximo possível. Para isso, precisamos dar tempo para os novos blocos se propagarem antes do próximo ser minerado. Se os blocos fossem minerados mais rápido do que conseguem ser transmitidos, os mineradores frequentemente trabalhariam sobre blocos "antigos", desperdiçando energia em cadeias concorrentes que seriam descartadas em reorganizações.

2. Uma emissão consistente de novos bitcoins.

O Bitcoin é uma moeda, então ter uma taxa fixa de novos bitcoins introduzidos no sistema ajuda a fornecer estabilidade.

Localização

Onde você encontra o alvo?

O alvo fica armazenado no campo bits do cabeçalho de cada bloco. O campo bits é uma representação compacta do alvo (para economizar espaço). Você pode converter facilmente entre a representação bits e o alvo completo:

Ícone Ferramenta

Target / Bits

Converta o campo compacto bits do cabeçalho do bloco para o valor de alvo (target) completo.

0x

Comandos

bitcoin-cli getblocktemplate

A forma mais simples de obter o alvo atual. Ao solicitar um modelo de bloco (para mineração), ele também retorna o alvo atual.

$ bitcoin-cli getblocktemplate '{"rules": ["segwit"]}' | grep target
"target": "00000000000000000002068f0000000000000000000000000000000000000000",

bitcoin-cli getdifficulty

Alternativamente, você pode pedir a dificuldade atual e convertê-la para o alvo:

$ bitcoin-cli getdifficulty
138955357012247.30
Ícone Ferramenta Dificuldade
Ícone Ferramenta

Dificuldade

Converta entre um alvo (target) e a dificuldade.

0x
0x
0 bytes
0d

Converter de dificuldade para alvo nem sempre é preciso. A dificuldade é um número de ponto flutuante calculado a partir da mudança entre o alvo inicial e o atual, então pode perder precisão.

bitcoin-cli getblockheader [hash do bloco]

Este comando permite encontrar um alvo anterior de um bloco específico. O alvo na época da mineração fica armazenado em cada cabeçalho de bloco no formato bits, que você pode converter para o alvo completo.

Código

Erro de "off-by-one". Os ajustes de dificuldade são, na verdade, calculados usando o tempo ao longo de 2015 blocos (ex.: 403199 − 401184 = 2015), e não 2016 como seria de se esperar. Isso foi um erro de implementação no código, e ainda existe hoje.

Perguntas Frequentes

Por que 10 minutos entre os blocos?

Acho que ninguém, exceto o Satoshi, sabe exatamente por que 10 minutos foi escolhido. Meu palpite é que parecia longo o suficiente para permitir que os blocos se propagassem pela rede (minimizando reorganizações) e curto o suficiente para não esperar demais pelas novas transações. E 10 é um número redondo agradável.

O que faz os blocos serem minerados mais rápido ou mais devagar que 10 minutos?

Primeiro, a mineração é imprevisível: você nunca sabe quando um minerador vai encontrar o próximo bloco. Segundo (e mais importante), os mineradores podem entrar e sair da rede a qualquer momento, o que afeta a velocidade. Quanto mais mineradores entram, mais hashing acontece, e mais provável é que um novo bloco seja minerado em menos de 10 minutos.