Glossar / Nodes und Software
Kompakter Blockfilter
- Was ist ein kompakter Blockfilter?
- Ein kompakter Blockfilter ist eine kleine, Golomb-kodierte Zusammenfassung der Output-Skripte, die ein Block erzeugt und ausgibt, veröffentlicht von Full Nodes, damit eine Light Wallet Blöcke prüfen kann, ohne preiszugeben, was sie besitzt.
Spezifiziert im BIP-158.
Ein Filter deckt einen Block ab, und er listet Output-Skripte auf, nicht Adressen, Beträge oder Transaktions-IDs. BIP-158 legt den grundlegenden Typ auf 0x00 fest, mit P gleich 19 und M gleich 784.931, sodass ein Element, das nicht im Block ist, trotzdem etwa einmal bei 784.931 Versuchen passt. Weil der Abgleich auf Ihrem Gerät läuft, erfährt der Node, der den Filter ausliefert, nie, welche Bitcoin Ihnen gehören.
So funktioniert es
Ein kompakter Blockfilter wird zusammengestellt, indem die Output-Skripte, die ein Block erzeugt und ausgibt, in einen einzigen numerischen Bereich gehasht, die Ergebnisse sortiert und nur die Abstände zwischen ihnen notiert werden.
Die Elementliste ist durch die Spezifikation festgelegt, sodass zwei ehrliche Nodes byte-identische Filter für denselben Block erzeugen. Für jede Transaktion nimmt der Filter das vorherige Output-Skript, das jeder Input ausgibt, wobei die Coinbase-Transaktion übersprungen wird, sowie das scriptPubKey jedes Outputs. Eine Kategorie bleibt absichtlich ausgenommen: Outputs, die mit OP_RETURN beginnen. BIP-158 schließt sie aus, damit Filter später in einem Coinbase-OP_RETURN-Output festgeschrieben werden können, so wie es beim Witness Commitment bereits geschieht, ohne dass das Commitment sich selbst abdecken muss.
Beim Hashing wird SipHash mit c gleich 2 und d gleich 4 verwendet, mit den ersten 16 Bytes des Block-Hashs in seiner standardmäßigen Little-Endian-Form als Schlüssel. Dieser Schlüssel ändert sich mit jedem Block, sodass dasselbe Skript in jedem Block an einer anderen Stelle landet und niemand eine Nachschlagetabelle erstellen kann, die über die ganze Chain funktioniert. Jede 64-Bit-Ausgabe wird dann mit einer Multiplikation und einer Verschiebung statt einer Division auf den Bereich null bis N mal M abgebildet.
Die Kompression ist das, worauf der Name hinweist: Sortierte Werte werden durch ihre aufeinanderfolgenden Differenzen ersetzt, und jede Differenz wird zu einem Quotienten in Unärform, gefolgt von 19 Restbits, was Golomb-Rice-Kodierung ist. Die Ausgabe kann nicht kleiner als N mal 20 Bit sein, und ihr wird die Elementanzahl N als CompactSize vorangestellt; ein Block, dessen Filter keine Elemente hat, wird als ein einzelnes Byte aus Nullen gespeichert. Ein Node, der bereit ist, diese Filter auszuliefern, kündigt das Service-Bit NODE_COMPACT_FILTERS an, definiert als 1 um 6 Stellen nach links verschoben.
Wo Sie ihn sehen
Kompakte Blockfilter sind die Synchronisierungsmethode, die Wallets wählen, die lieber Bandbreite verbrauchen, als einem Server eine Adressliste auszuhändigen.
Wasabi Wallet ist das Beispiel in unseren eigenen Bewertungen: nur Desktop, nur Bitcoin, jede Verbindung standardmäßig über Tor, und Synchronisierung aus Filtern, damit kein Server erfährt, welche Adressen Ihnen gehören. Diese Website bewertet sie mit 3,6 und kennzeichnet sie mit Vorsicht, aus einem Grund, der nichts mit der Synchronisierung zu tun hat. Electrum, bewertet mit 4,4, geht den anderen Weg: Sie verifiziert per SPV gegen einen Indexierungsserver, den jeder betreiben kann, und dieser Server hält am Ende die Liste der Adressen, die Ihnen gehören.
Zwei Grenzen sind zu kennen, bevor Sie sich auf Filter verlassen. Ein Filter ist auf Skripte geschlüsselt, sodass Sie eine Transaktions-ID nicht darin nachschlagen können: Mit nur einer txid brauchen Sie weiterhin einen Node oder einen Block-Explorer. Und OP_RETURN-Outputs fehlen konstruktionsbedingt, sodass Software, die auf datentragende Outputs achtet, auf diesem Mechanismus überhaupt nicht aufgebaut werden kann.
Kompakter Blockfilter vs. Compact Block Relay
Ein kompakter Blockfilter sagt einer Wallet, ob sich ein Block zum Herunterladen lohnt; Compact Block Relay, spezifiziert in BIP152, verkleinert einen Block, der sich bereits zwischen zwei Full Nodes auf dem Weg befindet.
Die Zielgruppen sind unterschiedlich. Filter gelten pro Block, sind deterministisch, verwenden die ersten 16 Bytes des Block-Hashs als Schlüssel und werden von Clients heruntergeladen, die keine eigene Chain führen. Compact Block Relay ersetzt die meisten Transaktionen eines Blocks durch 48-Bit-Identifikatoren, deren Schlüssel aus dem Block-Header zusammen mit einem vom Sender gewählten Nonce gehasht wird, und es spart nichts für einen Empfänger, dessen Mempool diese Transaktionen nicht bereits enthält. Das eine erspart einem Smartphone das Herunterladen von Blöcken, die es nicht braucht; das andere erspart einem Node, Transaktionen zweimal zu empfangen. Das gemeinsame Wort „kompakt“ ist die ganze Ähnlichkeit.