Saltar al contenido
buybitcoinsmart

Glosario / Protocolo y actualizaciones

Retransmisión de bloques compactos

También se conoce como BIP152.

¿Qué es la retransmisión de bloques compactos?
La retransmisión de bloques compactos reemplaza un bloque nuevo en la red por una lista de identificadores de seis bytes, que el nodo destinatario compara con las transacciones que ya tiene para reensamblar el bloque localmente.

Se especifica en el BIP-152.

Dos pares que observan la mempool ya comparten casi todas las transacciones del siguiente bloque, así que enviarlas por segunda vez es un desperdicio. Matt Corallo especificó la solución como BIP152 y Bitcoin Core la activó en la versión 0.13.0, publicada el 23 de agosto de 2016. Para quien ejecuta un nodo en casa, es la diferencia entre una factura de ancho de banda tolerable y una intolerable.

Cómo funciona

La retransmisión de bloques compactos añade cuatro mensajes al protocolo, y el interesante es el mensaje cmpctblock, que describe un bloque sin contenerlo.

Un mensaje cmpctblock lleva el encabezado de 80 bytes, un nonce de 8 bytes elegido por el remitente y, a continuación, un identificador corto de seis bytes por cada transacción del bloque. Esos identificadores salen de SipHash-2-4, con una clave obtenida del hash SHA-256 del encabezado concatenado con ese nonce. El nonce es lo que hace seguro el esquema: los identificadores cambian con cada bloque y con cada remitente, así que nadie puede preparar de antemano dos transacciones cuyos identificadores colisionen y atasquen la reconstrucción en toda la red a la vez.

Algunas transacciones viajan completas en lugar de por identificador. La transacción coinbase siempre lo hace, porque ningún par puede haberla visto antes, y un remitente puede precargar cualquier otra que sospeche que el destinatario no tendrá.

Después, la reconstrucción ocurre en el lado del destinatario. El nodo calcula con la misma clave el hash de cada transacción de su propia mempool, busca cada identificador corto y completa el bloque. También mantiene una pequeña reserva adicional de transacciones expulsadas y reemplazadas recientemente, que recoge las que salieron de la mempool momentos antes. Lo que aún falte se solicita por posición con el mensaje getblocktxn, y el remitente devuelve solo esas transacciones en un mensaje blocktxn.

Dos cosas obligan a recurrir a la descarga del bloque entero: que falten demasiadas transacciones como para que valga la pena un viaje de ida y vuelta, o que dos transacciones distintas produzcan el mismo identificador de seis bytes. Seis bytes permiten 281 billones de valores, así que las colisiones accidentales son rarísimas, y las deliberadas son justo las que descarta el nonce.

El anuncio tiene dos modalidades. En el modo de bajo ancho de banda, un par anuncia un bloque nuevo y espera a que se lo soliciten. En el modo de alto ancho de banda, que un nodo activa para tres pares como máximo, el mensaje cmpctblock se envía directamente en el instante en que llega el bloque, lo que ahorra un viaje de ida y vuelta en la ruta donde más importa la velocidad de propagación.

Dónde aparece

La retransmisión de bloques compactos se ve en el registro de su propio nodo, una línea por bloque, y leerlo es la forma más rápida de juzgar si un nodo está en buen estado.

Bitcoin Core imprime un resumen de la reconstrucción que indica cuántas transacciones venían precargadas, cuántas salieron de la mempool, cuántas de la reserva adicional y cuántas hubo que solicitar. En una máquina que lleva horas en marcha, el recuento de transacciones solicitadas suele ser cero o casi cero. En una máquina iniciada hace diez minutos, la mempool está casi vacía, hay que descargar casi todo y los primeros bloques llegan con lentitud.

De ahí sale una regla práctica para quien ejecuta un nodo con el fin de comprobar su propio saldo en lugar de confiar en un sitio web: déjelo en marcha. Un nodo reiniciado justo antes de que usted lo necesite es un nodo que descarga bloques completos, y su visión de la punta de la cadena irá por detrás de la de un explorador de bloques público hasta que la mempool se vuelva a llenar.

No confundir con

Preguntas frecuentes

¿Cambia la retransmisión de bloques compactos lo que cuenta como un bloque válido?

No. Solo cambia cómo viajan los bytes entre pares. El nodo destinatario valida desde cero el bloque reensamblado según las mismas reglas de consenso, así que un bloque que llega en forma compacta se valida con exactamente el mismo rigor que uno descargado completo.

¿Por qué mi nodo descarga bloques completos después de un reinicio?

Porque la reconstrucción necesita una mempool con transacciones. Un nodo recién iniciado casi no tiene con qué comparar los identificadores cortos, así que debe solicitar la mayor parte de cada bloque. El comportamiento se corrige solo en aproximadamente una hora, a medida que la mempool se vuelve a llenar.

Términos relacionados

Más en la sección Protocolo y actualizaciones

Leer esta página en inglés