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.
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 |
|---|
Ajuste
Como o alvo é calculado?
O alvo do primeiro bloco (gênese) foi definido como:
00000000ffff0000000000000000000000000000000000000000000000000000Esse 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).
Unix Time
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:
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
Dificuldade
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.