Skip to content

Commit 059609d

Browse files
committed
https://jira.baeldung.com/browse/BAEL-7876
1 parent 9fc2779 commit 059609d

File tree

8 files changed

+244
-0
lines changed

8 files changed

+244
-0
lines changed

java-blockchain/baeldung.dat

664 Bytes
Binary file not shown.
884 Bytes
Binary file not shown.
1.22 MB
Binary file not shown.

java-blockchain/baeldungkit.wallet

23.3 KB
Binary file not shown.

java-blockchain/pom.xml

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,24 @@
1414
<version>1.0.0-SNAPSHOT</version>
1515
</parent>
1616

17+
<dependencies>
18+
<dependency>
19+
<groupId>org.bitcoinj</groupId>
20+
<artifactId>bitcoinj-core</artifactId>
21+
<version>${bitcoinj.version}</version>
22+
</dependency>
23+
<dependency>
24+
<groupId>org.slf4j</groupId>
25+
<artifactId>slf4j-api</artifactId>
26+
<version>${sl4j.version}</version>
27+
</dependency>
28+
<dependency>
29+
<groupId>org.slf4j</groupId>
30+
<artifactId>slf4j-simple</artifactId>
31+
<version>${sl4j.version}</version>
32+
</dependency>
33+
</dependencies>
34+
1735
<build>
1836
<finalName>java-blockchain</finalName>
1937
<resources>
@@ -24,4 +42,10 @@
2442
</resources>
2543
</build>
2644

