BitcoinJ 04 Wallet online

Nachdem wir die Beispiele 01 bis 03 komplett offline, d.h. ohne Verbindung mit dem Internet, durchgeführt haben benötigen wir nun den Zugang zur Bitcoin Blockchain (wir nutzen hier das Testnetz und nicht das „echte“ Mainnet). Natürlich können wir unsere Geldbörse auch ganz klassisch über eine „PeerGroup“ mit einem „Peer“ verbinden, aber ich zeige Euch hier im Beispiel die Nutzung des „WalletAppKit“, welches viele nützliche Funktionalitäten beinhaltet und die Programmierung stark vereinfacht. Das werdet Ihr sehen bei der Betrachtung des Quellcodes – für die Online-Funktion sind nur rund 10 Codezeilen notwendig.

Wenn Ihr das Programm innerhalb einer Entwicklungsumgebung startet, werdet Ihr auch die Konsole direkt im Blick haben und Euch bestimmt wundern, welche Datenmengen unser kleines Programm ausspuckt (in meinem IntelliJ IDEA in Rot dargestellt, um die Ausgaben von „echten“ Programmausgaben abzugrenzen). Ich zeige Euch gleich in der Konsolenansicht die reinen Druck-Ausgaben (die vollständige Konsolenausgabe folgt am Ende des Artikels).

Des Weiteren sollte es Euch auffallen, das die Ausgaben des Programms erst zeitverzögert erfolgen und auch die Beendigung nicht sofort passiert. Das ist eine direkte Folge der Online-Anbindung – zuerst versucht das Programm die Verbindung zu verschiedenen „Nodes“ (das sind Gegenstellen, welche die Blockchain im Netz verfügbar halten) und dann die im Wallet gespeicherten Daten auf den aktuellen Stand zu bringen; das kann schon einmal ein paar Minuten dauern – je nach „Alter“ des Wallets (also der letzten Aktualisierung). Bei der Beendigung versucht das Programm noch, das Wallet zu speichern („autosave“) und die Verbindungen gezielt zu beenden.

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

Hier die Konsolenausgabe – ich habe die interessanten Zeilen hervorgehoben und gelb markiert. Die Guthaben sehen zwar gleich aus, aber das verfügbare Guthaben („available“) ist um 0.001 BTC kleiner als das erwartete Guthaben („estimated“), was schlicht daran liegt, das ich kurz zur von einem Faucet Geld auf mein Wallet überwiesen habe. Diese Transaktion ist noch nicht abgeschlossen und daher unter „PENDING“ zu finden.

Eine weitere Besonderheit seht Ihr in Zeile 20: ich habe mein Wallet in ein „Watching Wallet“ kopiert, d.h. es kann „nur“ Zahlungseingänge überwachen und auswerten, aber keine Überweisungen tätigen. Damit eignet es sich hier als Demonstrationsdatei, welche Ihr im Github-Archiv herunterladen könnt. Ein kleines Programm zur Umwandlung Eurer Wallet-Dateien findet Ihr im Artikel BitcoinJ 05 Watching Wallet, der auch in Englisch verfügbar ist.

Etwas später wandelt sich das Bild, sobald meine Transaktion in einen Block eingebunden und „mined“ ist wandert sie zum nächsten Status über und kann ausgegeben werden (hier die verkürzte Ausgabe):

Hier der Programmcode:

Alle Quellcodes zum Bitcoin findet Ihr zum Download in meinem Github-Repository BitcoinJ, welches Ihr über diesen Link erreicht: https://github.com/java-crypto/BitcoinJ. 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.

Noch ein Wort zum Thema „Lizenz“: 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: 17.03.2020

Hier die vollständige Konsolenausgabe: