一、说明

在上一篇文章中 《Hyperledger Fabric 2.x 自定义智能合约》 分享了智能合约的安装并使用 cli 客户端进行合约的调用;本文将使用 Java 代码基于 fabric-gateway-java 进行区块链网络的访问与交易,并集成 SpringBoot 框架。

Fabric Gateway SDK 实现Fabric的编程模型,提供了一系列简单的API给应用程序与Fabric区块链网络进行交互;

网络拓扑图:

应用程序将各自的网络交互委托给其网关,每个网关都了解网络信道拓扑,包括组织的多个Peer节点和排序节点,使应用程序专注于业务逻辑;Peer节点可以使用gossip协议在组织内部和组织之间相互通信。

二、Mavn依赖

添加网关sdk的依赖:

<dependency><groupId>org.hyperledger.fabric</groupId><artifactId>fabric-gateway-java</artifactId><version>2.2.3</version>
</dependency>

三、准备配置文件

工程的目录结构如下图所示:

3.1. 准备网络证书

创建目录 crypto-configordererpeer 节点的证书文件复制进来。

证书文件从 fabric-samplestest-network 目录中复制 ordererOrganizationspeerOrganizations 文件夹:

3.2. 创建网络配置

创建文件 connection.json 内容如下:

{"name": "basic-network","version": "1.0.0","client": {"organization": "Org1","connection": {"timeout": {"peer": {"endorser": "300"},"orderer": "300"}}},"channels": {"mychannel": {"orderers": ["orderer.example.com"],"peers": {"peer0.org1.example.com": {"endorsingPeer": true,"chaincodeQuery": true,"ledgerQuery": true,"eventSource": true},"peer0.org2.example.com": {"endorsingPeer": true,"chaincodeQuery": true,"ledgerQuery": true,"eventSource": true}}}},"organizations": {"Org1": {"mspid": "Org1MSP","peers": ["peer0.org1.example.com"],"certificateAuthorities": ["ca-org1"],"adminPrivateKeyPEM": {"path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/keystore/priv_sk"},"signedCertPEM": {"path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp/signcerts/Admin@org1.example.com-cert.pem"}},"Org2": {"mspid": "Org2MSP","peers": ["peer0.org2.example.com"],"certificateAuthorities": ["ca-org2"],"adminPrivateKeyPEM": {"path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/keystore/priv_sk"},"signedCertPEM": {"path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp/signcerts/Admin@org2.example.com-cert.pem"}}},"orderers": {"orderer.example.com": {"url": "grpcs://192.168.28.134:7050","mspid": "OrdererMSP","grpcOptions": {"ssl-target-name-override": "orderer.example.com","hostnameOverride": "orderer.example.com"},"tlsCACerts": {"path": "src/main/resources/crypto-config/ordererOrganizations/example.com/orderers/orderer.example.com/tls/ca.crt"},"adminPrivateKeyPEM": {"path": "src/main/resources/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/keystore/priv_sk"},"signedCertPEM": {"path": "src/main/resources/crypto-config/ordererOrganizations/example.com/users/Admin@example.com/msp/signcerts/Admin@example.com-cert.pem"}}},"peers": {"peer0.org1.example.com": {"url": "grpcs://192.168.28.134:7051","grpcOptions": {"ssl-target-name-override": "peer0.org1.example.com","hostnameOverride": "peer0.org1.example.com","request-timeout": 120001},"tlsCACerts": {"path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt"}},"peer0.org2.example.com": {"url": "grpcs://192.168.28.134:9051","grpcOptions": {"ssl-target-name-override": "peer0.org2.example.com","hostnameOverride": "peer0.org2.example.com","request-timeout": 120001},"tlsCACerts": {"path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt"}}},"certificateAuthorities": {"ca-org1": {"url": "https://192.168.28.134:7054","grpcOptions": {"verify": true},"tlsCACerts": {"path": "src/main/resources/crypto-config/peerOrganizations/org1.example.com/ca/ca.org1.example.com-cert.pem"},"registrar": [{"enrollId": "admin","enrollSecret": "adminpw"}]},"ca-org2": {"url": "https://192.168.28.134:8054","grpcOptions": {"verify": true},"tlsCACerts": {"path": "src/main/resources/crypto-config/peerOrganizations/org2.example.com/ca/ca.org2.example.com-cert.pem"},"registrar": [{"enrollId": "admin","enrollSecret": "adminpw"}]}}
}

