在 Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用 中我已经把官方sdk具体改良办法,即使用办法发出来了,所有的类及文件都是完整的,在文章的结尾也说明了用法主要都依赖于ChaincodeManager这个智能合约管理器,建议以单例的形式生成该对象。

鉴于新入门的朋友在实际运用上可能需要更加简单明了的方案,这里就把最直接的方案给出,具体是写了一个FabricManager管理器,这个管理器将会接管整个java sdk与peer节点服务器及orderer排序服务器的通讯过程,包括event等时间的拦截等等,但是这里还是给一个demo级的,具体实际运用需要大家根据自己的实际场景进行简单的修改和完善。

在此之前,请现将 Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用 这篇文章中的类及结构按照自己的需要结合到自己的项目中,确保不会报错。

然后我们开始编写FabricManager管理器,这个管理器包含两个简单部分,第一部分是项目配置,第二部分是调用方法。

项目配置

节点服务器设置

     /**
* 根据节点作用类型获取节点服务器配置
*
* @param type
* 服务器作用类型(1、执行;2、查询)
* @return 节点服务器配置
*/
private FabricConfig getConfig() {
FabricConfig config = new FabricConfig();//创建配置
config.setOrderers(getOrderers());//设置排序服务器
config.setPeers(getPeers());//[]设置节点服务器对象
config.setChaincode(getChaincode("xxx","xxxcc", "github.com/hyperledger/fabric/chaincode/go/release/xxx", "1.0"));//设置智能合约对象
config.setCryptoConfigPath(getCryptoConfigPath());//设置crypto-config所在路径
return config;
}

创建配置

FabricConfig.java类创建配置,在构造器里设置crypto-config所在路径,默认路径为src/main/resources/fabric/crypto-config/

     public FabricConfig() {
// 默认channel-artifacts所在路径 /xxx/WEB-INF/classes/fabric/channel-artifacts/
channelArtifactsPath = getChannlePath() + "/channel-artifacts/";
// 默认crypto-config所在路径 /xxx/WEB-INF/classes/fabric/crypto-config/
cryptoConfigPath = getChannlePath() + "/crypto-config/";
}

如下图未知:

设置排序服务器

通过getOrderers()方法新建排序服务器,在由config.setOrderers()方法添加排序服务器到设置。

     private Orderers getOrderers() {
Orderers orderer = new Orderers();
orderer.setOrdererDomainName("example.com");//设置排序服务器所在的根域名
orderer.addOrderer("orderer0.example.com", "grpc://x.x.x.x");//新增排序服务器
orderer.addOrderer("orderer1.example.com", "grpc://x.x.x.xx");
orderer.addOrderer("orderer2.example.com", "grpc://x.x.x.xxx");
return orderer;
}

排序服务器可以添加一个或多个,排序服务器的域名和排序服务器的访问地址按提供的文件填写。

设置节点服务器对象

通过getPeers ()方法新建节点服务器,在由config. setPeers ()方法添加节点服务器到设置。

     private Peers Peers() {
Peers peers = new Peers();
peers.setOrgName("XXX");//设置组织名称
peers.setOrgMSPID("XXXMSP");//组织名称+MSP
peers.setOrgDomainName("xxx.example.com");//设置组织根域名
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");//添加排序服务器
return peers;
}

组织名称、MSPID、组织根域名根据实际情况填写。

设置智能合约对象

通过getChaincode ()方法获取智能合约对象,在由config. setChaincode ()方法添加智能合约对象到设置。

     private Chaincode getChaincode(String channelName, String chaincodeName, String chaincodePath, String chaincodeVersion) {
Chaincode chaincode = new Chaincode();
chaincode.setChannelName(channelName);//设置当前将要访问的智能合约所属频道名称
chaincode.setChaincodeName(chaincodeName);//设置智能合约名称
chaincode.setChaincodePath(chaincodePath);//设置智能合约安装路径
chaincode.setChaincodeVersion(chaincodeVersion);//设置智能合约版本号
chaincode.setInvokeWatiTime(100000);
chaincode.setDeployWatiTime(120000);
return chaincode;
}

项目配置到这里基本就完成了,接下来是调用过程。

在述说调用过程之前,我把完整的代码粘贴出来,当然还是demo级的,但已经可以使用于生产了,如下:

 package cn.xx.xxx.util;

 import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.spec.InvalidKeySpecException; import org.hyperledger.fabric.sdk.exception.CryptoException;