45+
<properties>
46+
<sl4j.version>2.1.0-alpha1</sl4j.version>
47+
<bitcoinj.version>0.16.2</bitcoinj.version>
48+
</properties>
49+
50+
2751
</project>
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
package com.baeldung.bitcoinj;
2+
3+
import org.bitcoinj.core.NetworkParameters;
4+
import org.bitcoinj.core.BlockChain;
5+
import org.bitcoinj.core.PeerGroup;
6+
import org.bitcoinj.core.Transaction;
7+
import org.bitcoinj.core.Coin;
8+
import org.bitcoinj.core.Utils;
9+
import org.bitcoinj.net.discovery.DnsDiscovery;
10+
import org.bitcoinj.params.TestNet3Params;
11+
import org.bitcoinj.script.Script;
12+
import org.bitcoinj.store.BlockStore;
13+
import org.bitcoinj.store.BlockStoreException;
14+
import org.bitcoinj.store.MemoryBlockStore;
15+
import org.bitcoinj.wallet.DeterministicSeed;
16+
import org.bitcoinj.wallet.UnreadableWalletException;
17+
import org.bitcoinj.wallet.Wallet;
18+
import org.slf4j.Logger;
19+
import org.slf4j.LoggerFactory;
20+
21+
import java.io.File;
22+
import java.io.IOException;
23+
24+
public class CreateWallet {
25+
26+
Logger logger = LoggerFactory.getLogger(CreateWallet.class);
27+
28+
NetworkParameters params = TestNet3Params.get();
29+
30+
public void createWallet() throws IOException {
31+
Wallet wallet = Wallet.createDeterministic(params, Script.ScriptType.P2PKH);
32+
File walletFile = new File("baeldung.dat");
33+
wallet.saveToFile(walletFile);
34+
}
35+
36+
public void createEncryptedWallet() throws IOException {
37+
Wallet wallet = Wallet.createDeterministic(params, Script.ScriptType.P2PKH);
38+
File walletFile = new File("baeldungencrypted.dat");
39+
wallet.encrypt("password");
40+
wallet.saveToFile(walletFile);
41+
}
42+
43+
public Wallet loadEncryptedWallet() throws IOException, UnreadableWalletException {
44+
File walletFile = new File("baeldungencrypted.dat");
45+
Wallet wallet = Wallet.loadFromFile(walletFile);
46+
logger.info("Address: " + wallet.currentReceiveAddress().toString());
47+
logger.info("Seed Phrase: " + wallet.getKeyChainSeed().getMnemonicString());
48+
logger.info("Balance: " + wallet.getBalance().toFriendlyString());
49+
logger.info("Public Key: " + wallet.findKeyFromAddress(wallet.currentReceiveAddress()).getPublicKeyAsHex());
50+
return wallet;
51+
}
52+
53+
public Wallet loadDecryptedWallet() throws IOException, UnreadableWalletException {
54+
File walletFile = new File("baeldungencrypted.dat");
55+
Wallet wallet = Wallet.loadFromFile(walletFile);
56+
wallet.decrypt("password");
57+
return wallet;
58+
}
59+
60+
public Wallet loadWallet() throws IOException, UnreadableWalletException {
61+
File walletFile = new File("baeldung.dat");
62+
Wallet wallet = Wallet.loadFromFile(walletFile);
63+
logger.info("Address: " + wallet.currentReceiveAddress().toString());
64+
logger.info("Seed Phrase: " + wallet.getKeyChainSeed().getMnemonicString());
65+
logger.info("Balance: " + wallet.getBalance().toFriendlyString());
66+
logger.info("Public Key: " + wallet.findKeyFromAddress(wallet.currentReceiveAddress()).getPublicKeyAsHex());
67+
logger.info("Private Key: " + wallet.findKeyFromAddress(wallet.currentReceiveAddress()).getPrivateKeyAsHex());
68+
return wallet;
69+
}
70+
71+
public Wallet loadUsingSeed(String seedWord) throws UnreadableWalletException {
72+
DeterministicSeed seed = new DeterministicSeed(seedWord, null, "", Utils.currentTimeSeconds());
73+
return Wallet.fromSeed(params, seed);
74+
}
75+
76+
public void connectWalletToPeer() throws BlockStoreException, UnreadableWalletException, IOException {
77+
Wallet wallet = loadWallet();
78+
BlockStore blockStore = new MemoryBlockStore(params);
79+
BlockChain chain = new BlockChain(params, wallet, blockStore);
80+
PeerGroup peerGroup = new PeerGroup(params, chain);
81+
peerGroup.addPeerDiscovery(new DnsDiscovery(params));
82+
peerGroup.addWallet(wallet);
83+
84+
wallet.addCoinsReceivedEventListener((Wallet w, Transaction tx, Coin prevBalance, Coin newBalance) -> {
85+
logger.info("Received tx for " + tx.getValueSentToMe(wallet));
86+
logger.info("New balance: " + newBalance.toFriendlyString());
87+
});
88+
89+
peerGroup.start();
90+
peerGroup.downloadBlockChain();
91+
wallet.saveToFile(new File("baeldung.dat"));
92+
93+
logger.info("Wallet balance: " + wallet.getBalance()
94+
.toFriendlyString());
95+
}
96+
97+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
package com.baeldung.bitcoinj;
2+
3+
import org.bitcoinj.core.Transaction;
4+
import org.bitcoinj.core.Address;
5+
import org.bitcoinj.core.Coin;
6+
import org.bitcoinj.core.InsufficientMoneyException;
7+
import org.bitcoinj.core.NetworkParameters;
8+
import org.bitcoinj.kits.WalletAppKit;
9+
import org.bitcoinj.params.TestNet3Params;
10+
import org.bitcoinj.wallet.Wallet;
11+
import org.slf4j.Logger;
12+
import org.slf4j.LoggerFactory;
13+
14+
import java.io.File;
15+
16+
public class WalletKit {
17+
18+
static Logger logger = LoggerFactory.getLogger(WalletKit.class);
19+
20+
public static void main(String[] args) throws InsufficientMoneyException {
21+
22+
NetworkParameters params = TestNet3Params.get();
23+
24+
WalletAppKit kit = new WalletAppKit(params, new File("."), "baeldungkit") {
25+
@Override
26+
protected void onSetupCompleted() {
27+
logger.info("Wallet created and loaded successfully.");
28+
logger.info("Receive address: " + wallet().currentReceiveAddress());
29+
logger.info("Seed Phrase: " + wallet().getKeyChainSeed());
30+
logger.info("Balance: " + wallet().getBalance()
31+
.toFriendlyString());
32+
logger.info("Public Key: " + wallet().findKeyFromAddress(wallet().currentReceiveAddress())
33+
.getPublicKeyAsHex());
34+
logger.info("Private Key: " + wallet().findKeyFromAddress(wallet().currentReceiveAddress())
35+
.getPrivateKeyAsHex());
36+
wallet().encrypt("password");
37+
38+
}
39+
};
40+
41+
kit.startAsync();
42+
kit.awaitRunning();
43+
kit.setAutoSave(true);
44+
45+
kit.wallet()
46+
.addCoinsReceivedEventListener((wallet, tx, prevBalance, newBalance) -> {
47+
logger.info("-----> coins resceived: " + tx.getTxId());
48+
logger.info("received: " + tx.getValue(wallet));
49+
});
50+
String receiveAddress = "n1vb1YZXyMQxvEjkc53VULi5KTiRtcAA9G";
51+
Coin value = Coin.valueOf(200);
52+
final Coin amountToSend = value.subtract(Transaction.REFERENCE_DEFAULT_MIN_TX_FEE);
53+
final Wallet.SendResult sendResult = kit.wallet()
54+
.sendCoins(kit.peerGroup(), Address.fromString(params, receiveAddress), amountToSend);
55+
56+
kit.wallet()
57+
.addCoinsSentEventListener((wallet, tx, prevBalance, newBalance) -> logger.info("new balance: " + newBalance.toFriendlyString()));
58+
59+
}
60+
61+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package com.baeldung.bitcoinj;
2+
3+
import org.bitcoinj.wallet.UnreadableWalletException;
4+
import org.bitcoinj.wallet.Wallet;
5+
import org.junit.jupiter.api.Test;
6+
import org.slf4j.Logger;
7+
import org.slf4j.LoggerFactory;
8+
9+
import java.io.IOException;
10+
11+
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
12+
import static org.junit.jupiter.api.Assertions.assertTrue;
13+
import static org.junit.jupiter.api.Assertions.assertFalse;
14+
import static org.junit.jupiter.api.Assertions.assertEquals;
15+
16+
class CreateWalletUnitTest {
17+
18+
Logger logger = LoggerFactory.getLogger(CreateWalletUnitTest.class);
19+
20+
@Test
21+
void givenCreateWalletInstance_whenCreateWalletCalled_thenNoExceptionThrown() {
22+
CreateWallet createWallet = new CreateWallet();
23+
assertDoesNotThrow(createWallet::createWallet);
24+
}
25+
26+
@Test
27+
void givenCreateWalletInstance_whenCreateEncryptedWalletCalled_thenNoExceptionThrown() {
28+
CreateWallet createWallet = new CreateWallet();
29+
assertDoesNotThrow(createWallet::createEncryptedWallet);
30+
}
31+
32+
@Test
33+
void givenCreateWalletInstance_whenLoadWalletCalled_thenNoExceptionThrown() {
34+
CreateWallet createWallet = new CreateWallet();
35+
assertDoesNotThrow(createWallet::loadWallet);
36+
}
37+
38+
@Test
39+
void givenCreateWalletInstance_whenLoadWalletCalled_thenReturnTrue() throws UnreadableWalletException, IOException {
40+
CreateWallet createWallet = new CreateWallet();
41+
assertTrue(createWallet.loadEncryptedWallet()
42+
.isEncrypted());
43+
}
44+
45+
@Test
46+
void givenCreateWalletInstance_whenLoadDecryptedWalletCalled_thenReturnFalse() throws UnreadableWalletException, IOException {
47+
CreateWallet createWallet = new CreateWallet();
48+
assertFalse(createWallet.loadDecryptedWallet()
49+
.isEncrypted());
50+
}
51+
52+
@Test
53+
void givenCreateWalletInstanceAndSeed_whenLoadUsingSeedCalled_thenWalletAddressMatchesExpected() throws UnreadableWalletException {
54+
CreateWallet createWallet = new CreateWallet();
55+
Wallet wallet = createWallet.loadUsingSeed("sad puzzle wrestle despair remain husband oval weird library guess fee avoid");
56+
assertEquals("n1vb1YZXyMQxvEjkc53VULi5KTiRtcAA9G", wallet.currentReceiveAddress()
57+
.toString());
58+
logger.info("Wallet balance: " + wallet.getBalance()
59+
.toFriendlyString());
60+
}
61+
62+
}

0 commit comments

Comments
 (0)