Sobald Ihr mit einem Bitcoin-Wallet aktiv seid benötigt Ihr ab und zu einen schnellen Überblick über die technischen Details und gespeicherten Schlüssel. Dieser Datenbankauszug wird auch „Dump“ genannt und mit dem folgenden Programm sehr schnell und einfach realisiert.
Da wir in unserem Beispiel BitcoinJ 02 Wallet Erzeugung ein HD-Wallet erzeugt haben benötigen wir nur eine Befehlszeile, um an alle wichtigen Informationen zu gelangen (siehe Zeile 61 im Quellcode). Allerdings fehlen bei dieser Ausgabe die selbst importierten Schlüsselpaare und diese Daten erhaltet Ihr mit den Zeilen 63 bis 67.
Ein ganz wichtiger Hinweis: die Ausgabe taugt nicht zu Sicherungszwecken, denn die beiden wichtigsten Informationen fehlen bei dieser Ausgabe. Zum einen fehlt der Seed, mit dem der HD-Teil des Wallets erzeugt worden ist. Ebenfalls fehlen die privaten Schlüssel (sowohl der importierten Schlüsselpaare als auch der im Wallet erzeugten Schlüssel). Die Ausgabe dieser Daten zeige ich Euch im Beispiel BitcoinJ 02b Dump eines Wallets komplett.
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.
Hier nun der Quellcode und die Konsolenausgabe:
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 |
/* * 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: 02a Erzeugt den Dump eines Wallets * Function: 02a creates the dump of 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.wallet.UnreadableWalletException; import org.bitcoinj.wallet.Wallet; import java.io.File; import java.io.IOException; import java.util.List; public class BitcoinJ02aDumpWallet { public static void main(String[] args) throws IOException, UnreadableWalletException { System.out.println("BitcoinJ 02a DUMP 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"); 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 + " ist nicht vorhanden und das Programm wird beendet"); System.exit(0); } System.out.println("**********************************************************************************"); System.out.println("Ausgabe des kompletten Wallets\n"); System.out.println(wallet); System.out.println("Ausgabe der importierten Schlüssel:"); List<ECKey> importedKeys = wallet.getImportedKeys(); System.out.println("Es wurden " + importedKeys.size() +" Schlüssel importiert"); for (int i = 0; i < importedKeys.size(); i++) { System.out.println("Schlüssel " + (i+1) + ": " + importedKeys.get(i)); } System.out.println("\nAdresse für Zahlungseingänge: " + wallet.currentReceiveAddress()); } } |
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 02a DUMP eines Wallets Wir benutzen für unsere Versuche das Bitcoin Testnetz und nicht das Mainnetz Laden einer bestehenden Walletdatei Die Datei bitcoinj02createwallet.wallet wird geladen [main] INFO org.bitcoinj.wallet.DeterministicKeyChain - 133 keys needed for M/0H/0 = 0 issued + 100 lookahead size + 33 lookahead threshold - 0 num children [main] INFO org.bitcoinj.wallet.DeterministicKeyChain - Took 86.57 ms [main] INFO org.bitcoinj.wallet.DeterministicKeyChain - 133 keys needed for M/0H/1 = 0 issued + 100 lookahead size + 33 lookahead threshold - 0 num children [main] INFO org.bitcoinj.wallet.DeterministicKeyChain - Took 59.19 ms [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. ********************************************************************************** Ausgabe des kompletten Wallets 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: -1 (time unknown): null Keys: Earliest creation time: 2020-02-29T09:44:25Z addr:mjLMNLydrmt2JerdCSc8sZCTMuujMXpero,tb1q980nq50prlpulx3t9r46jxa9csd8qh4ltz0en6 hash160:29df3051e11fc3cf9a2b28eba91ba5c41a705ebf creationTimeSeconds:1582969466 [2020-02-29T09:44:26Z] (imported) addr:mnXCDFQwz4cs7eneMCnU5ngRfhzbax3bea,tb1qfn2877ts2mk05e2p79wp77ctvev60092390d3g hash160:4cd47f797056ecfa6541f15c1f7b0b6659a7bcaa creationTimeSeconds:1582969466 [2020-02-29T09:44:26Z] (imported) addr:mnRTQHcZo3wn6GdaZCsCccdEbp58zEFinn,tb1qfwl2avjrmkusg5yttwke6lrm4urj4qpyzcklha hash160:4bbeaeb243ddb904508b5bad9d7c7baf072a8024 creationTimeSeconds:1582969466 [2020-02-29T09:44:26Z] (imported) addr:mg6fpLDT77SsMUsm3oaQQpAWQ2JwQ7jaKr,tb1qqesxxwg22yksnfnzx7xglzhxytrm5fnuy363h9 hash160:066063390a512d09a662378c8f8ae622c7ba267c creationTimeSeconds:1582969466 [2020-02-29T09:44:26Z] (imported) addr:mgzuJkArrMvtrb3BySYnCHdkN1BLtwizsf,tb1qzpq5w3zcahmjkjgn6petz5zll64dlrplhyxe3y hash160:1041474458edf72b4913d072b1505ffeaadf8c3f creationTimeSeconds:1582969466 [2020-02-29T09:44:26Z] (imported) Seed birthday: 1582969465 [2020-02-29T09:44:25Z] Ouput script type: P2PKH Key to watch: tpubD8WRr3vpDwybtseRYzbP739wJw4vSMcRAvw6QifMh5ZNJTKwp5QRmymsjjLHp6kZqMPAVEqsZcAfqSApUS8mtLbwzyxAM5XFQMh3eZ73PRy Lookahead siz/thr: 100/33 addr:miaLUm4yeBv7XEfx9u9LXCeCvS9Y7GL3gE hash160:218c24dd87b2b87a3405518512cbd6e6dfa1c9f6 (M, root) addr:mogznRmPEcfXBJimuGM8CojsWUtPVfQ3VM hash160:59a73e67ba416d45b46da3be18b9f3f0004ee364 (M/0H, account) addr:mrng5UWQZgVDRK5i1VqaAAAvcZQpaS4iXN hash160:7ba28078b4fed09e357e94ed8e161205594baeea (M/0H/0, external) addr:mywm94fnykAXEw6ZcFFpha83LE37WU8EXc hash160:ca2359f7364347cd452ed41e11c744e52538228a (M/0H/1, internal) Ausgabe der importierten Schlüssel: Es wurden 5 Schlüssel importiert Schlüssel 1: ECKey{pub HEX=03361d06bd8040d62d2dfd22e5999868bdf90d2ae8d8172d8eb431da2025770ea2, creationTimeSeconds=1582969466, isEncrypted=false, isPubKeyOnly=false} Schlüssel 2: ECKey{pub HEX=02302928d9607a7a77f3011b7a302a93211fa76a580e4f28b4d9d7cb0812eff422, creationTimeSeconds=1582969466, isEncrypted=false, isPubKeyOnly=false} Schlüssel 3: ECKey{pub HEX=0254b91acc2e7436b550ed87ae05ee2d04da57b9cbbd5ec52797225fd9ec9bf52e, creationTimeSeconds=1582969466, isEncrypted=false, isPubKeyOnly=false} Schlüssel 4: ECKey{pub HEX=039a08da376f693bcf7e38b28332b3da4891386a69d0ce8b4faeac24e8acd9dad2, creationTimeSeconds=1582969466, isEncrypted=false, isPubKeyOnly=false} Schlüssel 5: ECKey{pub HEX=03f6ffd95558657cda444861a9eebeabe22b0641341facdd174046b50d8fb0ee9b, creationTimeSeconds=1582969466, isEncrypted=false, isPubKeyOnly=false} Adresse für Zahlungseingänge: n3YE2rPKNhefnjrSHvEScXazNaSyeK52ML |
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: 12.03.2020