本文给大家介绍了 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. 算法与数据结构基础 - 位运算(Bit Manipulation)

    位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...

  2. gcd 和 同余方程(Exgcd)

    求关于x的同余方程 ax≡1(mod b) 的最小正整数解. 对于 100%的数据,2≤a,b≤2*109. NOIP 2012 提高组 第二天 第一题 (只看Exgcd的自行跳过这段文字) 先撇开扩 ...

  3. Kubernetes-保障集群内节点和网络安全

    13.1.在pod中使用宿主节点的Linux命名空间 13.1.1.在pod中使用宿主节点的网络命名空间 在pod的yaml文件中就设置spec.hostNetwork: true 这个时候pod使用 ...

  4. ATX agent+UIautomation2 自动化测试介绍

    纯搬运贴,内容几乎来源于作者的几篇介绍文章,这里做了整合 目前ATX+UIautomator2 处于自动化界的浪口风尖,现在有幸终于有时间对ATX进行了粗浅的了解 为什么要用ATX ATX+UIaut ...

  5. appiumstudio工具-----实现windows上安卓、IOS自动化测试

    博主用的是win10,用python+appium做完安卓的自动化第一个版本后,大量地搜索windows上做IOS自动化的解决办法,有的建议用虚拟机,安装苹果的系统,没有实践过,据说效果不很好.然后, ...

  6. 携程PMO--如何召开卓有成效的回顾会

      话题介绍   回顾会提供团队反思迭代过程并提出改进措施的机会.回顾会是团队成员共同进行的协作活动,让团队成员跟进并落实改进措施,使团队在下一个冲刺中更高效,这是相当重要的.   我们给出了回顾会的 ...

  7. Java函数式编程原理以及应用

    一. 函数式编程 Java8所有的新特性基本基于函数式编程的思想,函数式编程的带来,给Java注入了新鲜的活力. 下面来近距离观察一下函数式编程的几个特点: 函数可以作为变量.参数.返回值和数据类型. ...

  8. SpringBoot中快速实现邮箱发送

    前言 在许多企业级项目中,需要用到邮件发送的功能,如: 注册用户时需要邮箱发送验证 用户生日时发送邮件通知祝贺 发送邮件给用户等 创建工程导入依赖 <!-- 邮箱发送依赖 --> < ...

  9. docker安装Ubuntu以及ssh连接

    一.简述 环境: Windows10 docker:2.1.0.1 二.开始安装 Windows的docker安装就不再多说了,网上有很多教程 在docker的hub仓库中,有专门的ubuntu系统. ...

  10. IT人不仅要提升挣钱能力,更要拓展挣钱途径

    前几天我上班路上,和小区门口开车的师傅闲聊,发现他们虽然学历不高,但挣钱的途径不少,比如固定接送多位客户,然后能通过朋友圈拓展新客户,而且通过客户口口相传,也能不断拉到生意,算下来每月也能挣1万5出头 ...