BitcoinJ Erzeuge OP_RETURN Transaktion

Hier zeige ich Euch eine kleine Anwendung zur Speicherung von beliebigen Daten in der Blockchain. Wir nutzen dafür eine besondere Transaktionsart des Bitcoins, nämlich der „OP_RETURN“-Transaktion.

Bei einer normalen Transaktion gebe ich einen Empfänger und den Überweisungsbetrag an, bei einer OP_RETURN-Transaktion fehlen diese beiden Angaben. Stattdessen wird als Überweisungsbetrag 0 Coins genannt und der Empfänger fällt komplett weg (markierte Zeilen 127 bis 129).

Dafür kann ich der Transaktion über ein besonderes Script ein Byte Array mit maximal 40 Bytes Länge mitgeben. Wenn Ihr das folgende Programm ausführt, werdet Ihr sehen, das mit einem Klick auf die Checkbox auch 80 Zeichen zugelassen sind. Es gibt aber leider keine Garantie dafür, das eine derartige Transaktion (insbesondere im Mainnetz) von allen Gegenstellen und Minern akzeptiert und somit auch final in einen Block aufgenommen und damit dauerhaft gespeichert wird.

Eine weitere Besonderheit dieses Programms ist es, die Minimum-Gebühr für die Transaktion zu minimieren (Faktor 100) und nutze dafür den Code in den Zeilen 134-137. Auch diese Herabstufung kann im Echtnetz (Mainnet) dazu führen, das die Transaktion nicht bearbeitet wird. Ich habe die Reduzierung hier aufgenommen, damit Euer Guthaben etwas länger vorhält und nicht durch die Transaktionsgebühren vorschnell aufgezehrt wird.

Die Benutzung des Programms ist sehr einfach – zuerst muss das Wallet gestartet und online aktualisiert werden:

Die Wartezeit kann bis 3 Minuten andauern:

Danach gebe ich einen Zeichenkette in das Feld OP_RETURN ein (die Zeichenanzahl ist auf 40 Zeichen begrenzt) – hier benutze ich  „github.com/java-crypto/BitcoinJTimestamp“:

Nach dem Klick auf „senden einer OP-Return-Transaktion“ erfolgt das Senden der Transaktion und die „grüne“ Rückbestätigung – im Beispiel wird die Transaktions-Id „541f90f18a7698455edd226c2b9ed77c562ce2d9320da01f4d76d7cc351acedb“ ausgegeben. Das Label „Link“ ist mit einem Maus-Listener ausgestattet und bei einem Klick darauf öffnet sich der Browser mit einem Bitcoin Testnetz Blockexplorer (Direktlink: https://tbtc.bitaps.com/541f90f18a7698455edd226c2b9ed77c562ce2d9320da01f4d76d7cc351acedb) :

Hier die Ansicht im Bitcoin Explorer – unsere eingegebenen Daten erscheinen unveränderbar in der Blockchain:

Hier noch ein Beispiel für die Nutzung von 80 Zeichen – ich klicke die Checkbox „80 Zeichen“ an und gebe diese Zeichen ein: „visit http://java-crypto.bplaced.net and http://javacrypto.bplaced.net“:

Auch diese Daten werden in der Blockchain gespeichert und die Transaktions-Id ist „d8a3ee0b792acd8b7fa78f0589f5c7adace8438816dd9b64bf5e029a3b137687“. Abrufbar ist die dazugehörende volle Information per Direktlink (https://tbtc.bitaps.com/d8a3ee0b792acd8b7fa78f0589f5c7adace8438816dd9b64bf5e029a3b137687):

Bitte beachtet noch den folgenden Hinweis: wenn ich von „ewiger“ Speicherung der OP_RETURN-Transaktion in der Blockchain spreche meine ich das Main-Netzwerk und nicht das hier genutzte Testnetz. Das Testnetz kann jederzeit zurückgesetzt werden und alle bis dahin gespeicherten Daten werden verschwinden – speichert bitte keine wichtigen Informationen alleine im Bitcoin Testnetzwerk!

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

Hier der Quellcode und die dazugehörende Form (Ihr benötigt intelliJ IDEA zum Nachbau):