In den beiden Beispielen BitcoinJ 02a Dump eines Wallets und BitcoinJ 02b Dump Wallet komplett haben wir bereits die Daten eines Wallets ausgelesen und als „Dump“ auf den Bildschirm gebracht. Dieses Beispiel wird Euch zeigen, wie Ihr die wichtigsten Daten rund um Euer Wallet auslesen könnt, wie z.B. das vorhandene Guthaben („Balance“) oder die genauen Daten jeder einzelnen Transaktion („transaction“).
Als Basis hierfür nehmen wir das im Beispiel BitcoinJ 02 Wallet Erzeugung auf der Festplatte gespeicherte Wallet und schauen es uns hiermit an. Da wir uns zum jetzigen Zeitpunkt alleine auf die im Wallet gespeicherten Daten verlassen, sind nach der Erzeugung keinerlei Guthaben oder Transaktionen sichtbar – die kommen erst später ins Wallet hinein.
Die Online-Anbindung an die Bitcoin-Blockchain werden wir hier nicht machen, das werde ich in einem späteren Artikel beschreiben. Damit Ihr den Artikel nachvollziehen könnt, solltet Ihr mein Demonstrations-Wallet „bitcoinj02createwalletW.wallet“ nebst zugehöriger SPV-Datei „bitcoinj02createwalletW.spvchain“ aus dem Github-Archiv (https://github.com/java-crypto/BitcoinJ) herunterladen und damit dieses Beispiel nachvollziehen. Ein Hinweis hierzu: bei diesem Wallet handelt es sich um ein „Watching Wallet“, d.h. es sind keine privaten Schlüssel hinterlegt und Ihr könnt damit keine Transaktionen ausführen.
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.
Ich zeige Euch zuerst die Konsolenausgabe und nachfolgend dann den Sourcecode. Ihr solltet Euch über die Bedeutung der verschiedenen Guthaben („Balances“) einlesen, denn z.B. erst ein „Available“ = verfügbares Guthaben kann auch wieder abverfügt werden. Auch die verschiedenen „Value“ = Beträge solltet Ihr Euch näher ansehen, Links findet Ihr z.B. in meinem Bitcoin-Linkarchiv.
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 |
BitcoinJ 03 Daten eines Wallets Wir benutzen für unsere Versuche das Bitcoin Testnetz und nicht das Mainnetz Laden einer bestehenden Walletdatei - die Datei bitcoinj02createwalletW.wallet wird geladen ********************************************************************************** Ausgabe von Daten des Wallets Adresse für Zahlungseingänge: n3Wa5ZC1ihiR4BbUBU2tfq4A7v14kanTiq Balances (Guthaben) Balance bei Abfrage getBalance : 1626622 Balance bei Abfrage getBalance().toFriendlyString() : 0.01626622 BTC Balance bei Abfrage getBalance(Wallet.BalanceType.AVAILABLE) : 1626622 Balance bei Abfrage getBalance(Wallet.BalanceType.AVAILABLE_SPENDABLE): 0 Balance bei Abfrage getBalance(Wallet.BalanceType.ESTIMATED) : 1626622 Balance bei Abfrage getBalance(Wallet.BalanceType.ESTIMATED_SPENDABLE): 0 Transaktionen im Wallet Es befinden sich 4 Transaktionen im Wallet --------------------------------------------------------------------------------- Transaktion Nummer 1 Zahlungseingang Transaktions-Id: 18866d7e03a0b8958769382afe24ff7671fbc911cbdf3006fd1fbb3a3c49c4cf Transaktionsdatum : Wed Mar 11 13:45:06 CET 2020 Transaktionsbetrag (getValue) : 0.01098238 BTC Transaktionsgebuehr (fee) : wegen Zahlungseingang keine Fee Grund der Transaktion (purpose) : UNKNOWN Confidence (Bestaetigungen) : Appeared in best chain at height 1669535, depth 66. Source: NETWORK Confidence (Bestaetigungen) (Depth/Tiefe): 66 Confidence (Bestaetigungen) (Type) : BUILDING Confidence (Bestaetigungen) (ChainHeight): 1669535 --------------------------------------------------------------------------------- Transaktion Nummer 2 Zahlungsausgang Transaktions-Id: 905277665a3eb6cd1cf0af30b00f15db3ec6fc7ae86b3c150aa2fdcdb589d0b1 Transaktionsdatum : Wed Mar 11 14:55:45 CET 2020 Transaktionsbetrag (getValue) : -0.005225 BTC Transaktionsgebuehr (getFee) : -0.000225 BTC Transaktionsbetrag (getValueSendFromMe) : -0.01098238 BTC Transaktionsbetrag (getValueSendToMe) : 0.00575738 BTC Transaktionsbetrag an Empfaenger : -0.005 BTC Grund der Transaktion (purpose) : UNKNOWN Confidence (Bestaetigungen) : Appeared in best chain at height 1669539, depth 62. Source: NETWORK Confidence (Bestaetigungen) (Depth/Tiefe): 62 Confidence (Bestaetigungen) (Type) : BUILDING Confidence (Bestaetigungen) (ChainHeight): 1669539 --------------------------------------------------------------------------------- Transaktion Nummer 3 Zahlungsausgang Transaktions-Id: 3b04ff0742625ad5123e3a6bc74b407fde68e098c97244bd6a413b9550effe34 Transaktionsdatum : Thu Mar 12 11:22:01 CET 2020 Transaktionsbetrag (getValue) : -0.001425 BTC Transaktionsgebuehr (getFee) : -0.000225 BTC Transaktionsbetrag (getValueSendFromMe) : -0.00575738 BTC Transaktionsbetrag (getValueSendToMe) : 0.00433238 BTC Transaktionsbetrag an Empfaenger : -0.0012 BTC Grund der Transaktion (purpose) : UNKNOWN Confidence (Bestaetigungen) : Appeared in best chain at height 1669600, depth 1. Source: NETWORK Confidence (Bestaetigungen) (Depth/Tiefe): 1 Confidence (Bestaetigungen) (Type) : BUILDING Confidence (Bestaetigungen) (ChainHeight): 1669600 --------------------------------------------------------------------------------- Transaktion Nummer 4 Zahlungseingang Transaktions-Id: aa844f9e5f93716e5207b1479ba9c1209a3660a1a1514f9f0d6b3fa0164e1770 Transaktionsdatum : Thu Mar 12 11:22:01 CET 2020 Transaktionsbetrag (getValue) : 0.01193384 BTC Transaktionsgebuehr (fee) : wegen Zahlungseingang keine Fee Grund der Transaktion (purpose) : UNKNOWN Confidence (Bestaetigungen) : Appeared in best chain at height 1669600, depth 1. Source: NETWORK Confidence (Bestaetigungen) (Depth/Tiefe): 1 Confidence (Bestaetigungen) (Type) : BUILDING Confidence (Bestaetigungen) (ChainHeight): 1669600 ********************************************************************************** |
Sourcecode:
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 96 97 98 99 100 101 102 103 104 105 |
/* * Herkunft/Origin: http://javacrypto.bplaced.net/ * Programmierer/Programmer: Michael Fehr * Copyright/Copyright: Michael Fehr * 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): 12.03.2020 * Funktion: 03 Liest Daten eines Wallets aus * Function: 03 Get data from 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_Libraries * */ import org.bitcoinj.core.Coin; import org.bitcoinj.core.NetworkParameters; import org.bitcoinj.core.Transaction; 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.ArrayList; public class BitcoinJ03GetDataFromWallet { public static void main(String[] args) throws IOException, UnreadableWalletException { System.out.println("BitcoinJ 03 Daten eines Wallets"); System.out.println("Wir benutzen für unsere Versuche das Bitcoin Testnetz und nicht das Mainnetz"); NetworkParameters netParams = TestNet3Params.get(); //NetworkParameters netParams = MainNetParams.get(); String filenameWallet = "bitcoinj02createwalletW.wallet"; final File walletFile = new File(filenameWallet); Wallet wallet = null; if (walletFile.exists()) { System.out.println("Laden einer bestehenden Walletdatei - 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 von Daten des Wallets"); System.out.println("\nAdresse für Zahlungseingänge: " + wallet.currentReceiveAddress()); System.out.println("\nBalances (Guthaben)"); System.out.println("Balance bei Abfrage getBalance : " + wallet.getBalance()); System.out.println("Balance bei Abfrage getBalance().toFriendlyString() : " + wallet.getBalance().toFriendlyString()); // verschiedene BalanceTypes: System.out.println("Balance bei Abfrage getBalance(Wallet.BalanceType.AVAILABLE) : " + wallet.getBalance(Wallet.BalanceType.AVAILABLE)); System.out.println("Balance bei Abfrage getBalance(Wallet.BalanceType.AVAILABLE_SPENDABLE): " + wallet.getBalance(Wallet.BalanceType.AVAILABLE_SPENDABLE)); System.out.println("Balance bei Abfrage getBalance(Wallet.BalanceType.ESTIMATED) : " + wallet.getBalance(Wallet.BalanceType.ESTIMATED)); System.out.println("Balance bei Abfrage getBalance(Wallet.BalanceType.ESTIMATED_SPENDABLE): " + wallet.getBalance(Wallet.BalanceType.ESTIMATED_SPENDABLE)); // transaktionen System.out.println("\nTransaktionen im Wallet"); ArrayList<Transaction> txList = new ArrayList(wallet.getTransactions(true)); int txListSize = txList.size(); System.out.println("Es befinden sich " + txListSize + " Transaktionen im Wallet"); for (int txIterator = 0; txIterator < txListSize; txIterator++) { Transaction tx = txList.get(txIterator); System.out.println("---------------------------------------------------------------------------------"); String txDirection = ""; if (tx.getValue(wallet).isNegative()) txDirection = " Zahlungsausgang"; else txDirection = " Zahlungseingang"; System.out.println("Transaktion Nummer " + (txIterator + 1) + txDirection); System.out.println("Transaktions-Id: " + tx.getTxId()); System.out.println("Transaktionsdatum : " + tx.getUpdateTime()); System.out.println("Transaktionsbetrag (getValue) : " + tx.getValue(wallet).toFriendlyString()); try { System.out.println("Transaktionsgebuehr (getFee) : -" + tx.getFee().toFriendlyString()); System.out.println("Transaktionsbetrag (getValueSendFromMe) : -" + tx.getValueSentFromMe(wallet).toFriendlyString()); System.out.println("Transaktionsbetrag (getValueSendToMe) : " + tx.getValueSentToMe(wallet).toFriendlyString()); // berechnung der netto-zahlung an den empfänger Coin txGetValue = tx.getValue(wallet); // ist negativ bei ausgehender zahlung Coin txGetFee = tx.getFee(); // ist positiv ! Coin txEmpfaenger = txGetValue.add(txGetFee); System.out.println("Transaktionsbetrag an Empfaenger : " + txEmpfaenger.toFriendlyString()); } catch (NullPointerException e) { System.out.println("Transaktionsgebuehr (fee) : " + "wegen Zahlungseingang keine Fee"); } System.out.println("Grund der Transaktion (purpose) : " + tx.getPurpose()); System.out.println("Confidence (Bestaetigungen) : " + tx.getConfidence()); System.out.println("Confidence (Bestaetigungen) (Depth/Tiefe): " + tx.getConfidence().getDepthInBlocks()); System.out.println("Confidence (Bestaetigungen) (Type) : " + tx.getConfidence().getConfidenceType()); try { System.out.println("Confidence (Bestaetigungen) (ChainHeight): " + tx.getConfidence().getAppearedAtChainHeight()); } catch (IllegalStateException e) { System.out.println("Confidence (Bestaetigungen) (ChainHeight): " + "keine Bestaetigung da die Transaktion nicht im BUILDING-Typ ist"); } } System.out.println("**********************************************************************************"); } } |
Wenn Ihr noch mehr Daten auslesen möchtet nutzt einfach die erweiterte Version, BitcoinJ 03 Daten aus einem Wallet auslesen Extended.
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