本文给大家介绍了 Web3j Java 版本的框架的基本使用,大家可根据本文的内容进行扩展性的练习,对其他 API 的使用进行尝试。

使用web3j对接以太坊钱包

一、开发准备事项

启动 Geth

此操作在(二)中已经详细介绍过了,可以参考其内容进行 Geth 节点启动,也算是对之前内容的复习,这里不再赘述操作步骤。

开发环境准备

    • JDK 版本 1.8;
    • 开发工具 Intellij idea(本教程使用,也可以使用 Eclipse 等其他 IDE);
    • Maven 版本管理(本教程使用,要依赖一些通用的 jar 包,采用 Maven 项目管理模式,也可自行下载依赖 jar 包使用其他方式,建议用 Maven 来操作)。

二、项目实战

创建 Maven 项目

在 idea 中单击创建新项目,进入如下页面,选择 Maven 项目:

单击 Next 按钮,填写 Maven 项目中的 GroupId 和 ArtifactId:

单击 Next 按钮,设置项目名称和项目路径:

单击 Finish 按钮,这样就创建好了一个 Maven 项目:

添加依赖

在 pom.xml 文件中新增依赖父元素和 Maven 编译指定 jdk 版本:

<dependencies>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>

然后在其中父依赖中添加一下依赖信息:

<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.web3j</groupId>
<artifactId>geth</artifactId>
<version>3.2.0</version>
</dependency>

上面引入的是一套开源的支持 Web3j 调用以太坊的依赖核心包和 Geth 操作包。Web3j 开源框架提供了一套 Java 版本的操作封装,让开发人员可以方便快捷的进行 JSON-RPC 的调用。

公共代码示例

创建 package:com.secbro.eth,并在 package 下面创建 EthService 类,后面针对 ETH 的操作,都会封装在 EthService 中做为静态方法呈现,类内容如下,后面代码讲解不再粘贴类内容,直接展示使用到的方法:

 package com.secbro.eth;
/**
* @author zzs
*/
public class EthService {
/**
* geth节点可调用的json-rpc接口地址和端口
*/
private static final String URL = "http://127.0.0.1:8545/";
}

其中需要注意的是上面的静态变量为 Geth 节点启动的 JSON-RPC 访问的地址和端口,如果不是本地启动可修改 IP 和端口,确保网络畅通。

初始化 Web3j、Geth 和 Admin 接口

Web3j 框架中提供了多类操作,我们重点介绍 Web3j、Geth 和 Admin 这三个接口,其中 Web3j 和 Admin 都在核心包 core 中,Geth 是在 Geth 包中,这三个接口与我们讲的 JSON-RPC 中说到的操作有对应的关系,其中 Web3j 接口封装了常见的 net、eth、db 等操作,与官方提供的操作一一对应。

Admin 接口对应的是 personal 的一部分操作:

    • personalListAccounts()
    • personalNewAccount(String password)
    • personalUnlockAccount( String address, String passphrase, BigInteger duration)
    • personalUnlockAccount( String address, String passphrase)
    • personalSendTransaction( Transaction transaction, String password)

Geth 接口继承了 Admin 接口,并新增了以下操作:

    • personalImportRawKey(String keydata, String password)
    • personalLockAccount(String accountId)
    • personalSign(String message, String accountId, String password)
    • personalEcRecover(String message, String signiture)

下面在 EthService 类中新增如下实例化方法,来获得这三个接口的实现:

/**
* 初始化web3j普通api调用
*
* @return web3j
*/
public static Web3j initWeb3j() {
return Web3j.build(getService());
}
/**
* 初始化personal级别的操作对象
* @return Geth
*/
public static Geth initGeth(){
return Geth.build(getService());
}
/**
* 初始化admin级别操作的对象
* @return Admin
*/
public static Admin initAdmin(){
return Admin.build(getService());
}
/**
* 通过http连接到geth节点
* @return
*/
private static HttpService getService(){
return new HttpService(URL);
}

代码上的注释已经明确说明每个方法的用户,这里值得一提的是这里采用的是 HttpService 来初始化一个与 geth 通信的 http 连接,在真实生产中可以采用 OkHttpClient 来对此链接进行设置超时时间等参数。

通过上面的步骤就完成了三个接口对应的类的实例化操作,后面的内容就可以直接使用它们提供的方法来实现进行相应的业务处理。

三、常用接口使用示例

下面提供一些常用的接口(开发钱包或交易所)的具体实现的代码和解析。

创建地址

根据输入的密码创建地址,对应 personal_newAccount 操作,返回地址 hash:

/**
* 输入密码创建地址
*
* @param password 密码(建议同一个平台的地址使用一个相同的,且复杂度较高的密码)
* @return 地址hash
* @throws IOException
*/
public static String newAccount(String password) throws IOException {
  Admin admin = initAdmin();
  Request<?, NewAccountIdentifier> request = admin.personalNewAccount(password);
  NewAccountIdentifier result = request.send();
  return result.getAccountId();
}

查询区块高度

