Red
Bitcoin utiliza una red de difusión simple para propagar transacciones y bloques. Todas las comunicaciones se realizan por protocolo de control de transmisión (transmission control protocol, o TCP). Bitcoin es plenamente capaz de usar otros puertos a parte del puerto 8333 a través del -port parameter. IPv6 es compatible con Bitcoind/Bitcoin-Qt v0.7.
Contenido
Mensajes
- version – información sobre versión del programa y conteo de bloques. Se intercambia en la primera conexión.
- verack – es enviado como respuesta a un mensaje version para acreditar que estamos dispuestos a conectar.
- addr – lista de una o más direcciones IP y puertos.
- inv – “tengo los siguientes bloques/transacciones: …” Normalmente es enviado solo cuando se está retransmitiendo un nuevo bloque o transacción. Es solo una lista, no datos.
- getdata – petición por un bloque o transacción por hash.
- getblocks – petición de un inv de todos los bloques en un rango.
- getheaders – petición de un mensaje header con todos los headers de los bloques en un rango.
- tx – enviar una transacción. Se manda solo en respuesta a una petición getdata.
- block – enviar un bloque. Se manda solo en respuesta a una petición getdata.
- headers – enviar hasta 2 mil headers de bloques. Non-generators pueden descargar headers de bloques en lugar de bloques enteros.
- getaddr – petición por un mensaje addr que contiene un conjunto de pares known-active (para bootstrapping).
- submitorder, checkorder, y reply – se usan al realizar un .
- alert – enviar una alerta a la red.
- ping – no hace nada. Se usa solo para chequear que la conexión sigue en línea. Ocurrirá un error en el TCP si la conexión falla.
Hay más información técnica disponible en el .
Conexión
Para conectarte con un par, debes enviar un mensaje version con tu número de versión, block count y hora actual. El par remoto te enviará de vuelta un mensaje verack y su propio mensaje version, si acepta conexiones de tu versión. Tú responderás con tu propio verack si aceptas las conexiones de su versión.
Se recolectan los datos de hora de todos tus pares y la mediana será usada por Bitcoin para todas las tareas de red que utilizan hora (excepto por otros mensajes version).
Luego intercambias mensajes getaddr y addr, guardando todas las direcciones. Los mensajes addr a menudo contienen una sola dirección, pero pueden contener hasta mil. Esto es más común al comienzo de un intercambio.
Retransmisión estándar
Cuando alguien envía una transacción, manda un mensaje inv a todos los pares con la transacción. Los pares requerirán la transacción completa con getdata. Si consideran que la transacción es válida luego de recibirla, difundirán la transacción a todos los pares con una inv, y así. Los pares piden o retransmiten transacciones sólo si no las tienen. Un par jamás volverá a difundir una transacción que ya conoce, aunque las transacciones serán eventualmente olvidadas si pasado un rato no han entrado en un bloque. Sin embargo, el remitente y el receptor de una transacción sí volverán a difundir. Cualquier usuario que esté generando recolectará transacciones recibidas válidas y trabajará para incluirlas en un bloque. Cuando alguien encuentra un bloque, envían un inv a todos los pares. Funciona igual que las transacciones.
Todos difunden un addr con su propia dirección IP cada 24 horas. Los nodos retransmiten estos mensajes a algunos de sus pares y guardan las direcciones que les son desconocidas. Gracias a este sistema, todos tienen una idea clara de cuáles IPs están conectados a la red en el momento. Después de conectarte a la red, quedas agregado a la base de datos de todo el mundo casi al instante, por tu addr inicial.
Se difunden alertas de red con mensajes de alerta. No se usa ningún sistema tipo inv; los mensajes contienen la alerta completa. Si se recibe una alerta válida (es decir, firmada por uno de los usuarios con una llave privada), se retransmite a todos los pares. Mientras una alerta siga vigente, será retransmitida al comienzo de cada conexión nueva.
Initial block download
Al comienzo de cada conexión recibirás un mensaje getblocks con el hash del último bloque que hayas visto. Si el par no cree que este sea el útlimo bloque, te enviará una mensaje inv con hasta 500 bloques por delante del que hayas declarado. Luego pedirás todos estos bloques con getdata, y el par te los enviará con mensajes de bloque. Cuando hayas descargado y procesado todos estos boques enviarás otro getblocks, y así, hasta que consigas todos los bloques.
Thin SPV Clients
introdujo la compatibilidad para clientes ligeros (thin o lite clients) a través del Simple Payment Verification (verificación de pago simple) o SPV. Los clientes SPV no necesitan descargar el contenido completo de los bloques para verificar la existencia de fondos en la blockchain, sino que dependen de la cadena de encabezados de bloque y filtros bloom para obtener los datos que necesitan de otros nodos. Este método de comunicación entre clientes permite comunicación de alta seguridad y sin necesidad de confianza con nodos completos, a cambio de privacidad, ya que los pares pueden deducir cuáles son las direcciones sobre las cuales que los clientes SPV buscan información. MultiBit y Bitcoin Wallet funcionan de esta manera, usando library bitcoinj como base.
Bootstrapping
Tú eliges con cuáles pares te conectas, ordenando tu base de datos de direcciones según la hora a la que viste la dirección por última vez y añadiendo algo de aleatoriedad. Bitcoin ofrece tres maneras de encontrar pares:
Addr
Los mensaje addr anteriormente descritos producen un efecto similar al método de arranque de los IRC. Te enteras prontamente cuando se une un par, pero no te enterarás del momento exacto en el que se van. Bitcoin viene con una lista de direcciones conocidas como nodos semilla, o “seed nodes”. Si no puedes conectarte al IRC y jamás te has conectado a la red, el cliente se conectará a uno de los nodos de la lista para actualizar la base de datos de direcciones.
Para añadir un nodo manualmente, puedes usar la opción de línea de comando –addnode. La opción -connect obliga a Bitcoin a conectar a un nodo específico.
DNS
Bitcoin busca la dirección IP de varios hosts y los agrega a la lista de direcciones potenciales. Este es el mecanismo de seeding por defecto desde la vesión v0.6.x en adelante.
IRC
Desde la versión 0.6.x del cliente Bitcoin, el arranque IRC ya no está habilitado por defecto. La información que sigue es correcta para la mayoría de las versiones anteriores.
Bitcoin se une a un canal cualquiera entre #bitcoin00 y #bitcoin99 en irc.lfnet.org. Tu nick está sintonizada a una forma codificada de tu dirección de IP. Al decodificar todos los nicks de todos los usuarios del canal, obtienes una lista de todas las direcciones IP actualmente conectadas a Bitcoin. Para los hosts que no pueden establecer conexiones de salida en el puerto 6667, los servidores lfnet también están escuchando por el puerto 7777.
Heartbeat
Si transcurren 30 minutos o más desde el último mensaje de un cliente, se transmitirá un mensaje para mantener viva la conexión al nodo del par. Si pasan 90 minutos desde el último mensaje del nodo de un par, el cliente asumirá que la conexión ha muerto.
Ver también
- Historical Network Status (no longer updated)
- Bitnodes.io’s network size estimate
- How to run your own cheap full bitcoin node
- Bitcoin Mining
- Video: What is Bitcoin Mining