前言
这是我的区块链专栏的第二篇,内容将围绕web3j 以及springBoot与我们之前创建好的链进行交互来写。怎么创建一条私链,请看上一篇文章。
文章目录
需求
重新讲一下我们的需求:我想做的是把一部分的数据上链,以便之后必要的时候能做一定的验证,你可以理解这是一个简单地溯源项目。
既然如此,那么我们的核心就是把数据上链,以及结合现实情况,让一切能够走得通。而完成这系列工作的核心就是:web3j
web3j
web3j是什么?
Web3j是一个轻量级,响应式,类型安全的Java库,用于与Ethereum网络上的客户端(节点)集成,核心就是这一点: 与Ethereum网络上的客户端(节点)集成
web3所提供的核心功能
-
通过HTTP和IPC完成对Ethereum客户端API的实现
-
对于Ethereum钱包支持
-
使用过滤器的函数式编程功能的API
-
自动生成Java智能合约包装器,以创建、部署、处理和调用来自本地Java代码的智能合约
上一篇博客里我们是基于本地环境下。利用geth客户端与我们创建的私链进行交互,在实际开发中,我们不可能这样的,我们肯定是需要借助代码去和链进行交互;而web3j说白了就是做这样一件事情,需要记住的一点是: web3j不能进行智能合约编写!
springBoot项目下进行web3j的整合
导入依赖
这里只注入了web3j的依赖
<!-- web3j-->
<dependency>
<groupId>org.web3j</groupId>
<artifactId>core</artifactId>
<version>3.4.0</version>
</dependency>
开启以太坊客户端
我们现在还是基于本地进行测试,至于本地怎么搭建相关环境,请看上一篇博客。这里直接开启geth控制台,运行以下命令:
geth --identity "TestNode" --rpc --rpcport "8545" --datadir data --port "30303" --nodiscover --allow-insecure-unlock console
与客户端进行通信
从上面指令我们知道,我们已经开启了8545端口;那么接下来我们就去和我们本机的8545端口通信,在web3j里是这样实现的:
//你可以这样:
Web3j web3j = Web3j.build(new HttpService());
//你也可以这样:
Web3j web3j = Web3j.build(new HttpService("http://localhost:8545"));
//你还可以这样:
Admin admin =Admin.build(new HttpService());
上面的方式都可以与我们本地客户端完成通信
创建链上账户
与客户端进行通信之后,下面就是我们的代码实现部分,首先先完成创建链上账户:下面是我的完整代码
首先,创建一个以太坊钱包类:
public class ETHAccounts {
Integer id ;
//保存文件名
String keyStoreKey;
//12个单词的助记词
String memorizingWords;
//钱包公钥16进制字符串表示
String ethPublicKey;
//钱包私钥16进制字符串表示
String ethPrivateKey;
//钱包地址
String walletAddress;
//企业id
Integer terraceUserId;
//密码秘钥
String rsaPublicKey;
//密码公钥
String rsaPrivateKey;
//加密后密码
String walletPwd;
Integer status;
public String getWalletPwd() {
return walletPwd;
}
public void setWalletPwd(String walletPwd) {
this.walletPwd = walletPwd;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getKeyStoreKey() {
return keyStoreKey;
}
public void setKeyStoreKey(String keyStoreKey) {
this.keyStoreKey = keyStoreKey;
}
public String getMemorizingWords() {
return memorizingWords;
}
public void setMemorizingWords(String memorizingWords) {
this.memorizingWords = memorizingWords;
}
public String getEthPublicKey() {
return ethPublicKey;
}
public void setEthPublicKey(String ethPublicKey) {
this.ethPublicKey = ethPublicKey;
}
public String getEthPrivateKey() {
return ethPrivateKey;
}
public void setEthPrivateKey(String ethPrivateKey) {
this.ethPrivateKey = ethPrivateKey;
}
public String getWalletAddress() {
return walletAddress;
}
public void setWalletAddress(String walletAddress) {
this.walletAddress = walletAddress;
}
public Integer getTerraceUserId() {
return terraceUserId;
}
public void setTerraceUserId(Integer terraceUserId) {
this.terraceUserId = terraceUserId;
}
public String getRsaPublicKey() {
return rsaPublicKey;
}
public void setRsaPublicKey(String rsaPublicKey) {
this.rsaPublicKey = rsaPublicKey;
}
public String getRsaPrivateKey() {
return rsaPrivateKey;
}
public void setRsaPrivateKey(String rsaPrivateKey) {
this.rsaPrivateKey = rsaPrivateKey;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "ETHAccounts{" +
"id=" + id +
", keyStoreKey='" + keyStoreKey + '\'' +
", memorizingWords='" + m