Bytes Mágicos
Los bytes que marcan el inicio de cada mensaje en la red
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:
| Red | Bytes Mágicos |
|---|---|
| Mainnet | f9beb4d9 |
| Testnet3 | 0b110907 |
| Regtest | fabfb5da |
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.
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.
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:
- ASCII. Si conviertes los bytes
f9beb4d9a ASCII extendido, obtienesù¾´Ù, que es una secuencia de caracteres poco probable de aparecer por accidente dentro del scriptsig de una transacción coinbase, o como texto en una salida OP_RETURN. - UTF-8. El conjunto básico Latin de caracteres UTF-8 no va más allá de
7e, así que, si codificas texto usando UTF-8 básico, no chocarás con ninguno de los bytes mágicos (todos son mayores que7e). - Enteros. Si conviertes
f9beb4d9en un entero, obtienes 4190024921. Si además inviertes el orden de los bytes ad9b4bef9y lo conviertes a entero, obtienes 3652501241. Ambos son números muy grandes, así que es menos probable que aparezcan en uno de los campos de los datos brutos de transacción (por ejemplo, version, conteo de entradas, vout, conteo de salidas, importe, tamaño del script, etc.).
Conversor de Números
Invertir Bytes
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.