1、首先要安装好bitcoin core服务 上一篇有怎么安装
下面代码支持多钱包多地址动态调用,但让我没用使用多地址,根据自己的需要然后封装方法就好
2、引入jar JavaBitcoinRpcClient
wf.bitcoin JavaBitcoindRpcClient 1.0.0
3、 BitcoinRPC 接口
package com.lpz.btc.api;import com.lpz.btc.model.TransferModel;public interface BitcoinRPC { /** * 创建BTC钱包地址(钱包、地址都是新创建) * @param walletName 钱包名称 * @param walletPassword 钱包密码 * @param addressName 地址显示名称 * @return 地址 */ String createBtcAddress(String walletName,String walletPassword,String addressName); /** * 获取BTC余额 * @param walletName 钱包名称 * @param address 地址 * @return 余额 */ double getBtcBalance(String walletName,String address); /** * BTC转账 * @param walletName 钱包名称 * @param walletPassword 钱包密码 * @param toAddress 接收地址 * @param quantity 转账数量 * @return 转账状态消息 */ TransferModel transfetBtc(String walletName,String walletPassword,String toAddress,double quantity); /** * 获取地址私钥 * @param walletName 钱包名称 * @param walletPassword 钱包密码 * @param address 地址 * @return 私钥 */ String getBtcPrivateKey(String walletName,String walletPassword,String address); /** * 导入BTC私钥(导入地址到钱包) * @param walletName 钱包名称 * @param walletPassword 钱包密码 * @param privateKey 私钥 * @return 是否成功 */ boolean importBtcPrivateKey(String walletName,String walletPassword,String privateKey);}
4、BitcoinRPCImpl 实现类
package com.lpz.btc.api.impl;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONArray;import com.alibaba.fastjson.JSONObject;import com.lpz.btc.api.BitcoinRPC;import com.lpz.btc.wf.bitcoin.javabitcoindrpcclient.BitcoinJSONRPCClient;import com.lpz.btc.model.exchange.TransferModel;import com.lpz.setting.DefaultBtc;import org.apache.log4j.Logger;import java.math.BigDecimal;import java.net.MalformedURLException;import java.net.URL;import java.util.ArrayList;import java.util.List;public class BitcoinRPCImpl implements BitcoinRPC { private Logger logger=Logger.getLogger(BitcoinRPCImpl.class); private DefaultBtc defaultBtc=new DefaultBtc(); private String user=defaultBtc.BTCRPCUSER;//lpz private String password=defaultBtc.BTCRPPASSWORD;//lpz private String port=defaultBtc.BTCRPCPORT;//18332 因为测试网是18332 主网是8332 private String host=defaultBtc.BTCRPCALLOWIP;//127.0.0.1 private final int WALLET_PASS_PHRASE_TIME_OUT=60; @Override public String createBtcAddress(String walletName, String walletPassword, String addressName) { try{ //获取BTC客户端默认钱包 BitcoinJSONRPCClient bitcoinClient=getBitcoinClient(""); //创建钱包 String walletResult=bitcoinClient.query("createwallet",walletName).toString(); logger.info("钱包("+walletName+")创建成功返回==>"+walletResult+""); //获取当前BTC客户端钱包 bitcoinClient=getBitcoinClient(walletName); //设置钱包密码 bitcoinClient.encryptWallet(walletPassword); //创建地址 return bitcoinClient.getNewAddress(addressName); }catch (Exception e){ logger.error("创建钱包地址异常==>"+e.getMessage()); } return null; } @Override public double getBtcBalance(String walletName, String address) { try { ListjsonArrayList=getListAddressInfo(walletName); for(JSONArray jsonArray:jsonArrayList){ if(jsonArray.getString(0).equals(address)){ return jsonArray.getDoubleValue(1); } } }catch (Exception e){ logger.error("钱包("+walletName+")地址("+address+")获取余额异常==>"+e.getMessage()); } return 0; } @Override public TransferModel transfetBtc(String walletName, String walletPassword, String toAddress, double quantity) { TransferModel transferModel=new TransferModel(); transferModel.status=transferModel.status_101; try { BitcoinJSONRPCClient bitcoinClient=getBitcoinClient(walletName); //获取钱包余额 double balance = bitcoinClient.getBalance().doubleValue(); if(balance "+result); transferModel.message="转账成功"; transferModel.status=transferModel.status_100; } }catch (Exception e){ transferModel.message="BTC转账异常"; logger.error("钱包("+walletName+")转账"+quantity+"个btc到"+toAddress+"异常==>"+e.getMessage()); } return transferModel; } @Override public String getBtcPrivateKey(String walletName, String walletPassword, String address) { try { BitcoinJSONRPCClient bitcoinClient=getBitcoinClient(walletName); bitcoinClient.walletPassPhrase(walletPassword,WALLET_PASS_PHRASE_TIME_OUT); Object addressPrivate=bitcoinClient.query("dumpprivkey",address); return addressPrivate.toString(); }catch (Exception e){ logger.error("获取地址("+address+")私钥异常==>"+e.getMessage()); } return null; } @Override public boolean importBtcPrivateKey(String walletName, String walletPassword, String privateKey) { try { BitcoinJSONRPCClient bitcoinClient=getBitcoinClient(walletName); bitcoinClient.walletPassPhrase(walletPassword,WALLET_PASS_PHRASE_TIME_OUT); bitcoinClient.importPrivKey(privateKey); return true; }catch (Exception e){ logger.error("导入地址私钥("+privateKey.substring(10)+"******)到钱包("+walletName+")异常==>"+e.getMessage()); } return false; } /** * 获取BTC客户端 * @param walletName 钱包名称 * @return BTC客户端 */ private BitcoinJSONRPCClient getBitcoinClient(String walletName){ BitcoinJSONRPCClient bitcoinClient=null; try { URL url = new URL("http://" + user + ':' + password + "@" + host + ":" + port + "/wallet/"+walletName+""); bitcoinClient = new BitcoinJSONRPCClient(url); } catch (MalformedURLException e) { logger.error("获取BTC RPC错误==>"+e.getMessage()); } return bitcoinClient; } /** * 获取所有钱包地址信息 * @param walletName 钱包名称 * @return 所有地址信息 */ private List getListAddressInfo(String walletName){ BitcoinJSONRPCClient bitcoinClient=getBitcoinClient(walletName); List resultList=new ArrayList (); try { Object walletAddressAll=bitcoinClient.query("listaddressgroupings"); JSONArray jsonArrayAll= JSON.parseArray(JSON.toJSONString(walletAddressAll)); for(int i=0;i "+e.getMessage()); } return resultList; }}
5、测试调用 BitcoinRPCTest
package com.lpz; import com.lpz.btc.api.BitcoinRPC; import com.lpz.btc.api.impl.BitcoinRPCImpl; import org.apache.log4j.Logger; import org.junit.Test; public class BitcoinRPCTest { private Logger logger=Logger.getLogger(BitcoinRPCTest.class); BitcoinRPC bitcoinRPC=new BitcoinRPCImpl(); @Test public void getBalance(){ String walletName="lpz"; String address="2N1UMYA6poo3JFFnV3kGC5T5yrw81nRBQP4"; double balance=bitcoinRPC.getBtcBalance(walletName,address); logger.info("钱包("+walletName+")的余额是==>"+balance); } @Test public void createBtcAddress(){ String walletName="lpz_tld"; String walletPassword="lpz_tld"; String addressName="lpz_tld"; String newAddress=bitcoinRPC.createBtcAddress(walletName,walletPassword,addressName); logger.info("钱包("+walletName+")地址==>"+newAddress); } }
效果如下:
还有一点就是我代码里面没有使用BitcoinJSONRPCClient 这个jar 用的是源码
copy代码使用的时候,引包哪里改成使用jar就好了,
然后就是jar里面包含了老版本的方法,有些方法在bitcoin core控制台不能使用的话,在java里面也会抛异常 "找不到此方法"的
eq:上一篇里面move(转账)方法 java里面使用此方法就会抛异常
###最后一点是我自己测试使用的
package com.lpz.exchange.biz;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.apache.log4j.Logger;import wf.bitcoin.javabitcoindrpcclient.BitcoinJSONRPCClient;import wf.bitcoin.javabitcoindrpcclient.BitcoindRpcClient;import java.math.BigDecimal;import java.net.MalformedURLException;import java.net.URL;import java.util.List;public class TestBitcoinCore { private static Logger logger= Logger.getLogger(TestBitcoinCore.class); private static void javaBitcoin(){ String user = "lpz"; String password = "lpz"; String host = "127.0.0.1";// String host = "192.168.86.1"; String port = "18332"; try { URL url = new URL("http://" + user + ':' + password + "@" + host + ":" + port + "/wallet/"); BitcoinJSONRPCClient bitcoinClient = new BitcoinJSONRPCClient(url);// //创建钱包// String walletName="longpizi5";// String returnWallet=bitcoinClient.query("createwallet",walletName).toString();// System.out.println(returnWallet); //设置钱包密码// bitcoinClient.encryptWallet("TLD6_1zns"); //修改钱包密码 walletpassphrasechange// bitcoinClient.query("TLD6_1zns","原密码","新密码");//未测试 //获取钱包信息 System.out.println("钱包信息:"+JSON.toJSONString(bitcoinClient.getWalletInfo())); //导入钱包// bitcoinClient.dumpWallet("C:\\Users\\THIS_ODK\\Desktop\\lpz.dat");// System.out.println(JSON.toJSONString());// System.out.println(bitcoinClient.backupWallet();); //创建账号// String addressName="longlin1";// String account=bitcoinClient.getNewAddress(addressName);// System.out.println("账号地址:"+account); BigDecimal balance = bitcoinClient.getBalance(); System.out.println(balance); //获取账号信息 listaddressgroupings ListreceivedAddressList=bitcoinClient.listReceivedByAddress(); System.out.println("钱包地址信息1:"+JSON.toJSONString(receivedAddressList)); Object o_listAddress=bitcoinClient.query("listaddressgroupings"); System.out.println("钱包地址信息2:"+ JSON.toJSONString(o_listAddress)); //获取地址私钥 dumpprivkey //输入钱包密码// bitcoinClient.walletPassPhrase("TLD6_1zns",60);// Object o_getAddressPrivate=bitcoinClient.query("dumpprivkey","2N1y1DGtXUbajM5SWyo9yRgiWAqQcPUyVEA");// System.out.println("获取地址私钥:"+ JSON.toJSONString(o_getAddressPrivate)); /* //转账 sendtoaddress 错误: Please enter the wallet passphrase with walletpassphrase first." //输入钱包密码 bitcoinClient.walletPassPhrase("TLD6_1zns",5000); //开始转账 String result=bitcoinClient.sendToAddress("2N1y1DGtXUbajM5SWyo9yRgiWAqQcPUyVEA", BigDecimal.valueOf(0.01)); System.out.println("交易ID:"+result); */ //锁定钱包:walletlock 钱包解锁:walletpassphrase //* } catch (MalformedURLException e) { e.printStackTrace(); } } public static void main(String[] args){ javaBitcoin(); }}