El protocolo Bitcoin P2P es la base de la red de Bitcoin, permitiendo la comunicación y sincronización entre los diferentes nodos. Estos nodos, que funcionan como pares, se encargan de mantener la red y procesar transacciones.
¿Qué es el protocolo P2P de Bitcoin?
El protocolo P2P de Bitcoin (Peer-to-Peer) es un sistema de red descentralizado que permite a los nodos de Bitcoin comunicarse e intercambiar información. Esto permite que la red de Bitcoin funcione sin necesidad de un servidor centralizado.
Red P2P
La red P2P de Bitcoin está formada por miles de nodos que funcionan de manera independiente. Cada nodo puede comunicarse con cualquier otro nodo de la red, lo que permite una gran resistencia y flexibilidad.
Nodos completos
Los nodos completos, también conocidos como full nodes, son los que descargan y verifican cada bloque y transacción antes de retransmitirlos a otros nodos. Estos nodos juegan un papel crucial en la seguridad de la red de Bitcoin.
- Nodos de archivo: Son nodos completos que almacenan toda la blockchain y pueden servir bloques históricos a otros nodos.
- Nodos recortados: Son nodos completos que no almacenan toda la blockchain.
Clientes SPV
Los clientes SPV (Simplified Payment Verification) son clientes ligeros que no almacenan toda la blockchain. Estos clientes se conectan a nodos completos para verificar transacciones.
Descubrimiento de pares
Cuando un nodo se inicia por primera vez, no conoce las direcciones IP de otros nodos activos. Para descubrir algunas direcciones IP, consulta uno o más nombres DNS (llamados semillas DNS) codificados en Bitcoin Core y BitcoinJ.
Las semillas DNS son mantenidas por miembros de la comunidad Bitcoin. Algunas proporcionan servidores de semillas DNS dinámicos que obtienen automáticamente las direcciones IP de los nodos activos escaneando la red. Otros proporcionan semillas DNS estáticas que se actualizan manualmente y tienen más probabilidades de proporcionar direcciones IP para nodos inactivos. En cualquier caso, los nodos se agregan a la semilla DNS si se ejecutan en los puertos predeterminados de Bitcoin de 8333 para mainnet o 18333 para testnet.
Los resultados de la semilla DNS no están autenticados y un operador de semilla malicioso o un atacante man-in-the-middle en la red puede devolver solo direcciones IP de nodos controlados por el atacante, aislando un programa en la red del atacante y permitiendo al atacante alimentarlo con transacciones y bloques falsos. Por esta razón, los programas no deben confiar exclusivamente en las semillas DNS.
Una vez que un programa se ha conectado a la red, sus pares pueden comenzar a enviarle mensajes addr (dirección) con las direcciones IP y los números de puerto de otros pares en la red, proporcionando un método completamente descentralizado de descubrimiento de pares. Bitcoin Core mantiene un registro de los pares conocidos en una base de datos persistente en disco que generalmente le permite conectarse directamente a esos pares en los inicios posteriores sin tener que usar semillas DNS.
Conexión a pares
Para conectarse a un par, se envía un mensaje "version", que contiene el número de versión, el bloque y la hora actual al nodo remoto. El nodo remoto responde con su propio mensaje "version". Luego, ambos nodos envían un mensaje "verack" al otro nodo para indicar que la conexión se ha establecido.
Reenvío de transacciones
Para enviar una transacción a un par, se envía un mensaje "inv". Si se recibe un mensaje de respuesta getdata, la transacción se envía usando tx. El par que recibe esta transacción también reenvía la transacción de la misma manera, dado que es una transacción válida.
Conjunto de memoria (Mempool)
Los pares completos pueden realizar un seguimiento de las transacciones no confirmadas que son elegibles para ser incluidas en el siguiente bloque. Esto es esencial para los mineros que realmente extraerán algunas o todas esas transacciones, pero también es útil para cualquier par que quiera realizar un seguimiento de las transacciones no confirmadas, como los pares que sirven información de transacciones no confirmadas a los clientes SPV.
Nodos que se comportan mal
Tenga en cuenta que para ambos tipos de reenvío, existen mecanismos para castigar a los pares que se comportan mal que ocupan ancho de banda y recursos informáticos al enviar información falsa. Si un par obtiene una puntuación de prohibición superior al umbral -banscore=
¿Cómo funcionan los nodos SPV?
Los nodos SPV (Simplified Payment Verification) son nodos ligeros que no almacenan la blockchain completa. Estos nodos se basan en un método que les permite verificar transacciones sin tener que descargar toda la blockchain.
Verificación de pagos simplificada
La verificación de pagos simplificada (SPV) se basa en la profundidad de una transacción en la blockchain, en lugar de su altura. En lugar de construir una cadena completa de bloques y transacciones, un nodo SPV verifica la cadena de bloques (pero no todas las transacciones) y la vincula a la transacción de interés. Para verificar una transacción en el bloque 300.000, un nodo SPV establece una conexión entre la transacción y el bloque que la contiene, utilizando una ruta merkle (vea Árboles merkle). El nodo SPV espera a ver los seis bloques 300.001 a 300.006 apilados en la parte superior del bloque que contiene la transacción y la verifica estableciendo su profundidad debajo de los bloques 300.006 a 300.00El hecho de que otros nodos en la red hayan aceptado el bloque 300.000 y luego hayan realizado el trabajo necesario para producir seis bloques más en la parte superior es una prueba, por proxy, de que la transacción no fue un gasto doble.
Filtros Bloom
Los filtros Bloom son una estructura de datos probabilística que permite a los nodos SPV solicitar transacciones que coincidan con un patrón específico sin revelar exactamente qué direcciones están buscando. Esto ayuda a proteger la privacidad de los usuarios.
¿Cómo se sincroniza la blockchain?
Cuando un nodo se conecta a la red, comienza a sincronizar su blockchain con la de otros nodos. Esto implica descargar y verificar todos los bloques de la blockchain. El proceso de sincronización de la blockchain comienza con el mensaje version, porque contiene BestHeight, la altura actual de la blockchain de un nodo (número de bloques). Un nodo verá los mensajes version de sus pares, sabrá cuántos bloques tiene cada uno y podrá comparar con cuántos bloques tiene en su propia blockchain. Los nodos conectados intercambiarán un mensaje getblocks que contiene el hash (huella digital) del bloque superior en su blockchain local. Uno de los pares podrá identificar el hash recibido como perteneciente a un bloque que no está en la parte superior, sino que pertenece a un bloque más antiguo, deduciendo así que su propia blockchain local es más larga que la de su par.
Intercambio de "Inventario"
Lo primero que hará un nodo completo una vez que se conecte a pares es intentar construir una blockchain completa. Si es un nodo completamente nuevo y no tiene ninguna blockchain, solo conoce un bloque, el bloque génesis, que está estáticamente integrado en el software del cliente. Comenzando con el bloque #0 (el bloque génesis), el nuevo nodo tendrá que descargar cientos de miles de bloques para sincronizarse con la red y restablecer la blockchain completa. El proceso de sincronización de la blockchain comienza con el mensaje version, porque contiene BestHeight, la altura actual de la blockchain de un nodo (número de bloques). Un nodo verá los mensajes version de sus pares, sabrá cuántos bloques tiene cada uno y podrá comparar con cuántos bloques tiene en su propia blockchain. Los nodos conectados intercambiarán un mensaje getblocks que contiene el hash (huella digital) del bloque superior en su blockchain local. Uno de los pares podrá identificar el hash recibido como perteneciente a un bloque que no está en la parte superior, sino que pertenece a un bloque más antiguo, deduciendo así que su propia blockchain local es más larga que la de su par. El par que tiene la blockchain más larga tiene más bloques que el otro nodo y puede identificar qué bloques necesita el otro nodo para "ponerse al día". Identificará los primeros 500 bloques para compartir y transmitirá sus hashes usando un mensaje inv (inventario). El nodo que falta estos bloques los recuperará, emitiendo una serie de mensajes getdata solicitando los datos completos del bloque e identificando los bloques solicitados usando los hashes del mensaje inv.
Conjunto de transacciones (Mempool)
Casi todos los nodos en la red Bitcoin mantienen una lista temporal de transacciones no confirmadas llamada conjunto de memoria, mempool o conjunto de transacciones. Los nodos utilizan este conjunto para realizar un seguimiento de las transacciones que son conocidas por la red pero que aún no están incluidas en la blockchain. Por ejemplo, un nodo que contiene la billetera de un usuario utilizará el conjunto de transacciones para rastrear los pagos entrantes a la billetera del usuario que se han recibido en la red pero que aún no se han confirmado. A medida que se reciben y verifican las transacciones, se agregan al conjunto de transacciones y se retransmiten a los nodos vecinos para propagarse en la red.
Conclusión
El protocolo Bitcoin P2P es esencial para la seguridad y el funcionamiento de la red Bitcoin. Permite la comunicación y la sincronización entre los nodos, lo que garantiza que todos los nodos tengan una copia consistente de la blockchain. Si bien los nodos SPV ofrecen una forma más eficiente de interactuar con la red, los nodos completos siguen siendo cruciales para la seguridad y la descentralización de Bitcoin.
Si quieres conocer otros artículos parecidos a Bitcoin p2p protocol para entender la red de bitcoin puedes visitar la categoría Finanzas / Inversiones.
