Versão

O campo usado pelos mineradores para sinalizar soft forks

Diagrama mostrando a localização do campo versão dentro do cabeçalho do bloco e como os últimos 29 bits são usados para sinalizar prontidão para soft forks.

O campo versão de 4 bytes no cabeçalho do bloco é usado pelos mineradores para sinalizar prontidão para soft forks propostos.

Números de versão são usados em software para indicar atualizações ou a adição de novos recursos. Porém, o bitcoin é descentralizado, então não há uma autoridade central para forçar todos a atualizarem para novas versões do software. Portanto, é ideal que a maioria da rede consiga concordar com mudanças propostas de antemão.

Então o campo versão é basicamente usado para "votar" em atualizações propostas ao software.

Mas não são votos de verdade. Qualquer maioria de mineradores pode começar a aplicar uma nova regra — eles não precisam indicar isso nos blocos, nem mesmo contar a alguém. O que o campo versão faz é fornecer uma forma de sinalizar prontidão, para que um ponto de transição seguro e coordenado possa ser encontrado.
Pieter Wuille, bitcoin.stackexchange.com

Números de Versão

Até 2015, o número de versão era incrementado para sinalizar prontidão para novas atualizações. Isso ocorria até o número de versão chegar a 4:

Essas atualizações se tornavam permanentes quando 950 de 1000 blocos em um período eram minerados com o novo número de versão. E, uma vez que essas atualizações estavam ativas, todos os novos blocos tinham que usar o novo número de versão (ou maior).

Esse sistema funciona, mas a desvantagem é que você só pode sinalizar para uma mudança por vez.

Por causa dessas atualizações, o número de versão mínimo exigido para um bloco agora é 0x00000004. Qualquer número de versão abaixo disso será rejeitado pelos nós da rede.

Version Bits

Em 2015, o campo versão foi alterado para ser usado como um bit field, o que permite aos mineradores sinalizar até 29 novos recursos propostos ao mesmo tempo.

Diferentes bits no campo versão de 32 bits (4 bytes) podem ser designados ao mesmo tempo para sinalizar prontidão para um soft fork diferente. Então, tudo o que você precisa fazer para sinalizar prontidão para uma atualização específica é ligar um bit específico (ou seja, setá-lo em 1).

Version Bits

Cada bit do campo versão pode sinalizar prontidão para uma atualização (BIP9). Os 3 bits do topo devem ser 001 para a sinalização valer.

Campo de Bits 00000000000000000000000000000000
0x
4 bytes
  • Version Bits: Habilitado

Os seguintes bits foram usados para atualizações:

Para usar "version bits" na sinalização, você precisa setar os 3 primeiros bits como 0b001 (especificado na BIP 9). É apenas um requisito que indica que você está usando o campo versão como um bit field para sinalização. É por isso que você só pode sinalizar para no máximo 29 atualizações diferentes ao mesmo tempo (32 − 3 = 29 bits).

Cada proposta tem seu próprio período de sinalização, em que um número específico de blocos precisa sinalizar pela atualização ao longo de uma janela específica para que ela seja ativada. Na atualização Taproot, por exemplo, 90% dos blocos em um período de ajuste de alvo de 2016 blocos tinham que sinalizar pela atualização (começando em 24 de abril de 2021 e terminando em 11 de agosto de 2021), o que de fato acabou acontecendo, e a implantação foi ativada na altura de bloco 709.632.

Você pode ver as atualizações passadas e atuais que estão sendo votadas via bitcoin-cli getblockchaininfo.

Uma lista de todas as atribuições de bits para atualizações propostas pode ser encontrada na página BIP 9 assignments, mas acho que ela não é atualizada com frequência.

Exemplos

Aqui estão alguns exemplos de números de versão que você encontra na história da blockchain.

A partir de cerca da altura 411.000, o campo versão passa a ser usado como bit field com mais frequência (em vez de um número simples). É por isso que os "números" de versão parecem tão maiores: os 3 primeiros bits agora ficam setados como 0b001.

Aqui estão alguns números de versão "não padronizados" que aparecem de vez em quando:

Padrão Atual

A versão padrão no cabeçalho do bloco atualmente é:

0b00100000000000000000000000000000

Que em hexadecimal é

0x20000000

Isso indica que você está usando "version bits" (ou seja, os 3 primeiros bits são 0b001), mas sem sinalizar para nenhum novo recurso proposto (todos os outros bits são zero).

O primeiro bit do campo versão nunca pode ser 1, pois isso indicaria um número negativo, que seria inválido. Isso porque o Bitcoin usa uma codificação personalizada para valores uint256.

Este bit não pode ser setado em 1, ou a versão será inválida:

00000000000000000000000000000000
↑

Extra Nonce

Por que aparecem números de versão estranhos?

Não há restrições sobre quais valores você pode colocar no campo versão (além de ele ter que ser no mínimo 0x00000004, e o primeiro bit não poder ser 1), então os mineradores às vezes o usam como um nonce extra ao minerar.

É por isso que, desde cerca da altura 600.000 (também antes, mas mais a partir daí), você vê com frequência alguns números de versão "estranhos" no cabeçalho do bloco que não correspondem a nenhuma atualização proposta. Por exemplo:

De novo, esses números de versão não estão sinalizando nada em particular; foram apenas ajustados para que o minerador possa continuar fazendo o hash do bloco atual sem ter que reconstruí-lo por completo.

Recursos