需按实际情况修改url中的地址,内容中分别包含了 channelsorganizationsordererspeersca 的配置

3.3. SpringBoot配置

application.yml 中添加以下内容,用于访问网关的相关配置:

fabric:# wallet文件夹路径(自动创建)walletDirectory: wallet# 网络配置文件路径networkConfigPath: connection.json# 用户证书路径certificatePath: crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/signcerts/User1@org1.example.com-cert.pem# 用户私钥路径privateKeyPath: crypto-config/peerOrganizations/org1.example.com/users/User1@org1.example.com/msp/keystore/priv_sk# 访问的组织名mspid: Org1MSP# 用户名username: user1# 通道名字channelName: mychannel# 链码名字contractName: mycc

四、连接合约

分别构建网关、通道和合约的Bean对象,代码如下:

/*** 连接网关*/
@Bean
public Gateway connectGateway() throws IOException, InvalidKeyException, CertificateException {//使用org1中的user1初始化一个网关wallet账户用于连接网络Wallet wallet = Wallets.newFileSystemWallet(Paths.get(this.walletDirectory));X509Certificate certificate = readX509Certificate(Paths.get(this.certificatePath));PrivateKey privateKey = getPrivateKey(Paths.get(this.privateKeyPath));wallet.put(username, Identities.newX509Identity(this.mspid, certificate, privateKey));//根据connection.json 获取Fabric网络连接对象Gateway.Builder builder = Gateway.createBuilder().identity(wallet, username).networkConfig(Paths.get(this.networkConfigPath));//连接网关return builder.connect();
}/*** 获取通道*/
@Bean
public Network network(Gateway gateway) {return gateway.getNetwork(this.channelName);
}/*** 获取合约*/
@Bean
public Contract contract(Network network) {return network.getContract(this.contractName);
}

五、合约调用

创建controller类,注入Contract对象调用合约方法:

@Resource
private Contract contract;@Resource
private Network network;@GetMapping("/getUser")
public String getUser(String userId) throws ContractException {byte[] queryAResultBefore = contract.evaluateTransaction("getUser",userId);return new String(queryAResultBefore, StandardCharsets.UTF_8);
}@GetMapping("/addUser")
public String addUser(String userId, String userName, String money) throws ContractException, InterruptedException, TimeoutException {byte[] invokeResult = contract.createTransaction("addUser").setEndorsingPeers(network.getChannel().getPeers(EnumSet.of(Peer.PeerRole.ENDORSING_PEER))).submit(userId, userName, money);String txId = new String(invokeResult, StandardCharsets.UTF_8);return txId;
}

六、测试接口

调用接口 getUser

http://127.0.0.1:9001/getUser?userId=1

返回:

{"money": 300,"name": "zlt","userId": "1"
}

调用接口 addUser

http://127.0.0.1:9001/addUser?userId=6&userName=test6&money=600

返回:

2ae291bb6a366b5ba01ad49e4237da8def9e9828cc2c982e8c49d4b763af0157

七、代码下载

gitee:https://gitee.com/zlt2000/my-fabric-application-java

github:https://github.com/zlt2000/my-fabric-application-java

扫码关注有惊喜!

