Versão
O campo usado pelos mineradores para sinalizar 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.
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:
0x00000001= O software original- Altura de ativação: 0
0x00000002= BIP 34: Altura na Coinbase- Altura de ativação: 227.931
0x00000003= BIP 66: Assinaturas DER estritas- Altura de ativação: 363.725
0x00000004= BIP 65: OP_CHECKLOCKTIMEVERIFY- Altura de ativação: 388.381
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).
Os seguintes bits foram usados para atualizações:
- Bit 0: BIP 112: CHECKSEQUENCEVERIFY
- Exemplo:
0b00100000000000000000000000000001 - Altura de ativação: 419.328
- Exemplo:
- Bit 1: BIP 141: SegWit
- Exemplo:
0b00100000000000000000000000000010 - Altura de ativação: 481.824
- Exemplo:
- Bit 2: BIP 341: Taproot
- Exemplo:
0b00100000000000000000000000000100 - Altura de ativação: 709.632
- Exemplo:
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.
0x00000001– A maioria dos blocos até a altura 200.000 usa este número de versão.- Exemplo: 000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f (Altura 0)
0x00000002– A maioria dos blocos entre 227.931 e 363.724 usa este número de versão.- Exemplo: 000000000000024b89b42a942fe0d9fea3bb44ab7bd1b19115dd6a759c0808b8 (Altura 227.931)
0x00000003– A maioria dos blocos entre 363.725 e 388.380 usa este número de versão.- Exemplo: 00000000000000000379eaa19dce8c9b722d46ae6a57c2f1a988119488b50931 (Altura 363.725)
0x00000004– A maioria dos blocos entre 388.381 e cerca de 411.000 usa este número de versão.- Exemplo: 000000000000000004c2b624ed5d7756c508d90fd0da2c7c679febfa6c4735f0 (Altura 388.381)
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.
0x20000000– Version bits em uso, mas sem sinalizar nenhuma atualização em particular.- Version Bits:
0b00100000000000000000000000000000 - Exemplo: 000000000000000005025d88492c54a51ac3bccaaa15c12a05aee16a28d6b294 (Altura 410.370)
- Version Bits:
0x20000001– Version bits em uso para sinalizar a atualização CSV.- Version Bits:
0b00100000000000000000000000000001 - Exemplo: 000000000000000004983f04183f2a6ae7f1cdf6ddb8f4b3f79e39e14392db4c (Altura 416.498)
- Version Bits:
0x20000002– Version bits em uso para sinalizar a atualização SegWit.- Version Bits:
0b00100000000000000000000000000010 - Exemplo: 0000000000000000001094a0145695e4228c21cbbc6be40507f728c6b7d6f16a (Altura 471.329)
- Version Bits:
0x20000004– Version bits em uso para sinalizar a atualização Taproot.- Version Bits:
0b00100000000000000000000000000100 - Exemplo: 00000000000000000004f065fae967b93540f321076684fe926d4e7bfbcd77ab (Altura 703.353)
- Version Bits:
Aqui estão alguns números de versão "não padronizados" que aparecem de vez em quando:
0x30000000– Acredito que possa ter sido um bit não oficial usado para sinalizar suporte a blocos de 2 MB. Aparece 2.058 vezes entre os blocos 398.364 e 476.482.- Version Bits:
0b00110000000000000000000000000000 - Exemplo: 0000000000000000018c393bb66dac52e1a2131ab2332b4d6e2caed463209892 (Altura 414.996)
- Version Bits:
0x08000004– Outro sinal não oficial, para tamanhos de bloco adaptativos. Aparece 39 vezes entre os blocos 416.832 e 455.757.- Version Bits:
0b00001000000000000000000000000100 - Exemplo: 00000000000000000479bbbf51d485ddc7b161998b6f54049e576b09fd72e363 (Altura 416.832)
- Version Bits:
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:
0x2844a000– Usando version bits com alguns bits setados, mas nenhum deles corresponde a uma atualização proposta.- Version Bits:
0b00101000010001001010000000000000 - Exemplo: 00000000000000000479bbbf51d485ddc7b161998b6f54049e576b09fd72e363 (Altura 791.617)
- Version Bits:
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.