Mastering Bitcoin
8. La Red Bitcoin » Nodos de Verificación de Pago Simplificada (SPV)
Página 54 de 98
Nodos de Verificación de Pago Simplificada (SPV)
No todos los nodos tienen la capacidad de almacenar la cadena de bloques completa. Muchos clientes bitcoin están diseñados para funcionar en dispositivos con restricciones de espacio y de energía, tales como teléfonos inteligentes, tabletas o sistemas embebidos. Para tales dispositivos, se utiliza un método de verificación de pago simplificada (SPV) que permite operar sin almacenar la cadena de bloques completa. Este tipo de clientes se llaman clientes SPV o clientes ligeros. Con el aumento en la adopción de bitcoin, el nodo SPV se está convirtiendo en la forma más común de nodo bitcoin, especialmente para carteras Bitcoin.
Los nodos SPV descargan solo las cabeceras de bloque y no descargan las transacciones incluidas en cada bloque. La cadena resultante de bloques, sin transacciones, es 1000 veces menor que la cadena de bloques completa. Los nodos SPV no pueden construir una imagen completa de todos los UTXOs que están disponibles para el gasto, ya que no saben acerca de todas las transacciones en la red. Los nodos SPV verifican las transacciones utilizando una metodología ligeramente diferente que depende de los pares para proporcionar vistas parciales de las partes relevantes de la cadena de bloques bajo demanda.
Como analogía, un nodo completo es como un turista en una ciudad extraña, equipado con un mapa detallado de cada calle y de cada dirección. En comparación, un nodo SPV es como un turista en una ciudad extraña preguntando a extraños al azar indicaciones giro a giro conociendo solo una avenida principal. Aunque ambos turistas pueden verificar la existencia de una calle al visitarla, el turista sin un mapa no sabe lo que hay más allá de las calles laterales y no sabe qué otras calles existen. Situado frente al número 23 de Church Street, el turista sin un mapa no puede saber si hay una docena de otras direcciones «23 Church Street» en la ciudad y si esta es la correcta. La mejor opción del turista sin mapas es preguntar a bastante gente y esperar que algunos de ellos no le estén tratando de robar.
La verificación de pago simplificada verifica las transacciones en función de su profundidad en la cadena de bloques, en vez de en su altura. Mientras que un nodo completo de la cadena de bloques construirá una cadena completamente verificada de miles de bloques y transacciones que alcanza (atrás en el tiempo) toda la cadena de bloques hasta el bloque génesis, un nodo SPV verificará la cadena de todos los bloques (pero no todas las transacciones) y vinculará esa cadena a la transacción de interés.
Por ejemplo, al examinar una transacción en el bloque 300.000, un nodo completo enlaza todos los 300.000 bloques desde el bloque génesis y crea una base de datos completa de UTXO, estableciendo la validez de la transacción mediante la comprobación de que el UTXO se encuentra sin gastar. Un nodo SPV no puede validar si el UTXO está sin gastar. En su lugar, el nodo SPV establecerá un vínculo entre la transacción y el bloque que lo contiene, usando una ruta (ver Árboles de Merkle). A continuación, el nodo SPV espera hasta que ve los seis bloques de 300.001 a 300.006, apilados encima del bloque que contiene la transacción y lo verifica mediante el establecimiento de su profundidad bajo los bloques 300.006 a 300.001. El hecho de que otros nodos de la red acepten el bloque 300.000 y luego hayan hecho el trabajo necesario para producir seis bloques más en la parte superior del mismo es la prueba, de forma indirecta, de que la operación no fue un doble gasto.
No se puede convencer a un nodo SPV de que existe una transacción en un bloque cuando la transacción en realidad no existe. El nodo SPV establece la existencia de una transacción en un bloque solicitando una prueba de ruta merkle y validando la prueba de trabajo en la cadena de bloques. Sin embargo, la existencia de una transacción puede estar «oculta» para un nodo SPV. Un nodo SPV puede definitivamente probar que existe una transacción, pero no puede verificar que una transacción, como un doble gasto de la misma UTXO, no exista, ya que no tiene un registro de todas las transacciones.
Esta vulnerabilidad se puede utilizar en un ataque de denegación de servicio o en un ataque de doble gasto contra nodos SPV. Para defenderse de esto, un nodo SPV necesita conectarse al azar a varios nodos, y así aumentar la probabilidad de que esté en contacto con al menos un nodo honesto. Esta necesidad de conectarse de forma aleatoria tiene como consecuencia que los nodos SPV también sean vulnerables a los ataques de particionamiento de la red o a ataques Sybil, donde están conectados a nodos falsos o a redes falsas y no tienen acceso a nodos honestos o a la red bitcoin real.
A efectos prácticos, los nodos SPV bien conectados son suficientemente seguros, manteniendo el equilibrio adecuado entre las necesidades de recursos, practicidad y seguridad. Sin embargo, para una seguridad infalible lo mejor es ejecutar un nodo completo de cadena de bloques.
Un nodo completo de cadena de bloques verifica una transacción mediante la comprobación de toda la cadena de miles de bloques por debajo de ella con el fin de garantizar que el UTXO no esté gastado, mientras que un nodo SPV comprueba la profundidad del bloque, que estará cubierto solo por un puñado de bloques por encima de ella.
Para obtener las cabeceras de bloque, los nodos SPV utilizan un mensaje getheaders en lugar de getblocks. El compañero que responda, enviará hasta 2000 cabeceras de bloques utilizando un único mensaje headers. El proceso es similar al utilizado por un nodo completo para recuperar bloques completos. Los nodos SPV también establecen un filtro en la conexión con sus compañeros, filtrando el flujo de bloques y futuras transacciones enviados por los compañeros. Cualquier transacción de interés se recupera mediante una petición getdata. El compañero genera como respuesta un mensaje tx que contiene las transacciones. Nodo SPV sincronizando las cabeceras de bloque muestra la sincronización de las cabeceras de bloque.

Figura 7. Nodo SPV sincronizando las cabeceras de bloque
El hecho de que los nodos SPV necesiten recuperar transacciones específicas para verificarlas de forma selectiva, hace que se genere un riesgo para la privacidad. A diferencia de los nodos completos de cadena de bloques, que recogen todas las transacciones dentro de cada bloque, las peticiones de datos específicos por parte de los nodos SPV pueden revelar inadvertidamente las direcciones de su cartera.
Por ejemplo, un tercero podría monitorizar la red y llevar un registro de todas las transacciones solicitadas por una cartera en un nodo SPV, utilizando las asociaciones de direcciones bitcoin con el usuario de esa cartera y destruyendo la privacidad del usuario.
Poco después de la introducción de los SPV/nodos ligeros, los desarrolladores de bitcoin añadieron una característica llamada filtros bloom para abordar los riesgos de privacidad de los nodos SPV. Los filtros bloom permiten a los nodos SPV recibir un subconjunto de transacciones sin revelar con precisión en qué direcciones están interesados, a través de un mecanismo de filtrado que utiliza probabilidades en lugar de patrones fijos.