Glossar / Nodes und Software
Inventar
Auch bekannt als Inv-Nachricht.
- Was ist ein Inventar?
- Ein Inventar ist die Liste der Objektkennungen, die ein Node seinen Peers ankündigt; sie sagt, welche Transaktionen und Blöcke er hält, ohne eines davon bereits zu senden.
Erst ankündigen, dann auf Anfrage liefern. Dieses Muster ist der Grund, warum das Netzwerk nicht in Duplikaten ertrinkt: jeder Eintrag kostet 36 Bytes, ein vier Byte großes Typkennzeichen plus einen 32 Byte langen Hash, und eine einzelne inv-Nachricht kann bis zu 50.000 davon tragen. Ein Peer, der das Objekt bereits hält, fragt nie, und die Bandbreite wird nie verbraucht.
So funktioniert es
Ein Inventareintrag ist ein Paar: eine Zahl, die sagt, um welche Art von Sache es sich handelt, und der Hash, der sie identifiziert.
Die Typcodes sind kleine ganze Zahlen. 1 ist eine Transaktion, 2 ist ein Block, 3 ist ein gefilterter Block aus dem alten Bloom-Filter-Schema, 4 ist ein kompakter Block, 5 ist eine Transaktion, die über ihren Witness-Hash identifiziert wird. Setzt man das Bit 0x40000000 auf einen Typ, kennzeichnet das die Witness-tragende Variante, sodass ein SegWit-fähiger Peer MSG_WITNESS_BLOCK anfordert, wo ein älterer einen einfachen Block angefordert hätte.
Der Austausch läuft in drei Schritten ab. Ein Node sendet inv und listet auf, was neu ist. Der Peer durchsucht die Liste, ignoriert alles, was er erkennt, und antwortet mit getdata, wobei er nur benennt, was ihm fehlt. Der Node sendet diese Objekte, eine Nachricht pro Objekt, oder notfound, wo etwas inzwischen verworfen wurde. Die Arithmetik hinter der Obergrenze von 50.000 ist bemerkenswert: 50.000 Einträge zu 36 Bytes sind 1.800.000 Bytes, bequem innerhalb der Obergrenze von 4.000.000 Bytes für eine einzelne Nachricht, und Bitcoin Core enthält eine Zusicherung zur Kompilierzeit, die diese beiden Konstanten miteinander konsistent hält.
Das Timing ist eine Datenschutzkontrolle und kein Implementierungsdetail. Bitcoin Core kündigt eine Transaktion nicht in dem Moment an, in dem die Software davon erfährt. Ankündigungen werden gebündelt und über einen randomisierten Timer freigegeben, der im Durchschnitt zwei Sekunden gegenüber ausgehenden Peers und fünf gegenüber eingehenden beträgt, sodass ein Beobachter, der mit vielen Nodes verbunden ist, die Ankunftsreihenfolge nicht nutzen kann, um herauszufinden, wo eine Zahlung begonnen hat. Blöcke überspringen die Verzögerung vollständig, weil es nichts zu verbergen gibt und Sekunden Geld kosten.
Jeden Hash jedem Peer zuzurufen ist teuer, und Erlay ist das vorgeschlagene Heilmittel: Peers gleichen regelmäßig kurze Skizzen dessen ab, was der jeweils andere hält, statt Kennungen in alle Richtungen zu fluten.
Wo Sie es sehen
Inventare sind das Geräuschvollste an der Netzwerkschnittstelle eines Nodes und das am leichtesten zu Beobachtende.
Der Aufruf getpeerinfo schlüsselt den Verkehr nach Nachrichtentyp auf, und inv ist fast immer unter den größten Zählern. Ein gut vernetzter Node gibt einen echten Teil seiner Bandbreite dafür aus, Hashes anzukündigen, die am Ende niemand brauchte. Das ist auch der Grund, warum eine Zahlung in einem Block-Explorer Sekunden vor einem anderen erscheint: es sind getrennte Beobachter, die getrennte Ankündigungen aus verschiedenen Teilen des Netzwerks hören.
Eine Angewohnheit, die man verlernen sollte: ein inv ist keine Verpflichtung. Ein Node kann eine Transaktion ankündigen und sie Minuten später entfernen, wenn sein Mempool voll wird, und er schuldet niemandem eine Korrektur.
Inventar vs. Mempool
Ein Inventar ist eine Nachricht; ein Mempool ist ein Speicher, und nur einer von beiden überlebt den Moment. Die inv-Nachricht teilt einem Peer mit, dass ein Hash irgendwo existiert. Der Mempool ist die Menge der unbestätigten Transaktionen, die ein Node tatsächlich validiert hat, im Speicher hält und weiterzuleiten oder zu minen bereit ist, standardmäßig 300 MB groß, mit einer Verdrängungspolitik, die die günstigsten zuerst entfernt. Zu beobachten, wie Ihre txid sich über inv-Ankündigungen verbreitet, sagt Ihnen, dass das Netzwerk von Ihrer Zahlung erfahren hat. Es sagt Ihnen nicht, dass jemand sie eine Stunde später noch hat.