Die inv
Nachricht wird verwendet, um das eigene Wissen über Blöcke und tx
s an andere Clients im Netzwerk weiterzuleiten. Wenn sich ein neuer Client mit dem Netzwerk verbindet, erhält er inv
als Antwort auf Nachrichten zunächst Informationen über alle Blöcke in Form einer getblocks
Nachricht. Da es keine gettx
Nachricht gibt, gehe ich davon aus, dass die Informationen zu Transaktionen in der letzten inv
Antwort an weitergeleitet werden getblocks
. Funktioniert der Standard-Client tatsächlich so oder leitet er die tx
Nachrichten nur weiter, wenn sie ankommen, und lässt neu verbundene Clients warten, bis sie die Informationen über die tx
s erhalten?
ThreadMessageHandler2() ruft alle 100 Sekunden SendMessages() auf, wodurch inv
Nachrichten an die Peers des Clients gesendet werden.
Ein Peer wird nach dem Zufallsprinzip ausgewählt , um inv
Nachrichten zu erhalten, die sich auf alle ausstehenden Transaktionen beziehen, von denen wir wissen, und dies nicht tut, einschließlich derjenigen, die wir selbst erstellt haben. Der Rest der Peers erhält inv
Nachrichten, die nur auf etwa 25 % der ausstehenden Transaktionen verweisen, von denen wir wissen, und sie nicht, einschließlich der von uns erstellten.
Ein Kommentar im Code erklärt, dass dieses „Tröpfeln“ des Transaktionsinventars dem Schutz der Privatsphäre dient.
Edit: Ich habe gerade diesen Thread entdeckt , der auch den Prozess von Werbetransaktionen beschreibt. Zum Glück stimmt es mit meiner Beschreibung hier überein.
Der Prozess des Ankündigens und Sendens von Daten ist für Transaktionen und Blöcke gleich: inv
gibt den Hash eines Objekts bekannt, getdata
wird verwendet, um das Objekt selbst anzufordern, und tx
oder block
werden verwendet, um sie zu übermitteln.
getblocks
ist ein Schritt vor diesem Prozess: Es fordert die Ankündigungen der letzten Blöcke über an inv
.
Pieter Wuille