Wie findet ein Node eine Transaktion in der Blockchain?

Wenn ein (leichter) SPV-Client einen Full Node nach dem Merkle-Zweig fragt, der eine bestimmte Transaktion (oder den Wert einer Adresse) enthält, wie findet der Full Node diese Transaktion (oder die UTXOs) in der Blockchain? Scannt der Full Node linear durch die gesamte Blockchain oder gibt es einen schnelleren Weg, Transaktionen und Blöcke zu verknüpfen?

Liebe deine Frage, ich habe nie wirklich darüber nachgedacht. Da ich mir überhaupt nicht sicher bin und eher spekuliere, poste ich dies als Kommentar (vielleicht kann es jemand als Ausgangspunkt für eine Antwort verwenden): SPV-Clients fragen Knoten meistens nach Mustern wie einem Bloomfilter, der aufgelöst wird Zahlungen an ihre Adressen. Da SPV-Clients eher ausschließlich an noch existierenden (oder bald existierenden) Coins interessiert sind, werden alle diese Informationen entweder durch Durchsuchen des UTXO-Sets oder des Speicherpools gefunden. -Ende der Spekulation-.
@Murch Das UTXO enthält keine Merkle-Wurzeln, um zu beweisen, dass eine Ausgabe existiert. In diesem Modell könnte der Knoten nur Unsinn erfinden. Sie haben Recht damit, dass der UTXO zwar in Millisekunden durchsucht werden kann, aber dies würde keinen Verlauf für die Clientverbindung erhalten.

Antworten (2)

Sie können die bip37- Spezifikation für alle groben Details lesen.

Wie findet der Full Node diese Transaktion (oder die UTXOs) in der Blockchain?

Der Client erstellt einen Filter, der das enthält, woran er interessiert ist, sei es Ausgabeskript (Adressen), öffentliche Schlüssel oder TXID. Diese senden sie dann an den Knoten, mit dem sie verbunden sind. Wenn sie Daten für einen bestimmten Block anfordern, filtert der Knoten diese so, dass sie nur Dinge enthalten, die mit dem Bloom-Filter des Clients übereinstimmen, und sendet sie an sie. Um alle ihre nicht verbrauchten UTXO zu finden, fordern sie nacheinander jeden einzelnen Block in der Kette an und suchen nach Dingen, die ihnen gehören könnten. Wie Sie meistens herausgefunden haben, bedeutet dies für jeden Client, dass der Knoten 80 GB Blöcke von der Festplatte lädt und extrem teure Filtervorgänge an ihnen durchführt.

Moderne Knoten erkennen, wie schrecklich das für eine Idee ist, und erlauben Benutzern, die Funktionalität aufgrund der massiven Last und des damit verbundenen Denial-of-Service-Risikos vollständig zu deaktivieren. Mit speziell gestalteten Transaktionen kann ein Remote-Peer mit einem einzigen Befehl von weniger als 50 Byte einen Knoten veranlassen, einen 1-MB-Block von der Festplatte zu laden, ihn über eine Million Mal zu hashen und dann nichts zurückzugeben.

Fragen sie nicht einfach nach den Daten von Blöcken, für die sie noch keine Informationen haben? Das heißt, wenn eine Brieftasche bei Block 423.000 erstellt wurde, würde sie erst später nach Blöcken fragen. Und dann, da es weiß, dass es beim letzten Mal bis zu 430.000 eingeholt hat, nur neuere Blöcke danach?
Ja. Sie können auch Blöcke überspringen, von denen sie wissen, dass sie vor dem „Geburtsdatum“ der Brieftasche stattgefunden haben, da es unmöglich Transaktionen aus dieser Zeit geben kann, die sie ausgeben können. Dies hilft in der Praxis nicht viel, da der Großteil der Größe der Kette in den letzten Monaten liegt.

Normalerweise fragt der Light-Client „ist diese Transaktion in diesem Block“, nicht „in welchem ​​Block ist diese Transaktion“. Letzteres kann ohne allzu großen Aufwand durchgeführt werden, wenn es einen txindex (Transaktionsindex) gibt, für den Bitcoin eine Option hat.

Danke für deine Antwort! Dennoch sind mir ein paar Dinge nicht klar: (1) Wie bestimmt der SPV-Client X in der Frage "Ist diese Transaktion in Block X"? Indem ich alle Blöcke stütze (sagen wir, ich habe gerade einen neuen SPV-Client installiert und er sollte bestimmen, wie viel Bitcoin ich besitze, basierend auf meinen öffentlichen Adressen)? (2) Wie funktioniert es im Falle eines Bloom-Filters? Nach meinem Verständnis muss der Full Node die Hashes aller Transaktionen berechnen und mit dem Filter vergleichen? Dies erscheint bei mehr als 80 GB Daten zu zeitaufwändig.
Knoten verwalten standardmäßig kein , txindexda es ewig wachsen würde und unerschwinglich teuer wäre (das Aktivieren dieser Option verlangsamt die Geschwindigkeit des Einfügens von Blöcken erheblich und erhöht die Schreibvorgänge auf der Festplatte).