Mensajes de red P2P

Cómo se encuentran los nodos y difunden bloques y transacciones.

Bitcoin no tiene un servidor central. Los nodos hablan directamente entre sí por un protocolo peer-to-peer sencillo, por defecto en el puerto TCP 8333.

El marco del mensaje

En el protocolo original (v1), cada mensaje empieza con una cabecera: 4 bytes «mágicos» que identifican la red (F9 BE B4 D9 en mainnet), un nombre de comando de 12 bytes, una longitud de carga y un checksum de 4 bytes. El tráfico no está cifrado.

v2: transporte cifrado

BIP324 añade un transporte cifrado. Bitcoin Core lo admite y lo ha activado por defecto desde la versión 27.0. No autentica pares, pero hace mucho más difícil el espionaje pasivo y la manipulación.

El apretón de manos

Dos nodos intercambian mensajes version (versión de software, servicios ofrecidos, mejor altura) y confirman con verack. Mensajes de función como sendheaders, sendcmpct, wtxidrelay y sendaddrv2 se envían alrededor del apretón de manos.

Difundir datos

  • inv anuncia «tengo esta transacción o bloque».
  • getdata la pide, y tx o block la entrega.
  • headers y getheaders intercambian cabeceras de bloque, hasta 2.000 a la vez.
  • cmpctblock, getblocktxn y blocktxn llevan bloques compactos (BIP152).
  • feefilter dice a un par que no envíe transacciones por debajo de una feerate.
  • ping/pong comprueban que la conexión está viva.

Encontrar pares

Un nodo nuevo primero pide a semillas DNS, gestionadas por miembros conocidos de la comunidad, direcciones. Después aprende más mediante mensajes addr y addrv2. El addrv2 de BIP155 puede llevar direcciones Tor v3, I2P y CJDNS.

Resistiendo ataques

Bitcoin Core hace por defecto 8 conexiones salientes de relay completo y 2 solo de relay de bloques. Elige direcciones de distintos grupos de red para que un atacante no pueda rodear fácilmente un nodo (un «ataque eclipse»). Los pares que envían datos inválidos se desconectan.

Conclusión

La capa P2P solo mueve datos. Cada nodo sigue comprobando cada bloque y transacción contra las reglas de consenso por sí mismo.