BitcoinJ Erweitere einen Timestamp

Ihr werdet Euch bestimmt wundern, warum wir einen bestehenden Zeitstempel erweitern (müssen) und es nicht gleich in einem Rutsch komplett machen. Der Grund dafür ist ganz einfach und hat mit Arbeitsweise der Bitcoin-Blockchain zu tun: die Blockchain bietet keine direkte Möglichkeit, auf eine einzelne Transaktion zuzugreifen.

Wenn ich einen der zahlreichen Bitcoin (Testnetz-) Blockexplorer benutze kann ich doch einfach den Hash der Transaktion eingeben und erhalte direkt die Transaktion auf den Bildschirm… aber das liegt daran, dass diese Systeme intern eine komplette Datenbank mit allen Transaktionen vorliegen haben. Das setzt voraus, das die komplette Blockchain mit allen Rohdaten auf der eigenen Festplatte liegen muss und das können schon mal 160 GB oder mehr sein. Um „mal eben“ einen Timestamp zu überprüfen wird wohl kein Anwender freiwillig diese Datenmenge herunterladen.

Natürlich steht mir der im Programm „BitcoinJ Erzeuge einen Timestamp“ vorgeschlagene Weg der manuellen Abfrage einer Transaktion (Online Bitcoin Explorer) immer zur Verfügung, aber wir möchten das Ganze doch mit Java-Mitteln erledigen. Die Einzige externe Zugriffsmöglichkeit auf die Daten einer Transaktion besteht darin, zuerst den Block ausfindig zu machen, in dem sich die fragliche Transaktion befindet und genau das erledigt unser kleines Erweiterungs-Programm. Bitte beachtet dabei, das Ihr zwischen der Erstellung und der Erweiterung des Timestamps bis zu 30 Minuten warten müsst, denn zuerst muss der Block ja die Transaktion aufgenommen und ein Miner den Block in die Blockchain eingereiht haben. Diese Wartezeit ist genau der Grund für die Zweiteilung des Programms (Erstellung und Erweiterung), denn so könnt Ihr viele Timestamps hintereinander erledigen und später dann die Timestamps erweitern.

Die Benutzung ist wieder sehr einfach gehalten zuerst startet Ihr das Programm und wählt „starte das Wallet“:

Eine JProgressBar informiert Euch über die Aktualisierung des Wallets:

Mit dem Klick auf „waehlen Sie eine Datei…“ sucht Ihr die Originaldatei auf der Festplatte („neben“ der Datei muss die Textdatei mit dem Timestamp liegen, die Ihr im Beispiel BitcoinJ Erzeuge einen Timestamp erzeugt habt).

Das Programm sucht die Transaktion in einem Block und schreibt die Blockadresse („Block Hash“) in eine neue Textdatei „neben“ der Originaldatei. Diese Datei hat am Ende den Dateinamen „.timestamp_extended.txt“:

Sollte die Transaktion noch nicht in einem Block verarbeitet worden sein gibt das Programm diese Warnung aus. Bitte wartet bis zu 30 Minuten, dann sollte die Transaktion auch gefunden werden:

So sieht die erweiterte Timestamp-Datei aus (in den Zeilen 2 und 3 stehen nun der Blockhash und die Blocknummer (Block Height); diese Informationen werden zusätzlich unterhalb der bisherigen Datei gezeigt:

Im Echteinsatz könntet Ihr nun die Originaldatei und die erweiterte Timestamp-Datei an einen Dritten geben und der könnte die Daten überprüfen – z.B. mit dem Beispiel „BitcoinJ Überprüfe einen Timestamp„.

Die Sourcecodes findet Ihr am Ende des Artikels.

Alle Quellcodes zu BitcoinJ Timestamps & OP_RETURN findet Ihr zum Download in meinem GitHub-Repository BitcoinJTimestamp, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/BitcoinJTimestamp. Alle Programme sind unter Java 11 lauffähig (vermutlich auch unter Java 8) und wurden mit intelliJ IDEA entwickelt, welches für dieses Programm aber nicht notwendig ist.

Zur Nutzung der Programme benötigt Ihr diverse Bibliotheken – ladet Euch diese aus dem separaten GitHub-Archiv (https://github.com/java-crypto/BitcoinJ_Libraries) herunter und bindet Sie über Eure Entwicklungsumgebung ein.

Noch ein Wort zum Thema „Lizenz“: Das Programm steht unter unterschiedlichen Lizenzen, die Ihr bitte beachten solltet. Die von mir erstellten Beispiele selber stehen unter der „Unlicense“-Lizenz, allerdings werden zur Laufzeit diverse Bibliotheken eingebunden, welche zum Teil ganz eigene Lizenzen mitbringen. Darauf kann ich in meinen Lizenzhinweisen nicht hinweisen.

Letzte Bearbeitung: 22.03.2020

Hier der Sourcecode des Programms und der Form; den Quellcode der Klasse RedirectedFrame.java findet Ihr in meinem GitHub-Repository: