Glosario / Nodos y software
Neutrino
También se conoce como BIP157 o Filtros compactos de bloques.
- ¿Qué es Neutrino?
- Neutrino es el diseño de cliente ligero en el que su billetera descarga un filtro diminuto por cada bloque, lo comprueba localmente y solo obtiene los bloques completos que podrían afectarle.
Se especifica en el BIP-157.
Toda la idea consiste en dar la vuelta al esquema anterior. En lugar de decirle a un servidor qué direcciones observar, la billetera toma un resumen compacto de cada bloque y busca las coincidencias en su propio hardware. Bitcoin Core puede construir estos filtros desde la versión 0.19.0, de noviembre de 2019, y servirlos a los pares desde la 0.21.0, así que el mecanismo ya no depende de confiar en un único proveedor.
Cómo funciona
Neutrino se apoya en dos especificaciones que se reparten un mismo trabajo.
BIP158 define el filtro en sí: para cada bloque, un conjunto que contiene cada script de bloqueo que el bloque crea y cada script de bloqueo que gasta, comprimido en una estructura con codificación Golomb-Rice. Sus dos parámetros los establece la especificación, P igual a 19 y M igual a 784.931, lo que da una proporción de falsos positivos de aproximadamente uno entre 784.931 por elemento comprobado. En la práctica, una billetera que observa unas pocas docenas de scripts descarga un puñado de bloques innecesarios al año.
BIP157 define los mensajes que hacen circular esos filtros: getcfilters y cfilter para los filtros, getcfheaders y cfheaders para la cadena de los encabezados de filtro, y getcfcheckpt para los puntos de control periódicos. Los encabezados de filtro importan más de lo que parece. Cada uno fija el anterior, así que un cliente puede solicitar puntos de control a varios pares independientes y advertir de inmediato si uno de ellos sirve un conjunto de filtros distinto del de los demás, sin necesidad de descargar los bloques para averiguarlo.
A partir de ahí, la rutina de la billetera es sencilla. Sincroniza los encabezados de bloque, descarga cada filtro, comprueba cada uno frente a los scripts que posee y solicita el bloque completo solo cuando un filtro indica que podría haber una coincidencia. El par que sirve ese bloque se entera de que usted quería el bloque 912.345, y de nada más, lo que es una señal mucho más débil que una lista de sus direcciones. En un nodo de Bitcoin Core, el índice se activa con la opción blockfilterindex, que ocupaba unos 4 GiB de disco cuando se publicó la funcionalidad, y se sirve a los pares con la opción peerblockfilters.
Dónde aparece
Neutrino es el backend de cadena de las billeteras Lightning móviles que se niegan a ejecutar un servidor.
El nombre corresponde ante todo a la implementación en Go de Lightning Labs, que lnd puede usar en lugar de un nodo completo, y ahí es donde la mayoría de la gente lo encuentra: una billetera de teléfono que abre canales y paga facturas sin llevar una blockchain propia. Breez y varias otras billeteras móviles siguen el mismo enfoque.
El costo es ancho de banda y paciencia. Un cliente Neutrino descarga cada filtro, haya o no alguna coincidencia, así que consume muchos más datos que una billetera que se limita a pedir su saldo a un servidor, y restaurar un respaldo antiguo implica recorrer los filtros hacia adelante desde la altura de creación de la billetera en lugar de obtener una respuesta en una sola consulta. Con una conexión móvil con límite de datos, esa disyuntiva es una decisión real, no un trámite.
Neutrino frente a filtros de Bloom BIP37
Neutrino hace que el cliente filtre los bloques; BIP37 hacía que el cliente entregara su filtro a un servidor, que es justo al revés. Un filtro de Bloom de BIP37 se construye a partir de sus propias direcciones y se envía a un par, y los investigadores demostraron repetidamente que los falsos positivos apenas sirven para ocultar lo que contiene. También era una forma barata de denegación de servicio, ya que cualquier par podía pedir a un nodo que volviera a escanear toda la cadena con un filtro arbitrario. Bitcoin Core dejó de servir BIP37 de forma predeterminada en la versión 0.19.0, la misma versión que introdujo el índice de filtros compactos, y cualquier billetera que todavía dependa de él está revelando su conjunto de direcciones al nodo al que esté conectada en ese momento.
Neutrino frente a un servidor Electrum
Neutrino traslada el trabajo y el conocimiento a su dispositivo; un servidor Electrum se queda con ambos. Consultar a un servidor cuesta kilobytes y da la respuesta al instante, y por eso lo prefieren las billeteras de escritorio, pero el operador acaba en posesión de su historial de direcciones. Neutrino, en cambio, gasta gigabytes a lo largo de la vida de una billetera para mantener ese historial en su teléfono.