Bytes Mágicos

Los bytes que marcan el inicio de cada mensaje en la red

Diagrama que muestra un mensaje enviado a otro nodo con los bytes mágicos al inicio.

Los bytes mágicos ayudan a identificar mensajes separados enviados entre los nodos de la red Bitcoin.

Por ejemplo, cuando te conectas a un nodo con tu propio código, cada mensaje que recibes de ese nodo empieza con f9beb4d9, y cada mensaje que envías debe empezar con los mismos bytes mágicos.

Bitcoin

¿Cuáles son los bytes mágicos en Bitcoin?

Los bytes mágicos usados en Bitcoin tienen 4 bytes de tamaño y son distintos para cada red:

RedBytes Mágicos
Mainnetf9beb4d9
Testnet30b110907
Regtestfabfb5da

Ejemplos

¿Dónde encuentras los bytes mágicos?

Este es un mensaje "version" bruto, el primer mensaje que recibes al conectarte a un nodo (observa los bytes mágicos f9beb4d9 al inicio):

f9beb4d976657273696f6e00000000006f0000004aae42a47c11010005000000000000001436396400000000010000000000000000000000000000000000ffffc1207f8db0d0050000000000000000000000000000000000ffff8a4414c5208df66af23ecba5bd68192f5361746f7368693a302e31322e3128626974636f7265292fc8fb0b0001

Y este es un mensaje "tx" bruto que contiene una sola transacción:

f9beb4d9747800000000000000000000e00000006a86deb701000000015ac5ae0a2ba96622c9b79de2c339084c8b1d30f63bb55a315f354db4d9a6abcf010000006b4830450221009ad52459e1e8bd5e758399cc0be963c75726c5089499465d9aa79ffb304ecd3802207d73ea58047f4d1f857b400cbff725ef562b7ada1c26e763c5a1aa6d29d2fdf401210234b7b614fcc0e4d926747d491992d8cc133f076bd79095eddf60c34b0e3fef4affffffff02390205000000000017a914ea3b6d7e92e05370bc8a61d3f05dbfdc90bb1d9587d1df3000000000001976a91425f0800454530549ed93747a6449aefe2618203988ac00000000

Si imprimes el bloque génesis desde los archivos brutos de la blockchain de tu nodo local, verás que también está almacenado en disco junto con los bytes mágicos:

$ 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|
...

Aquí hay otro mensaje "version", pero esta vez en la red Testnet3, así que los bytes mágicos son diferentes:

0b11090776657273696f6e000000000066000000c0094f817e1101000d000000000000004659775800000000000000000000000000000000000000000000ffff0000000000000d000000000000000000000000000000000000000000000000003d2324b2fc764108102f5361746f7368693a302e31332e312fab3d100001

Propósito

¿Por qué usamos bytes mágicos?

Si te conectas a un nodo Bitcoin, los mensajes que recibes forman parte de un flujo continuo de datos.

Diagrama que muestra un mensaje enviado a otro nodo con los bytes mágicos al inicio.
Los nodos reciben datos en flujos de bytes.

Si estás intentando leer esos datos, conviene tener una forma de saber cuándo podría estar empezando un mensaje nuevo. Por eso se usa un conjunto específico de bytes mágicos como marcador, para que puedas identificar con más facilidad el inicio de un mensaje nuevo.

Así que no hay nada realmente mágico en los bytes mágicos; solo se usan para ayudar a delimitar un flujo de datos.

Origen

¿Por qué se eligieron estos bytes específicos?

La cadena de inicio del mensaje fue diseñada para que fuera poco probable que aparezca en datos normales. Los caracteres son ASCII extendido, se usan raramente, no son UTF-8 válido y producen un entero grande de 32 bits con cualquier alineamiento.
chainparams.cpp

Esta cita de arriba estaba originalmente en el archivo chainparams.cpp, pero desde entonces ha sido eliminada.

Así que podrían ser diferentes, pero estos son solo 4 bytes que tienen las propiedades que sirven como buenos bytes mágicos en la red Bitcoin:

Ícono de herramienta Conversor de Números

Convertidor de Números

Convierte un número entre distintas bases (binaria, decimal, hexadecimal).

0b
0 dígitos
0d
0 dígitos
0x
0 dígitos
Ícono de herramienta Invertir Bytes

Invertir Bytes

Invierte el orden de los bytes de un valor hexadecimal (útil para convertir entre big-endian y little-endian).

0 bytes 0 bytes
Bytes
Invertidos

No es imposible que este conjunto específico de bytes aparezca dentro de un bloque o una transacción, pero es menos probable que ocurra de forma natural, y esa es la mejor alternativa.

Así que no dependerías solo de los bytes mágicos para identificar el inicio de cada mensaje, pero sí son útiles para ayudar a identificar dónde probablemente empieza un mensaje y también con qué red estás trabajando (mainnet, testnet o regtest).

Este conjunto específico de bytes mágicos también es exclusivo del protocolo Bitcoin.

Recursos