import org.hyperledger.fabric.sdk.exception.InvalidArgumentException;
import org.hyperledger.fabric.sdk.exception.TransactionException; import cn.aberic.fabric.ChaincodeManager;
import cn.aberic.fabric.FabricConfig;
import cn.aberic.fabric.bean.Chaincode;
import cn.aberic.fabric.bean.Orderers;
import cn.aberic.fabric.bean.Peers;
import lombok.extern.slf4j.Slf4j; @Slf4j
public class FabricManager { private ChaincodeManager manager; private static FabricManager instance = null; public static FabricManager obtain()
throws CryptoException, InvalidArgumentException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, TransactionException, IOException {
if (null == instance) {
synchronized (FabricManager2.class) {
if (null == instance) {
instance = new FabricManager();
}
}
}
return instance;
} private FabricManager()
throws CryptoException, InvalidArgumentException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, TransactionException, IOException {
manager = new ChaincodeManager(getConfig());
} /**
* 获取节点服务器管理器
*
* @return 节点服务器管理器
*/
public ChaincodeManager getManager() {
return manager;
} /**
* 根据节点作用类型获取节点服务器配置
*
* @param type
* 服务器作用类型(1、执行;2、查询)
* @return 节点服务器配置
*/
private FabricConfig getConfig() {
FabricConfig config = new FabricConfig();
config.setOrderers(getOrderers());
config.setPeers(getPeers());
config.setChaincode(getChaincode("xxx", "xxxcc", "github.com/hyperledger/fabric/chaincode/go/release/xxx", "1.0"));
config.setChannelArtifactsPath(getChannleArtifactsPath());
config.setCryptoConfigPath(getCryptoConfigPath());
return config;
} private Orderers getOrderers() {
Orderers orderer = new Orderers();
orderer.setOrdererDomainName("example.com");
orderer.addOrderer("orderer1.example.com", "grpc://x.x.x.x:7050");
orderer.addOrderer("orderer0.example.com", "grpc://x.x.x.xx:7050");
orderer.addOrderer("orderer2.example.com", "grpc://x.x.x.xxx:7050");
return orderer;
} /**
* 获取节点服务器集
*
* @return 节点服务器集
*/
private Peers getPeers() {
Peers peers = new Peers();
peers.setOrgName("XXX");
peers.setOrgMSPID("XXXMSP");
peers.setOrgDomainName("xxx.example.com");
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");
return peers;
} /**
* 获取智能合约
*
* @param channelName
* 频道名称
* @param chaincodeName
* 智能合约名称
* @param chaincodePath
* 智能合约路径
* @param chaincodeVersion
* 智能合约版本
* @return 智能合约
*/
private Chaincode getChaincode(String channelName, String chaincodeName, String chaincodePath, String chaincodeVersion) {
Chaincode chaincode = new Chaincode();
chaincode.setChannelName(channelName);
chaincode.setChaincodeName(chaincodeName);
chaincode.setChaincodePath(chaincodePath);
chaincode.setChaincodeVersion(chaincodeVersion);
chaincode.setInvokeWatiTime(100000);
chaincode.setDeployWatiTime(120000);
return chaincode;
} /**
* 获取channel-artifacts配置路径
*
* @return /WEB-INF/classes/fabric/channel-artifacts/
*/
private String getChannleArtifactsPath() {
String directorys = FabricManager.class.getClassLoader().getResource("fabric").getFile();
log.debug("directorys = " + directorys);
File directory = new File(directorys);
log.debug("directory = " + directory.getPath()); return directory.getPath() + "/channel-artifacts/";
} /**
* 获取crypto-config配置路径
*
* @return /WEB-INF/classes/fabric/crypto-config/
*/
private String getCryptoConfigPath() {
String directorys = FabricManager.class.getClassLoader().getResource("fabric").getFile();
log.debug("directorys = " + directorys);
File directory = new File(directorys);
log.debug("directory = " + directory.getPath()); return directory.getPath() + "/crypto-config/";
} }

调用过程

调用过程其实就是对FabricManager管理器的具体应用,一般都在impl中进行,具体可执行代码如下:

 ChaincodeManager manager = FabricManager.obtain().getManager();

 manager.invoke(fcn, arguments);

 manager.query(fcn, arguments);

具体返回结果的运用需要各位智能合约编写返回结果的解析来支持,这里需要结合业务来实操,无法说的详尽。

需要注意区块链的事务处理,另外还有invoke和query的区别。

