From 3adfa8473d46c4b8c869c927e47e7b8774495be8 Mon Sep 17 00:00:00 2001 From: Bruno Volpato Date: Wed, 13 Dec 2017 22:49:02 -0800 Subject: [PATCH] Create 12.7 Accessing Bitcoind with Java --- 12_7_Accessing_Bitcoind_with_Java.md | 131 +++++++++++++++++++++++++++ README.md | 2 + 2 files changed, 133 insertions(+) create mode 100644 12_7_Accessing_Bitcoind_with_Java.md diff --git a/12_7_Accessing_Bitcoind_with_Java.md b/12_7_Accessing_Bitcoind_with_Java.md new file mode 100644 index 0000000..b534557 --- /dev/null +++ b/12_7_Accessing_Bitcoind_with_Java.md @@ -0,0 +1,131 @@ +# 12.7: Accessing Bitcoind with Java + +> **NOTE:** This is a draft in progress, so that I can get some feedback from early reviewers. It is not yet ready for learning. + +Interacting with the `bitcoind` directly and using command-line `curl` can get simple if you understand how it works, but there's a project [JavaBitcoindRpcClient](https://github.com/Polve/JavaBitcoindRpcClient) that provides the functionality in a Java-API level, making it even easier to interact with your Bitcoin Server. + +## Setup Dependency + +If you use Maven in your Java project, you can include the dependency: +```xml + + wf.bitcoin + JavaBitcoindRpcClient + 0.9.13 + +``` + +Or if you use Gradle: +```groovy +compile 'wf.bitcoin:JavaBitcoindRpcClient:0.9.13' +``` + +### Build Your Connection + +To use `JavaBitcoindRpcClient`, you need to create a `BitcoindRpcClient` instance. The arguments in the URL are username, password, IP address and port. You should know this information from your work with `curl` . As you'll recall, the IP address 127.0.0.1 and port 18332 should be correct for the standard testnet setup described in this documents, while you can extract the user and password from `~/.bitcoin/bitcoin.conf`. + +```java + BitcoindRpcClient rpcClient = new BitcoinJSONRPCClient("http://bitcoinrpc:d8340efbcd34e312044c8431c59c792c@127.0.0.1:18332"); +``` + +> **MAINNET VS TESTNET:** The port would be 8332 for a mainnet setup. + +If `rpcClient` is successfully initialized, you'll be able to send off RPC commands. + +Later, when you're all done with your `bitcoind` connection, you should close it: +``` +rpcClient.stop(); +``` + +### Making your first RPC Call + +In order to use an RPC method using `JavaBitcoindRpcClient`, you'll find that the `BitcoindRpcClient` provides most of the functionality that can be accessed through `bitcloin-cli` or `curl`. + +For example, to execute the `getmininginfo`, you should use the `getMiningInfo()` method: +```java +MiningInfo info = rpcClient.getMiningInfo(); +System.out.println("Mining Information"); +System.out.println("------------------"); +System.out.println("Chain......: " + info.chain()); +System.out.println("Blocks.....: " + info.blocks()); +System.out.println("Difficulty.: " + info.difficulty()); +System.out.println("Hash Power.: " + new BigDecimal(info.networkHashps()).toPlainString()); +``` +The output for this line should be similar to this: +``` +Mining Information +------------------ +Chain......: test +Blocks.....: 1254920 +Difficulty.: 1.0 +Hash Power.: 6585163152453.466796875 +``` + +### Creating an Address + +You can create a new address attaching a specific label to it, as well as dump the private key for a specific address: +```java + String address = rpcClient.getNewAddress("Learning-Bitcoin-from-the-Command-Line"); + System.out.println("New Address: " + address); + + String privKey = rpcClient.dumpPrivKey(address); + System.out.println("Priv Key: " + privKey); +``` +Output: +``` +New Address: mpsFtZ8qTJPRGZy1gaaUw37fHeUSPLkzzs +Priv Key: cTy2AnmAALsHokYzJzTdsUBSqBtypmWfmSNYgG6qQH43euUZgqic +``` + + + +### Sending Transactions + +You can easily send a transaction using the method `sendToAddress()`. + +```java +String sendToAddress = rpcClient.sendToAddress("mgnNsZj6tPzpd7JwTTidUKnGoDTkcucLT5", 1); +System.out.println("Send: " + sendToAddress); +``` +This program will output a transaction id, for example: +``` +a2d2f629d6666ca6e440169a322850cd9d133f637f7a02a02a0a7477bc5687d4 +``` + +In case you want to adjust the transaction fee, you can use the `setTxFee` method before sending the output: + +```java +rpcClient.setTxFee(new BigDecimal(0.001).setScale(3, BigDecimal.ROUND_DOWN)); +``` + + +### Listening to Transactions or Blocks + +You may want to write applications that keep listening the Blockchain, and execute a specific code when something happens, such as a transaction that involves an address in your wallet, or even the generation of a new block in the network. +To do that, `JavaBitcoindRpcClient` provides support to `BitcoinAcceptor`, where you can attach listeners in the network. + +Example: +```java + BitcoinAcceptor acceptor = new BitcoinAcceptor(rpcClient, blockHash, 6, new BitcoinPaymentListener() { + + @Override + public void transaction(Transaction tx) { + System.out.println("Transaction: " + tx); + + } + + @Override + public void block(String block) { + System.out.println("Block: " + block); + + } + }); + acceptor.run(); +``` + +Every time some transaction is sent, or a new block is generated, you should see a similar output in your console: +``` +Transaction: {account=Tests, address=mhopuJzgmTwhGfpNLCJ9CRknugY691oXp1, category=receive, amount=5.0E-4, label=Tests, vout=1, confirmations=0, trusted=false, txid=361e8fcff243b74ebf396e595a007636654f67c3c7b55fd2860a3d37772155eb, walletconflicts=[], time=1513132887, timereceived=1513132887, bip125-replaceable=unknown} + +Block: 000000004564adfee3738314549f7ca35d96c4da0afc6b232183917086b6d971 +``` diff --git a/README.md b/README.md index 503dc5a..2d24eeb 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,8 @@ This tutorial assumes that you have some minimal background of how to use the co * [12.3: Programming Bitcoind with C](12_3_Programming_Bitcoind_with_C.md) — Needs Editing * [12.4: Receiving Bitcoind Notifications with C](12_4_Receiving_Bitcoind_Notifications_with_C.md) — Pending * [12.5: Accessing Bitcoind with Other Languages](12_5_Accessing_Bitcoind_with_Other_Languages.md) — Writing + * [12.6: Accessing Bitcoind with Python](12_6_Accessing_Bitcoind_with_Python.md) — Writing + * [12.7: Accessing Bitcoind with Java](12_7_Accessing_Bitcoind_with_Java.md) * 13.0: Programming with LibWally * 13.1: Programming Transactions * 13.2: Programming Scripts