1、首先要安装好bitcoin core服务 上一篇有怎么安装

下面代码支持多钱包多地址动态调用,但让我没用使用多地址,根据自己的需要然后封装方法就好

2、引入jar  JavaBitcoinRpcClient

<!-- https://mvnrepository.com/artifact/wf.bitcoin/JavaBitcoindRpcClient -->
<dependency>
<groupId>wf.bitcoin</groupId>
<artifactId>JavaBitcoindRpcClient</artifactId>
<version>1.0.0</version>
</dependency>

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 {
List<JSONArray> jsonArrayList=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<quantity){
transferModel.message="余额不足";
transferModel.status=transferModel.status_103;
}else{
//输入钱包密码
bitcoinClient.walletPassPhrase(walletPassword,WALLET_PASS_PHRASE_TIME_OUT);
//开始转账
String result=bitcoinClient.sendToAddress(toAddress, BigDecimal.valueOf(quantity));
logger.info("钱包("+walletName+")成功转账"+quantity+"个btc到"+toAddress+"交易hash==>"+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<JSONArray> getListAddressInfo(String walletName){
BitcoinJSONRPCClient bitcoinClient=getBitcoinClient(walletName);
List<JSONArray> resultList=new ArrayList<JSONArray>();
try {
Object walletAddressAll=bitcoinClient.query("listaddressgroupings");
JSONArray jsonArrayAll= JSON.parseArray(JSON.toJSONString(walletAddressAll));
for(int i=0;i<jsonArrayAll.size();i++){
JSONArray walletArray=JSON.parseArray(jsonArrayAll.get(i).toString());
for(int j=0;j<walletArray.size();j++){
JSONArray jsonArray= JSON.parseArray(walletArray.getString(j));
resultList.add(jsonArray);
}
}
}catch (Exception e){
logger.error("钱包("+walletName+")获取所有地址信息异常==>"+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
List<BitcoindRpcClient.ReceivedAddress> receivedAddressList=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();
}
}

BitcoinCore JSONRPC Java使用,创建账号,获取余额,转账等等...的更多相关文章

  1. java session创建与获取

    一.流程 登录接口-->验证用户名密码-->获取用户实体对象-->创建session (key,value) 其他接口调用-->获取session(key) 二.代码 //登录 ...

  2. 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token

    一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...

  3. 捷微jeewx , 免费开源(java)微信公众账号管家系统发布

    JeeWx, 微信管家平台,简称"捷微". 捷微是一款免费开源的JAVA微信公众账号开发平台.  平台介绍: 一.捷微Jeewx简介 Jeewx是一个开源.高效.敏捷的微信开发平台 ...

  4. 使用java 程序创建格式为utf-8文件的方法(写入和读取json文件)

    使用java 程序创建格式为utf-8文件的方法:  try{            File file=new   File("C:/11.jsp");              ...

  5. 第七篇 :微信公众平台开发实战Java版之如何获取微信用户基本信息

    在关注者与公众号产生消息交互后,公众号可获得关注者的OpenID(加密后的微信号,每个用户对每个公众号的OpenID是唯一的.对于不同公众号,同一用户的openid不同). 公众号可通过本接口来根据O ...

  6. Java中创建操作文件和文件夹的工具类

    Java中创建操作文件和文件夹的工具类 FileUtils.java import java.io.BufferedInputStream; import java.io.BufferedOutput ...

  7. Java值创建线程的两种方式对比

    在Java中创建线程的方式有两种,第一种是直接继承Thead类,另一种是实现Runable接口.那么这两种方式孰优孰劣呢? 采用继承Thead类实现多线程: 优势:编写简单,如果需要访问当前线程,只需 ...

  8. Java Class类以及获取Class实例的三种方式

    T - 由此 Class 对象建模的类的类型.例如,String.class 的类型是Class<String>.如果将被建模的类未知,则使用Class<?>.   publi ...

  9. Java curator操作zookeeper获取kafka

    Java curator操作zookeeper获取kafka Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更 ...

随机推荐

  1. [洛谷Luogu]P1141 01迷宫[联通块 并查集]

    题目链接 大致题意 相邻格子不同为连通,计算每个点所在的连通块大小. 想法 我采用了并查集的做法. 开一个辅助数组记录连通块大小,每次合并的时候更新父亲节点的大小即可. 一个点先与它上面的点判定,若判 ...

  2. bugku - pwn wp

    一. PWN1 题目:nc 114.116.54.89 10001 1.  直接kali里面跑nc 2.ls看看有啥 3.明显有一个flag cat查看一下 搞定 二 . PWN2 题目:给了nc 1 ...

  3. jvm 性能监控与linux常用命令

    linux日常的运维 .Java开发 管理监控命令  ,较为浅显,欢迎提意见,我将在后面持续补充.

  4. Marvolo Gaunt's Ring(巧妙利用前后缀进行模拟)

    Description Professor Dumbledore is helping Harry destroy the Horcruxes. He went to Gaunt Shack as h ...

  5. 【剑指Offer】面试题06.从尾到头打印链表

    题目 输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回). 示例 1: 输入:head = [1,3,2] 输出:[2,3,1] 限制: 0 <= 链表长度 <= 1000 ...

  6. JVM探秘:jinfo查看JVM运行时参数

    本系列笔记主要基于<深入理解Java虚拟机:JVM高级特性与最佳实践 第2版>,是这本书的读书笔记. 如何查看JVM运行时参数,对于线上JVM调优是很关键的,因为只有知道了当前使用的JVM ...

  7. 如何保障Assignment写作效率?

    有没有因为开学要交的Assignment而日夜赶工.身心俱疲啊?写Assignment确实是个体力+脑力活,要一直保持旺盛的精力并不容易.精神和身体的疲劳会慢慢分散你的注意力,进而影响效率和写作质量. ...

  8. 项目进度02-Day3

    ①今天做了什么? 数据库数据的重置.之前的用户类字段的补充.简单的平台信息查询 ②明天要做什么?   分类浏览和综合查询功能. ③遇到了什么问题? 出现问题:Parameter index out o ...

  9. 51nod 1392:装盒子 匈牙利+贪心

    1392 装盒子 基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题  收藏  关注 有n个长方形盒子,第i个长度为Li,宽度为Wi,我们需要把他们套放.注意一个盒子 ...

  10. Spring的配置文件说明

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...