Pular para o conteúdo
buybitcoinsmart

Glossário / Nós e software

Start string

Outros nomes: Bytes mágicos de rede.

O que é a start string?
A start string é o prefixo de quatro bytes que abre cada mensagem da rede bitcoin e informa em qual rede o remetente está antes de qualquer outra coisa ser lida.

Quatro bytes impedem que as redes paralelas do bitcoin conversem entre si por acidente. A mainnet usa f9beb4d9 e a regtest usa fabfb5da, e um nó que lê um valor inesperado descarta a mensagem e, normalmente, também a conexão. A verificação detecta erro de configuração, não atacantes, porque qualquer pessoa pode enviar os quatro bytes corretos.

Como funciona

A start string ocupa os bytes de zero a três de uma mensagem e é testada antes que o nó aloque memória para qualquer coisa que venha depois.

O Bitcoin Core fixa no código um valor por cadeia. A mainnet é 0xf9beb4d9. A testnet3 é 0x0b110907. A testnet4, adicionada junto com o BIP94 no Bitcoin Core 28.0, é 0x1c163f28. A regtest é 0xfabfb5da. A signet é o caso interessante: em vez de uma constante, seus quatro bytes são derivados do hash do script de desafio que define quem pode assinar os blocos daquela signet, de modo que a signet pública padrão e uma signet privada que você cria para testes automaticamente se recusam a conversar entre si.

Os valores não foram escolhidos por parecerem bonitos. São sequências de bytes improváveis de aparecer em dados comuns de um fluxo, então um cliente que lê um fluxo TCP corrompido ou dessincronizado pode avançar até encontrar o padrão novamente e retomar a partir desse ponto em vez de descartar tudo.

Os mesmos quatro bytes são gravados no disco. Dentro dos arquivos blk00000.dat que guardam os blocos brutos, cada bloco armazenado é precedido pela start string de sua rede e por um comprimento de quatro bytes. É esse enquadramento que permite a um nó percorrer um arquivo de blocos que não terminou de escrever, localizar o limite entre os registros e descartar apenas a parte truncada no final, em vez do arquivo inteiro.

Onde você a vê

A start string aparece sempre que o tráfego de bitcoin é inspecionado, e não apenas usado.

Abra uma captura de pacotes na porta 8333 e cada quadro da conversa começa com f9 be b4 d9. Os analisadores de protocolo se baseiam exatamente nessa assinatura para rotular o tráfego. Todo projeto que bifurcou o código alterou os quatro bytes como um de seus primeiros atos, e é por isso que as bifurcações não conseguem se conectar entre si, embora seus handshakes sejam idênticos em tudo o mais.

Para um usuário comum, ela aparece uma vez, como um silêncio pouco útil. Aponte uma carteira configurada para a testnet para um nó da mainnet e você não terá erro, nem aviso de rejeição, nem conexão: o nó lê quatro bytes que não reconhece, descarta a mensagem e por fim desconecta o par. Confirmar que as duas pontas estão na mesma rede é a primeira coisa a verificar quando um nó e uma carteira se recusam a se enxergar.

Start string vs cabeçalho de mensagem

A start string é um campo; o cabeçalho de mensagem é o conjunto dos quatro. Um cabeçalho tem 24 bytes, formados pela start string, depois um nome de comando de doze bytes em ASCII, depois um comprimento de carga útil de quatro bytes e depois um checksum de quatro bytes. A start string responde qual rede, o comando responde que tipo de mensagem e o comprimento responde quanto mais ler. As pessoas usam os dois nomes de forma intercambiável quando querem dizer o cabeçalho, o que fica realmente confuso no momento em que você conta deslocamentos de bytes em um despejo hexadecimal.

Não confundir com

Perguntas frequentes

Quais são os bytes mágicos de rede do bitcoin?

A mainnet usa 0xf9beb4d9, a testnet3 usa 0x0b110907, a testnet4 usa 0x1c163f28 e a regtest usa 0xfabfb5da. A signet não tem valor fixo: seus quatro bytes são derivados de um hash do script de desafio que define quem pode assinar os blocos daquela signet.

Por que minha carteira falha silenciosamente ao se conectar ao meu nó?

Muitas vezes porque os dois estão em redes diferentes. Um nó que lê uma start string inesperada descarta a mensagem sem enviar erro, então uma carteira de testnet apontada para um nó da mainnet produz silêncio em vez de um aviso.

Termos relacionados

Mais em Nós e software

Ler esta página em inglês