Wie ist Bitcoin „schüchtern“ beim Austausch von „Version“-Paketen?

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 accepterstellte 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 ifBlock, 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?

Antworten (1)

  • Zuerst teilt der Peer, der sich für eine Verbindung entscheidet, seine Version.
  • Jeder der Peers kann nur eine Versionsnachricht senden.

PushNodeVersionwird verwendet, um die Versionsnachricht zu senden. Es wird von zwei Funktionen aufgerufen

1) PeerLogicValidation::InitializeNodewenn die Verbindung ausgehend ist.

2) ProcessMessagewenn 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 ifCaluse nicht existierte, würde Client A die Versionsnachricht erneut senden.

Der Kommentar // Be shy and don't send version until we hearist eigentlich irrelevant.