Glossário / Protocolo e atualizações
Retransmissão de blocos compactos
Outros nomes: BIP152.
- O que é a retransmissão de blocos compactos?
- A retransmissão de blocos compactos substitui um novo bloco na rede por uma lista de identificadores de seis bytes, que o nó receptor compara com as transações que já tem e remonta localmente.
Especificação no BIP-152.
Dois pares que ambos observam a mempool já compartilham quase todas as transações do próximo bloco, então enviá-las uma segunda vez é desperdício. Matt Corallo especificou a solução como BIP152 e o Bitcoin Core a ativou na versão 0.13.0, lançada em 23 de agosto de 2016. Para quem executa um nó em casa, é a diferença entre uma conta de largura de banda tolerável e uma intolerável.
Como funciona
A retransmissão de blocos compactos adiciona quatro mensagens ao protocolo, e a interessante é a cmpctblock, que descreve um bloco sem contê-lo.
Uma cmpctblock carrega o cabeçalho de 80 bytes, um nonce de 8 bytes escolhido pelo remetente e, em seguida, um identificador curto de seis bytes para cada transação do bloco. Esses identificadores vêm do SipHash-2-4, com chave derivada do SHA-256 do cabeçalho concatenado com esse nonce. O nonce é o que torna o esquema seguro: os identificadores mudam a cada bloco e a cada remetente, então ninguém pode preparar com antecedência duas transações cujos identificadores colidam e travem a remontagem em toda a rede de uma só vez.
Algumas transações viajam completas, e não por identificador. A coinbase sempre viaja assim, pois nenhum par pode tê-la visto antes, e um remetente pode preencher previamente qualquer outra que suspeite que o receptor não terá.
A remontagem então acontece no lado de quem recebe. O nó calcula o hash de cada transação de sua própria mempool com a mesma chave, procura cada identificador curto e preenche o bloco. Ele também mantém um pequeno reservatório extra de transações expulsas e substituídas recentemente, que recolhe as que saíram da mempool momentos antes. O que ainda estiver faltando é solicitado por posição com getblocktxn, e o remetente devolve somente essas transações em uma mensagem blocktxn.
Duas coisas obrigam a baixar o bloco inteiro: faltarem transações demais para valer uma ida e volta, ou duas transações diferentes produzirem o mesmo identificador de seis bytes. Seis bytes permitem 281 trilhões de valores, então as colisões acidentais são raríssimas, e as deliberadas são justamente o que o nonce descarta.
O anúncio tem duas modalidades. No modo de baixa largura de banda, um par anuncia um bloco novo e espera que o solicitem. No modo de alta largura de banda, que um nó ativa para no máximo três pares, a cmpctblock é enviada no instante em que o bloco chega, economizando uma ida e volta no caminho em que a velocidade de propagação mais importa.
Onde você vê isso
A retransmissão de blocos compactos aparece no log do seu próprio nó, uma linha por bloco, e lê-lo é a forma mais rápida de avaliar se um nó está saudável.
O Bitcoin Core imprime um resumo da remontagem informando quantas transações foram preenchidas previamente, quantas vieram da mempool, quantas vieram do reservatório extra e quantas tiveram de ser solicitadas. Em uma máquina que está ligada há horas, a contagem de solicitadas costuma ser zero ou perto disso. Em uma máquina iniciada dez minutos atrás, a mempool está quase vazia, quase tudo precisa ser baixado e os primeiros blocos chegam devagar.
Isso dá uma regra prática para quem executa um nó e quer conferir o próprio saldo em vez de confiar em um site: deixe-o rodando. Um nó reiniciado pouco antes de você precisar dele é um nó baixando blocos completos, e sua visão da ponta da cadeia ficará atrás de um explorador público até a mempool se encher de novo.