查询区块高度,对应eth_blockNumber操作,返回当前区块高度。

/**
* 获得当前区块高度
*
* @return 当前区块高度
* @throws IOException
*/
public static BigInteger getCurrentBlockNumber() throws IOException {
  Web3j web3j = initWeb3j();
  Request<?, EthBlockNumber> request = web3j.ethBlockNumber();
  return request.send().getBlockNumber();
}

解锁账户

解锁账户,发送交易前需要对账户进行解锁,对应personal_unlockAccount操作。

/**
* 解锁账户,发送交易前需要对账户进行解锁
*
* @param address 地址
* @param password 密码
* @param duration 解锁有效时间,单位秒
* @return
* @throws IOException
*/
public static Boolean unlockAccount(String address, String password, BigInteger duration) throws IOException {
  Admin admin = initAdmin();
  Request<?, PersonalUnlockAccount> request = admin.personalUnlockAccount(address, password, duration);
  PersonalUnlockAccount account = request.send();
  return account.accountUnlocked();
}

锁定账户

账户解锁,使用完成之后需要锁定,对应操作personal_lockAccount

/**
* 账户解锁,使用完成之后需要锁定
*
* @param address
* @return
* @throws IOException
*/
public static Boolean lockAccount(String address) throws IOException {
  Geth geth = initGeth();
  Request<?, BooleanResponse> request = geth.personalLockAccount(address);
  BooleanResponse response = request.send();
  return response.success();
}

获取交易信息

根据 hash 值获取交易信息,对应操作eth_getTransactionByHash

/**
* 根据hash值获取交易
*
* @param hash
* @return
* @throws IOException
*/
public static EthTransaction getTransactionByHash(String hash) throws IOException {
  Web3j web3j = initWeb3j();
  Request<?, EthTransaction> request = web3j.ethGetTransactionByHash(hash);
  return request.send();
}

查询区块内容

根据区块编号查询区块内容,对应操作eth_getBlockByNumber

/**
* 获得ethblock
*
* @param blockNumber 根据区块编号
* @return
* @throws IOException
*/
public static EthBlock getBlockEthBlock(Integer blockNumber) throws IOException {
  Web3j web3j = initWeb3j();
  DefaultBlockParameter defaultBlockParameter = new DefaultBlockParameterNumber(blockNumber);
  Request<?, EthBlock> request = web3j.ethGetBlockByNumber(defaultBlockParameter, true);
  EthBlock ethBlock = request.send();
  return ethBlock;
}

发送交易

发送交易并获得交易 hash 值,对应操作personal_sendTransaction

/**
* 发送交易并获得交易hash值
*
* @param transaction
* @param password
* @return
* @throws IOException
*/
public static String sendTransaction(Transaction transaction, String password) throws IOException {
  Admin admin = initAdmin();
  Request<?, EthSendTransaction> request = admin.personalSendTransaction(transaction, password);
  EthSendTransaction ethSendTransaction = request.send();
  return ethSendTransaction.getTransactionHash();
}

获取指定地址 nonce

指定地址发送交易所需 nonce 获取,对应操作eth_getTransactionCount

/**
* 指定地址发送交易所需nonce获取
*
* @param address 待发送交易地址
* @return
* @throws IOException
*/
public static BigInteger getNonce(String address) throws IOException {
  Web3j web3j = initWeb3j();
  Request<?, EthGetTransactionCount> request = web3j.ethGetTransactionCount(address, DefaultBlockParameterName.LATEST);
  return request.send().getTransactionCount();
}

使用接口注意事项

在使用上面的接口调用时,request.send() 方法是同步返回结果,在某些情况下可能会导致响应比较慢,因此此框架提供了 request.sendAsync() 异步操作,当进行异步操作时只是将操作的执行发送出去,并没有获得相应的操作结果,需要通过监听器获取结果的通知。

本文中示例的代码大家在真实生产环境使用时需要进行相应的优化处理,比如网络优化、初始化链接优化、超时时间设定、冷钱包设置、私钥与 Geth 节点分离、系统安全考虑等。

BIZZAN(币严) 数字货币交易所官方网址:

www.bizzan.com

