Magic Bytes
Os bytes que marcam o início de cada mensagem na rede
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:
| Rede | Magic Bytes |
|---|---|
| Mainnet | f9beb4d9 |
| Testnet3 | 0b110907 |
| Regtest | fabfb5da |
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.
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.
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:
- ASCII. Se você converter os bytes
f9beb4d9para ASCII estendido, obtémù¾´Ù, que é uma sequência de caracteres improvável de ser colocada acidentalmente dentro do scriptsig de uma transação coinbase, ou como texto em uma saída OP_RETURN. - UTF-8. O conjunto básico Latin de caracteres UTF-8 não passa de
7e, então, se você codifica texto usando UTF-8 básico, não vai colidir com nenhum dos magic bytes (todos maiores que7e). - Inteiros. Se você converter
f9beb4d9para um inteiro, obtém 4190024921. Se também inverter a ordem dos bytes parad9b4bef9e converter para inteiro, obtém 3652501241. Ambos são números muito grandes, então é menos provável que sejam usados em um dos campos dos dados brutos de transação.
Conversor de Números
Inverter 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 só 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).