Andere Datenbank außer UTXO?

In diesem Beitrag wird erklärt, dass die UTXO entfernt werden, nachdem sie ausgegeben wurden. Das ist sinnvoll, weil sie nicht mehr „unverbraucht“ sind.

Aber haben nicht alle UTXOs einen Bezug/Verbindung zu ihrer vorherigen Transaktion? Gibt es eine zweite „Liste“ in der Blockchain, wo alle Transaktionen aus der Vergangenheit gespeichert werden? Denn wenn nicht, wohin zeigt dieser Verweis, wenn die vorherige Transaktion nicht mehr in der UTXO-Liste enthalten ist.

Das ganze UTXO-Modell verwirrt mich ein wenig, also danke für die Klarstellung.

Antworten (2)

Einmal ausgegeben, entfernt das Wallet den UTXO aus seinem Cache für nicht ausgegebene Transaktionen. Die Transaktion wird nicht aus der allgemeinen Datenbank (der Blockchain oder dem Blockindex) entfernt. Full Nodes, die mit txindex=1 laufen, behalten jede Transaktion für immer. Einige Wallets optimieren zwar die Datenbank, um Speicherplatz freizugeben – dies ist jedoch eine Wallet-spezifische Optimierung und nicht Teil der Funktionsweise von Bitcoin.

Zum Beispiel hat Bitcoin Core viele Caches und Optimierungen. Einer davon ist der UTXO-Cache. Der Grund für diesen Cache liegt auf der Hand: Wenn Sie vor jeder Transaktion die gesamte Blockchain nach Ihren eigenen nicht ausgegebenen Münzen durchsuchen müssten, könnte das möglicherweise Stunden dauern. Bitcoin Core verfolgt also Ihre UTXOs. Die Ausgabebeträge Ihres UTXO summieren sich und werden zum Guthaben, das Sie in der Wallet-Software sehen.

Der UTXO-Cache zeigt niemals auf frühere Transaktionen – es ist nur ein Optimierungs-Cache, der es Bitcoin Core leicht macht, TXs zu finden. Der Algorithmus, der den UTXO-Cache erstellt, weiß, von welcher Transaktion das UTXO stammt, aber der Cache zeigt niemals irgendwohin, außer auf den TX-Index, wo sich die nicht ausgegebene Ausgabe befindet.

Der Zeiger auf eine vorherige Transaktion existiert nur, wenn Sie ein UTXO ausgeben und dann ein neues Eingabe-TX für diese Transaktion erstellt wird. Diese Eingabe zeigt auf die zuvor nicht ausgegebene Transaktion und dieser frühere UTXO wird ausgegeben. Ein neues UTXO wird dann erstellt, nachdem diese Transaktion abgebaut wurde. Dieses UTXO wird Teil des Bitcoin-Guthabens des Empfängers, genau wie das UTXO Teil Ihres Guthabens war, bevor Sie es ausgegeben haben.

Dieses Bild (mit freundlicher Genehmigung von bitcoin.org) könnte helfen, zu veranschaulichen, wie es funktioniert:Geben Sie hier die Bildbeschreibung ein

Sehen Sie diese UTXOs, die ohne einen neuen TX vor ihnen baumeln? Bis sie ausgegeben werden, bleiben sie als UTXO.

Die Pfeile in dieser Abbildung zeigen die Richtung des Geldflusses, aber technisch gesehen zeigen die Pfeile in die andere Richtung: Die Eingaben zeigen zurück auf eine frühere UTXO-Ausgabe. Sobald ein Eingang auf einen Ausgang zeigt, ist dieser Ausgang kein UTXO mehr, sondern ein festgeschriebener TX. Die Eingabe verknüpft den vorherigen TX mit einem neuen UTXO und der vorherige wird als verbraucht markiert. Bitcoin Core entfernt dann dieses vorherige UTXO aus dem Cache.

Der Chainstate (die Datenbank von Bitcoin Core mit nicht ausgegebenen Transaktionsausgaben) ist jedoch nicht nur ein Cache. Es ist der maßgebliche Satz aller nicht ausgegebenen Ausgaben, und die Ausgabe fehlender Einträge davon impliziert, dass eine Transaktion ungültig ist. Es ist auch kein Index, da Sie die tatsächlichen Blockdaten für alte Blöcke löschen können, nachdem Sie ihre Auswirkungen auf das UTXO-Set angewendet haben. Schließlich gibt es einen Cache über dem Kettenzustand im Speicher mit vielen Optimierungen, aber diese sind unabhängig vom Kettenzustand selbst.

Ich möchte eine Klarstellung in Ihrem guten Beitrag von Jose Fonseca hinzufügen, der UTXO ist ein TransactionOutput, diese Struktur hat nur 2 Werte, den Betrag und den scriptPubKey. Der Link zur vorherigen Transaktion befindet sich in TransactionInput, sodass TransactionInput und die Transaktionsausgabe in Raw-Transaktion enthalten sind.

Im Cache ist also nur der UTXO (TransactionOutput) vorhanden.

Ich habe dieses Schema für mein Dokument erstellt, ich hoffe, es kann Ihnen helfen.

Geben Sie hier die Bildbeschreibung ein

Dieses Bild versucht zu vereinfachen, wie Bitcoin-Transaktionen generiert werden. Die verwendeten Begriffe sind verallgemeinert, zum Beispiel geben Sie in der Ausgabetransaktion nicht den öffentlichen Schlüssel ein, sondern die Adresse oder den Hash160 des öffentlichen Schlüssels, dies hängt von der Art des verwendeten Skripts ab.

Im Bild ist es nicht dargestellt, aber es gibt einen Datentyp namens Outpoint, der sich auf die vorherige Rohtransaktion bezieht.

Dennoch habe ich für mein Projekt die im Bitcoin-Kern verwendeten Datenstrukturen neu erstellt (mit Ausnahme des scriptWitness). Wenn Sie sich den Code nicht angesehen haben, können sie Ihnen eine allgemeine Vorstellung geben. Sie können es hier finden

ps: Ich entwickle diese Dokumentation, sie kann Fehler enthalten, bitte überprüfen Sie sie.