Was ist der beste Weg, um einen "aktuellen" UTXO-Set-Snapshot herunterzuladen?

Ich verwende bitcoinj, um Zahlungen abzuhören. Ich brauche eine Möglichkeit, das gesamte UTXO-Set in einer lokalen Datenbank zu verwalten.

  1. Kann bitcoinj verwendet werden, um jeden Block herunterzuladen (ich denke, es lädt nur neuere Blöcke und Header für ältere Blöcke herunter)?

  2. Ich muss nicht bitcoinj oder sogar Java verwenden, um diese Datenbank zu erstellen oder zu pflegen, wenn es eine bessere Lösung gibt. Gibt es so etwas?

Idealerweise möchte ich eine Brieftasche, die nur das UTXO-Set herunterlädt, ohne die gesamte Blockchain herunterzuladen (aufgrund von Bandbreitenbeschränkungen) und von da an verwaltet. Dies muss der gesamte Satz sein, nicht nur für die Adressen, die ich besitze. Zusätzlich benötige ich eine API, die folgende Abfragen ermöglicht:

  1. Überprüfen Sie bei einem UTXO, ob es im Set vorhanden ist.
  2. Wenn Sie eine Adresse haben, besorgen Sie mir alle UTXOs dafür.

Ich denke, dass es derzeit nicht möglich ist, ein bestimmtes UTXO-Set zu validieren, ohne die gesamte Blockchain herunterzuladen, daher wäre eine diesbezügliche Lösung ebenfalls wünschenswert.

Antworten (5)

Ja, standardmäßig lädt bitcoinj ganze Blöcke von Genesis herunter. Nur wenn Sie eine Brieftasche verbinden, verwendet sie Optimierungen wie Checkpoints und Filter.

Das einfache Herunterladen des UTXO-Sets (auf vertrauensfreie Weise) ist nicht möglich, da das Bitcoin-Protokoll nicht dafür ausgelegt ist. Sie können UTXOs von Block-Explorern und Electrum-Servern erhalten, aber ohne Krypto-Beweis.

Wie lange dauert es aktuell mit einer i7 k7700 CPU und anständiger Bandbreite?

Abgesehen von den Fragen des Vertrauens, der Validierung der Daten, der Aktualisierung und so weiter. Wenn Sie nur einen einmaligen Schnappschuss für akademische Zwecke wünschen, könnten Sie einen Freund, der Bitcoin Core verwendet, bitten, Ihnen eine Kopie seines Chainstate-Ordners zu geben – aber Sie müssten Daten aus der LevelDB-Datenstruktur extrahieren .

Andere Wallets wie Electrum verfügen möglicherweise auch über einen dauerhaften Datenspeicher, der hauptsächlich aus UTXO-Daten besteht.

Wie Andreas schrieb, ist das einfache Herunterladen des UTXO-Sets (auf vertrauensfreie Weise) nicht möglich. Ich möchte, dass es möglich ist, und so habe ich darüber nachgedacht, wie es geht ...

Jeder Block identifiziert Transaktionen aus vorherigen Blöcken, die in dem UTXO-Set waren und nicht mehr darin sind, und spezifiziert auch vollständig alle Transaktionen, die dem UTXO-Set durch den aktuellen Block hinzugefügt wurden. Dies bedeutet, dass Sie, wenn Sie bereits ein vollständiges und verifiziertes UTXO-Set haben und jemand wissen möchte, ob ein UTXO-Set von vor N Blöcken gültig ist, eine Antwort geben können. Ob sie dir vertrauen oder nicht, ist eine andere Frage. Wenn Ihr Satz gültig ist, können Sie die Additionen und Subtraktionen von Transaktionen rückgängig machen, wie durch die N-Blöcke angegeben, einen Hash berechnen und diesen Hash dann an die andere Person senden. Wenn sie denselben Hash auf ihrem Set erhalten, können sie davon ausgehen, dass Sie dasselbe UTXO-Set verwendet haben, um den Hash zu erhalten, den sie verwendet haben (dh sie stimmen überein).

