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 E esta é uma mensagem "tx" bruta contendo uma única transação:
f9beb4d9747800000000000000000000e00000006a86deb701000000015ac5ae0a2ba96622c9b79de2c339084c8b1d30f63bb55a315f354db4d9a6abcf010000006b4830450221009ad52459e1e8bd5e758399cc0be963c75726c5089499465d9aa79ffb304ecd3802207d73ea58047f4d1f857b400cbff725ef562b7ada1c26e763c5a1aa6d29d2fdf401210234b7b614fcc0e4d926747d491992d8cc133f076bd79095eddf60c34b0e3fef4affffffff02390205000000000017a914ea3b6d7e92e05370bc8a61d3f05dbfdc90bb1d9587d1df3000000000001976a91425f0800454530549ed93747a6449aefe2618203988ac00000000 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|
...
Aqui está outra mensagem "version", mas desta vez na rede Testnet3, então os magic bytes são diferentes:
0b11090776657273696f6e000000000066000000c0094f817e1101000d000000000000004659775800000000000000000000000000000000000000000000ffff0000000000000d000000000000000000000000000000000000000000000000003d2324b2fc764108102f5361746f7368693a302e31332e312fab3d100001 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.
Esta citação acima estava originalmente no arquivo chainparams.cpp, mas desde então foi removida.
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 (por exemplo, version, contagem de entradas, vout, contagem de saídas, valor, tamanho do script, etc.).
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).
Esse conjunto específico de magic bytes também é exclusivo do protocolo Bitcoin.