至此整个java sdk的改良使用和调用方法应该就完成了,如果还有什么问题,可以留言讨论。

Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】的更多相关文章

  1. Hyperledger Fabric 1.0 从零开始(二)——环境构建(公网)

    1:环境构建 在本文中用到的宿主机环境是Centos ,版本为Centos.x86_647.2,通过Docker 容器来运行Fabric的节点,版本为v1.0.因此,启动Fabric网络中的节点需要先 ...

  2. Hyperledger Fabric 1.0 从零开始(一)

    在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后1.0就发布了.自从2017年7月H ...

  3. Hyperledger Fabric 1.0 从零开始(三)——环境构建(内网/准离线)

    有公网环境的服务器可以直接看 Hyperledger Fabric 1.0 从零开始(二)--环境构建(公网) ,本篇内容与上篇相似,只不过环境搭建需要在内网下,也就是网络被限制的情况下. 1:环境构 ...

  4. Hyperledger Fabric 1.0 从零开始(一)——吐槽

    在HyperLedger/Fabric发布0.6的时候,公司就已经安排了一个团队研究这一块,后来也请IBM的专家组过来培训了一批人,不幸的是,这批人后来全走了,然后没过多久1.0就发布了.自从2017 ...

  5. Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用

    Hyperledger Fabric 1.0 从零开始(十)--智能合约 Hyperledger Fabric 1.0 从零开始(十一)--CouchDB 上述两章,最近网上各路大神文章云集,方案多多 ...

  6. Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群生产部署

    6.1.平台特定使用的二进制文件配置 该方案与Hyperledger Fabric 1.0 从零开始(五)--运行测试e2e类似,根据企业需要,可以控制各节点的域名,及联盟链的统一域名.可以指定单独节 ...

  7. Hyperledger Fabric 1.0 从零开始(十三)——orderer分布式方案

    简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群 ...

  8. 利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(十二)SDK中的导航系统 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew ...

  9. Hyperledger Fabric 1.0 从零开始(五)——运行测试e2e

    3:运行测试e2e 3.1.运行fabric-samples的问题说明 该问题说明能够解决6.1.平台特定使用的二进制文件配置第一步的问题.可以选择继续阅读该说明,或者等参考到6.1小节时再反向阅读本 ...

随机推荐

  1. MySQL 索引管理与执行计划

    1.1 索引的介绍 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息.如果想按特定职员的姓来查找他或她,则与在表中搜索所有的行相比,索引有助于更快地获取信息. ...

  2. 走进Linux01-磁盘分区与文件夹结构

    近期学习Linux,首先安装系统,遇到了磁盘分区.之前仅仅知道Linux分区是从/(根文件夹)開始的,至于磁盘格式,多块盘怎样挂载全然不了解,系统的查询了一下Linux磁盘分区和文件夹结构,整理一下. ...

  3. hdu4893 Wow! Such Sequence!

    线段树结点上保存一个一般的sum值,再同一时候保存一个fbsum,表示这个结点表示的一段数字若为斐波那契数时的和 当进行3操作时,仅仅用将sum = fbsum就可以 其它操作照常进行,仅仅是单点更新 ...

  4. POJ 2631 Roads in the North(树的直径)

    POJ 2631 Roads in the North(树的直径) http://poj.org/problem? id=2631 题意: 有一个树结构, 给你树的全部边(u,v,cost), 表示u ...

  5. Android事件拦截机制简单分析

    前一阶段,在学习的时候,遇到了我觉得的我接触安卓以来的最多的一次事件拦截出来,那个项目,用到了slidemenu側滑菜单条,然后加上tab标签,还有轮播广告,listview上下滑动.viewpage ...

  6. JAVA入门[9]-mybatis多表关联查询

    概要 本节要实现的是多表关联查询的简单demo.场景是根据id查询某商品分类信息,并展示该分类下的商品列表. 一.Mysql测试数据 新建表Category(商品分类)和Product(商品),并插入 ...

  7. 【转】Spring 中三种Bean配置方式比较

    今天被问到Spring中Bean的配置方式,很尴尬,只想到了基于XML的配置方式,其他的一时想不起来了,看来Spring的内容还没有完全梳理清楚,见到一篇不错的文章,就先转过来了. 以前Java框架基 ...

  8. Material使用02 图标MdIconModule、矢量图作为图标使用及改进

    1 MdIconModule模块的使用 1.1 在需要用到的模块中引入Material图标模块 import { BrowserModule } from '@angular/platform-bro ...

  9. 《调试九法——软硬件错误的排查之道》【PDF】下载

    <调试九法--软硬件错误的排查之道>[PDF]下载链接: https://u253469.ctfile.com/fs/253469-231196352 内容简介 <调试九法:软硬件错 ...

  10. springMVC(4)---生成excel文件并导出

    springMVC(4)---生成excel文件并导出 在开发过程中,需要将数据库中的数据以excel表格的方式导出. 首先说明.我这里用的是Apache的POI项目,它是目前比较成熟的HSSF接口, ...