Möglicherweise gibt es bereits Software, die dies kann. Das würde mir gefallen. Aber es gibt keinen Beweis dafür, dass einer von Ihnen das richtige UTXO-Set hat. Ich würde das gerne für alle behoben sehen, aber es erfordert ein wenig Bootstrapping. Ich habe einen Plan dafür:

  1. Erstellen Sie Software, die einen SHA256-Hash in etwas einprägsames und einzigartiges verwandelt. Das ist etwas komplizierter als es klingt. Was auch immer das Rendering erzeugt (Musik, Kunst, Animation, eine Kombination, ...) muss (mindestens) 256 unterschiedliche binäre Eigenschaften haben, die leicht zu merken sind. Jeder könnte diese Software verwenden, um zu sehen, ob der Hash des UTXO-Sets bei einer aktuellen Blockhöhe ein denkwürdiges Rendering erzeugt.
  2. Machen Sie es sich zur Aufgabe, dass manchmal ein denkwürdiges Rendering entsteht. Das kann als globaler Kontrollpunkt für die Blockchain dienen. Wenn genügend Leute (Beurteilungsaufruf) über das denkwürdige Rendering Bescheid wissen, könnten neue Installationen von vollständigen Knoten (von jedem, der es hat) den UTXO-Satz auf dieser Höhe erhalten, den Hash berechnen, ihn rendern und das Ergebnis mit dem von allen vergleichen erinnert sich. Ich kann mir vorstellen, dass das im Internet leicht verfügbar wäre, aber es ist sicherer, mit jemandem im wirklichen Leben zu sprechen, um die Gefahr von Sybil-Angriffen zu vermeiden.
  3. Aktualisieren Sie die vollständige Node-Software, um das UTXO-Set ab einem Block bereitzustellen, den der anfordernde Node angibt (um den vorherigen Schritt für Neuinstallationen zu ermöglichen).
  4. Aktualisieren Sie die vollständige Node-Software, damit der Benutzer eine Blockhöhe angeben kann, von der bekannt ist, dass sie ein UTXO-Set mit einem einprägsamen Hash erzeugt hat, fragen Sie nach dem UTXO-Set ab diesem Block von Peers, erstellen Sie das Rendering aus dem Hash der Antwort und zeigen Sie es an es an den Benutzer.
  5. Erlauben Sie dem Benutzer, anzugeben, dass das Rendering übereinstimmt, und wenn der Benutzer dies angibt, überspringen Sie das Herunterladen der Blockchain (mit Ausnahme von Teilen, die nicht im kanonischen UTXO-Set enthalten sind – falls vorhanden), um Bandbreite und Speicherplatz zu sparen, und beginnen Sie einfach mit dem UTXO-Set, das als Antwort kam.

Aus dem gleichen Grund, aus dem abgebauten Bitcoins mit einer Tiefe von weniger als 100 Blöcken nicht ausgegeben werden können (d. h. eine Reorganisation von 100 Blöcken ist unwahrscheinlich – möglicherweise nicht einmal unterstützt?), erlaubt uns diese Strategie, mit einem Minimum von 100 Blöcken an Historie fortzufahren statt der gesamten Blockchain.

Dadurch wird die Verantwortung für die Sicherstellung der Integrität des Startpunkt-UTXO-Sets auf den Menschen gelegt, der die Full-Node-Software verwendet. Es müsste eine Weile experimentell sein, bis es beweist, dass die Blöcke Null bis X nicht mehr notwendig sind (weil das UTXO-Set auf Blockhöhe X einprägsam genug war, um von bloßen Menschen mit dieser neuen Funktion erkannt zu werden), wodurch die Blockchain reduziert wird Bedarf nach einer immer größer werdenden Speichermenge bis zu einer Speichermenge, die sich voraussichtlich einpendeln wird.

