Compact Blocks transmite blocos de Bitcoin segundo BIP 152 com menos dados repetidos. Não reduz o próprio bloco nem afrouxa suas regras: o destinatário precisa recuperar o conteúdo inteiro e verificá-lo antes de aceitá-lo.
Ana quer enviar um novo bloco a Pedro, mas ele já tem muitas das transações. Um bloco reúne transações em um lote acrescentado ao histórico compartilhado. Enviar todas repetiria dados. O mecanismo Compact Blocks fornece o cabeçalho e uma lista de rótulos curtos para localizar transações conhecidas. O cabeçalho é uma parte curta do bloco com informações básicas, incluindo uma referência ao bloco anterior e uma impressão digital das transações. Para leitores técnicos: os rótulos têm 48 bits, ou 6 bytes, e resultam do corte da saída da função SipHash-2-4. Seus parâmetros vêm do cabeçalho e de um número adicional para aquela transmissão, chamado nonce. O rótulo não é um nome permanente da transação para toda a rede Bitcoin. [1] [2] [7]
Uma lista não substitui tudo. Ana envia algumas transações completas com suas posições no bloco. O exemplo comum é a Coinbase Transaction, a primeira transação do bloco, que atribui a recompensa da mineração; não tem relação com a corretora de mesmo nome. Ela é criada para aquele bloco, então Pedro normalmente não a tem entre as transações pendentes. Itens completos e rótulos curtos se complementam na reconstrução. [1] [2]
O Mempool de Pedro é sua coleção local de transações conhecidas que ainda não foram confirmadas na cadeia aceita. Ele calcula os mesmos rótulos curtos para as transações disponíveis e busca correspondências na lista de Ana. Não presume que todos tenham a mesma coleção. Como um rótulo pode ocasionalmente corresponder a mais de uma transação, encontrá-lo não é uma prova definitiva de que o conteúdo está correto. [1] [2]
Se restarem posições vazias ou ambíguas, Pedro solicita as transações por suas posições. A mensagem de pedido se chama getblocktxn, e a resposta com as transações, blocktxn. Não é necessário decorar os nomes: importa pedir dados reais, sem adivinhar o conteúdo. Outra viagem de ida e volta na rede leva tempo. Se a reconstrução falhar, é possível baixar o bloco inteiro. [1] [3]
Pedro precisa recuperar as transações exatas, na ordem correta, e conferir seu vínculo com o cabeçalho. Merkle Tree é uma estrutura que reúne transações em uma impressão digital de verificação e ajuda a conferir esse vínculo. Montar corretamente, porém, não substitui a conferência das regras. Um Full Node é um programa com o qual Pedro verifica por conta própria as regras do Bitcoin, como a autorização para gastar fundos e o valor da recompensa. Uma assinatura digital comprova a autorização de um pagamento por meio de uma chave privada, um valor numérico secreto, sem revelar essa chave. A transmissão compacta não abre exceção para um bloco inválido. [1] [8]
Nós vizinhos combinam o modo usando sendcmpct. Na opção rápida, uma mensagem cmpctblock com os dados de reconstrução anuncia diretamente o novo bloco. Após as verificações preliminares exigidas, o remetente pode transmitir antes de concluir todos os controles das transações. Deve conferir, entre outros requisitos, a ligação com a cadeia validada, Proof of Work como prova do trabalho computacional e o vínculo do cabeçalho com as transações. O destinatário ainda verifica o bloco inteiro antes de aceitá-lo no histórico. [1] [4]
A outra opção anuncia primeiro um bloco já validado usando inv ou headers. Pedro solicita então os dados compactos, caso precise. Assim pode evitar uma entrega desnecessária de um bloco recebido por outro caminho, ao custo de mais uma etapa de comunicação. Os dois modos podem economizar em relação ao reenvio de todas as transações. Diferem no momento do envio e na necessidade de um pedido anterior, não no padrão de validade do bloco. [1] [7]
Duas transações distintas podem ter o mesmo rótulo curto. Isso se chama colisão. Pense em duas pessoas com as mesmas iniciais: a abreviação já não basta para distingui-las. Conforme o ponto em que surgir o problema, o programa pede mais dados ou baixa o bloco completo. Uma colisão não quebra assinaturas de Bitcoin nem transforma um bloco inválido em válido. É preciso verificar o conteúdo real, não apenas rótulos iguais. [1] [2]
A versão 2 do protocolo compacto suporta SegWit, que separa assinaturas e outros dados de verificação em uma parte witness. Ela usa wtxid, identificador que inclui esses dados, em vez de txid, que não os inclui. As transações completas são transmitidas com os dados witness necessários segundo BIP 144. Eles não são descartados para fazer a remessa parecer menor. A versão do protocolo de transmissão também não é o número de versão do próprio bloco. [1] [6]
Quando Ana e Pedro conhecem muitas transações em comum, o bloco viaja com muito menos dados repetidos. Isso também ajuda uma conexão doméstica na chegada repentina de um bloco. Se a sobreposição for pequena, os pedidos adicionais reduzem a economia. O objetivo principal é poupar dados transmitidos; a entrega mais rápida é um possível benefício, não uma promessa de espera zero ou de mensagem com tamanho fixo. Bitcoin não passa a ter um novo limite de tamanho de bloco. [5] [7]
Para ter uma visão mais completa, leia este verbete junto com Block Propagation, Initial Block Download, Eclipse Attack, vByte, Bitcoin, Transação coinbase. Também há referências a este verbete em Stale Block, Eclipse Attack, Selfish Mining, Block Propagation.