Glossar / Nodes und Software
Assumeutxo
- Was ist Assumeutxo?
- Assumeutxo ermöglicht es einem Bitcoin Core-Node, von einer Momentaufnahme des Bestands nicht ausgegebener Outputs zu einer fest im Code hinterlegten Blockhöhe zu starten und die übersprungene Historie anschließend im Hintergrund zu verifizieren.
Die Momentaufnahme listet jeden Coin auf, der auf einer bestimmten Blockhöhe ausgegeben werden kann, und ihr Hash ist in die Software einkompiliert, statt mit ihr heruntergeladen zu werden. Bitcoin Core 28.0 fügte Mainnet-Parameter für die Höhe 840.000 hinzu, die erste Höhe, gegen die im Live-Netzwerk eine Momentaufnahme geladen werden kann. Ihre Wallet wird nutzbar, lange bevor die gesamte Historie geprüft wurde, während der Node die übersprungenen Blöcke im Hintergrund still verifiziert.
Wie es funktioniert
Assumeutxo teilt einen Node in zwei Chainstates auf und lässt sie gleichzeitig laufen.
Sie übergeben eine Momentaufnahme-Datei an den RPC loadtxoutset. Bitcoin Core legt einen zweiten Chainstate an, in den sie geladen wird, und hält den ursprünglichen aktiv, während der Inhalt gelesen und geprüft wird. Sobald der Chainstate der Momentaufnahme geladen und validiert ist, wird er der aktive, im Datenverzeichnis erscheint ein Verzeichnis namens chainstate_snapshot, und der Node beginnt, vom Basisblock der Momentaufnahme in Richtung Netzwerk-Spitze zu synchronisieren. In diesem Verzeichnis liegt eine kleine Datei namens base_blockhash, die festhält, bei welchem Block die Momentaufnahme erstellt wurde, sodass die Anordnung einen Neustart übersteht.
Der Hash ist die ganze Vertrauensfrage. Die Dokumentation von Core selbst stellt fest, dass es keine kanonische Quelle für Momentaufnahmen gibt und dass jede von Ihnen heruntergeladene Momentaufnahme gegen einen im Quellcode fest hinterlegten Wert geprüft wird. Sie vertrauen also nicht demjenigen, der die Datei bereitgestellt hat. Sie vertrauen derselben Version, für deren Ausführung Sie sich bereits entschieden haben, und eine Datei, deren Hash nicht dem kompilierten Wert entspricht, wird abgelehnt, bevor sie überhaupt Ihr Chainstate wird.
In der Zwischenzeit arbeitet sich der ursprüngliche Chainstate mit jeder angewandten Regel weiter vom Genesis-Block vor. Wenn er den Basisblock der Momentaufnahme erreicht, berechnet er den Hash seines eigenen Satzes nicht ausgegebener Ausgaben und vergleicht das Ergebnis mit dem kompilierten Parameter. Der Cache wird der Kette zugeteilt, die ihn stärker braucht: Die Kette der Momentaufnahme hat Vorrang, während sie zur Spitze eilt, und die Hintergrundkette erhält danach den größeren Anteil. Der RPC getchainstates zeigt beide.
Die Bereinigung erfolgt beim nächsten Neustart und nicht sofort. Core benennt chainstate_snapshot in chainstate um, löscht die Hintergrunddaten, und ab diesem Punkt ist der Node nicht von einem zu unterscheiden, der auf traditionelle Weise erstellt wurde. Die Datei base_blockhash bleibt als Aufzeichnung darüber zurück, wo er begonnen hat.
Warum das beim Bitcoin-Kauf zählt
Assumeutxo greift den einen Nachteil an, der die meisten Käufer davon abhält, ihre eigenen Bitcoin zu validieren.
Von den 41 auf dieser Website bewerteten Wallets ist Bitcoin Core die einzige, die die gesamte Kette selbst herunterlädt und prüft, weshalb unsere Bewertung sie mit 4,7 bewertet und dennoch als ihren ersten Nachteil aufführt, dass die erste Synchronisierung die ganze Kette herunterlädt und verifiziert, was Stunden und viel Speicherplatz kostet. Dieser Satz ist der Grund, warum die meisten Menschen es nie versuchen. Eine Momentaufnahme lässt den Aufwand nicht verschwinden, sie verschiebt ihn: Die Stunden fallen weiterhin an, nur eben nachdem Ihre Wallet bereits funktioniert, statt davor.
Der Moment, in dem sich das auszahlt, ist die Auszahlung. Sie kaufen bei einer der 63 hier erfassten Kryptobörsen, Sie senden die Bitcoin an Schlüssel, über die Sie verfügen, und dann möchten Sie wissen, dass sie angekommen sind. Ohne einen eigenen Node sind die beiden Stellen, die Sie fragen können, die Börse, die sie gerade gesendet hat, und ein öffentlicher Block-Explorer, der nun Ihre Adresse kennt. Mit einem Node kommt die Antwort aus einer Rechnung, die Ihr eigener Rechner durchgeführt hat.
Es ändert auch, was ein ernsthaftes Setup zu Beginn kostet. Unsere Sparrow-Bewertung, ebenfalls mit 4,7 bewertet, beschreibt die direkte Verbindung zu Bitcoin Core als Backend, und diese Kombination bedeutete früher, eine vollständige Synchronisierung abzuwarten, bevor Sparrow überhaupt etwas zum Ansprechen hatte. Eine Momentaufnahme komprimiert den Einrichtungstag auf einen nutzbaren Abend, und die Verifizierung, die Sie aufgeschoben haben, beendet sich von selbst, während Sie schlafen.
Praxisbeispiel: Erstellen einer Momentaufnahme mit dumptxoutset
Das Erstellen einer Assumeutxo-Momentaufnahme ist ein bewusster Vorgang an einem Node, dem Sie bereits vertrauen, keine Datei, die Sie irgendwo holen.
Der RPC dumptxoutset erzeugt sie, entweder an der aktuellen Spitze mit dem Typ "latest" oder auf einer jüngeren Höhe mit dem Typ "rollback". Während des größten Teils der Laufzeit befindet sich der Node in einem vorübergehenden Zustand, der nicht die Realität widerspiegelt, und markiert Blöcke als ungültig, von denen er weiß, dass sie in Ordnung sind, und wegen dieses Zustands wird die Netzwerkaktivität abgeschaltet und jede Gegenstelle getrennt. Die Dokumentation von Core empfiehlt -rpcclienttimeout=0, weil der Dump eine Weile dauert, unabhängig von der Hardware und vom gewählten Typ, und sie rät davon ab, den Node in der Zwischenzeit für etwas anderes anzufassen.
Zwei Details überraschen viele. Eine Momentaufnahme ist nur nutzbar, wenn für ihre Höhe bereits ein Hash in den Kettenparametern aufgeführt ist, sodass die Wahl einer anderen Höhe das Bearbeiten dieses Codes und ein erneutes Kompilieren bedeutet, und der Typ "rollback" dient zugleich als Möglichkeit, einen fest hinterlegten Hash zu prüfen, indem die Momentaufnahme neu erzeugt und verglichen wird. Und Bitcoin Core 28.0 änderte die Serialisierung: Dumps im alten Format werden nicht mehr unterstützt und müssen auf einem Node mit 28.0 oder neuer neu erstellt werden, bevor loadtxoutset sie akzeptiert.
Bitcoin Core 29.0 fügte ein verwandtes Werkzeug hinzu, contrib/utxo-tools/utxo_to_sqlite.py, das eine kompakt serialisierte Momentaufnahme in eine SQLite3-Datenbank umwandelt. Das hat nichts mit der Synchronisierung eines Nodes zu tun und alles damit, was eine Momentaufnahme tatsächlich ist: ein vollständiges, eigenständiges Bild davon, wem auf einer Höhe was gehört, was sich als nützlich zum Abfragen erweist.
Assumeutxo vs. initialer Blockchain-Download
Assumeutxo ersetzt den initialen Blockchain-Download nicht, es ändert die Reihenfolge, in der die Arbeit geschieht.
Ein Node, der eine Momentaufnahme geladen hat, führt in seinem Hintergrund-Chainstate weiterhin einen vollständigen initialen Blockchain-Download vom Genesis-Block aus, und dieser Chainstate ist mit der vollständigen Validierung des Kettenabschnitts betraut, den die Momentaufnahme ihn annehmen ließ. Nichts wird dauerhaft übersprungen. Was die Momentaufnahme bringt, ist, dass die Wallet während der Wartezeit nicht mehr nutzlos ist, weil der aktive Chainstate den aktuellen Zustand jeder Adresse bereits kennt, die Sie interessiert. Der Bereich zwischen Genesis und der Höhe der Momentaufnahme wird als angenommen gültig geführt statt still als verifiziert gezählt, weshalb Core zwei Chainstates führt statt einer Markierung an einem einzigen. Ein Node, der eine Momentaufnahme geladen und die Hintergrund-Synchronisierung nie abgeschlossen hat, befindet sich in einem realen und benannten Zustand, nicht in einem verborgenen.
Assumeutxo vs. ein bereinigter Node
Assumeutxo und das Pruning verkleinern beide, womit ein Node umgehen muss, und sie verkleinern entgegengesetzte Dinge.
Beim Pruning geht es um den Speicherplatz nach der Validierung: Ein bereinigter Node prüft jeden Block und löscht dann die Rohdateien, die er nicht mehr braucht. Bei Assumeutxo geht es um die Zeit vor der Validierung: Es schiebt Prüfungen auf, die es dennoch durchführen wird. Beides lässt sich kombinieren, und Core beugt dafür eine seiner eigenen Regeln. Die übliche Untergrenze für -prune ist 550 MiB, und ein Node, der eine Momentaufnahme lädt, ignoriert dieses Minimum und verwendet stattdessen mindestens 1100 MiB. Der Speicherplatz ist nicht der einzige Posten: Während die Hintergrund-Synchronisierung läuft, gibt es vorübergehend zwei Chainstate-Verzeichnisse, jedes mehrere Gigabyte groß und wahrscheinlich größer als die Momentaufnahme, die Sie heruntergeladen haben.
Bei den Indizes unterscheiden sich die beiden am stärksten. Ein Index gewinnt nichts durch eine Momentaufnahme, weil Indizes immer beim Genesis-Block mit dem Aufbau beginnen und Blöcke nur der Reihe nach anwenden können, sodass ein Index die Spitze erst erreicht, wenn die Hintergrundvalidierung den Node über den Block der Momentaufnahme hinausgeführt hat. Das Pruning verschärft das: Ein Index, der Pruning überhaupt unterstützt, erlaubt dem Node nur, Blöcke zu löschen, die er bereits indexiert hat, sodass eine alte Momentaufnahme einen Haufen heruntergeladener, nicht indexierter und nicht löschbarer Blöcke auf der Festplatte zurücklässt, bis die Indexierung aufholt.