Ein Teil des Reizes dieser Idee besteht für mich darin, dass der zufällige SHA256-Hash eines UTXO-Sets in etwas Denkwürdiges umgewandelt werden kann, und die Wahrscheinlichkeit, dass dies geschieht, ist gering, aber nicht gleich Null, genau wie das Mining selbst. Verschiedene Rendering-Algorithmen könnten konkurrieren. Ich dachte nur an einen...

Die 256 Bit des Hash plus die 32 Bit der Blockhöhe könnten verwendet werden, um anzuzeigen, welche Zellen in einem 16x18-Spiel des Lebens eingeschaltet sind. Lass das Spiel des Lebens laufen. Beobachten Sie es. Denken Sie daran, wie es sich stabilisiert. Einige Spiele werden schließlich das Brett löschen. Das ist denkwürdig. Wie es das Brett räumt, wäre auch denkwürdig.

Ich fing an, nach einem kanonischen UTXO-Set zu suchen (d. h. nach einem, dessen Struktur standardisiert ist, sodass dasselbe Set von UTXOs dieselbe Repräsentation wie Daten hat). Das Konvertieren des SHA256-Hash plus 32 Bit der Blockhöhe in ein Game of Life, um zu sehen, wie es abläuft, kann ziemlich einfach mit Golly oder jeder anderen Software durchgeführt werden, die John Conways „Game of Life“ implementiert.

Also habe ich die gleiche Quest wie OP, aber Andreas hat Recht. Sie müssen einen vollständigen Knoten ausführen und selbst erstellen. Sobald Sie dies jedoch getan haben, können Sie es möglicherweise anderen (mir!) zur Verfügung stellen. Er weist auch darauf hin, dass es keine Möglichkeit gibt, die Richtigkeit zu beweisen, außer indem man einen vollständigen Knoten ausführt und die ganze Arbeit der Aktualisierung für jede Transaktion wiederholt. Zu beweisen, dass das Ergebnis ohne all diese Arbeit korrekt ist, ist das Ziel der Idee, die ich in dieser Antwort vorstelle.

Schauen Sie sich dieses Programm an. Es wird die gesamte aktuelle UTXO-Datenbank in eine CSV-Datei kopieren, auf die Sie verweisen können. https://github.com/in3rsha/bitcoin-utxo-dump

@ Dave Scotese: Ich stimme Ihrer Idee zu, ein allgemein vereinbartes UTXO-Set zu haben (Ich bin mir jedoch nicht sicher, warum Sie vorgeschlagen haben, den resultierenden Checkpoint-Hash in ein Spiel des Lebens einzufügen). Wie auch immer, ich denke, das Problem ist nicht, dass es nicht möglich ist, sondern es kommt auf einen Konsens an (sehr ähnlich dem Problem, das von Blockchain selbst gelöst wird). Angenommen, Sie haben Ihren Algorithmus ehrlich verwendet und der Welt einen einprägsamen Hash zur Verfügung gestellt, der den UTXO-Satz an einem Blockhöhen-Checkpoint definiert, den Sie in einem Repo zum Herunterladen platzieren. Nun, wenn Herr A es herunterlädt und anhand seiner eigenen Datenbank überprüft und Ihnen zustimmt. Sie erwarten nicht, dass Herr B Ihnen zustimmt, nur weil Herr A zustimmt. Sie sehen, wer dieses UTXO-Set verwenden möchte, muss es selbst überprüfen. Es kommt immer noch auf das Problem der byzantinischen Generäle zurück, das die Blockchain gelöst hat. Ich denke ehrlich, dass es funktioniert,

Und ja, ich stimme Ihnen vollkommen zu, dass ein solches UTXO-Set das Problem lösen wird, dass Sie die gesamte Blockchain herunterladen müssen, bevor Sie Transaktionen validieren können.