Glossar / Mining und Konsens
Merkle-Block
Auch bekannt als Merkle block, Partieller Merkle-Zweig.
- Was ist ein Merkle-Block?
- Ein Merkle-Block ist die Antwort, die eine Light Wallet erhält, wenn sie nach gefilterten Blockinhalten fragt: der 80 Byte große Header plus genau so viele Hashes, wie nötig sind, um zu beweisen, welche Transaktionen übereinstimmten.
Spezifiziert im BIP-37.
BIP37 ließ eine Wallet einem Node einen Filter übergeben und nur das empfangen, was übereinstimmte, verpackt in einen Beweis, dass nichts erfunden wurde. Das Design scheiterte an der Privatsphäre und an der Last: Bitcoin Core schaltete die Funktion in Version 0.19.0, veröffentlicht im November 2019, standardmäßig ab. Wenn Sie eine moderne Light Wallet nutzen, verwendet sie fast sicher stattdessen kompakte Blockfilter.
So funktioniert es
Status: Die Bloom-Filterung nach BIP37 und die merkleblock-Nachricht, die sie bedient, wurden in Bitcoin Core 0.19.0 im November 2019 aus Gründen der Privatsphäre und wegen Denial-of-Service-Risiken standardmäßig deaktiviert. Kompakte Blockfilter, spezifiziert in BIP157 und BIP158, ersetzten sie, und Bitcoin Core kann diese seit Version 0.21.0 im Januar 2021 an Peers ausliefern.
Ein Merkle-Block ist ein Beweis, keine Zusammenfassung. Seine Struktur hat vier Teile: den Blockheader, die Gesamtzahl der Transaktionen im Block, eine geordnete Liste von Hashes und ein kompaktes Bitfeld aus Flags. Die Flags beschreiben einen Tiefendurchlauf durch den Merkle-Baum des Blocks und sagen der empfangenden Wallet, ob sie in einen Zweig absteigen oder den nächsten Hash aus der Liste als Stellvertreter für alles darunter nehmen soll. Die Wallet spielt diesen Durchlauf nach, gelangt zu einer Wurzel und vergleicht sie mit der Wurzel im Header, den sie erhalten hat.
Dieser Vergleich ist der ganze Punkt. Ein feindseliger Peer kann Transaktionen vor Ihnen verbergen, indem er sie einfach nicht erwähnt, und kein gefiltertes Protokoll kann das verhindern. Was er nicht kann, ist eine Transaktion erfinden, die Sie nie erhalten haben, denn der erfundene Hash würde sich nicht zu einer Wurzel rekonstruieren lassen, die zu einem Header mit echtem Proof of Work dahinter passt.
Einen anzufordern ist ein Austausch in zwei Schritten. Die Wallet lädt einen Filter mit einer filterload-Nachricht hoch und fragt dann einen Block mit dem Inventartyp gefilterter Block statt des gewöhnlichen an. Der Merkle-Block kommt zuerst zurück, gefolgt von den vollständigen übereinstimmenden Transaktionen als separate Nachrichten. Ein Block mit 2.000 Transaktionen und einer Übereinstimmung kostet die Wallet einen Header, etwa ein Dutzend Hashes und eine Transaktion statt eines Megabytes oder mehr.
Wo er auftritt
Merkle-Blöcke gehören zu einer Generation mobiler Wallets, die weitgehend ausgedient hat.
Die Bibliothek BitcoinJ machte sie populär, und die darauf aufbauenden Android-Wallets verbrachten den größten Teil der 2010er Jahre mit dieser Art der Synchronisierung. Wer eine alte Version einer dieser Apps nutzt, sendet möglicherweise noch filterload-Nachrichten und findet stillschweigend keinen Peer, der antwortet, denn das Ausliefern erfordert, dass ein Betreiber peerbloomfilters von Hand wieder eingeschaltet hat.
Was sie ersetzte, kehrt die Richtung der Anfrage um. Bei kompakten Blockfiltern veröffentlicht der Node einen kleinen Filter pro Block, der beschreibt, was dieser Block enthält, und die Wallet lädt Filter herunter, entscheidet lokal, welche Blöcke interessant sind, und ruft diese vollständig ab. Nichts über die Adressen der Wallet verlässt das Gerät. Das ist das Modell hinter dem Neutrino-Backend von lnd und den darauf aufbauenden mobilen Lightning-Wallets.
Das Scheitern bei der Privatsphäre verdient eine klare Aussage, denn es ist der Grund für den Wechsel. Eine im Jahr 2014 von Arthur Gervais und Mitautoren veröffentlichte Arbeit zeigte, dass ein Node, der einen Client mit Bloom-Filter bediente, die große Mehrheit der Adressen dieses Clients wiederherstellen konnte und dass die Anfrage zweier Blöcke mit demselben Filter noch mehr preisgab. Das Auffüllen mit falsch positiven Treffern, das die Wallet verbergen sollte, verbarg sie nicht.
Merkle-Block vs. Bloom-Filter
Der Bloom-Filter ist das, was eine Wallet nach oben sendet; der Merkle-Block ist das, was nach unten zurückkommt. Ein Filter ist eine probabilistische, verlustbehaftete Beschreibung der Adressen und Outpoints, die jemanden interessieren, und er liegt auf dem ausliefernden Node. Ein Merkle-Block ist ein deterministischer Beweis über einen bestimmten Block, und er liegt in der Antwort. Sie wurden als Paar als veraltet eingestuft, aber nur der Filter war das Problem für die Privatsphäre. Merkle-Beweise selbst sind weiterhin in Ordnung, weshalb kompakte Blockfilter die Beweisidee behielten und den Teil verwarfen, in dem Sie einem Fremden sagen, was Sie besitzen.