Saltar al contenido
buybitcoinsmart

Glosario / Nodos y software

Encabezado de mensaje

¿Qué es el encabezado de mensaje?
El encabezado de mensaje de Bitcoin es un sobre fijo de 24 bytes que envuelve cada mensaje entre pares: los bytes mágicos de red, un nombre de comando, una longitud de carga útil y una suma de comprobación.

Nada en el protocolo entre pares se describe a sí mismo, así que el sobre tiene que hacer ese trabajo. Sus cuatro campos nunca cambian de tamaño ni de orden, lo que permite a un nodo leer exactamente 24 bytes, saber cuánto más va a llegar y cortar la conexión con cualquiera que anuncie más de los 4.000.000 bytes que Bitcoin Core acepta. Usted nunca verá uno, pero un encabezado mal formado es la razón por la que una conexión con un par desaparece a veces sin explicación.

Cómo funciona

Los cuatro campos del encabezado se leen en un orden fijo, y cada uno condiciona lo que ocurre después.

Los bytes 0 a 3 contienen los bytes mágicos que identifican la red. Los bytes 4 a 15 contienen el comando: un nombre ASCII en minúsculas rellenado con bytes nulos hasta doce caracteres, y por eso todos los tipos de mensaje de bitcoin tienen nombres escuetos y el mensaje cmpctblock, con diez caracteres, se queda cerca del límite. Los bytes 16 a 19 contienen la longitud de la carga útil como un entero sin signo en little endian (el byte menos significativo primero). Los bytes 20 a 23 contienen una suma de comprobación: los cuatro primeros bytes de un doble SHA-256 calculado sobre la carga útil.

Poner la longitud antes de la carga útil es la verdadera medida de seguridad del diseño. Un nodo que ha consumido 24 bytes ya sabe si el remitente anuncia algo absurdo, y Bitcoin Core rechaza todo lo que supere los 4.000.000 bytes y se desconecta, sin reservar un búfer ni esperar datos que quizá nunca lleguen. Con la longitud después del cuerpo, habría que confiar en que el remitente se detenga.

La suma de comprobación merece menos respeto del que suele recibir. Cuatro bytes de hash detectan un bit alterado en un enlace defectuoso, y no consiguen nada frente a un par que miente, ya que un remitente hostil simplemente calcula la suma de comprobación sobre lo que haya decidido enviar. En bitcoin, la integridad proviene de validar el contenido frente a las reglas de consenso, nunca de este campo.

En el software más reciente, toda la estructura es opcional. El transporte de la versión 2 de BIP324 cifra la conexión y reemplaza el sobre en texto plano por una longitud ofuscada que delimita cada mensaje, más un ID corto de un byte para los tipos de mensaje más comunes, de modo que un observador pasivo ya no puede leer los nombres de comando que circulan por la red. Bitcoin Core lo incluyó como ajuste opcional en la versión 26.0 y lo activó de forma predeterminada en una versión posterior.

Dónde aparece

Los encabezados de mensaje aparecen en las capturas de paquetes y en los diagnósticos del propio nodo.

Ejecute Bitcoin Core con -debug=net y el registro de depuración anotará los tipos y los tamaños de los mensajes de cada par, que es la forma práctica de ver lo que una conexión está haciendo realmente. Las líneas del registro que dicen PROCESSMESSAGE: INVALID MESSAGESTART significan que un par envió bytes que no empezaban por los bytes mágicos de esta red, lo que casi siempre se debe a algo mal configurado en el otro extremo y no a un ataque. El disector de bitcoin de Wireshark analiza esos mismos 24 bytes para etiquetar cada trama.

Encabezado de mensaje frente a encabezado de bloque

Un encabezado de mensaje es el embalaje del transporte; un encabezado de bloque son datos de consenso, y no comparten más que la palabra. El encabezado de mensaje ocupa 24 bytes, existe solo mientras dura una entrega y se descarta en cuanto se ha leído la carga útil. El encabezado de bloque ocupa 80 bytes, contiene la versión, el hash del bloque anterior, la raíz de Merkle, la marca de tiempo, el objetivo de dificultad y el nonce, y se calcula su hash para producir la prueba de trabajo que identifica ese bloque de forma permanente. Uno es la etiqueta con la dirección de un paquete postal; el otro es lo que va dentro.

No confundir con

Preguntas frecuentes

¿Qué tamaño tiene un encabezado de mensaje de bitcoin?

Exactamente 24 bytes: cuatro para los bytes mágicos de red, doce para el nombre de comando rellenado con bytes nulos, cuatro para la longitud de la carga útil y cuatro para una suma de comprobación tomada de los primeros bytes de un doble SHA-256 sobre la carga útil.

¿La suma de comprobación del encabezado de mensaje hace segura la conexión?

No. Solo detecta la corrupción accidental. Un par hostil vuelve a calcular la suma de comprobación sobre lo que envíe, así que la seguridad proviene de validar la carga útil frente a las reglas de consenso, o del transporte cifrado BIP324, que reemplaza por completo el encabezado en texto plano.

Términos relacionados

Más en la sección Nodos y software

Leer esta página en inglés