Wie wird die UTXO-Datenbank initialisiert?

Die IDs der nicht ausgegebenen Transaktionen werden in der UTXO-Datenbank gespeichert. Ich gehe davon aus, dass es vom Client so generiert wird:

for block in blocks:
    for transaction in block:
        utxo.remove(transaction.input)
        utxo.add(transaction)

Allerdings habe ich einige Zweifel: Was ist sonst noch in der UTXO-Datenbank gespeichert? Speichert es die tatsächliche Menge an nicht ausgegebenen Münzen für jede Transaktion (was für die Überprüfung der unbestätigten Transaktionen notwendig erscheint)?

Antworten (1)

Die UTXO-Datenbank beginnt leer und wird dann aktualisiert, während die Blockchain auf die von Ihnen beschriebene Weise analysiert wird. Nur, es kann mehr als eine Eingabe und mehr als eine Ausgabe für eine Transaktion geben, also würde ich es so ausdrücken:

for block in blocks:
    for transaction in block:
        for(input in transaction):
            utxoset.remove(input)
        for(output in transaction):
            utxoset.add(output)

Offensichtlich wird der Block auf Gültigkeit geprüft und daher wissen wir, dass die Ein- und Ausgänge legitim sind.

Das UTXO-Set speichert dann die von Outpoints referenzierten UTXOs als Schlüssel, wobei ein Outpoint besteht aus:

  • TXID: Eindeutige Hash-ID der Transaktion, die die Ausgabe erstellt hat
  • index: die Position der Ausgabe in der Ausgabeliste der Transaktion

Und die in den Transaktionsausgaben gespeicherten Informationen sind:

  • Wert: Anzahl der Satoshis, für die die Ausgabe gut ist
  • Pubkey-Skript: die Bedingungen, unter denen die Ausgabe ausgegeben werden kann

Schließlich werden für jeden Block Undo-Daten generiert, falls eine Reorganisation auftritt.

Wenn wir für einen Benutzer A die Gesamtbilanz von Benutzer A (Summe aller UTXO) sehen möchten, müssen wir dann vom Kopfblock zum Schwanz iterieren und alle UTXOs überprüfen, die mit Benutzer A verknüpft sind? oder utxoset bietet uns einen schnelleren/effizienteren Weg? @Murch♦