¿Cómo es bitcoind "tímido" al intercambiar paquetes de `versión`?

Esto es más una cuestión técnica/de programación.

Me refiero a esta línea de código: https://github.com/bitcoin/bitcoin/blob/be992701b018f256db6d64786624be4cb60d8975/src/net_processing.cpp#L1699

Entiendo la lógica detrás de no enviar un paquete de versión a una acceptconexión recién creada a menos que envíen uno primero, pero el código al que me vinculé no hace eso, ¿o sí?

En ese momento ya estamos dentro de un ifbloque que verifica que el comando recibido es "versión", por lo que el par ya nos envió un paquete de versión, independientemente de quién inició la conexión. ¿Me estoy perdiendo de algo?

Respuestas (1)

  • Primero, el compañero que elige conectarse comparte su versión.
  • Cada uno de los pares solo puede enviar un mensaje de versión.

PushNodeVersionse utiliza para enviar el mensaje de versión. Es llamado por dos funciones.

1) PeerLogicValidation::InitializeNodecuando la conexión es saliente.

2) ProcessMessagecuando se recibe un mensaje. Se parece a esto:

bool static ProcessMessage(...) {
    if (strCommand == NetMsgType::VERSION) {
        if (pfrom->fInbound)
            PushNodeVersion(pfrom, connman, GetAdjustedTime());
    }
}

Si era

    if (strCommand == NetMsgType::VERSION) {
        // If this if clause didn't exist: if (pfrom->fInbound)
            PushNodeVersion(pfrom, connman, GetAdjustedTime());
    }

Considere el siguiente caso:

1) El cliente A se conecta al cliente B

2) El Cliente A envía su versión al Cliente B

3) El cliente B, como respuesta, comparte su versión

Ahora bien, si ese ifcaluso no existiera, el Cliente A enviaría el mensaje de versión una vez más.

El comentario // Be shy and don't send version until we heares realmente irrelevante.