Pular para o conteúdo
buybitcoinsmart

Glossário / Protocolo e atualizações

Bits de versão

O que são os bits de versão?
Os bits de versão tratam o campo de versão de 32 bits de um cabeçalho de bloco como uma fileira de interruptores independentes, para que os mineradores possam sinalizar apoio a vários soft forks ao mesmo tempo.

Especificação no BIP-9.

Um bit de versão representa um soft fork pendente, contado ao longo de uma janela fixa de blocos. O BIP-9 oferece os bits 0 a 28, e um deployment entra em LOCKED_IN quando 1.916 blocos dentro de um período de 2.016 blocos definem seu bit, ou falha no timeout sugerido de um ano. Ler esses sinais é como você sabe com meses de antecedência se um recurso que sua carteira quer está se tornando uma regra da rede.

Como funciona

Os bits de versão funcionam como uma máquina de cinco estados que cada nó calcula por conta própria, uma vez por período de reajuste, para cada deployment que conhece.

Os estados são DEFINED, STARTED, LOCKED_IN, ACTIVE e FAILED. Todos os blocos dentro de um período de reajuste de 2.016 blocos compartilham um estado, de modo que uma transição só pode ocorrer em uma altura que seja múltipla de 2.016. Um deployment sai de DEFINED para STARTED quando o tempo mediano passado do bloco anterior ultrapassa o horário de início configurado, sendo o tempo mediano passado a mediana dos timestamps de um bloco e de seus dez antecessores.

Uma vez em STARTED, um nó percorre para trás exatamente 2.016 ancestrais e conta os blocos cujos três bits superiores de versão são 001 e cujo bit do deployment está definido. Qualquer outra coisa conta como zero, então um minerador que usa outro esquema de versão não pode sinalizar por acidente. A mainnet precisa de 1.916 deles, a testnet de 1.512. Se o limite não for atingido até que o tempo mediano passado ultrapasse o timeout, o deployment vai para FAILED de forma permanente. O BIP-9 sugere colocar esse timeout 31.536.000 segundos, um ano, após o horário de início, para que uma proposta parada libere seu bit em vez de bloquear a fila para sempre.

Um detalhe pega as pessoas de surpresa. O estado de um bloco nunca depende do próprio campo de versão, apenas do de seus ancestrais, então um minerador não pode votar por uma regra e fazer com que o voto vincule o bloco que o emite. Fixar os três bits superiores em 001 também restringe a versão de um bloco que sinaliza ao intervalo de 0x20000000 a 0x3FFFFFFF, deixando os padrões 010 e 011 livres para qualquer mecanismo que por fim substitua os bits de versão.

Os bits são reciclados em vez de gastos. Quando um deployment se ativa ou expira, seu bit pode carregar uma proposta posterior, após uma pausa de descanso que o BIP-9 recomenda para que o software com bugs seja detectado antes. A especificação também pede que os nós acompanhem bits que não reconhecem e avisem de forma bem visível quando um deployment desconhecido entra em LOCKED_IN, que é como o software não atualizado avisa que uma regra que ele não consegue aplicar está chegando.

Onde você vê isso

Dois deployments rodaram na mainnet do bitcoin com os próprios parâmetros do BIP-9, e a lista de deployments do BIP tabula ambos.

O primeiro, chamado csv, usou o bit 0 com horário de início em 2016-05-01 e expiração em 2017-05-01, e se tornou ativo no bloco 419.328. Ele reuniu o BIP-68, o BIP-112 e o BIP-113, três das mudanças que o BIP-9 lista como capazes de tornar inválidas transações antes válidas. O segundo, segwit, usou o bit 1 com uma janela de 2016-11-15 a 2017-11-15, e se tornou ativo no bloco 481.824, dentro de um prazo que poderia ter perdido.

O esquema também aparece na infraestrutura de mineração. O BIP-9 ampliou a chamada getblocktemplate com um array rules que nomeia os deployments já ativos, um objeto vbavailable que associa o nome de cada deployment pendente ao seu bit, e uma máscara opcional vbrequired com os bits que o servidor exige. Um pool lê essas chaves para decidir o que sinalizar, e é isso que transforma uma versão publicada em um percentual nos rastreadores.

Bits de versão vs bloco de versão 2

Um bloco de versão 2 carrega um contador no campo de versão; os bits de versão carregam um vetor de bits nos mesmos quatro bytes. Sob o BIP-34 o campo era comparado como um inteiro, então só uma atualização podia estar em andamento por vez e cada sucesso queimava permanentemente valores que um bloco válido poderia usar. O BIP-9 detalha a conta: depois do BIP-34, do BIP-66 e do BIP-65 restavam apenas 0x7FFFFFFB valores de versão, o que limita qualquer esquema de vetor de bits a 30 deployments independentes. Fixar os três bits superiores em vez disso transformou o que restava em 29 faixas que funcionam em paralelo e podem ser reutilizadas.

Não confundir com

Perguntas frequentes

O que significa uma versão de bloco 0x20000000?

Significa que o bloco não está sinalizando nada. O BIP-9 fixa os três bits superiores do campo em 001, de onde vem o 0x2, e todos os bits de deployment abaixo deles são zero, então o minerador não está votando por nenhum soft fork pendente.

Dois soft forks podem usar o mesmo bit de versão?

Não ao mesmo tempo. Um bit só fica livre quando seu deployment se ativou ou alcançou seu timeout, e o BIP-9 recomenda uma pausa de descanso antes da reutilização, para que o software com bugs seja detectado antes que o bit comece a significar algo novo.

Quanto tempo leva um deployment de bits de versão?

Dois períodos de reajuste no mínimo, o que equivale a 4.032 blocos. Um período completo de 2.016 blocos precisa conter 1.916 blocos que sinalizam, depois o deployment fica travado por mais um período inteiro antes que as regras sejam aplicadas, e o BIP-9 sugere considerar a tentativa fracassada um ano após seu horário de início.

Termos relacionados

Mais em Protocolo e atualizações

Ler esta página em inglês