Hyperledger Fabric 2.x Java区块链应用相关推荐

  1. 利用Hyperledger Fabric开发第一个区块链应用

    利用Hyperledger Fabric开发第一个区块链应用 Fabric入门 Fabric 我们通过一个简单的示例程序来了解Fabric应用是如何运行的.在这个例子中使用的应用程序和智能合约(链码) ...

  2. Hyperledger Fabric 1.4 搭建区块链浏览器

    Hyperledger Fabric 1.4 搭建区块链浏览器 原创iCyberpunk 最后发布于2020-01-09 12:11:01 阅读数 233  收藏 展开 1. 准备工作 安装nodej ...

  3. Hyperledger Fabric 2.2.1 区块链问题汇总(持续更新)

    搭建Hyperledger Fabric时遇到了很多问题,很多坑,这里汇总一下,有些可能没保存图片,还有些问题没及时记录起来: 1.生成orderer区块文件时,如下图所示: 必须要指定channel ...

  4. Hyperledger Fabric 超级账本 Java 开发区块链环境构建

    面向 Java 开发人员的链代码简介 您听说过区块链超级账本Hyperledger Fabric?对Java开发人员有何用.我将分步展示用 Hyperledger Fabric v0.6来搭建开发环境 ...

  5. java 区块链开发_Java开发人员的区块链入门

    java 区块链开发 顶级技术专家将区块链列为十大新兴技术之一,它们有潜力在未来十年内改变我们的世界,这值得您花时间学习. 如果您是一名具有Java背景的开发人员,并且想快速了解区块链技术,那么本文将 ...

  6. 区块链 java 开源_详细介绍Java区块链开源代码背后的内容

    什么是Java区块链开源代码?它是一种分布式分类帐技术,将所有不同的属性放在一起.那么Java区块链开源代码就可以通过不同的共识机制,使所有添加的数据不变.2015年之前,估计大家都知道的区块链的申请 ...

  7. java开发区块链_7个顶级Java区块链项目【2019】

    如果你是一个对区块链感兴趣的Java工程师,那么除了阅读 书籍或博客之外,更好的学习方法是亲自动手,深入了解 以下7个最流行的Java区块链项目. 1.Corda Corda可能是Java开发人员进入 ...

  8. java区块链_JAVA区块链项目实战

    课程介绍 全国首套,基于java的区块链实战教程.目的是让更多的java编程者了解区块链,掌握区块链开发. 1.区块链理论:以node.js例子区块链原理有深刻理解: 2.区块链java实战:深刻理解 ...

  9. fabric中简单搭建区块链浏览器

    区块链浏览器可以让项目更直观的展示 前期准备 安装git,mysql,node,npm,各版本如下图 一 从github上拉取项目 git clone https://github.com/hyper ...

最新文章

  1. Java基础学习总结(9)——this关键字
  2. linux让脚本在指定时间运行程序,如何限制Linux命令程序运行的时间
  3. 你知道WPF与WinForms的区别吗?
  4. nssl1452-排行榜【数论】
  5. 在Hive查询中如何显示列名
  6. oracle12 共享内存不存在,DBA警世录:Oracle的共享内存段
  7. Oracle中的sequence对象
  8. wsimport 的使用问题
  9. ARCGIS 分区统计的时候,出现无法解决的重大问题,程序崩溃
  10. Ubuntu 安装网易云音乐
  11. 打印機lpt接口轉com接口
  12. 命令提示符命令(cmd)
  13. 图新地球 “请选择目标图层后再下载”
  14. Nginx实现动静分离(Nginx图片服务器及404问题解决)
  15. 初级软件测试工程师:测试路上披荆斩棘,争做大厂程序员,斩获高薪offer~
  16. win10蓝屏0xc000021a怎么修复?
  17. 高德地图--SDK集成--定位功能 地图定位搜索
  18. 使用weixin-java-miniapp实现微信小程序登录接口
  19. 国家开放大学计算机应用基础终结性考试(大作业).zip
  20. nodejs获取时间戳

热门文章

  1. 什么是损失函数?什么是梯度
  2. 【吐槽脑洞】关于逛B站时偶然体验的弹幕互动游戏魏蜀吴三国争霸游戏的一些思考
  3. 线性代数---魏福义版 第一章习题答案
  4. 计算机网络构成的硬件和软件有哪些,计算机的硬件构成及软件构成 有什么
  5. 格式化 NameNode 提示 SHUTDOWN_MSG: Shutting down NameNode at xxx/xxx.xxx.xxx.xxx
  6. Python中yield的用法详解——最简单,最清晰的解释
  7. 腾讯Hardcoder Android通讯框架简介
  8. SAP 系统组织结构
  9. 传奇创世孙大宁:2016年H5将井喷,新传播途径是突破口
  10. Java实战项目之个人日记本系统【源码+课后指导】_Java毕业设计/计算机毕业设计