Glossário / Nós e software
Cabeçalho de mensagem
- O que é o cabeçalho de mensagem?
- O cabeçalho de mensagem do Bitcoin é um envelope fixo de 24 bytes que envolve cada mensagem ponto a ponto: uma string de início de rede, um nome de comando, um comprimento de carga útil e uma soma de verificação.
Nada no protocolo ponto a ponto se descreve, então o envelope tem de fazer esse trabalho. Seus quatro campos nunca mudam de tamanho nem de ordem, o que permite a um nó ler exatamente 24 bytes, saber quanto mais está por vir e encerrar a conexão com qualquer coisa que anuncie mais do que os 4.000.000 bytes que o Bitcoin Core aceita. Você nunca verá um, mas um cabeçalho malformado é a razão pela qual uma conexão com um par às vezes desaparece sem explicação.
Como funciona
Os quatro campos do cabeçalho são lidos em ordem fixa, e cada um condiciona o que acontece depois.
Os bytes 0 a 3 contêm a string de início que identifica a rede. Os bytes 4 a 15 contêm o comando: um nome ASCII em minúsculas preenchido com bytes nulos até doze caracteres, e é por isso que todo tipo de mensagem no bitcoin tem um nome curto e que o cmpctblock, com dez caracteres, fica perto do limite. Os bytes 16 a 19 contêm o comprimento da carga útil como um inteiro sem sinal em little-endian. Os bytes 20 a 23 contêm uma soma de verificação: os quatro primeiros bytes de um SHA-256 duplo calculado sobre a carga útil.
Colocar o comprimento antes da carga útil é o verdadeiro recurso de segurança do projeto. Um nó que já consumiu 24 bytes sabe de antemão se o remetente está anunciando algo absurdo, e o Bitcoin Core recusa qualquer coisa acima de 4.000.000 bytes e se desconecta, sem alocar um buffer nem esperar por dados que talvez nunca cheguem. Com o comprimento depois do corpo, você confia que o remetente vai parar.
A soma de verificação merece menos respeito do que costuma receber. Quatro bytes de hash detectam um bit alterado em um link ruim, e não conseguem nada contra um par que mente, já que um remetente hostil simplesmente calcula a soma de verificação sobre o que decidiu enviar. A integridade no bitcoin vem de validar o conteúdo segundo as regras de consenso, nunca deste campo.
Toda a estrutura é opcional no software mais recente. O transporte da versão 2 do BIP324 criptografa a conexão e substitui o envelope em texto simples por um enquadramento de comprimento ofuscado mais um identificador curto de um byte para os tipos de mensagem mais comuns, de modo que um observador passivo não consegue mais ler os nomes de comando que trafegam na rede. O Bitcoin Core o incluiu como ajuste opcional na versão 26.0 e o ativou por padrão em uma versão posterior.
Onde você o encontra
Os cabeçalhos de mensagem aparecem em capturas de pacotes e nos próprios diagnósticos de um nó.
Execute o Bitcoin Core com -debug=net e o log registra os tipos e os tamanhos das mensagens de cada par, que é a forma prática de observar o que uma conexão está realmente fazendo. Entradas que dizem PROCESSMESSAGE: INVALID MESSAGESTART significam que um par enviou bytes que não começavam pela string de início desta rede, o que quase sempre é algo mal configurado do outro lado, e não um ataque. O dissector de bitcoin do Wireshark analisa esses mesmos 24 bytes para rotular cada quadro.
Cabeçalho de mensagem vs cabeçalho de bloco
Um cabeçalho de mensagem é embalagem de transporte; um cabeçalho de bloco é composto de dados de consenso, e eles não compartilham nada além da palavra. O cabeçalho de mensagem tem 24 bytes, existe apenas durante uma entrega e é descartado assim que a carga útil foi lida. O cabeçalho de bloco tem 80 bytes, contém a versão, o hash do bloco anterior, a raiz de Merkle, o carimbo de data e hora, o alvo de dificuldade e o nonce, e é submetido a hash para produzir a prova de trabalho que nomeia esse bloco permanentemente. Um é a etiqueta de endereço em uma encomenda; o outro é o que está dentro dela.