前言
区块链笔记(4)–fabric-sdk-java调用链码
在本地使用
IDEA结合远程服务器部署的fabric环境调试fabric-sdk-java
简介
Java-SDK是外部应用程序与Hyperledger Fabric的交互通道,帮助Java应用程序更好的管理Fabric通道和链码的生命周期,提供了链码管理、查询通道上的区块和交易数据的接口,及通道发生事件的监控。简单说就是用java代码代替之前的一些通道接口命令、链码接口命令、区块接口命令
流程
当
SDK发起一个事务invoke请求时,会将事务请求参数发送至Peer节点服务器,随后Peer节点服务对其参数内容进行校验以及背书校验。如果校验成功,则返回处理成功消息给客户端,在该消息中包含了本次请求的读写集。这一段包含读写集的消息将会被客户端发送给Orderer排序服务器,此时Orderer排序服务器在收到消息后进行创建区块等操作。待最终排序完成则执行广播操作,将所生成的区块广播到各个Peer节点服务器。
代码分析
主要有两个类,分别是HFClient类和HFCAClient类
外部应用程序访问区块链是通过实例化
HFClient类,调用类中的接口。访问Fabric ca是通过实例化HFCAClient类,调用类中的接口
HFClient类
| 类名 | 说明 |
|---|---|
HFClient | Hyperledger fabric客户端访问类,通过实例化HFClient类,调用其中的接口与区块链交互。 |
Orderer | Orderer类实现客户端部署、调用和查询排序(Orderer)服务。 |
Peer | Peer类实现客户端部署、调用和查询节点(Peer)。 |
Channel | Channel类实现客户端与通道交互。 |
User | User是用户接口 |
InstallProposalRequest | InstallProposalRequest是智能合约==安装==提案请求类。 |
InstantiateProposalRequest | InstantiateProposalRequest是智能合约==实例化==提案请求类。 |
TransactionProposalRequest | TransactionProposalRequest是智能合约==交易==提案请求类。 |
QueryByChaincodeRequest | QueryByChaincodeRequest是智能合约==查询==提案请求类。 |
HFCAClient类
| 主要方法 | 说明 |
|---|---|
register | register是注册用户身份方法。 |
enroll | enroll是登记用户身份方法。 |
reenroll | reenroll是重新登记用户身份方法。 |
revoke | revoke是注销已签发的用户证书方法。 |
实操
服务器操作
1、停止服务器上运行的所有相关fabric的容器
可以参考第一篇环境搭建篇文章执行
byfn.sh脚本关闭sh byfn.sh down也可以直接执行以下命令
docker rm -f $(docker ps -aq) #清空所有docker容器 docker network prune #清空所有缓存网络
2、下载fabric-sdk-java源码:
cd /opt/gopath/src/github.com/hyperledger
git clone https://github.com/hyperledger/fabric-sdk-java.git
cd fabric-sdk-java
#查询该Git库下的所有branch
git branch -r
#check出来想要的分支
git checkout -b release-1.4 origin/release-1.4
3、启动fabric网络
cd /opt/gopath/src/github.com/hyperledger/fabric-sdk-java/src/test/fixture/sdkintegration
./fabric.sh up
经过一段漫长的等待之后,出现这个页面则是启动成功
本地操作
1、IDEA导入项目源码
由于
GitHub下载较慢,因此上传到csdn免费下载
2、IDEA安装Protobuf Support插件
安装该插件是为了后续启动的时候把
.proto后缀文件转换为java文件
3、注释掉pom.xml以下内容,否则会报错
3.1注释内容
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
<version>2.2.2</version>
<executions>
<execution>
<id>get-the-git-infos</id>
<goals>
<goal>revision</goal>
</goals>
<phase>validate</phase>
</execution>
</executions>
<configuration>
<dotGitDirectory>${project.basedir}/.git</dotGitDirectory>
</configuration>
</plugin>
3.2 不注释会报错
4、编译项目
在
idea右侧先点击跳过测试的按钮(像闪电那个图标),然后在点击clean–compile,经过漫长的等待出现以下页面则编译成功
而且经过编译成功后在
target中看到根据.proto文件生成的Java类,如下所示
5、修改测试类
在
src\test\java\org\hyperledger\fabric\sdk\testutils包下找到TestConfig.java,代码里的localhost改为自己服务器的地址ip
6、关闭防火墙
由于涉及端口众多,因此如果不关闭防火墙,会导致一些网络错误,例如
ERROR org.hyperledger.fabric.sdk.Channel - Channel Channel{id: 16, name: foo} sending proposal with transaction xxx to Peer{ id: 21, name: peer0.org1.example.com, channelName: foo, url: grpc://192.168.56.103:7051} failed because of timeout(120000 milliseconds) expiration#检测防火墙状态 systemctl status firewalld.service #关闭防火墙 systemctl stop firewalld.serviceservice #一定要重启docker,然后重启脚本 docker restart
7、运行文件End2endIT.java
在
src\test\java\org\hyperledger\fabric\sdkintegration包下找到End2endIT.java,修改下面的地址成服务器的地址,并启动该类
结果分析可以参考Fabric-sdk-java调试跑通