Bitcoinj – Java-Implementierung für das Bitcoin-Protokoll

Bei Bitcoinj handelt es sich um eine Entwicklungs-Bibliothek auf Basis von Java, mit der Wallets und Anwendungen für das Bitcoin-Protokoll erstellt und verwaltet werden können. Auch Transaktionen können darüber abgewickelt werden. Im Fokus von Bitcoinj sind SPV-Wallets auf Smartphones.

Mit Bitcoinj lassen sich Wallets für Smartphones entwickeln

Neben der aktiven Community arbeiten auch Google-Entwickler an dem Projekt mit. Die Bibliothek steht unter der Apache-Lizenz als Open Source zur Verfügung. Da mit Bitcoinj Anwendungen entwickelt und betrieben werden, die direkt finanzielle Transaktionen auslösen, müssen Entwickler beachten, dass es keinerlei Haftung der Entwickler von Bitcoinj gibt.

Die Bibliothek steht als Open Source zur Verfügung und wer diese nutzt, macht das auf eigenes Risiko. Das sollte vor dem Einsatz berücksichtigt werden. Einfach ausgedrückt, kann Bitcoinj dabei helfen Transaktionen durchzuführen und Wallets zu verwalten, ohne einen anderen Bitcoin-Client nutzen zu müssen.

Für einen sicheren Betrieb von Bitcoinj-Anwendungen kann es sinnvoll sein parallel einen vollwertigen Bitcoin-Knoten zu betreiben, an den sich die Bitcoinj-Anwendungen anbinden können. Das erhöht die Sicherheit, ohne die Leistung der eigentlichen Clients zu beeinträchtigen.

Anwendungen mit dem Bitcoin-Protokoll entwickeln

Beim Einsatz von Bitcoinj kann das Bitcoin-Protokoll genutzt werden, um Wallets zu verwalten und auch Transaktionen zu senden oder zu empfangen. Bitcoinj arbeitet mit Java und JavaScript. Es ist aber auch möglich Python, Scala, Clojure, Kotlin und Ruby zu nutzen.

Für den Betrieb wird eine JVM verwendet. Die Möglichkeiten dazu sind in sehr vielen Programmiersprachen enthalten. Diese Sprachen und die dazugehörigen Entwicklungsumgebungen können natürlich mit Bitcoinj genutzt werden.

Bitcoinj befindet sich derzeit noch in der Entwicklung. Es ist also klar, dass Funktionen fehlen und auch noch Bugs enthalten sind. Die aktuellen Bugs sind im Bug-Tracker auf Github zu finden.

Bitcoin-Wallets ohne Bitcoin Core betreiben

