Mastering Bitcoin
8. La Red Bitcoin » Descubrimiento de Red
Página 51 de 98
Descubrimiento de Red
Cuando un nodo nuevo arranca, debe descubrir otros nodos en la red bitcoin para poder participar.
Para iniciar este proceso, un nuevo nodo debe descubrir al menos un nodo existente en la red y conectarse a él. La ubicación geográfica de los otros nodos es irrelevante; la topología de la red bitcoin no está definida geográficamente. Por lo tanto, cualquier nodo bitcoin existente puede ser seleccionado al azar.
Para conectarse a un compañero conocido, los nodos establecen una conexión TCP, por lo general en el puerto 8333 (puerto conocido generalmente como el utilizado por bitcoin), o un puerto alternativo si se proporciona. Al establecer una conexión, el nodo se iniciará un «apretón de manos» (handshake) mediante la transmisión de un mensaje de versión, que contiene información básica de identificación, incluyendo:
PROTOCOL_VERSION
Una constante que define la versión del protocolo P2P bitcoin que el cliente «habla» (por ejemplo, 70002)
nLocalServices
Una lista de los servicios locales soportados por el nodo, actualmente solo NODE_NETWORK
nTime
La fecha y hora actuales
AddrYou
La dirección IP del nodo remoto como se ve desde este nodo
AddrMe
La dirección IP del nodo local, tal como se ve desde el otro nodo local Subver
Una subversión que muestra el tipo de software que se ejecuta en este nodo (por ejemplo, "/Satoshi:0.9.2.1/").
BestHeight
La altura de bloque de la cadena de bloques de este nodo
Ver GitHub[1] para un ejemplo de la versión del mensaje de red.
El nodo de pares responde con verack para reconocer y establecer una conexión, y envía opcionalmente su propio mensaje de versión si quiere corresponder a la conexión y conectar de nuevo como un igual.
¿Cómo funciona un nuevo nodo para encontrar compañeros? El primer método consiste en hacer una consulta DNS utilizando una serie de «semillas de DNS», que son los servidores DNS que proporcionan una lista de direcciones IP de nodos Bitcoin. Algunas de esas semillas DNS proporcionan una lista estática de direcciones IP de los nodos Bitcoin estables que están a la escucha. Algunas de las semillas de DNS son implementaciones personalizadas de BIND (Berkeley Internet Name Daemon) que devuelven un subconjunto aleatorio de una lista de direcciones de nodo bitcoin recogidos por un rastreador o un nodo bitcoin de larga duración. El cliente Bitcoin Core contiene los nombres de cinco semillas DNS diferentes. La diversidad de la propiedad y la diversidad de la implementación de las diferentes semillas DNS ofrece un alto nivel o fiabilidad del proceso de arranque inicial. En el cliente Bitcoin Core, la preferencia de utilizar las semillas de DNS se controla con la opción -dnsseed (ajustado a 1 por defecto, para usar la semilla DNS).
Alternativamente, un nodo nuevo en el proceso de arranque que no sabe nada de la red debe tener la dirección IP de al menos un nodo bitcoin, después de lo cual se puede establecer conexiones a través de nuevas presentaciones. El argumento de línea de comandos -seednode se puede utilizar para conectarse a un nodo solo para presentaciones, usándolo como una semilla. Después de utilizar el nodo de semilla inicial para hacer las presentaciones, el cliente se desconecta de ella y utiliza los compañeros recién descubiertos.

Figura 4. El apretón de manos inicial entre pares
Una vez que se han establecido una o más conexiones, el nuevo nodo enviará un mensaje addr que contiene su propia dirección IP para sus vecinos. Los vecinos, a su vez, remitirán el mensaje addr a sus vecinos, lo que garantiza que el nodo recién conectado se convierte en bien conocido y mejor conectado. Además, el nodo recién conectado puede enviar getaddr a los vecinos, pidiéndoles que le devuelvan una lista de direcciones IP de otros compañeros. De esa manera, un nodo puede encontrar compañeros para conectarse y anunciar su existencia en la red para que otros nodos puedan encontrarlo. Descubrimiento y propagación de la dirección muestra el protocolo de descubrimiento de direcciones.

Figura 5. Descubrimiento y propagación de la dirección
Un nodo debe conectarse a unos cuantos compañeros diferentes a fin de establecer diversos caminos en la red Bitcoin. Los caminos no son fiables (nodos que van y vienen), por lo que el nodo debe seguir descubriendo nuevos nodos a medida que pierde conexiones antiguas, así como ayudar a otros nodos que inician su proceso de arranque. Solo se necesita una conexión para arrancar, ya que el primer nodo puede ofrecer presentaciones a sus nodos pares y los pares puede ofrecer nuevas presentaciones. También es innecesario y derrochador de recursos de red conectarse a más de un puñado de nodos. Después de iniciarse, un nodo se acordará de sus conexiones exitosas entre pares más recientes, por lo que si se reinicia puede restablecer rápidamente las conexiones con su antigua red de pares. Si ninguno de los pares anteriores responde a su solicitud de conexión, el nodo puede utilizar los nodos de semillas para realizar el arranque de nuevo.
En un nodo que ejecuta el cliente Bitcoin Core, puede listar las conexiones entre pares con el comando getpeerinfo:
$ bitcoin-cli getpeerinfo
[
{
"addr" : "85.213.199.39:8333",
"services" : "00000001",
"lastsend" : 1405634126,
"lastrecv" : 1405634127,
"bytessent" : 23487651,
"bytesrecv" : 138679099,
"conntime" : 1405021768,
"pingtime" : 0.00000000,
"version" : 70002,
"subver" : "/Satoshi:0.9.2.1/",
"inbound" : false,
"startingheight" : 310131,
"banscore" : 0,
"syncnode" : true
},
{
"addr" : "58.23.244.20:8333",
"services" : "00000001",
"lastsend" : 1405634127,
"lastrecv" : 1405634124,
"bytessent" : 4460918,
"bytesrecv" : 8903575,
"conntime" : 1405559628,
"pingtime" : 0.00000000,
"version" : 70001,
"subver" : "/Satoshi:0.8.6/",
"inbound" : false,
"startingheight" : 311074,
"banscore" : 0,
"syncnode" : false
}
]
Para ignorar la gestión automática de pares y especificar una lista de direcciones IP, los usuarios pueden proporcionar la opción:
-connect=<IPAddress>
Y especificar una o más direcciones IP. Si se utiliza esta opción, el nodo sólo se conectará a las direcciones IP seleccionados, en lugar de descubrir y mantener las conexiones entre pares automáticamente.
Si no hay tráfico en una conexión, los nodos se envían periódicamente un mensaje para mantener la conexión. Si un nodo no se ha comunicado en una conexión por más de 90 minutos, se supone que está desconectado y se buscará un nuevo par. De este modo, la red se ajusta dinámicamente a los nodos transitorios y problemas de la red, y puede crecer y encogerse orgánicamente según sea necesario, sin ningún tipo de control central.