Unspent Transaktionen

Wenn ich in Block n eine Transaktion habe und der Input sei eine unspent Transaktion Tx1 von Block (n-1000), dann sollte Tx1 anschließend verbraucht sein. Mir ist nicht klar, wo und wie das vermerkt wird. Der Block n-1000 kann ja, wegen der ganzen Hashs, nicht mehr geändert werden.

Wenn du in einem früheren Block eine Transaktion mit einem Output hast, der bisher nicht weiter transferiert wurde, dann kannst du diesen Unspent Transaction Output (UTXO) in jedem späteren Block ausgeben.

Hierfür wird dieser UTXO dann zu einem Input einer neuen Transaktion. D.h. wenn deine Wallet Software die neue Transaktion an die Blockchain übermittelt, sind in dieser Transaktion u.a. alle Input UTXOs aufgelistet, und alles zusammen wird auf der Blockchain gespeichert.

Im alten Block musst du das nicht vermerken. Es reicht, wenn der UTXO in einem späteren Block ausgegeben wird. Deshalb muss eine Wallet entweder die ganze Blockchain kennen, um deinen Kontostand anzuzeigen. Oder sie fragt eine andere Node ab, welche die ganze Blockchain kennt. Ohne Kenntniss der gesamten Blockchain würdest du nämlich sonst nicht alle Zahlungseingänge
und -ausgänge einer Adresse kennen.

Da sind wir bei dem Punkt, der mir nicht einleuchten: Wenn zu einem späteren Zeitpunkt eine weitere (2.) Transaktion Tx1 als Input verwendet, dann müssten doch alle inputs von allen Transaktionen der gesamten Blockchain überprüft werden, ob Tx1 schon einmal verwendet wurde.

Also rund 100.000.000 Transaktionen pro Jahr. Ist das wirklich so?

Prinzipiell ist das genau so!

Allerdings vermute ich mal stark, dass die Node Software eine Art Katalog anlegt, so dass nicht jedes Mal die ganze Blockchain durchsucht werden muss.

Das kann ich dir aber leider nicht genau sagen. Gibt aber einige Experten hier.

@Makowski, @mcwinston, weil ihr gerade online seid, wisst ihr das?

Ok, ich versuche das mal nach meinem Wissen zu erklären:

Wenn eine Node synchronisiert ist, hat die Node alle UTXOs schön sauber in einer fetten Datenbank gespeichert (Wer eine Node hat: im Unterordner „chainstate“!) → diese LevelDB nennt sich dann UTXO-set. Aktuell ist diese DB ungefähr 4GB groß und muss für jede nuee Transaction, die in den MemPool will, durchgerattert werden.
Jeder Datenbankeintrag enthält nun u.a. die relevanten Informationen Amount und Address (also „wo“ sie liegen)

Wenn nun eine neue Transaktion rein kommt, werden deren „Inputs“ in der UTXO-set gesucht und ob die Adressen übereinstimmen.

Diese UTXO-set ist eine der Kern-Elemente, die die Performance und den Speicherbedarf einer Node bestimmt!

(Wer Fehler findet, darf sie gerne korrigieren!!)

Edit:
Es ist wohl unschwer zu erkennen, je mehr sich Bitcoin verbreitet und immer mehr kleine UTXOs auf einzelnen Adressen liegen, desto größer wird die UTXO-set Datenbank. In den letzten 3 Jahren hat sie sich fast verdoppelt.

3 „Gefällt mir“

Danke! :+1: Hat mich auch schon länger interessiert.

Danke, das war hilfreich. Bei allen Erklärungen, die ich bisher gelesen habe, wurde es bei diesem Punkt immer ziemlich schwammig.