[币严区块链]数字货币交易所之以太坊(ETH)钱包对接(四) 使用web3j对接以太坊钱包的更多相关文章

  1. [币严区块链]数字货币交易所之比特币(BTC)钱包对接 | 自建节点JSON-RPC访问

    BTC钱包对接流程 一.   部署BTC钱包节点 二.   分析BTC钱包的API 三.   通过JSON-RPC访问BTC钱包API 四.   部署测试 一.部署钱包节点 交易平台对接BTC之前,要 ...

  2. [币严区块链]数字货币交易所之瑞波(XRP)钱包对接

    对接Ripple(XRP),不需要本地部署钱包,直接访问Ripple API,本文包括访问Ripple API及如何免费获取测试的XRP. 对接流程 安装Ripple API Ripple API 接 ...

  3. [币严BIZZAN区块链]数字货币交易所钱包对接之比特币(BTC)

    在币严BIZZAN开发数字货币交易所的过程中,一共有两大难点,一个是高速撮合交易引擎,另一个是钱包对接,这两者是我们团队以前没有接触过的.这个系列的文章主要介绍数字货币交易所钱包对接实现技术.第一个要 ...

  4. [币严区块链]BitcoinCash - BCH钱包地址生成与扫块充值监控(JAVA版)

    本文的方案无需自建节点,因为BCH当前区块数据大小已经达到200G以上,BTC区块数据也已超过300G,若每个币都自建节点,对云服务器的消耗会非常大. 认识BitcoinCash(BCH) Bitco ...

  5. [币严区块链]交易所钱包系统如何实现USDT自动归集操作

    本文代码应用场景: 每个用户在交易所充值时,每个人都分配了独立的USDT地址,而交易所需要将所有独立的地址中USDT汇集到一个钱包地址(一般是冷钱包),从而实现资产归集与安全保障. 注意: 理解以下代 ...

  6. [币严区块链]USDT钱包节点搭建

    USDT是基于BTC发的稳定币,它是比特币的一条侧链,说简单点,就是在比特币区块数据的不可篡改性与区块唯一性的基础上,再封装了一层.具体原理可网上查资料.总之理解一点:USDT的钱包节点就是BTC的钱 ...

  7. [币严区块链]以太坊(ETH)Dapp开发入门教程之宠物商店领养游戏

    阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你先看以太坊是什么 除此之外,你最好还了解一些HTML及JavaScript知识. 本文通过实例教大家来开发去中心化应用,应用效果如图 ...

  8. [币严区块链]简单易懂的以太坊(ETH)智能合约开发入门教程

    以太坊(Ethereum)是一提供个智能合约(smart contract)功能的公共区块链(BlockChain)平台. 本文介绍了一个简单的以太坊智能合约的开发过程. 开发环境 在以太坊上开发应用 ...

  9. [币严区块链]ETH搭建节点区块数据同步的三种模式:full、fast、light

    ETH  全节点Archive(归档)模式数据量增长图 上述图表可通过链接查看:https://etherscan.io/chartsync/chainarchive 通过上表,可以看到截止2019年 ...

随机推荐

  1. 世界十大OTA公司盘点

    世界十大OTA公司盘点 文/刘照慧(执惠旅游联合创始人,首发百度百家) 全球在线旅游公司(OTA)经过多年发展,已经形成较为成熟的商业模式,各大巨头跑马圈地,格局初现, 这两篇文章就梳理出全球按市值( ...

  2. 使用mybatis实现分页查询示例代码分析

    *******************************************分页查询开始*************************************************** ...

  3. .NETCore C# 中级篇2-4 一文带你完全弄懂正则表达式

    .NETCoreCSharp 中级篇2-4 本节内容为正则表达式的使用 简介 有的时候,你是否有过这种需求:判断一个Ip地址.邮箱.密码规则是否合法.如果让你使用if一类的传统方法进行处理,你肯定会被 ...

  4. CodeForces 427D Match & Catch

    洛谷题目页面传送门 & CodeForces题目页面传送门 给定\(2\)个字符串\(a,b,|a|=n,|b|=m\),求最长的既在\(a\)中出现恰好\(1\)次又在\(b\)中出现恰好\ ...

  5. (二十六)c#Winform自定义控件-有确定取消的窗体(二)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  6. Python项目中的单元测试

    引入 单元测试负责对最小的软件设计单元(模块)进行验证,unittest是Python自带的单元测试框架. 单元测试与功能测试都是日常开发中必不可少的部分,本文演示了Python中unittest单元 ...

  7. 8.9 day30 并发编程 进程理论 进程方法 守护进程 互斥锁

    多道技术 1.空间上的复用 多个程序共用一套计算机硬件 多道技术原理 2.时间上的复用 ​ 切换+保存状态 ​ 1.当一个程序遇到IO操作 操作系统会剥夺该程序的CPU执行权限( 提高了CPU的利用率 ...

  8. 谈谈surging 微服务引擎 2.0的链路跟踪和其它新增功能

    一.前言 surging是基于.NET CORE 服务引擎.初始版本诞生于2017年6月份,经过NCC社区二年的孵化,2.0版本将在2019年08月28日进行发布,经历二年的发展,已经全部攘括了微服务 ...

  9. Nginx总结(一)Linux如何安装Nginx

    以前写过一些Nginx的文章,但都是用到什么说什么,没有一个完整系统的总结.趁最近有时间,打算将Nginx相关的内容重新整理一下.nginx系列文章地址如下:https://www.cnblogs.c ...

  10. 利用SSH端口转发实现远程访问内网主机远程桌面(一) 建立SSH转发

    近期家里更换了移动的宽带,拨号后拿到的是10开头的内网IP,就不能像之前一样通过路由器的端口映射实现从外网访问主机的远程桌面.这种情况下可以利用一台具有公网IP的服务器充当中转,利用SSH的隧道转发功 ...