Dies ist eher eine technische / Programmierfrage.
Ich beziehe mich auf diese Codezeile: https://github.com/bitcoin/bitcoin/blob/be992701b018f256db6d64786624be4cb60d8975/src/net_processing.cpp#L1699
Ich verstehe die Logik dahinter, kein Versionspaket an eine neu accept
erstellte Verbindung zu senden, es sei denn, sie senden zuerst eines, aber der Code, mit dem ich verlinkt habe, tut das nicht ganz, oder doch?
An diesem Punkt befinden wir uns bereits in einem if
Block, der überprüft, ob der empfangene Befehl "Version" ist, sodass der Peer uns bereits ein Versionspaket gesendet hat, unabhängig davon, wer die Verbindung initiiert hat. Übersehe ich etwas?
PushNodeVersion
wird verwendet, um die Versionsnachricht zu senden. Es wird von zwei Funktionen aufgerufen
1) PeerLogicValidation::InitializeNode
wenn die Verbindung ausgehend ist.
2) ProcessMessage
wenn eine Nachricht empfangen wird. Es sieht aus wie das:
bool static ProcessMessage(...) {
if (strCommand == NetMsgType::VERSION) {
if (pfrom->fInbound)
PushNodeVersion(pfrom, connman, GetAdjustedTime());
}
}
Wenn es war
if (strCommand == NetMsgType::VERSION) {
// If this if clause didn't exist: if (pfrom->fInbound)
PushNodeVersion(pfrom, connman, GetAdjustedTime());
}
Betrachten Sie den folgenden Fall:
1) Client A verbindet sich mit Client B
2) Client A sendet seine Version an Client B
3) Client B teilt als Antwort seine Version
Wenn diese if
Caluse nicht existierte, würde Client A die Versionsnachricht erneut senden.
Der Kommentar // Be shy and don't send version until we hear
ist eigentlich irrelevant.