Glossar / Protokoll und Upgrades
Compact Block Relay
Auch bekannt als BIP152.
- Was ist Compact Block Relay?
- Compact Block Relay ersetzt einen neuen Block auf der Leitung durch eine Liste sechs Byte langer Kennungen, die der empfangende Node mit Transaktionen abgleicht, die er bereits hält, und den Block lokal zusammensetzt.
Spezifiziert im BIP-152.
Zwei Peers, die beide den Mempool beobachten, teilen bereits fast jede Transaktion des nächsten Blocks, also ist es Verschwendung, sie ein zweites Mal zu senden. Matt Corallo spezifizierte die Lösung als BIP152, und Bitcoin Core aktivierte sie in Version 0.13.0, veröffentlicht am 23. August 2016. Für jeden, der zu Hause einen Node betreibt, ist es der Unterschied zwischen einer vertretbaren und einer unvertretbaren Bandbreitenrechnung.
So funktioniert es
Compact Block Relay fügt dem Protokoll vier Nachrichten hinzu, und die interessante ist cmpctblock, die einen Block beschreibt, ohne ihn zu enthalten.
Eine cmpctblock-Nachricht enthält den 80 Byte großen Header, einen vom Sender gewählten Nonce von 8 Byte und dann eine sechs Byte lange kurze Kennung für jede Transaktion im Block. Diese Kennungen stammen aus SipHash-2-4, dessen Schlüssel aus dem SHA-256 des Headers in Verkettung mit diesem Nonce gebildet wird. Der Nonce macht das Verfahren sicher: Die Kennungen unterscheiden sich für jeden Block und jeden Sender, sodass niemand im Voraus zwei Transaktionen vorbereiten kann, deren Kennungen kollidieren und die Rekonstruktion im gesamten Netzwerk auf einmal blockieren.
Manche Transaktionen werden vollständig übertragen statt über eine Kennung. Die Coinbase-Transaktion immer, da kein Peer sie vorher gesehen haben kann, und ein Sender kann alles andere vorab mitschicken, von dem er annimmt, dass der Empfänger es nicht hat.
Die Rekonstruktion erfolgt dann auf der Empfängerseite. Der Node berechnet mit demselben Schlüssel den Hash jeder Transaktion in seinem eigenen Mempool, sucht jede kurze Kennung nach und füllt den Block. Er hält außerdem einen kleinen zusätzlichen Pool kürzlich verdrängter und ersetzter Transaktionen bereit, der diejenigen auffängt, die kurz zuvor aus dem Mempool gefallen sind. Was noch fehlt, wird mit getblocktxn nach Position angefordert, und der Sender liefert nur diese Transaktionen in einer blocktxn-Nachricht zurück.
Zwei Dinge erzwingen den Rückgriff auf das Herunterladen des ganzen Blocks: zu viele fehlende Transaktionen, als dass sich ein Round-Trip lohnen würde, oder zwei verschiedene Transaktionen, die dieselbe sechs Byte lange Kennung erzeugen. Sechs Byte erlauben 281 Billionen Werte, daher sind zufällige Kollisionen verschwindend selten, und die absichtliche Art ist genau das, was der Nonce ausschließt.
Die Ankündigung gibt es in zwei Varianten. Im Modus mit geringer Bandbreite kündigt ein Peer einen neuen Block an und wartet darauf, dass er angefordert wird. Im Modus mit hoher Bandbreite, den ein Node für höchstens drei Peers aktiviert, wird die cmpctblock-Nachricht in dem Moment gesendet, in dem der Block eintrifft, was einen Round-Trip auf dem Pfad spart, auf dem die Verbreitungsgeschwindigkeit am wichtigsten ist.
Wo Sie es sehen
Compact Block Relay ist im Log Ihres eigenen Nodes sichtbar, eine Zeile pro Block, und diese zu lesen ist der schnellste Weg zu beurteilen, ob ein Node gesund ist.
Bitcoin Core gibt eine Zusammenfassung der Rekonstruktion aus und nennt, wie viele Transaktionen vorab mitgeschickt wurden, wie viele aus dem Mempool kamen, wie viele aus dem zusätzlichen Pool kamen und wie viele angefordert werden mussten. Auf einem Rechner, der seit Stunden läuft, ist die Zahl der angeforderten Transaktionen meist null oder nahe null. Auf einem Rechner, der vor zehn Minuten gestartet wurde, ist der Mempool fast leer, fast alles muss abgerufen werden, und mehrere der ersten Blöcke treffen langsam ein.
Daraus ergibt sich eine praktische Regel für jeden, der einen Node betreibt, um seinen eigenen Bestand zu prüfen, statt einer Website zu vertrauen: Lassen Sie ihn laufen. Ein Node, der kurz vor dem Moment neu gestartet wurde, in dem Sie ihn brauchen, ist ein Node, der vollständige Blöcke herunterlädt, und seine Sicht auf die Spitze der Kette hinkt hinter der eines öffentlichen Explorers zurück, bis sich der Mempool wieder füllt.