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 accept
conexió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 if
bloque 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?
PushNodeVersion
se utiliza para enviar el mensaje de versión. Es llamado por dos funciones.
1) PeerLogicValidation::InitializeNode
cuando la conexión es saliente.
2) ProcessMessage
cuando 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 if
caluso 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 hear
es realmente irrelevante.