Saltar al contenido
buybitcoinsmart

Glosario / Nodos y software

Filtro compacto de bloque

¿Qué es un filtro compacto de bloque?
Un filtro compacto de bloque es un pequeño resumen con codificación Golomb de los scripts de bloqueo que un bloque crea y gasta, publicado por nodos completos para que una billetera ligera pueda comprobar bloques sin revelar lo que posee.

Se especifica en el BIP-158.

Un filtro abarca un bloque, y enumera scripts de bloqueo, no direcciones, montos ni ID de transacción. BIP-158 establece el tipo básico en 0x00, con P igual a 19 y M igual a 784.931, así que un elemento que no está en el bloque sigue coincidiendo alrededor de una vez cada 784.931 intentos. Como la comparación se hace en su dispositivo, el nodo que sirve el filtro nunca se entera de qué monedas son suyas.

Cómo funciona

Un filtro compacto de bloque se construye proyectando el hash de cada script de bloqueo que un bloque crea y gasta sobre un único rango numérico, ordenando los resultados y anotando solo las distancias entre ellos.

La especificación establece la lista de elementos, así que dos nodos honestos producen filtros idénticos byte a byte para el mismo bloque. Para cada transacción, el filtro toma el script de bloqueo de la salida anterior que gasta cada entrada, salvo en la transacción coinbase, y el scriptPubKey de cada salida. Una categoría queda fuera a propósito: las salidas que empiezan por OP_RETURN. BIP-158 las excluye para que más adelante una salida OP_RETURN de la transacción coinbase pueda fijar los filtros, como ya ocurre con el compromiso de testigo, sin que el compromiso tenga que abarcarse a sí mismo.

El cálculo del hash usa SipHash con c igual a 2 y d igual a 4, con una clave formada por los primeros 16 bytes del hash del bloque en su forma estándar little endian (el byte menos significativo primero). Esa clave cambia con cada bloque, así que el mismo script cae en un lugar distinto en cada uno y nadie puede construir una tabla de búsqueda que funcione en toda la cadena. Después, cada resultado de 64 bits se proyecta sobre el rango de cero a N por M con una multiplicación y un desplazamiento en lugar de una división.

La compresión es a lo que alude el nombre: los valores ordenados se reemplazan por sus diferencias sucesivas, y cada diferencia se convierte en un cociente en unario seguido de 19 bits de resto, que es la codificación Golomb-Rice. El resultado no puede ocupar menos de N por 20 bits, y va precedido del número de elementos N, codificado como CompactSize; un bloque cuyo filtro no tiene elementos se almacena como un solo byte de ceros. Un nodo dispuesto a servir estos filtros anuncia el bit de servicio NODE_COMPACT_FILTERS, definido como 1 desplazado 6 posiciones a la izquierda.

Dónde aparece

Los filtros compactos de bloques son el método de sincronización que eligen las billeteras que prefieren gastar ancho de banda antes que entregar una lista de direcciones al servidor de alguien.

Wasabi Wallet es el ejemplo de nuestras propias reseñas: solo para escritorio, solo bitcoin, todas las conexiones por Tor de forma predeterminada, y sincronización a partir de filtros para que ningún servidor sepa qué direcciones le pertenecen a usted. En este sitio recibe una calificación de 3,6 y la marca de precaución, por un motivo que no tiene nada que ver con la sincronización. Electrum, con una calificación de 4,4, opta por el enfoque contrario: verifica mediante SPV contra un servidor de indexación que cualquiera puede ejecutar, y ese servidor acaba teniendo la lista de direcciones que usted posee.

Hay dos límites que conviene conocer antes de apoyarse en los filtros. Un filtro se basa en scripts, así que no se puede buscar en él un ID de transacción: con solo un txid, sigue haciendo falta un nodo o un explorador de bloques. Y las salidas OP_RETURN están ausentes por construcción, así que el software que observa salidas portadoras de datos no puede construirse en absoluto sobre este mecanismo.

Filtro compacto de bloque frente a retransmisión de bloques compactos

Un filtro compacto de bloque le dice a una billetera si vale la pena descargar un bloque; la retransmisión de bloques compactos, especificada en BIP152, reduce un bloque que ya viaja entre dos nodos completos.

Los públicos son distintos. Los filtros son por bloque, deterministas, usan como clave los primeros 16 bytes del hash del bloque y los descargan clientes que no guardan ninguna cadena propia. La retransmisión reemplaza la mayoría de las transacciones de un bloque por identificadores de 48 bits cuya clave sale del hash conjunto del encabezado del bloque y de un nonce que elige el remitente, y no ahorra nada a un destinatario cuya mempool no tenga ya esas transacciones. El filtro le ahorra a un teléfono descargar bloques que no necesita; la retransmisión le ahorra a un nodo recibir transacciones dos veces. La palabra compartida "compacto" es todo el parecido.

No confundir con

Preguntas frecuentes

¿Puede un filtro compacto de bloque revelarle a alguien qué direcciones observa mi billetera?

No. El nodo construye el filtro a partir del propio contenido del bloque y lo publica para todos, así que nada sobre su billetera sale de su dispositivo. El par que le sirve un bloque coincidente sí se entera de que usted solicitó ese bloque concreto, lo que es una señal mucho más débil que una lista de direcciones.

¿Por qué mi billetera descarga a veces un bloque que no tiene nada que ver conmigo?

Porque los filtros son probabilísticos. Un elemento que usted comprueba y que no está en el bloque sigue coincidiendo aproximadamente una vez cada 784.931 intentos, así que una billetera que observa muchos scripts acumula algunos falsos positivos, descarga esos bloques y no encuentra dentro nada suyo.

¿Puedo buscar un ID de transacción en un filtro compacto de bloque?

No. Un filtro básico de BIP-158 solo contiene scripts de bloqueo: el scriptPubKey de cada salida, salvo las salidas OP_RETURN, más el script de bloqueo de la salida anterior que gasta cada entrada que no es coinbase. Un ID de transacción no está ahí, así que sigue necesitando un nodo o un explorador de bloques.

Para seguir leyendo

Términos relacionados

Más en la sección Nodos y software

Leer esta página en inglés