Timestamp Erläuterungen

Ich gebe Euch hier ein einige Erläuterungen zu den verwendeten Begriffen, damit Ihr das Thema „BitcoinJ OP_RETURN und Timestamping“ besser einschätzen könnt.

Was ist ein „OP_RETURN“ im Zusammenhang mit der Bitcoin-Blockchain? Die Bitcoingemeinde hat vor ein paar Jahren den Wunsch geäußert, zusätzliche Informationen in der Bitcoin Blockchain unterbringen zu können. Da aber die Datenmenge nicht zu stark ansteigen sollte, wurde der „OP_RETURN“ Modus mit einem maximalen Umfang von 40 Zeichen je Transaktion zugelassen (der Umfang kann auf 80 Zeichen verdoppelt werden, allerdings besteht keine Garantie das alle Partner diese Daten auch verarbeiten). Weiterhin gibt es bei einer „OP_RETURN“ Transaktion keine Rückgelder, sondern es wird der gesamte Betrag für das Mining verbraucht. Aus diesem Grund sind diese Transaktionen stets mit dem Überweisungsbetrag von 0 BTC und einer kleinen Fee zu finden.

Ein praktisches Beispiel dazu findet Ihr im Programm BitcoinJ Erzeuge eine OP_RETURN Transaktion.

Schauen wir uns den zweiten Teil an – was ist ein „Timestamp“ ? Die einfache Übersetzung bringt uns zum Wort „Zeitstempel“ und bezeichnet einfach eine Aktion, welche an einem bestimmten Zeitpunkt stattgefunden hat. So hat z.B. jede Datei auf dem Rechner die Timestamps „Erzeugung“ oder „Letzte Veränderung“. Das Dateisystem speichert bei der Erstanlage der Datei die aktuelle Rechnerzeit in das Feld „Dateierzeugung“ und bei einer späteren Bearbeitung das nun aktuelle Datum und verändert das Feld „Letzte Bearbeitung“. Dieses seht Ihr, wenn Ihr Euch mit einem Dateiexplorer die Dateien auf Eurer Festplatte anschaut.

Wofür kann das Erzeugungsdatum wichtig sein? Stellt Euch vor, das Ihr einen wissenschaftlichen Artikel schreibt und sicherstellen wollt, das Ihr den Artikel bereits am 19.03.2020 erstellt habt. Das Datum kann dann sehr wichtig werden, wenn zwei konkurrierende Wissenschaftler die „Erstbeschreibung“ dokumentieren und die „Erfindung“ für sich beanspruchen wollen. Beide Wissenschaftler übergeben Ihre Datei mit der Beschreibung der Erfindung (oder Entdeckung) an das Entscheidungsgremium und dieses entscheidet dann anhand des Datei-Erstellungsdatums, wem der Ruhm zusteht.

Leider wäre diese Vorgehensweise zu kurz gesprungen – ich könnte z.B. ein Word-Dokument aus der letzten Wochen einfach mit einem neuen Inhalt füllen und voilà – das Dateieierzeugungsdatum weist die letzte Woche als Erfindungsdatum aus. Eine andere Möglichkeit wäre, das Rechnerdatum zurückzustellen und erst dann meine Worddatei neu erzeugen – wieder würde ich später in die Irre geführt.

Jetzt kommen zum ersten Mal unsere Kryptografie-Kenntnisse zum Einsatz. Als Erstes bilde ich einen (SHA256-) Hashwert von meiner Datei und kann später anhand des Hashwertes beweisen, das die jetzt vorgelegte Datei tatsächlich der Datei mit meinem Hashwert entspricht. Damit kann ich natürlich nur nachweisen, das meine Datei nach der Hashwert-Erzeugung unverändert geblieben ist und nicht wann die Datei so vorgelegen hat.

Jetzt kommt die Bitcoin-Blockchain und der OP_RETURN zum Einsatz: Ich speichere den Hashwert meiner Datei in einer OP_RETURN-Transaktion und lasse die Transaktion Teil der Bitcoin-Blockchain werden. Sobald ich die Transaktion dem Netzwerk übergeben habe erhalte ich eine eindeutige Transaktions-Id und mit dieser kann ich jederzeit (Online über einen Bitcoin Explorer) nachweisen, das zum Zeitpunkt der Blockerzeugung (die Transaktion ist ja ein Teil eines Blockchain-Blockes mit vielleicht mehreren hundert Transaktionen) ein Datensatz mit genau dem Hashwert vorhanden war.

Damit kann nun jeder Prüfer mühelos feststellen, das die Datei mit dem genannten Inhalt zum angezeigten Datum (inklusive Uhrzeit) existiert hat. Da wir die Blockchain als fälschungssicher ansehen ist dieser Nachweis nun „für alle Zeiten“ im Netz verfügbar.

Ich zeige es Euch an einem einfachen Beispiel – den oben stehenden Text habe ich in einer Textdatei „bitcoinj_timestamping.txt gespeichert und Ihr könnt den Hashwert der Datei mit dem beliebigen Hash256-Programm selber errechnen lassen. So könnt Ihr beispielsweise mein Programm „F03 SHA-256 und SHA-512 Hash von einer Datei“ von der Schwesterseite http://javacrypto.bplaced.net/f03-sha-256-und-sha-512-hash-von-einer-datei/ nutzen und erhaltet dann diesen Hashwert („C9EDFC350F6EA6D1067370A51BAC7244E5D16F10CB5C6EC584A25AAB825F8AD0“):

Diesen Hashwert habe ich in einer OP_RETURN-Transaktion in der Bitcoin-Blockchain (natürlich im Testnetzwerk) gespeichert, was Ihr mühelos selber überprüfen könnt, beispielsweise mit dem Bitaps-Explorer (Link: https://tbtc.bitaps.com/ac6672f8b566b14302671909094048fdb3e6e7f0adf37d98be7b865bf1f073a5):

Damit steht fest: am 20.03.2020 um 12:29:17 UTC (= 13:29:17 MEZ) existierte eine Datei mit dem oben genannten Hashwert – was als Nachweis schon sehr stark sein dürfte.

So ist als anderes Beispiel auch eine Wohnungsübernahme denkbar und es werden am Übergabetag Fotos von der Wohnung gemacht, welche dann in einem ZIP-Archiv gebündelt und von diesem ZIP-Archiv dann der Hashwert errechnet und in der Blockchain gespeichert wird. Damit ist jederzeit und unabhängig feststellbar, das zum Zeitpunkt der Blockchain-Bestätigung die Bilder im ZIP-Archiv existiert haben – eine Behauptung à la „Die Bilder sind doch erst viel später entstanden“ kann damit ausgeräumt werden. Ganz wichtig ist es aber, sowohl die Originaldatei (oder das Original ZIP-Archiv) zusammen mit der Transaktionsnummer aufzubewahren, denn ansonsten besteht keine realistische Chance einer Wiederherstellung und Überprüfung der Datei(en).

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“: Die 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: 24.03.2020