Der Vorteil beim Einsatz von Bitcoinj besteht auch darin, dass keine lokale Kopie von Bitcoin Core (https://bitcoin.org/de/download) benötigt wird. Wer Apps für das Bitcoin-Protokoll entwickelt, benötigt in den meisten Fällen Bitcoin Core.

Das hat den Nachteil, dass mindestens 350 GB Daten heruntergeladen und lokal gespeichert werden müssen. Bitcoin Core kann als Server im Bitcoin-Netzwerk teilnehmen. Dazu wird der Port 8333 über das Internet zur Verfügung gestellt. Wer nur Anwendungen für das Bitcoin-Protokoll entwickeln will und mit Bitcoinj arbeitet, kann sich den Download von Bitcoin Core sparen. Generell kann es dennoch sinnvoll sein im eigenen  Netzwerk einen vollwertigen Bitcoin-Client zu betreiben, an den sich die Wallets auf Basis von Bitcoinj anbinden können.

Wer mit Bitcoinj Anwendungen für Bitcoin entwickeln will, zum Beispiel Apps für die Verwaltung und den Betrieb von Wallets, muss natürlich bereits Wissen zum Bitcoin-Protokoll aufgebaut haben. Hierzu empfiehlt es sich das Whitepaper „Bitcoin: A Peer-to-Peer Electronic Cash System” zu lesen.

Bitcoinj richtet sich an die Empfehlungen dieses Whitepapers, mit allen Vor- und Nachteilen des Bitcoin-Protokolls. Wer mit dem Bitcoin-Protokoll entwickeln will, sollte sich die Sachverhalte in diesem Whitepaper verinnerlichen.

Bitcoin-Wallets entwickeln (Bild von Gerd Altmann auf Pixabay)

Vorsicht bei der Entwicklung mit Bitcoinj

Bitcoinj ermöglicht vor allem das Entwickeln und Verwalten von Wallets in denen Bitcoins gespeichert und über die Transaktionen abgewickelt werden. Dazu können natürlich auch Micro-Transaktionen gehören.

Angesichts des Wertes von Bitcoins ist klar, dass bei der Entwicklung vorsichtig vorgegangen werden muss. Generell sollten vor dem produktiven Betrieb von selbst entwickelten Anwendungen in diesem Bereich sehr sorgfältig getestet werden.

Das gilt natürlich nicht nur für Bitcoinj, sondern generell für alle Anwendungen, bei denen Transaktionen mit Bitcoins abgewickelt werden. Vor allem die Sicherheitsmodelle sollten verstanden werden. Wir gehen in den nächsten Abschnitten auch auf das Thema Sicherheit bei der Entwicklung von Wallets mit Bitcoinj ein.

Einstieg in BitcoinJ – JDK, Gradle und Google Protocol Buffers

Der Download von Bitcoinj kann auf verschiedenen Wegen durchgeführt werden. Neben dem Download als JAR-Datei kann Gradle genutzt werden. Alternativ steht der Quellcode auf Github zur Verfügung.

Der Einstieg in BitcoinJ ist für Entwickler generell einfach gehalten. Da die Bibliothek als Open Source direkt bei Github heruntergeladen werden kann, sind keine teuren Lizenzen notwendig, und Entwickler, die Java beherrschen kommen schnell mit den Funktionen von Bitcoinj zurecht.

Für den Einsatz von Bitcoinj werden das aktuelle JDK und Gradle auf dem Computer benötigt.  Bitcoinj arbeitet auch mit Google Protocol Buffers. Hier spielen vor allem Serialisierung und die Kommunikation mit Hardware eine Rolle, zum Beispiel für die Smartphones auf denen die Wallets betrieben werden sollen, die mit Bitcoinj entwickelt werden.

Google Protocol Buffers sind Googles sprachneutraler, plattformneutraler, erweiterbarer Mechanismus zur Serialisierung strukturierter Daten.

Bitcoinj benötigt mehrere Komponenten (Bild von Lorenzo Cafaro auf Pixabay)

Generell sollte für die Entwicklung mit Bitcoinj natürlich auch eine passende Entwicklungsumgebung zum Einsatz kommen, die mit den oben genannten Sprachen zurechtkommt. Auch die Installation von Git ist sinnvoll. In den meisten Fällen arbeiten Entwickler ohnehin zum Teil bereits mit Git und Entwicklungsumgebungen, die Java oder Javascript beherrschen, kommen auch mit Bitcoinj zurecht.

Bestandteil von Bitcoinj ist ein Befehlszeilen-Tool mit dem Wallets erstellt und verwaltet werden können. Für die Erstellung wird Gradle benötigt. Der Befehl dazu ist:

gradle bitcoinj-tools:installDist

Tutorial und Dokumentation nutzen

Danach kann das Wallet-Tool in Bitcoinj genutzt werden. Sinnvoll ist das für erste Testumgebungen und der Anbindung an das Bitcoin-Netzwerk. Zum Download von Bitcoinj gehören auch zahlreiche Beispiele, die ebenfalls zunächst mit Gradle erstellt werden müssen. Die Beispiele befinden sich im Verzeichnis „examples“.

Die Entwickler stellen für einen Einstieg in Bitcoinj auch ein Tutorial zur Verfügung. Zusätzlich steht eine umfangreiche Dokumentation bereit, in der die meisten Fragen zu den Methoden und Vorgehensweisen mit Bitcoinj beantwortet werden. Die Dokumentation ist in der jeweiligen Version auf der Seite der Entwickler zu finden, genauso wie das Tutorial und die Links zum Download.

Bitcoinj ist für Smartphones und langsame Rechner geeignet

Ein weiterer Vorteil von Bitcoinj ist die Verwendung von Simplified Payment Verification (SPV). Bei der Verwendung des Modus für die Abwickelung des Zahlungsverkehrs wird nur ein kleiner Teil der Blockchain benötigt. Wir kommen im nächsten Abschnitt noch ausführlicher auf dieses Thema zurück, das bei der Entwicklung mit Bitcoinj einen zentralen Faktor darstellt.

SPV ist natürlich ideal für den Einsatz auf mobilen Geräten wie Smartphones und langsameren Rechnern.  Vor dem Entwickeln von Anwendungen sollten die beiden Verifizierungsmodi verstanden werden, die mit Bitcoinj zum Einsatz kommen. Der wichtigste Verifizierungsmodus beim Einsatz von Bitcoinj ist SPV. Warum das so ist, klären wir in den nächsten Abschnitten.

Bitcoinj bietet auch einen experimentellen, vollständigen Verifizierungsmodus, der die gleiche Verifizierungsmöglichkeiten bietet, die auch Bitcoin Core zur Verfügung stellt. Bei der Verwendung von diesem Modus mit Bitcoinj wird der nicht verbrauchte Transaktionsausgabesatz (UTXO-Satz) berechnet. Hier können auch Datenbanken eingebunden werden, zum Beispiel PostgreSQL oder MySQL.

Sicherheit für Wallets mit Bitcoinj

Wallets bieten in Zusammenhang mit Bitcoinj Verschlüsselung, Gebührenberechnung, Mehrfachsignierung, deterministischer Schlüsselableitung, Unterstützung von Erweiterungen und Ereignis-Listener, mit denen Sie über Änderungen Ihres Saldos auf dem Laufenden bleiben können. Generell sind alle Funktionen mit Bitcoinj umsetzbar, die ein Bitcoin-Wallet beherrschen muss.

Bitcoinj unterstützt auch Micropayment-Kanäle und bietet verschiedene Möglichkeiten um Mikrotransaktionen zu optimieren. Das ist ideal für den Einsatz auf mobilen Endgeräten und Hardware im IoT-Bereich. Mit Bitcoinj können auch die Vertragsfunktionen von Bitcoin genutzt und in eigene Anwendungen eingebunden werden.

Wer eine eigene Anwendung oder ein Wallet mit Bitcoinj entwickelt, kann die Installationsroutine so konfigurieren, dass diese kein Java erfordert. Das macht die Installation einfach und ermöglicht weitreichende Automatisierung bei Installation und Betrieb.

Das Sicherheitsmodell von Bitcoinj verstehen

Bei der Entwicklung von Apps zur Verwaltung von Wallets spielt die Sicherheit natürlich eine wichtige Rolle. Hier sollten Entwickler natürlich die Sicherheitsmodelle von Bitcoinj verstehen. In diesem Bereich spielen die beiden bereits erwähnten Modi für die Verifizierung eine Rolle, also die vollständige und die vereinfachte Verifizierung (SPV).

Abhängig vom verwendeten Modus benötigt das Endgerät natürlich mehr Ressourcen oder die Sicherheitsanforderungen werden heruntergeschraubt. Es gibt auch Kompromisse und daher flexible Möglichkeiten zwischen Leistung, Benutzerfreundlichkeit und Sicherheit.

Natürlich sind alle Aktionen rund um Überprüfung, Speicherung und Aktualisierung von Transaktionen sehr rechenintensiv. Dazu kommt, dass nicht jedes Endgerät im Bitcoin-Netzwerk einen vollständigen Knoten zur Verfügung stellen kann, da Leistung und Speicherkapazität nicht ausreichen, um die komplette Datenbank zu speichern. Beispiele dafür sind Smartphones oder kleine IoT-Geräte. Hier müssen Entwickler häufig Kompromisse zwischen mehr Leistung oder mehr Sicherheit eingehen, wie in anderen Bereichen auch.

Im Fokus von Bitcoinj stehen Wallets für Smartphones (Bild von Jan Vašek auf Pixabay)

Wer über entsprechend leistungsfähige Endgeräte verfügt, kann mit Bitcoinj auch eine vollständige Verifizierung ausführen. Das ist allerdings klar nicht der Schwerpunkt von Bitcoinj. Bei der Verwendung der vollständigen Verifizierung in einem Bitcoinj-Wallet wird die maximale Sicherheit erreicht. Hier verhält sich das Wallet wie ein Standard-Bitcoin-Knoten. Dabei werden alle Transaktionsskripte ausgeführt, Signaturen verifiziert und auf doppelte Ausgaben geprüft. Die Sicherheit wird dabei hochgehalten, die Leistung hängen von der Hardware und der Speicherkapazität ab.

Vollständige Verifizierung nicht immer sinnvoll

Bitcoinj kann also problemlos auch vollständige Verifizierungen ausführen, wie andere Bitcoin-Anwendungen auch. Allerdings steht diese nicht im Fokus der Weiterentwicklung. Hier ist der Quellcode noch wesentlich experimenteller, als bei den anderen Bereichen in Bitcoinj, vor allem für SPV. Im Schwerpunkt von Bitcoinj sind eindeutig Wallets, die mit der vereinfachten Überprüfung arbeiten (SPV). Hier liegt generell auch das Problem bei der vollständigen Überprüfung mit Bitcoinj.

Da der Quellcode hier wesentlich unausgereifter und unsicherer ist, kann ein Angreifer Sicherheitslücken ausnutzen, und auf diesem Weg einen Bitcoinj-Client angreifen. Statt mehr Sicherheit sind häufig Sicherheitsprobleme und weniger Leistung das Resultat. Wer in seinem Wallet oder seiner Bitcoin-Anwendung maximale Sicherheit bieten will, sollte daher nicht unbedingt auf die vollständige Überprüfung mit Bitcoinj setzen.

Vereinfachte Verifizierung für Smartphones und IoT

Zusätzlich zur vollständigen Verifizierung unterstützt Bitcoinj eine vereinfachte Zahlungsüberprüfung (SPV). Grundsätzlich ist diese auch der empfohlene Weg, um mit Bitcoinj zu arbeiten. Diese benötigt sehr viel weniger Ressourcen, da nur Transaktionen gespeichert werden, die für das Wallet relevant sind.

Alle anderen Transaktionen werden verworfen oder gar nicht erst vom Netzwerk heruntergeladen. Das spart enorm Leistung ein, was auf Smartphones und IoT-Geräten natürlich eine besonders wichtige Rolle spielt. Das bedeutet aber auch, dass diese Transaktionen nicht auf ihre Gültigkeit überprüft werden, so wie bei der vollständigen Überprüfung.

Wenn ein Angreifer sicherstellen könnte, dass ein Wallet nur mit seinen Knoten verbunden ist, würde dies bedeuten, dass er eine Transaktion zuführen könnte, die völlig ungültig ist. Das ist bei einer vollständigen Überprüfung natürlich nicht möglich, wodurch diese wesentlich sicherer sind. Hier wird klar, wo das Problem liegt, wenn Entwickler sich entscheiden müssen SPV oder vollständige Verifizierung zu nutzen.

Ein direkter Angriff auf die SPV-Funktion in Bicoinj ist allerdings nicht sehr einfach. Peers werden beim Start einer Bitcoinj-Anwendung immer zufällig ausgewählt. Außerdem akzeptieren Bitcoinj-Anwendungen keine eingehenden Verbindungen. Es ist also für einen Angreifer nicht sehr einfach dafür zu sorgen, dass sich ein Wallet mit seinen manipulierten Knoten verbindet und zwar ausschließlich. Das schließt Sicherheitsrisiken weitgehend aus, aber nicht komplett.

Bild von Gerd Altmann auf Pixabay

Wenn bei einer Überprüfung die meisten Peers eine Transaktion angekündigt haben, ist ziemlich sicher, dass die Transaktion sich über das Netzwerk verbreitet und mit hoher Wahrscheinlichkeit gültig ist. Es ist schwer alle Knoten zu bestimmen, die Bitcoinj nutzt, um eine gefälschte Transaktion zu verbreiten. Natürlich würde nur eine vollständige Überprüfung für vollständige Sicherheit sorgen. Allerdings reicht in den meisten Fällen die vereinfachte Zahlungsüberprüfung aus.

Hotspots und öffentliche Netzwerke

Wichtig ist hier auch die Sicherheit der Internetverbindung. Öffentliche Hotspots sind natürlich wesentlich gefährlicher als das eigene WLAN. Hier besteht durchaus das Risiko, dass ein Angreifer den vereinfachten Verifizierungsmodus aushebeln kann. Leider unterstützt Bitcoinj keine Verwendung von TOR. Mit dieser sicheren Verbindung können anonyme Internetverbindungen aufgebaut werden, und auch unsichere Netzwerke können für sicheren Betrieb von Internetanwendungen genutzt werden.

Generell ist die zuverlässigste Konfiguration, in der bitcoinj verwendet werden kann, der SPV-Modus, verbunden mit einem regulären C++-Bitcoin-Knoten, der unter eigener Kontrolle steht. Der Knoten wird natürlich auf eigener Hardware betrieben, die auch entsprechend sicher konfiguriert und leistungsstark ist.  Das stellt sicher, dass der Datenfeed für die Anwendung vom eigenen Knoten validiert wurde und die meisten Angriffsmöglichkeiten herausgefiltert werden. Gleichzeitig wird die Leistung des Wallets nicht beeinträchtigt.

Verwendung von PostgreSQL und MySQL

Bitcoinj unterstützt PostgreSQL und auch MySQL für die Speicherung von Daten. Im Rahmen der Konfiguration kann festgelegt werden, wie sich die Anwendung mit dem Datenbankserver verbinden soll und welche Benutzernamen oder andere Anmeldedaten genutzt werden sollen.  Außerdem gibt es einen Blockspeicher, der von MySQL unterstützt wird. Die Benutzung ist ähnlich wie die Benutzung des Postgres-Speichers.

Fazit

Bitcoinj ist eine Java-Bibliothek, die seit Jahren bei der Entwicklung und Verwaltung von Bitcoin-Wallets eine Rolle spielt. Ein Schwerpunkt der Bibliothek liegt in der Entwicklung von Wallets für Smartphones oder sehr langsame Endgeräte, die dennoch leistungsstark mit dem Bitcoin-Netzwerk verbunden sein müssen. Wer Wallets für Bitcoin entwickelt, oder sich generell mit dem Bereich der Programmierung für Blockchain und Bitcoin auseinandersetzt, sollten sich die Open Source-Bibliothek und deren Möglichkeiten genauer anschauen. Wenn du allgemein an Bitcoin interessiert bist, empfehlen wir Dir einen Blick auf unsere Bitcoin Kaufanleitung zu werden. Dort haben wir für Dich alles wichtige aufgelistet, um sicher und einfach Bitcoin in Deutschland zu kaufen.

Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert