Magic Bytes

Os bytes que marcam o início de cada mensagem na rede

Diagrama mostrando uma mensagem sendo enviada a outro nó com os magic bytes no início.

Os magic bytes ajudam a identificar as mensagens separadas enviadas entre os nós da rede bitcoin.

Por exemplo, ao conectar a um nó com o seu próprio código, toda mensagem que você recebe daquele nó começa com f9beb4d9, e toda mensagem que você envia deve começar com os mesmos magic bytes.

Bitcoin

Quais são os magic bytes no Bitcoin?

Os magic bytes usados no Bitcoin têm 4 bytes de tamanho e são diferentes para cada rede:

RedeMagic Bytes
Mainnetf9beb4d9
Testnet30b110907
Regtestfabfb5da

Exemplos

Onde você encontra os magic bytes?

Esta é uma mensagem "version" bruta, a primeira mensagem que você recebe ao conectar a um nó (note os magic bytes f9beb4d9 no início):

f9beb4d976657273696f6e00000000006f0000004aae42a47c11010005000000000000001436396400000000010000000000000000000000000000000000ffffc1207f8db0d0050000000000000000000000000000000000ffff8a4414c5208df66af23ecba5bd68192f5361746f7368693a302e31322e3128626974636f7265292fc8fb0b0001

Se você imprimir o bloco gênese a partir dos arquivos brutos da blockchain do seu nó local, verá que ele está armazenado no disco junto com os magic bytes também:

$ hexdump -C -n 293 blk00000.dat

00000000  f9 be b4 d9 1d 01 00 00  01 00 00 00 00 00 00 00  |................|
00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  |................|
...
00000080  ff ff 4d 04 ff ff 00 1d  01 04 45 54 68 65 20 54  |..M.......EThe T|
00000090  69 6d 65 73 20 30 33 2f  4a 61 6e 2f 32 30 30 39  |imes 03/Jan/2009|
000000a0  20 43 68 61 6e 63 65 6c  6c 6f 72 20 6f 6e 20 62  | Chancellor on b|
000000b0  72 69 6e 6b 20 6f 66 20  73 65 63 6f 6e 64 20 62  |rink of second b|
000000c0  61 69 6c 6f 75 74 20 66  6f 72 20 62 61 6e 6b 73  |ailout for banks|
...

Propósito

Por que usamos magic bytes?

Se você conecta a um nó bitcoin, as mensagens que recebe fazem parte de um fluxo contínuo de dados.

Diagrama mostrando uma mensagem sendo enviada a outro nó com os magic bytes no início.
Os nós recebem dados em fluxos de bytes.

Se você está tentando ler esses dados, é bom ter uma forma de descobrir quando uma nova mensagem pode estar começando. É por isso que um conjunto específico de magic bytes é usado como um marcador, para que você possa identificar mais facilmente o início de uma nova mensagem.

Então não há nada realmente mágico nos magic bytes; eles são só usados para ajudar a delimitar um fluxo de dados.

Origem

Por que esses bytes específicos foram escolhidos?

A string de início de mensagem foi projetada para ser improvável de ocorrer em dados normais. Os caracteres são ASCII estendido, raramente usados, não são UTF-8 válido e produzem um inteiro grande de 32 bits com qualquer alinhamento.
chainparams.cpp

Então eles poderiam ser diferentes, mas estes são só 4 bytes que têm as propriedades que servem para bons magic bytes na rede Bitcoin:

Ícone Ferramenta Conversor de Números
Ícone Ferramenta

Conversor de Números

Converta um número entre bases diferentes (binário, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
Ícone Ferramenta Inverter Bytes
Ícone Ferramenta

Inverter Bytes

Inverte a ordem dos bytes de um valor hexadecimal (útil para converter entre big-endian e little-endian).

0 bytes

Não é impossível que esse conjunto específico de bytes apareça dentro de um bloco ou transação, mas é menos provável que ocorra naturalmente, o que é a melhor alternativa.

Então você não dependeria dos magic bytes para identificar o início de cada mensagem, mas eles são úteis para ajudar a identificar onde uma mensagem provavelmente começa e também com qual rede você está trabalhando (mainnet, testnet ou regtest).

Recursos