Glosario / Nodos y software
Inventario
También se conoce como Mensaje inv.
- ¿Qué es un inventario?
- Un inventario es la lista de identificadores de objetos que un nodo anuncia a sus pares, indicando qué transacciones y bloques tiene sin enviar todavía ninguno de ellos.
Primero se anuncia, y se entrega cuando se solicita. Ese patrón es la razón de que la red no se ahogue en duplicados: cada elemento cuesta 36 bytes, un código de tipo de cuatro bytes más un hash de 32 bytes, y un solo mensaje inv puede llevar hasta 50.000 de ellos. Un par que ya tiene el objeto nunca lo pide, y ese ancho de banda nunca se gasta.
Cómo funciona
Un elemento de inventario consta de dos partes: un número que dice qué tipo de cosa es y el hash que lo identifica.
Los códigos de tipo son enteros pequeños. El 1 es una transacción, el 2 un bloque, el 3 un bloque filtrado del antiguo esquema de filtros de Bloom, el 4 un bloque compacto y el 5 una transacción identificada por su hash de testigo. Activar el bit 0x40000000 sobre un tipo marca la variante con testigo, así que un par compatible con SegWit solicita el tipo MSG_WITNESS_BLOCK donde uno más antiguo habría pedido un bloque simple.
El intercambio de mensajes se desarrolla en tres pasos. Un nodo envía un mensaje inv que enumera lo que es nuevo. El par recorre la lista, ignora todo lo que reconoce y responde con un mensaje getdata que nombra solo lo que le falta. El nodo envía esos objetos, un mensaje por cada uno, o un mensaje notfound cuando algo se ha descartado entretanto. Vale la pena detenerse en la aritmética que hay detrás del tope de 50.000: 50.000 elementos a 36 bytes son 1.800.000 bytes, holgadamente dentro del límite de 4.000.000 de bytes para un solo mensaje, y Bitcoin Core incluye una aserción en tiempo de compilación que mantiene esas dos constantes coherentes entre sí.
El momento del anuncio es un control de privacidad, no un detalle de implementación. Bitcoin Core no anuncia una transacción en el instante en que se entera de ella. Los anuncios se agrupan por lotes y se envían con un temporizador aleatorio que en promedio es de dos segundos hacia los pares salientes y de cinco hacia los entrantes, de modo que un observador conectado a muchos nodos no puede usar el orden de llegada para averiguar dónde empezó un pago. Los bloques se saltan el retraso por completo, porque no hay nada que ocultar y los segundos cuestan dinero.
Gritar cada hash a cada par es caro, y Erlay es el remedio propuesto: los pares reconcilian periódicamente sketches breves (resúmenes algebraicos) de lo que tiene cada uno, en lugar de inundar con identificadores en todas direcciones.
Dónde aparece
Los inventarios son lo más ruidoso de la interfaz de red de un nodo y lo más fácil de observar.
La llamada RPC getpeerinfo desglosa el tráfico por tipo de mensaje, y el mensaje inv casi siempre figura entre los contadores más altos. Un nodo bien conectado gasta una parte real de su ancho de banda en anunciar hash que al final nadie necesitaba. Por eso, además, un pago aparece en un explorador de bloques segundos antes que en otro: son observadores distintos que oyen anuncios distintos desde diferentes partes de la red.
Un hábito que conviene desaprender: un mensaje inv no es un compromiso. Un nodo puede anunciar una transacción y expulsarla minutos después cuando su mempool se llena, y no le debe a nadie una rectificación.
Inventario frente a mempool
Un inventario es un mensaje; una mempool es un almacén, y solo uno de los dos sobrevive al momento. El mensaje inv le dice a un par que un hash existe en algún lugar. La mempool es el conjunto de transacciones sin confirmar que un nodo ha validado realmente, mantiene en memoria y está dispuesto a retransmitir o minar, con un tamaño de 300 MB por defecto y una política de expulsión que descarta primero las más baratas. Ver cómo su txid se propaga mediante anuncios inv le dice que la red se enteró de su pago. No le dice que alguien lo siga teniendo una hora después.