Pular para o conteúdo
buybitcoinsmart

Glossário / Mineração e consenso

nBits

Outros nomes: Alvo compacto.

O que é o nBits?
nBits é o campo de quatro bytes presente em todo cabeçalho de bloco que empacota o alvo de mineração em uma codificação compacta, no estilo de ponto flutuante, com um expoente e um coeficiente de três bytes.

O Bitcoin precisa de um alvo de 256 bits em um cabeçalho que não pode dispor de 32 bytes para isso, então armazena em quatro bytes uma versão arredondada. O primeiro byte é um expoente, os três restantes são um coeficiente, e o alvo é o coeficiente multiplicado por 256 elevado à potência do expoente menos três. Cada nó recalcula o valor que espera, então um cabeçalho que declara um alvo mais fácil do que as regras permitem é rejeitado de imediato.

Como funciona

O nBits é lido como um byte de expoente seguido por um coeficiente de três bytes, e os dois se combinam em um número completo de 256 bits.

Tome o valor carregado pelo bloco gênese, 0x1d00ffff. O expoente é 0x1d, que é 29, e o coeficiente é 0x00ffff, que é 65.535. O alvo é, portanto, 65.535 multiplicado por 2 elevado a 208, um número escrito como oito zeros hexadecimais, depois ffff, depois zeros até completar 64 dígitos. Esse é o alvo mais fácil que a mainnet permite, e é a definição da dificuldade 1.

Duas peculiaridades confundem as pessoas. A primeira é a precisão. Um coeficiente de apenas 24 bits não consegue expressar um número arbitrário de 256 bits, então o alvo codificado é sempre arredondado, e uma ida e volta do alvo para o nBits e de volta nem sempre retorna o valor de partida. A segunda é o bit de sinal. Se o bit mais alto do coeficiente estiver definido, o valor é tratado como negativo, então quem codifica desloca o coeficiente um byte para baixo e aumenta o expoente para compensar. É por isso que o valor do gênese é 0x1d00ffff e não o mais óbvio 0x1cffff00, e por isso um byte zero à esquerda dentro do coeficiente é normal e não um erro.

No cabeçalho serializado, o campo fica no deslocamento de byte 72 e é escrito em little endian, então esses quatro bytes aparecem em disco e na rede como ff ff 00 1d.

Onde você o vê

O nBits circula sob vários nomes diferentes, e é daí que vem a maior parte da confusão em torno dele.

Os exploradores de blocos o rotulam como "bits" e exibem o valor hexadecimal ao lado de uma cifra de dificuldade mais amigável. A chamada RPC getblock do Bitcoin Core o devolve como "bits", e getblocktemplate o entrega ao software de mineração como o requisito que um cabeçalho candidato precisa superar. No código-fonte, é o membro nBits de CBlockHeader, convertido por arith_uint256::SetCompact e GetCompact. Os pools de mineração raramente o mostram: o Stratum envia esses mesmos quatro bytes às máquinas dentro de uma notificação de tarefa, e o firmware nunca precisa pensar no que eles significam.

O campo também muda conforme um cronograma, e não de forma contínua. Ele fica fixo por toda uma janela de 2.016 blocos e só assume um novo valor em um ajuste de dificuldade, então dois blocos minerados com uma hora de diferença carregam um campo nBits idêntico, a menos que um ajuste tenha ocorrido entre eles.

nBits vs limite do alvo

O nBits é a codificação; o limite do alvo é o número que ele codifica. Um nó nunca compara o hash de um cabeçalho diretamente com o nBits. Ele primeiro expande os quatro bytes em um alvo completo de 256 bits e depois verifica se o hash está igual ou abaixo desse valor. Tratar o nBits como se fosse o próprio alvo funciona em uma conversa e é errado no código, porque dois valores de nBits que diferem em uma única unidade são decodificados em alvos que diferem em uma quantidade absoluta enorme.

Não confundir com

Perguntas frequentes

O nBits é o mesmo que a dificuldade?

Não. O nBits codifica o alvo, e a dificuldade é uma razão derivada dele: o alvo mais fácil permitido dividido pelo alvo atual. Os exploradores mostram a dificuldade porque um número decimal é mais fácil de comparar do que um campo hexadecimal.

Por que o bloco gênese usa 0x1d00ffff?

Porque esse é o alvo mais fácil que o bitcoin permite na mainnet, codificado de modo que o bit mais alto do coeficiente permaneça zerado. Decodificado, é 65.535 multiplicado por 2 elevado a 208, que é o que significa a dificuldade 1.

Termos relacionados

Mais em Mineração e consenso

Ler esta página em inglês