Regtest descubrimiento automatizado de pares

Quiero probar el descubrimiento de pares en el modo de registro del núcleo de bitcoin, ejecutándose en Docker. Sin embargo, noté en el código fuente del núcleo de bitcoin que hay una verificación si la dirección es enrutable antes de responder a un mensaje getaddr. Así que primero creo una red con direcciones enrutables (IsRFC6598):

docker network create -d bridge --subnet 100.64.0.0/10 bridge_sharedrange

Luego lanzo cuatro máquinas Docker con bitcoind instalado (y usando la red bridge_sharedrange, con diferentes direcciones /16). A continuación, se inicia el demonio bitcoin en todas estas cuatro máquinas con:

bitcoind -regtest -daemon

Ejecutar ifconfig en estos nodos muestra que se están ejecutando en 100.64.0.2, 100.65.0.2, 100.66.0.2, 100.67.0.2. Desde la primera máquina (100.64.0.2) ejecuto el comando:

bitcoin-cli addnode 100.65.0.2 add

Desde la tercera máquina (100.66.0.2) ejecuto el comando:

bitcoin-cli addnode 100.65.0.2 add

Básicamente, el nodo con la dirección 100.65.0.2 ahora tiene dos pares (comprobado con bitcoin-cli getpeerinfo). Yo esperaría ahora que

  • 100.64.0.2 aprendió sobre 100.66.0.2 y
  • 100.66.0.2 aprendió sobre 100.64.0.2

Pero ese no es el caso. Solo conocen 100.65.0.2. ¿Es este comportamiento normal? Leí en https://en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery#Command_Line_Provided_Addresses que podría tener que ver con la marca de tiempo de la dirección, pero no estoy seguro de que esta pueda ser la causa y cómo se puede evitar.

Por cierto, también probé con

bitcoind -regtest -daemon -discover=1

Actualización : parece que esta característica de descubrir nodos LAN locales está en discusión: https://github.com/bitcoin/bitcoin/issues/3802 , sin embargo, creo que las reglas WAN se aplican a mi situación, ya que uso direcciones RFC6598 en mi configuración de prueba.

Respuestas (1)

Bitcoin Core no transmite inmediatamente un nuevo addrmensaje a los nodos con cada nueva conexión que obtiene. En promedio, esas transmisiones son cada 30 segundos, pero podrían ocurrir tarde o temprano, ya que el retraso sigue una distribución de Poisson. Debe esperar unos minutos antes de volver a comprobar. Además, el hecho de que conozcan la dirección no significa que los nodos realmente elijan conectarse a ellos.

¿Cuáles son las comprobaciones que hace un nodo para "elegir" conectarse a otro nodo, o es completamente aleatorio? Creo que tiene algo que ver tanto con la protección contra el ataque sybil ( en.bitcoin.it/wiki/Weaknesses ) como con el hecho de que no todas las direcciones tienen una marca de tiempo válida ( en.bitcoin.it/wiki/Satoshi_Client_Node_Discovery ) . Sin embargo, intenté dar a los nodos una dirección /16 diferente y el problema persiste (incluso después de 30 minutos de espera).
Los nodos se seleccionan aleatoriamente y no deben cumplir las condiciones marcadas aquí: github.com/bitcoin/bitcoin/blob/master/src/addrman.cpp#L33
Interesante, esto me llevó a información sobre el ataque Eclipse. medium.com/mit-security-seminar/… y eprint.iacr.org/2015/263.pdf proporcionan más detalles. Parece que no es tan fácil probar el descubrimiento de pares después de todo.