Serie explicativa sobre Discv5: #1
¿Alguna vez te has preguntado cómo se descubren los nodos de Ethereum dentro de la red? Si es así, ¡esta serie es perfecta para ti!
Este artículo es una traducción de “Discv5 Explainer Series: #1” escrito por Pier Two, traducido por Ari Kiry.
En este primer artículo, vamos a explicar el protocolo Discv5, centrándonos en la identidad de los nodos y la gestión de registros. Nuestro objetivo es presentar los diferentes componentes del protocolo de una manera fácil de entender, incluso si no estás familiarizado con la criptografía o las redes. Si tienes algunos conocimientos básicos sobre Ethereum, te resultará útil para seguir adelante.
Abordaremos una amplia gama de temas, desde el cifrado hasta los anuncios y la búsqueda, utilizando ejemplos para ilustrar los conceptos fundamentales. Al final de esta serie, habrás adquirido una comprensión sólida de cómo funciona Discv5 y por qué es fundamental para el ecosistema de Ethereum.
Introducción a Discv5
Uno de los elementos fundamentales de Ethereum es su sistema de comunicación peer-to-peer, el cual se basa en un conjunto de protocolos de red definidos. Estos protocolos establecen las reglas para la comunicación entre dos computadoras. En el contexto de Ethereum, estos protocolos determinan cómo los nodos envían y reciben mensajes. Por ejemplo, un protocolo define cómo los nodos pueden descubrirse entre sí en la red y compartir información sobre sus capacidades y estado. Otro protocolo establece cómo los nodos pueden solicitar y entregar bloques y transacciones entre ellos. Siguiendo estos protocolos, los nodos pueden comunicarse de manera segura y compatible. Uno de estos protocolos es Discv5, que es la abreviatura de Discovery Protocol V5.
¿Qué es Discv5?
Para comprender qué es Discv5 y cómo se relaciona con Ethereum, podemos considerar a Ethereum como dos capas distintas: ejecución y consenso. En ambas capas, existe un conjunto de protocolos de red que trabajan en paralelo para procesar las solicitudes entrantes y enviar las respuestas. En la capa de ejecución, encontramos Discv4 (la versión anterior de Discv5) y DevP2P (una pila de protocolos). Mientras tanto, en la capa de consenso, se utiliza Discv5 y LibP2P (otra pila de protocolos).
Discv5 es uno de estos protocolos que permite a los nodos descubrirse mutuamente para formar una red peer-to-peer. Los nodos que utilizan Discv5 pueden fungir como proveedores y consumidores de datos, y comunicarse directamente entre ellos sin intermediarios. Esto posibilita la descentralización, lo que significa que no existe ninguna autoridad o servidor central que controle la red o sus recursos.
Fue originalmente diseñado para Ethereum, pero puede aplicarse a cualquier red que necesite un mecanismo para descubrir pares (nodos) y conectarse con pares específicos que ofrecen servicios particulares. En comparación con su versión anterior, Discv4, Discv5 es la última versión que ofrece características adicionales, como la comunicación cifrada mediante criptografía, y permite a los nodos difundir información sobre sus servicios de manera escalable en la red.
Para comprender mejor los detalles técnicos, exploraremos cómo los nodos se identifican y gestionan los registros de otros nodos en la red.
Identidad de nodo y gestión de registros
Para participar en el protocolo Discv5, los nodos deben crear y mantener una identidad que siga un formato estándar conocido como registro de nodos de Ethereum (Ethereum Node Record o ENR). Este formato está especificado en la EIP-778.
Puedes pensar en un ENR como un registro de perfil que contiene información básica sobre un nodo, como su dirección IP, número de puerto y los protocolos que soporta. Por simplicidad, utilizaremos el término registro para referirnos a un ENR. Los nodos pueden compartir sus registros con otros nodos para facilitar la conexión y la comunicación entre ellos. A continuación, se detalla el contenido de un registro:
· Firma — es una forma de demostrar que el registro pertenece a un nodo específico y que no ha sido manipulado por terceros. Se crea utilizando un método criptográfico que consiste en aplicar una clave privada única conocida solo por el nodo para generar un código único, llamado firma, a partir de los datos del registro. Cualquier persona que tenga acceso a la clave pública, que forma parte del registro, puede verificar la firma utilizando el método criptográfico correspondiente.
· Seq — Un número que indica la actualidad del registro. Cada vez que el nodo actualiza uno de los campos de su registro, este número se incrementa en uno. De esta manera, otros nodos pueden determinar qué registro es más actual y evitar el uso de información obsoleta.
· Pares clave/valor — Una estructura de datos que almacena diversos atributos del nodo, como su dirección IP, número de puerto y protocolos admitidos. Cada atributo se identifica mediante una clave (un nombre corto) y tiene un valor correspondiente (los datos reales). Por ejemplo, la clave ip puede tener el valor 192.168.0.1. Los pares clave/valor se pueden personalizar según las necesidades y preferencias particulares de cada nodo.
La siguiente tabla muestra los pares clave/valor más comunes que utiliza el Discv5, tal y como se definen en la EIP:
Mientras que la clave id es obligatoria, el resto de claves son opcionales, lo que significa que pueden estar o no en el registro de un nodo. Como ya se ha mencionado, este formato de registro es flexible, ya que permite añadir pares clave-valor personalizados específicos para la red o la aplicación. Esto permite a los nodos de la red incluir más información según sea necesario.
Quizás te preguntes para qué sirven las distintas claves como ip6, tcp6 y udp6. En algunas redes, varios dispositivos pueden compartir la misma dirección IP pública, lo que puede dificultar la conexión a dispositivos específicos. Sin embargo, este problema se resuelve al incluir tanto direcciones IPv4 como IPv6 en el registro. De esta manera, se garantiza el acceso a los nodos desde ambos tipos de redes, facilitando así la conexión entre dispositivos.
Tabla de enrutamiento inspirada en Kademlia
En esta sección aprenderemos sobre cómo los nodos rastrean a otros nodos en la red. Cada nodo mantiene una estructura de datos conocida como tabla de enrutamiento. El diseño de esta tabla se inspira en la DHT (Tabla Hash Distribuida) de Kademlia, que se utiliza comúnmente en sistemas distribuidos para compartir archivos o almacenar datos. La DHT de Kademlia almacena pares clave-valor, donde la clave es el hash del contenido y el valor es el contenido real (por ejemplo, un archivo). Las claves en el DHT se organizan en base a la cercanía de los ID de los nodos. Trataremos esto más adelante, sin embargo, es importante mencionar cómo la tabla de enrutamiento en Discv5 difiere de Kademlia DHT y por qué se utiliza en primer lugar.
En el protocolo Discv5, los nodos no almacenan archivos ni proporcionan almacenamiento a otros nodos. En su lugar, mantienen una tabla de enrutamiento con registros (ENR) que se retransmiten en función de las distancias solicitadas a otros nodos. Este proceso permite descubrir nuevos nodos mediante una estructura de datos escalable que crece con el número de nodos. Independientemente del tamaño de la red, cualquier nodo puede encontrarse mediante un mecanismo de búsqueda. A continuación, examinaremos la tabla de enrutamiento y las implicaciones de su mantenimiento.
Una tabla de enrutamiento funciona como una guía telefónica que almacena los registros de otros nodos. En la sección anterior, mencionamos que cada registro tiene un ID único para identificar al nodo. Los nodos con ID similares se consideran vecinos debido a su proximidad en la estructura lógica de la red, no en términos de distancia física. Para medir la cercanía entre dos nodos, utilizamos una operación matemática llamada XOR, que calcula una “distancia” entre sus ID. XOR es una operación lógica que devuelve verdadero si solo una de las entradas es verdadera. Si ambas entradas son falsas, el resultado también es falso. Utilizamos XOR para comparar los ID de dos nodos y determinar su distancia relativa dentro de la organización lógica de la red. Veamos un ejemplo con dos IDs de nodos:
Nodo A = 10
Nodo B = 12
Para calcular el XOR de estos ID de nodo, primero los escribimos en forma binaria (utilizando sólo 0s y 1s). Esto significa convertir los valores 10 y 12 a sus equivalentes binarios:
Nodo A = 1 0 1 0
Nodo B = 1 1 0 0
A continuación, comparamos cada par de bits (0 ó 1) en la misma posición y anotamos un 0 si son iguales o un 1 si son diferentes:
1 0 1 0
1 1 0 0
- - - - -
0 1 1 0
- - - - -
Así, la distancia XOR entre el Nodo A y el Nodo B es 0110, que es 6 en notación decimal. Una distancia XOR mayor indica que hay más bits diferentes, mientras que una distancia XOR menor significa que los nodos están más cerca entre sí. Así es como la tabla de enrutamiento almacena y recupera registros de otros nodos en función de su proximidad.
Gestión de registros
Partiendo del concepto de tabla de enrutamiento, nos adentramos ahora en los detalles de cómo los nodos gestionan la información sobre otros nodos de la red. La tabla de enrutamiento se organiza en varios ‘buckets’ (contenedores), cada uno de los cuales contiene hasta 16 registros de nodos. Cada nodo puede tener hasta 256 buckets en su tabla de enrutamiento, y cada bucket corresponde a un rango de distancia diferente desde el nodo, medido mediante el XOR de sus claves públicas.
Los buckets se ordenan en función de la distancia creciente desde el nodo, de manera que el primer bucket almacena los vecinos más cercanos y el último los más lejanos. Dentro de cada bucket, los registros de los nodos se ordenan según el momento más reciente en que se vieron, ubicando los registros más recientes al final y los menos recientes al principio. Esta organización brinda al nodo la capacidad de identificar qué vecinos están activos y cuáles no.
Cuando un nodo descubre la existencia de un nuevo vecino a través de un mensaje o una búsqueda, intenta agregar el registro del vecino al bucket correspondiente según la distancia. Sin embargo, si el bucket ya está completo, el nodo no se limita a sobrescribir un registro existente. En su lugar, verifica si el registro más antiguo de ese bucket sigue activo enviando un mensaje PING (se explicará en el próximo artículo). Si recibe una respuesta dentro de un período de tiempo determinado, se considera que el registro sigue siendo válido y se mantiene en su lugar. Si no se recibe respuesta o se obtiene un mensaje de error, el registro se considera inválido o inalcanzable y se reemplaza con el nuevo registro.
La tabla de enrutamiento es dinámica y se actualiza constantemente a medida que los nodos se unen o abandonan la red, o cambian sus atributos. Con el fin de mantener una visión precisa de sus vecinos, cada nodo realiza periódicamente búsquedas de objetivos aleatorios dentro de cada rango de distancia. Este proceso permite al nodo descubrir nuevos nodos que se han unido o acercado a su vecindad, y eliminar nodos antiguos que se han ido o alejado.
Seguir leyendo
En este artículo, hemos abordado los fundamentos de Discv5, incluyendo cómo los nodos crean y verifican sus identidades, cómo almacenan y actualizan información sobre otros nodos utilizando registros de nodos de Ethereum (ENR) y tablas de enrutamiento, y cómo administran los registros que comparten con la red. Estos conceptos son esenciales para comprender los procesos de descubrimiento y comunicación entre los nodos de Ethereum.
En el próximo artículo, analizaremos la forma en que los nodos se comunican entre sí mediante cifrado y los distintos tipos de mensajes que se transmiten.
El protocolo Discv5 se implementa en el software de los nodos siguiendo la especificación del desarrollador. Para aquellos interesados, la especificación oficial se encuentra en el repositorio de Devp2p en GitHub.
A Pier Two le encantaría conocer tu opinión sobre esta serie o responder cualquier pregunta que tengas. No dudes en compartir tus comentarios o contactar a través de redes sociales. Si estás interesado en contribuir a la implementación en C# de Discv5, visita el repositorio de GitHub para obtener más información. Aquí tienes el enlace al segundo articulo de la serie.
Además, si estás interesado en aprender más sobre Ethereum o la tecnología blockchain, aquí tienes algunos recursos que pueden resultarte útiles:
· GitHub — ethereumbook/ethereumbook: Mastering Ethereum, by Andreas M. Antonopoulos, Gavin Wood