Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】
在 Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用 中我已经把官方sdk具体改良办法,即使用办法发出来了,所有的类及文件都是完整的,在文章的结尾也说明了用法主要都依赖于ChaincodeManager这个智能合约管理器,建议以单例的形式生成该对象。
鉴于新入门的朋友在实际运用上可能需要更加简单明了的方案,这里就把最直接的方案给出,具体是写了一个FabricManager管理器,这个管理器将会接管整个java sdk与peer节点服务器及orderer排序服务器的通讯过程,包括event等时间的拦截等等,但是这里还是给一个demo级的,具体实际运用需要大家根据自己的实际场景进行简单的修改和完善。
在此之前,请现将 Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用 这篇文章中的类及结构按照自己的需要结合到自己的项目中,确保不会报错。
然后我们开始编写FabricManager管理器,这个管理器包含两个简单部分,第一部分是项目配置,第二部分是调用方法。
项目配置
节点服务器设置
1 /** 2 * 根据节点作用类型获取节点服务器配置 3 * 4 * @param type 5 * 服务器作用类型(1、执行;2、查询) 6 * @return 节点服务器配置 7 */ 8 private FabricConfig getConfig() { 9 FabricConfig config = new FabricConfig();//创建配置 10 config.setOrderers(getOrderers());//设置排序服务器 11 config.setPeers(getPeers());//[]设置节点服务器对象 12 config.setChaincode(getChaincode("xxx","xxxcc", "github.com/hyperledger/fabric/chaincode/go/release/xxx", "1.0"));//设置智能合约对象 13 config.setCryptoConfigPath(getCryptoConfigPath());//设置crypto-config所在路径 14 return config; 15 }
创建配置
FabricConfig.java类创建配置,在构造器里设置crypto-config所在路径,默认路径为src/main/resources/fabric/crypto-config/
1 public FabricConfig() { 2 // 默认channel-artifacts所在路径 /xxx/WEB-INF/classes/fabric/channel-artifacts/ 3 channelArtifactsPath = getChannlePath() + "/channel-artifacts/"; 4 // 默认crypto-config所在路径 /xxx/WEB-INF/classes/fabric/crypto-config/ 5 cryptoConfigPath = getChannlePath() + "/crypto-config/"; 6 }
如下图未知:
设置排序服务器
通过getOrderers()方法新建排序服务器,在由config.setOrderers()方法添加排序服务器到设置。
1 private Orderers getOrderers() { 2 Orderers orderer = new Orderers(); 3 orderer.setOrdererDomainName("example.com");//设置排序服务器所在的根域名 4 orderer.addOrderer("orderer0.example.com", "grpc://x.x.x.x");//新增排序服务器 5 orderer.addOrderer("orderer1.example.com", "grpc://x.x.x.xx"); 6 orderer.addOrderer("orderer2.example.com", "grpc://x.x.x.xxx"); 7 return orderer; 8 }
排序服务器可以添加一个或多个,排序服务器的域名和排序服务器的访问地址按提供的文件填写。
设置节点服务器对象
通过getPeers ()方法新建节点服务器,在由config. setPeers ()方法添加节点服务器到设置。
1 private Peers Peers() { 2 Peers peers = new Peers(); 3 peers.setOrgName("XXX");//设置组织名称 4 peers.setOrgMSPID("XXXMSP");//组织名称+MSP 5 peers.setOrgDomainName("xxx.example.com");//设置组织根域名 6 peers.addPeer("peer1.xxx.example.com", "peer1.xxx.example.com", "grpc://x.x.x.x:7051", "grpc://x.x.x.x:7053", "http://x.x.x.x:7054");//添加排序服务器 7 return peers; 8 }
组织名称、MSPID、组织根域名根据实际情况填写。
设置智能合约对象
通过getChaincode ()方法获取智能合约对象,在由config. setChaincode ()方法添加智能合约对象到设置。
1 private Chaincode getChaincode(String channelName, String chaincodeName, String chaincodePath, String chaincodeVersion) { 2 Chaincode chaincode = new Chaincode(); 3 chaincode.setChannelName(channelName);//设置当前将要访问的智能合约所属频道名称 4 chaincode.setChaincodeName(chaincodeName);//设置智能合约名称 5 chaincode.setChaincodePath(chaincodePath);//设置智能合约安装路径 6 chaincode.setChaincodeVersion(chaincodeVersion);//设置智能合约版本号 7 chaincode.setInvokeWatiTime(100000); 8 chaincode.setDeployWatiTime(120000); 9 return chaincode; 10 }
项目配置到这里基本就完成了,接下来是调用过程。
在述说调用过程之前,我把完整的代码粘贴出来,当然还是demo级的,但已经可以使用于生产了,如下:
1 package cn.xx.xxx.util; 2 3 import java.io.File; 4 import java.io.IOException; 5 import java.security.NoSuchAlgorithmException; 6 import java.security.NoSuchProviderException; 7 import java.security.spec.InvalidKeySpecException; 8 9 import org.hyperledger.fabric.sdk.exception.CryptoException; 10 import org.hyperledger.fabric.sdk.exception.InvalidArgumentException; 11 import org.hyperledger.fabric.sdk.exception.TransactionException; 12 13 import cn.aberic.fabric.ChaincodeManager; 14 import cn.aberic.fabric.FabricConfig; 15 import cn.aberic.fabric.bean.Chaincode; 16 import cn.aberic.fabric.bean.Orderers; 17 import cn.aberic.fabric.bean.Peers; 18 import lombok.extern.slf4j.Slf4j; 19 20 @Slf4j 21 public class FabricManager { 22 23 private ChaincodeManager manager; 24 25 private static FabricManager instance = null; 26 27 public static FabricManager obtain() 28 throws CryptoException, InvalidArgumentException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, TransactionException, IOException { 29 if (null == instance) { 30 synchronized (FabricManager2.class) { 31 if (null == instance) { 32 instance = new FabricManager(); 33 } 34 } 35 } 36 return instance; 37 } 38 39 private FabricManager() 40 throws CryptoException, InvalidArgumentException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, TransactionException, IOException { 41 manager = new ChaincodeManager(getConfig()); 42 } 43 44 /** 45 * 获取节点服务器管理器 46 * 47 * @return 节点服务器管理器 48 */ 49 public ChaincodeManager getManager() { 50 return manager; 51 } 52 53 /** 54 * 根据节点作用类型获取节点服务器配置 55 * 56 * @param type 57 * 服务器作用类型(1、执行;2、查询) 58 * @return 节点服务器配置 59 */ 60 private FabricConfig getConfig() { 61 FabricConfig config = new FabricConfig(); 62 config.setOrderers(getOrderers()); 63 config.setPeers(getPeers()); 64 config.setChaincode(getChaincode("xxx", "xxxcc", "github.com/hyperledger/fabric/chaincode/go/release/xxx", "1.0")); 65 config.setChannelArtifactsPath(getChannleArtifactsPath()); 66 config.setCryptoConfigPath(getCryptoConfigPath()); 67 return config; 68 } 69 70 private Orderers getOrderers() { 71 Orderers orderer = new Orderers(); 72 orderer.setOrdererDomainName("example.com"); 73 orderer.addOrderer("orderer1.example.com", "grpc://x.x.x.x:7050"); 74 orderer.addOrderer("orderer0.example.com", "grpc://x.x.x.xx:7050"); 75 orderer.addOrderer("orderer2.example.com", "grpc://x.x.x.xxx:7050"); 76 return orderer; 77 } 78 79 /** 80 * 获取节点服务器集 81 * 82 * @return 节点服务器集 83 */ 84 private Peers getPeers() { 85 Peers peers = new Peers(); 86 peers.setOrgName("XXX"); 87 peers.setOrgMSPID("XXXMSP"); 88 peers.setOrgDomainName("xxx.example.com"); 89 peers.addPeer("peer1.xxx.example.com", "peer1.xxx.example.com", "grpc://x.x.x.x:7051", "grpc://x.x.x.x:7053", "http://x.x.x.x:7054"); 90 return peers; 91 } 92 93 /** 94 * 获取智能合约 95 * 96 * @param channelName 97 * 频道名称 98 * @param chaincodeName 99 * 智能合约名称 100 * @param chaincodePath 101 * 智能合约路径 102 * @param chaincodeVersion 103 * 智能合约版本 104 * @return 智能合约 105 */ 106 private Chaincode getChaincode(String channelName, String chaincodeName, String chaincodePath, String chaincodeVersion) { 107 Chaincode chaincode = new Chaincode(); 108 chaincode.setChannelName(channelName); 109 chaincode.setChaincodeName(chaincodeName); 110 chaincode.setChaincodePath(chaincodePath); 111 chaincode.setChaincodeVersion(chaincodeVersion); 112 chaincode.setInvokeWatiTime(100000); 113 chaincode.setDeployWatiTime(120000); 114 return chaincode; 115 } 116 117 /** 118 * 获取channel-artifacts配置路径 119 * 120 * @return /WEB-INF/classes/fabric/channel-artifacts/ 121 */ 122 private String getChannleArtifactsPath() { 123 String directorys = FabricManager.class.getClassLoader().getResource("fabric").getFile(); 124 log.debug("directorys = " + directorys); 125 File directory = new File(directorys); 126 log.debug("directory = " + directory.getPath()); 127 128 return directory.getPath() + "/channel-artifacts/"; 129 } 130 131 /** 132 * 获取crypto-config配置路径 133 * 134 * @return /WEB-INF/classes/fabric/crypto-config/ 135 */ 136 private String getCryptoConfigPath() { 137 String directorys = FabricManager.class.getClassLoader().getResource("fabric").getFile(); 138 log.debug("directorys = " + directorys); 139 File directory = new File(directorys); 140 log.debug("directory = " + directory.getPath()); 141 142 return directory.getPath() + "/crypto-config/"; 143 } 144 145 }
调用过程
调用过程其实就是对FabricManager管理器的具体应用,一般都在impl中进行,具体可执行代码如下:
1 ChaincodeManager manager = FabricManager.obtain().getManager(); 2 3 manager.invoke(fcn, arguments); 4 5 manager.query(fcn, arguments);
具体返回结果的运用需要各位智能合约编写返回结果的解析来支持,这里需要结合业务来实操,无法说的详尽。
需要注意区块链的事务处理,另外还有invoke和query的区别。
至此整个java sdk的改良使用和调用方法应该就完成了,如果还有什么问题,可以留言讨论。
转载于:https://www.cnblogs.com/aberic/p/8269244.html
Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】相关推荐
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用
Hyperledger Fabric 1.0 从零开始(十)--智能合约(参阅:Hyperledger Fabric Chaincode for Operators--实操智能合约) Hyperled ...
- Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署
6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...
- Hyperledger Fabric 1.0 从零开始(五)——运行测试e2e
3:运行测试e2e 3.1.运行fabric-samples的问题说明 该问题说明能够解决6.1.平台特定使用的二进制文件配置第一步的问题.可以选择继续阅读该说明,或者等参考到6.1小节时再反向阅读本 ...
- Hyperledger Fabric 1.0 从零开始(七)——启动Fabric多节点集群
5:启动Fabric多节点集群 5.1.启动orderer节点服务 上述操作完成后,此时各节点的compose配置文件及证书验证目录都已经准备完成,可以开始尝试启动多机Fabric集群. 首先启动or ...
- kotlin杂谈系列十二(Kotlin和Java的互操作)
Kotlin杂谈系列十二 这次就主要来谈谈kotlin和java互操作的问题 kotlin出来的使命就是为了解决java的模板问题和一些冗长的问题所以kotlin天生就很好的支持了java 所以我们在 ...
- 四十二、深入Java中的文件读取操作
@Author:Runsen @Date:2020/6/8 作者介绍:Runsen目前大三下学期,专业化学工程与工艺,大学沉迷日语,Python, Java和一系列数据分析软件.导致翘课严重,专业排名 ...
- Hyperledger Fabric 实战(十二): Fabric 源码本地调试
借助开发网络调试 fabric 源码本地调试 准备工作 IDE Goland Go 1.9.7 fabric-samples 模块 chaincode-docker-devmode fabric 源码 ...
- webug 4.0 第二十二关 越权修改密码
感谢webug团队一直以来的更新维护! webug是什么 WeBug名称定义为"我们的漏洞"靶场环境基础环境是基于PHP/mysql制作搭建而成,中级环境与高级环境分别都是由互联网 ...
- 网易互动直播2.0 开发 十二 视频设备管理
序 官方给出的例子是理想情况下的示例,理想情况下,预览视频,只需要如下调用就可以 void *hWnd = GetHWND();m_engine->setupLocalVideo(hWnd); ...
最新文章
- python简单代码画图-Python竟能画这么漂亮的花,帅呆了(代码分享)
- jquery 操作字符串、数组、对象常用方法
- 计算机支持协同工作不是多媒体应用,计算机支持的协同工作概观.PDF
- 第一章 Burp Suite 安装和环境配置
- 计算机用键盘能干什么,年轻人的第一块智能键盘-半台MBP能干什么?
- 对Win10和Linux双系统进行备份
- 玲珑杯#3 G 1043 - G. Quailty and Square Counter【线段树-卡常数】
- java农历万年历课程设计_Java编写多功能万年历程序的实例分享
- 产品如何取得WFA的WiFi认证(二)成为WFA会员
- JDK中文API帮助文档【沈东良】
- 详解for循环(各种用法)
- 懒癌必备-dplyr和data.table让你的数据分析事半功倍
- CF1037E. Trips
- Linux终端常见命令
- 差分进化算法_基于状态估计反馈的策略自适应差分进化算法
- 一键清理Maven失效依赖-脚本+软件
- 一加手机怎么root权限_一加手机3 root教程 一加3获取root权限的方法
- Suricata+ELK集群监控办公网流量
- Java文件关闭close语句_java – 关于用于关闭流的close方法()
- iOS 搜索功能实现
热门文章
- Java读取Properties文件的六种方法
- 嘿,我这里有一个 Survey!
- 功能暴强的页面验证js代码
- 大数据_Hbase-内容回顾和补充---Hbase工作笔记0018
- Hybrid App工作笔记0001---混合App开发过程中_Web是如何调用原生功能的_调用原理
- PostGreSql工作笔记003---在Navicat中创建数据库时报错rolcatupdate不存在_具体原因看其他博文_这里使用pgAdmin4创建管理postgre
- SpringBoot学习笔记001--创建第一个spring boot应用
- 嵌入式电路设计(符号库和封装库)
- amd玄冰400怎么拆图解_89元入手新版玄冰400I散热器实测,从此一生黑!还能再难用一点?...
- html app效果图,app端效果图.html