Die manuelle Verwaltung von Schlüsselpaaren ist bereits nach ganz kurzer Zeit kaum noch machbar, daher verwahren wir die neuen Schlüssel in einer „Geldbörse“ oder besser einem Wallet. Dieses gilt um so mehr für die Tatsache, das inzwischen für jede Transaktion eine neue Adresse angelegt wird. Die Erzeugung einer neuen Empfangsadresse über das Wallet vollautomatisch, als einzige Voraussetzung dafür muss das Wallet als Hierarchisch deterministisches (HD) Wallet erzeugt werden.
In diesem kleinen Beispiel erzeuge ich ein Wallet (wenn es noch nicht existiert) oder ich lade ein bestehendes Wallet von der Festplatte. Danach erzeuge ich 5 neue Schlüsselpaare (zusätzlich zu den HD-Schlüsselpaaren im Wallet) und importiere sie ins Wallet. Dann frage ich ab, ob der erste neu erzeugte Schlüssel auch tatsächlich Teil des Wallets geworden ist.
Weiterhin 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.
Zum Schluss gebe ich das Wallet mit allen öffentlichen Schlüsseln und der verschiedenen Guthaben auf die Konsole aus.
Hier nun der Quellcode und die Konsole:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 |
/* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Michael Fehr * Copyright/Copyright: Michael Fehr & andere/others * Lizenttext/Licence: verschiedene Lizenzen / several licenses * getestet mit/tested with: Java Runtime Environment 11.0.5 x64 * verwendete IDE/used IDE: intelliJ IDEA 2019.3.1 * Datum/Date (dd.mm.jjjj): 11.03.2020 * Funktion: 02 Erzeugt ein Wallet * Function: 02 creates a wallet * * Sicherheitshinweis/Security notice * Die Programmroutinen dienen nur der Darstellung und haben keinen Anspruch auf eine korrekte Funktion, * insbesondere mit Blick auf die Sicherheit ! * Prüfen Sie die Sicherheit bevor das Programm in der echten Welt eingesetzt wird. * The program routines just show the function but please be aware of the security part - * check yourself before using in the real world ! * * Sie benötigen diverse Bibliotheken (alle im Github-Archiv im Unterordner "libs") * You need a lot of libraries (see my Github-repository in subfolder "libs") * verwendete BitcoinJ-Bibliothek / used BitcoinJ Library: bitcoinj-core-0.15.6.jar * my Github-Repository: https://github.com/java-crypto/BitcoinJ * libs in my Github-Repo: https://github.com/java-crypto/BitcoinJ/tree/master/libs * */ import org.bitcoinj.core.ECKey; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.params.TestNet3Params; import org.bitcoinj.script.Script; import org.bitcoinj.wallet.UnreadableWalletException; import org.bitcoinj.wallet.Wallet; import java.io.File; import java.io.IOException; public class BitcoinJ02CreateWallet { public static void main(String[] args) throws IOException, UnreadableWalletException { System.out.println("BitcoinJ 02 Erzeugung eines Wallets"); System.out.println("\nWir benutzen für unsere Versuche das Bitcoin Testnetz und nicht das Mainnetz"); NetworkParameters netParams = TestNet3Params.get(); //NetworkParameters netParams = MainNetParams.get(); System.out.println("\nLaden einer bestehenden Walletdatei bzw. Erstellung einer neuen Walletdatei"); String filenameWallet = "bitcoinj02createwallet.wallet"; final File walletFile = new File(filenameWallet); Wallet wallet = null; if (walletFile.exists()) { System.out.println("Die Datei " + filenameWallet + " wird geladen"); wallet = Wallet.loadFromFile(walletFile); } else { System.out.println("Die Datei " + filenameWallet + " wird neu erzeugt"); wallet = Wallet.createDeterministic(netParams, Script.ScriptType.P2PKH); System.out.println("\nDas neue Wallet ist ein Hierarchisch deterministisches (HD) Wallet."); //wallet = Wallet.createBasic(netParams); //System.out.println("\nDas neue Wallet ist ein einfaches Wallet (kein HD Wallet)"); } System.out.println("\nZusätzlich zu den bestehenden Adressen importieren wir 5 zusätzliche Schlüsselpaare"); ECKey ecKeyFirst = null; // den ersten erzeugten eckey speichern wir zu vergleichszwecken ab try { // 5 eigene keys for (int i = 0; i < 5; i++) { ECKey ecKey = new ECKey(); if (i == 0) { // den ersten erzeugten eckey speichern wir zu vergleichszwecken ab ecKeyFirst = ecKey; } System.out.println("Neuer ECKey Nummer " + (i + 1) + ": " + ecKey); //System.out.println("Neuer ECKey Nummer " + (i+1) + ":" + bytesToHex(eckey.getPubKey())); // added wallet.importKey(ecKey); // changed // speicherung des wallets wallet.saveToFile(walletFile); } } catch (IOException e) { System.out.println("Die Erzeugung der Walletdatei " + filenameWallet + " war nicht möglich:\n" + e); } System.out.println("\nÜberprüfung das der erste neu erzeugte Schlüssel im Wallet gespeichert ist"); // fetch the first key in the wallet directly from the keychain ArrayList ECKey walletFirstKey = wallet.getImportedKeys().get(0); System.out.println("Erster Schlüssel im Wallet : " + walletFirstKey); System.out.println("Schlüssel aus der Generierung: " + ecKeyFirst); if (wallet.isPubKeyHashMine(ecKeyFirst.getPubKeyHash(), null)) { System.out.println(" * Der Schlüssel ist im Wallet vorhanden *"); } else { System.out.println(" * Der Schlüssel ist NICHT im Wallet vorhanden"); } System.out.println("\n****************************************************************************************************************************"); System.out.println("Ausgabe des kompletten Wallets ohne private Schlüssel"); System.out.println(wallet); } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
BitcoinJ 02 Erzeugung eines Wallets Wir benutzen für unsere Versuche das Bitcoin Testnetz und nicht das Mainnetz Laden einer bestehenden Walletdatei bzw. Erstellung einer neuen Walletdatei Die Datei bitcoinj02createwallet.wallet wird neu erzeugt [main] WARN org.bitcoinj.core.Context - Implicitly creating context. This is a migration step and this message will eventually go away. [main] INFO org.bitcoinj.core.Context - Creating bitcoinj 0.15.6 context. [main] INFO org.bitcoinj.crypto.MnemonicCode - PBKDF2 took 99.01 ms Das neue Wallet ist ein Hierarchisch deterministisches (HD) Wallet. Zusätzlich zu den bestehenden Adressen importieren wir 5 zusätzliche Schlüsselpaare Neuer ECKey Nummer 1: ECKey{pub HEX=02ea535aeebdb15cac3f061d019ef7c355ba3803e8158aa21dd2f4b7c449938b08, creationTimeSeconds=1582903772, isEncrypted=false, isPubKeyOnly=false} Neuer ECKey Nummer 2: ECKey{pub HEX=020f8963f1cfb3f5b981604b29c89b1cac6a9b4e529db469564353cb72e3b3bced, creationTimeSeconds=1582903772, isEncrypted=false, isPubKeyOnly=false} Neuer ECKey Nummer 3: ECKey{pub HEX=03a83f056dca284bede472c1806ddcef9a402285e19379226c067652f068e6f616, creationTimeSeconds=1582903772, isEncrypted=false, isPubKeyOnly=false} Neuer ECKey Nummer 4: ECKey{pub HEX=035e50c58931315006fdea53cfb79425038b8cfa1a74d12c3a2e419b628e50aaaa, creationTimeSeconds=1582903772, isEncrypted=false, isPubKeyOnly=false} Neuer ECKey Nummer 5: ECKey{pub HEX=035cd42a21c85ad5aaac15fec67a48425a7bd6287a37ae7f437361418e84761b8b, creationTimeSeconds=1582903772, isEncrypted=false, isPubKeyOnly=false} Überprüfung das der erste neu erzeugte Schlüssel im Wallet gespeichert ist Erster Schlüssel im Wallet : ECKey{pub HEX=02ea535aeebdb15cac3f061d019ef7c355ba3803e8158aa21dd2f4b7c449938b08, creationTimeSeconds=1582903772, isEncrypted=false, isPubKeyOnly=false} Schlüssel aus der Generierung: ECKey{pub HEX=02ea535aeebdb15cac3f061d019ef7c355ba3803e8158aa21dd2f4b7c449938b08, creationTimeSeconds=1582903772, isEncrypted=false, isPubKeyOnly=false} * Der Schlüssel ist im Wallet vorhanden * **************************************************************************************************************************** Ausgabe des kompletten Wallets ohne private Schlüssel Wallet Balances: 0.00 BTC ESTIMATED 0.00 BTC AVAILABLE 0.00 BTC ESTIMATED_SPENDABLE 0.00 BTC AVAILABLE_SPENDABLE Transactions: 0 pending 0 unspent 0 spent 0 dead Last seen best block: 0 (time unknown): null Keys: Earliest creation time: 2020-02-28T15:29:32Z addr:mxa6MC1zXgnPWoHf6RXjkJmWo6QKdZauNE,tb1qhvfpcqk6pxyk5adr94hvct2m34744selchp6g6 hash160:bb121c02da09896a75a32d6ecc2d5b8d7d5ac33f creationTimeSeconds:1582903772 [2020-02-28T15:29:32Z] (imported) addr:mwa8nwT9d99ZfSnaMMJamRnYEC6Yn66JV9,tb1qkqwqvya3qgyge3ckpn5f2dvc0q9rv8zgtalcju hash160:b01c0613b102088cc7160ce8953598780a361c48 creationTimeSeconds:1582903772 [2020-02-28T15:29:32Z] (imported) addr:mgs3gNFjzXksMa6iPc1ry3ZnxkUcAim5tG,tb1qpmz0pgy3f66tkveau53wx20ezx940waja6dahl hash160:0ec4f0a0914eb4bb333de522e329f9118b57bbb2 creationTimeSeconds:1582903772 [2020-02-28T15:29:32Z] (imported) addr:miokieTv8rhgnxvF5SzvzKNsWjaAG6V7KJ,tb1qys2ujxsjy0l39sdh6unzwhaucjwe9fz8c8rcdr hash160:2415c91a1223ff12c1b7d726275fbcc49d92a447 creationTimeSeconds:1582903772 [2020-02-28T15:29:32Z] (imported) addr:n3qBo5NP9SL3FoPGk2TQBCrenSx5YRW4kG,tb1q7nzcv273j8ka9xpkwvyha9as5c7e92py99qax0 hash160:f4c5862bd191edd2983673097e97b0a63d92a824 creationTimeSeconds:1582903772 [2020-02-28T15:29:32Z] (imported) Seed birthday: 1582903772 [2020-02-28T15:29:32Z] Ouput script type: P2PKH Key to watch: tpubDA8FresXcFYEFTTM4tmjo6pBXATbW81JGkD1fQqDJSSzmwjYwtmvqQ6aup694pQewd66hfpejGv5eyFjAAopa8h4SQV9x4YBXWGUH8JxsTu Lookahead siz/thr: 100/33 addr:n4e5X9NFhSpbEaUqUhJzmmMoUDx21gAA28 hash160:fda3d623517852f42ffc9c43e7b041622e2503ec (M, root) addr:n3UzWmFZ4bswj8p5WehMokAPmUVfjSbdkQ hash160:f0f3c9aa90d7e1fd3303237ed29dcc95a4c03d87 (M/0H, account) addr:n2BjAetBuVrZH3gPXYYZD12oFh3Z3ZR4z7 hash160:e2b7c7a2c4de896a3c5941ed4f69cc15e82d2d41 (M/0H/0, external) addr:n2qMqdL4RZR95At9E5e8PFjKRmwEB9WgMH hash160:e9d5c8599d36371ebb64324bdd1e3f0bb4f735ef (M/0H/1, internal) |
Wenn Ihr nachträglich einen Blick in Eurer Wallet werfen wollt empfehle ich Euch die Artikel BitcoinJ 02a Dump Wallet und BitcoinJ 02b Dump Wallet komplett.
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: 18.03.2020