Wie entschlüsselt man sehr große (!) Rohtransaktionen?

Ich parse die Blockchain, um bestimmte Informationen zu extrahieren, die ich für ein Skript benötige.

Eine Sache, die ich tue, ist das Analysieren von Transaktionen. Was ich mache ist:

getrawtransaction <tx>
decoderawtransaction <rawtx>

Dies funktioniert bei den meisten Transaktionen (> 99 %), aber einige sind sehr groß und der Bitcoin-Client kann sie nicht verarbeiten. Ich frage mich, was sonst damit umgehen kann, wenn nicht Bitcoin selbst. Der Fehler, den ich in Bitcoin bekomme:

TX decode failed (code -22)

Das liegt daran, dass es sehr lange Argumente nicht akzeptieren kann. Mein Ruby-Skript stirbt mit

Arguement list too long - (Errno::E2BIG)

Wie entschlüsselt man solche Transaktionen? Hier sind einige Beispiele:

2f50fdf7adbf58e91d738869948f4b191eb3cafa016c6df7e9182c06e4513852
e7229316b5a5b1f53382ec5a526b842dda2ca96bc891cd02d397a52c4a84dba0
540359af779a510828f0afd3c88562b62c37d0e4eeccb08104a167a3600f7956

Vielen Dank.


Update: Ich habe gerade versucht, die Rohtransaktion in diesen Online-Parser einzufügen, und dieser entschlüsselt diese Transaktion ohne Probleme. Wie ist das programmatisch möglich?

Antworten (4)

Versuche dies:

bitcoind getrawtransaction 2f50fdf7adbf58e91d738869948f4b191eb3cafa016c6df7e9182c06e4513852 1

Beachten Sie die 1 am Ende, die Bitcoin anweist, im ausführlichen Modus zu arbeiten.

Es hört sich so an, als würden Sie die gesamte Transaktion über die Befehlszeile übergeben, aber Ihr Betriebssystem hat eine Grenze für die maximale (kombinierte) Länge von Befehlszeilenargumenten, die überschritten wurde. Die Meldung „Argument list too long“ ist ein Betriebssystemfehler, nicht von Bitcoin selbst.

Sie sollten in der Lage sein, das -stdinArgument von bitcoin-clizu verwenden, um es über die Standardeingabe statt auf der Befehlszeile zu übergeben, in diesem Fall gibt es keine Längenbeschränkungen. Auf einem Unix-ähnlichen Betriebssystem möchten Sie die Daten wahrscheinlich über eine Pipe übergeben, indem popen(3)Sie oder ein Äquivalent in der Sprache Ihrer Wahl verwenden, aber Sie könnten auch in eine temporäre Datei schreiben.

Bitcoind kann sehr lange Eingaben akzeptieren, aber wenn Sie bitcoin-cli verwenden, ist die Länge eines Befehlszeilenarguments begrenzt. Sie können die Option -stdin verwenden, um die Argumente an bitcoin-cli vis stdin zu senden und die Größenbeschränkung für Argumente zu umgehen.

Es gibt Bibliotheken zum Deserialisieren von Transaktionen.

pybitcointools - python

bitwasp/bitcoin-php - php

libbitcoin - C++/C

VERALTET: bitcoin-lib-php - php

Es gibt bestimmt noch viele andere.

Kennst du irgendwelche in JavaScript? Kann Bitcore beispielsweise Transaktionen deserialisieren?