Hyperledger Fabric 1.0 从零开始——fabric-sdk-java应用
Posted Aberic
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hyperledger Fabric 1.0 从零开始——fabric-sdk-java应用相关的知识,希望对你有一定的参考价值。
Hyperledger Fabric 1.0 从零开始(十)——智能合约(参阅:Hyperledger Fabric Chaincode for Operators——实操智能合约)
Hyperledger Fabric 1.0 从零开始(十一)——CouchDB(参阅:Hyperledger Fabric CouchDB as the State Database——使用CouchDB)
上述两章,最近网上各路大神文章云集,方案多多,因为最近工作太忙太忙,我暂时就先不赘述了,可以优先参考深蓝大大的文章HyperLedger Fabric ChainCode开发——shim.ChaincodeStubInterface用法。
这章先捡大家都比较在意的java sdk应用方案贴出来,很多朋友都找我要过,我主要是把注释都写进去了,用法简单了说了下,一般情况下会java开发的都能看懂。
年前实在太忙。
JAVA-SDK
9.1、基本介绍
官方在Fabric1.0之后就推荐使用SDK来实现交互的操作,原本在0.6上的restapi已经被废弃。JAVA-SDK可以参考github。官方给的SDK的DEMO很难入手,注释稀少内容还很杂,所幸感谢github上有位朋友(具体地址实在是找不到了,以后会补上)稍加整理了一下,直接重写了官方的DEMO,让像我这样的新人更容易入手。
本次在官方SDK和大神重新的DEMO的基础上做了一次整理,能够更加清晰简单的入门并使用JAVA-SDK来进行交互。
9.2、架构
相信看到这里的朋友应该都对Fabric已经有了足够的了解,至少是应用层上已经可以实现分布式账本的各项功能,sdk也是在这样的基础进行讲述。
首先看下针对JAVA-SDK所写的辅助工程目录
关于Fabric,我们知道一个channel中可以创建多个chaincode,而一个chaincode需要指定对应orderer和peer。
所以,在此建立了一个bean目录来存放自定义的chaincode、orderer和peer对象。这几个对象都包含各自最基本的访问属性。
具体对应关系如下:
bean.Chaincode - Fabric创建的chaincode信息,涵盖所属channel等信息
bean.Orderers - Fabric创建的orderer信息,涵盖单机和集群两种方案
bean.Peers - Fabric创建的peer信息,包含有cli、org、ca、couchdb等节点服务器关联启动服务信息集合
ChaincodeManager - 智能合约操作总控制器
FabricConfig - 智能合约操作总参数配置器
FabricOrg - 联盟组织对象
FabricUser - 联盟用户对象
FabricStore - 联盟存储配置对象
9.3、具体实现
直接通过代码来看实现
9.3.1、Chaincode代码
1 package cn.aberic.fabric.bean; 2 3 /** 4 * Fabric创建的chaincode信息,涵盖所属channel等信息 5 * 6 * @author aberic 7 * 8 * @date 2017年10月18日 - 下午2:07:42 9 * @email abericyang@gmail.com 10 */ 11 public class Chaincode { 12 13 /** 当前将要访问的智能合约所属频道名称 */ 14 private String channelName; // ffetest 15 /** 智能合约名称 */ 16 private String chaincodeName; // ffetestcc 17 /** 智能合约安装路径 */ 18 private String chaincodePath; // github.com/hyperledger/fabric/xxx/chaincode/go/example/test 19 /** 智能合约版本号 */ 20 private String chaincodeVersion; // 1.0 21 /** 执行智能合约操作等待时间 */ 22 private int invokeWatiTime = 100000; 23 /** 执行智能合约实例等待时间 */ 24 private int deployWatiTime = 120000; 25 26 public String getChannelName() { 27 return channelName; 28 } 29 30 public void setChannelName(String channelName) { 31 this.channelName = channelName; 32 } 33 34 public String getChaincodeName() { 35 return chaincodeName; 36 } 37 38 public void setChaincodeName(String chaincodeName) { 39 this.chaincodeName = chaincodeName; 40 } 41 42 public String getChaincodePath() { 43 return chaincodePath; 44 } 45 46 public void setChaincodePath(String chaincodePath) { 47 this.chaincodePath = chaincodePath; 48 } 49 50 public String getChaincodeVersion() { 51 return chaincodeVersion; 52 } 53 54 public void setChaincodeVersion(String chaincodeVersion) { 55 this.chaincodeVersion = chaincodeVersion; 56 } 57 58 public int getInvokeWatiTime() { 59 return invokeWatiTime; 60 } 61 62 public void setInvokeWatiTime(int invokeWatiTime) { 63 this.invokeWatiTime = invokeWatiTime; 64 } 65 66 public int getDeployWatiTime() { 67 return deployWatiTime; 68 } 69 70 public void setDeployWatiTime(int deployWatiTime) { 71 this.deployWatiTime = deployWatiTime; 72 } 73 74 }
9.3.2、Orderers代码
1 package cn.aberic.fabric.bean; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * Fabric创建的orderer信息,涵盖单机和集群两种方案 8 * 9 * @author aberic 10 * 11 * @date 2017年10月18日 - 下午1:56:48 12 * @email abericyang@gmail.com 13 */ 14 public class Orderers { 15 16 /** orderer 排序服务器所在根域名 */ 17 private String ordererDomainName; // anti-moth.com 18 /** orderer 排序服务器集合 */ 19 private List<Orderer> orderers; 20 21 public Orderers() { 22 orderers = new ArrayList<>(); 23 } 24 25 public String getOrdererDomainName() { 26 return ordererDomainName; 27 } 28 29 public void setOrdererDomainName(String ordererDomainName) { 30 this.ordererDomainName = ordererDomainName; 31 } 32 33 /** 新增排序服务器 */ 34 public void addOrderer(String name, String location) { 35 orderers.add(new Orderer(name, location)); 36 } 37 38 /** 获取排序服务器集合 */ 39 public List<Orderer> get() { 40 return orderers; 41 } 42 43 /** 44 * 排序服务器对象 45 * 46 * @author aberic 47 * 48 * @date 2017年10月18日 - 下午2:06:22 49 * @email abericyang@gmail.com 50 */ 51 public class Orderer { 52 53 /** orderer 排序服务器的域名 */ 54 private String ordererName; 55 /** orderer 排序服务器的访问地址 */ 56 private String ordererLocation; 57 58 public Orderer(String ordererName, String ordererLocation) { 59 super(); 60 this.ordererName = ordererName; 61 this.ordererLocation = ordererLocation; 62 } 63 64 public String getOrdererName() { 65 return ordererName; 66 } 67 68 public void setOrdererName(String ordererName) { 69 this.ordererName = ordererName; 70 } 71 72 public String getOrdererLocation() { 73 return ordererLocation; 74 } 75 76 public void setOrdererLocation(String ordererLocation) { 77 this.ordererLocation = ordererLocation; 78 } 79 80 } 81 82 }
9.3.3、Peers代码
1 package cn.aberic.fabric.bean; 2 3 import java.util.ArrayList; 4 import java.util.List; 5 6 /** 7 * Fabric创建的peer信息,包含有cli、org、ca、couchdb等节点服务器关联启动服务信息集合 8 * 9 * @author aberic 10 * 11 * @date 2017年10月18日 - 下午1:49:03 12 * @email abericyang@gmail.com 13 */ 14 public class Peers { 15 16 /** 当前指定的组织名称 */ 17 private String orgName; // Org1 18 /** 当前指定的组织名称 */ 19 private String orgMSPID; // Org1MSP 20 /** 当前指定的组织所在根域名 */ 21 private String orgDomainName; //org1.example.com 22 /** orderer 排序服务器集合 */ 23 private List<Peer> peers; 24 25 public Peers() { 26 peers = new ArrayList<>(); 27 } 28 29 public String getOrgName() { 30 return orgName; 31 } 32 33 public void setOrgName(String orgName) { 34 this.orgName = orgName; 35 } 36 37 public String getOrgMSPID() { 38 return orgMSPID; 39 } 40 41 public void setOrgMSPID(String orgMSPID) { 42 this.orgMSPID = orgMSPID; 43 } 44 45 public String getOrgDomainName() { 46 return orgDomainName; 47 } 48 49 public void setOrgDomainName(String orgDomainName) { 50 this.orgDomainName = orgDomainName; 51 } 52 53 /** 新增排序服务器 */ 54 public void addPeer(String peerName, String peerEventHubName, String peerLocation, String peerEventHubLocation, String caLocation) { 55 peers.add(new Peer(peerName, peerEventHubName, peerLocation, peerEventHubLocation, caLocation)); 56 } 57 58 /** 获取排序服务器集合 */ 59 public List<Peer> get() { 60 return peers; 61 } 62 63 /** 64 * 节点服务器对象 65 * 66 * @author aberic 67 * 68 * @date 2017年11月11日 - 下午6:56:14 69 * @email abericyang@gmail.com 70 */ 71 public class Peer { 72 73 /** 当前指定的组织节点域名 */ 74 private String peerName; // peer0.org1.example.com 75 /** 当前指定的组织节点事件域名 */ 76 private String peerEventHubName; // peer0.org1.example.com 77 /** 当前指定的组织节点访问地址 */ 78 private String peerLocation; // grpc://110.131.116.21:7051 79 /** 当前指定的组织节点事件监听访问地址 */ 80 private String peerEventHubLocation; // grpc://110.131.116.21:7053 81 /** 当前指定的组织节点ca访问地址 */ 82 private String caLocation; // http://110.131.116.21:7054 83 /** 当前peer是否增加Event事件处理 */ 84 private boolean addEventHub = false; 85 86 public Peer(String peerName, String peerEventHubName, String peerLocation, String peerEventHubLocation, String caLocation) { 87 this.peerName = peerName; 88 this.peerEventHubName = peerEventHubName; 89 this.peerLocation = peerLocation; 90 this.peerEventHubLocation = peerEventHubLocation; 91 this.caLocation = caLocation; 92 } 93 94 public String getPeerName() { 95 return peerName; 96 } 97 98 public void setPeerName(String peerName) { 99 this.peerName = peerName; 100 } 101 102 public String getPeerEventHubName() { 103 return peerEventHubName; 104 } 105 106 public void setPeerEventHubName(String peerEventHubName) { 107 this.peerEventHubName = peerEventHubName; 108 } 109 110 public String getPeerLocation() { 111 return peerLocation; 112 } 113 114 public void setPeerLocation(String peerLocation) { 115 this.peerLocation = peerLocation; 116 } 117 118 public String getPeerEventHubLocation() { 119 return peerEventHubLocation; 120 } 121 122 public void setPeerEventHubLocation(String eventHubLocation) { 123 this.peerEventHubLocation = eventHubLocation; 124 } 125 126 public String getCaLocation() { 127 return caLocation; 128 } 129 130 public void setCaLocation(String caLocation) { 131 this.caLocation = caLocation; 132 } 133 134 public boolean isAddEventHub() { 135 return addEventHub; 136 } 137 138 public void addEventHub(boolean addEventHub) { 139 this.addEventHub = addEventHub; 140 } 141 142 } 143 144 }
9.3.4、FabricUser代码
1 package cn.aberic.fabric; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.IOException; 6 import java.io.ObjectInputStream; 7 import java.io.ObjectOutputStream; 8 import java.io.Serializable; 9 import java.util.Set; 10 11 import org.bouncycastle.util.encoders.Hex; 12 import org.hyperledger.fabric.sdk.Enrollment; 13 import org.hyperledger.fabric.sdk.User; 14 15 import io.netty.util.internal.StringUtil; 16 17 /** 18 * 联盟用户对象 19 * 20 * @author aberic 21 * 22 * @date 2017年9月7日 - 下午4:36:53 23 * @email abericyang@gmail.com 24 */ 25 class FabricUser implements User, Serializable { 26 27 private static final long serialVersionUID = 5695080465408336815L; 28 29 /** 名称 */ 30 private String name; 31 /** 规则 */ 32 private Set<String> roles; 33 /** 账户 */ 34 private String account; 35 /** 从属联盟 */ 36 private String affiliation; 37 /** 组织 */ 38 private String organization; 39 /** 注册操作的密�? */ 40 private String enrollmentSecret; 41 /** 会员id */ 42 private String mspId; 43 /** 注册登记操作 */ 44 Enrollment enrollment = null; // �?要在测试env中访�? 45 46 /** 存储配置对象 */ 47 private transient FabricStore keyValStore; 48 private String keyValStoreName; 49 50 public FabricUser(String name, String org, FabricStore store) { 51 this.name = name; 52 this.keyValStore = store; 53 this.organization = org; 54 this.keyValStoreName = toKeyValStoreName(this.name, org); 55 56 String memberStr = keyValStore.getValue(keyValStoreName); 57 if (null != memberStr) { 58 saveState(); 59 } else { 60 restoreState(); 61 } 62 } 63 64 /** 65 * 设置账户信息并将用户状�?�更新至存储配置对象 66 * 67 * @param account 68 * 账户 69 */ 70 public void setAccount(String account) { 71 this.account = account; 72 saveState(); 73 } 74 75 以上是关于Hyperledger Fabric 1.0 从零开始——fabric-sdk-java应用的主要内容,如果未能解决你的问题,请参考以下文章Hyperledger Fabric 1.0 从零开始——fabric-sdk-java应用
Hyperledger Fabric 1.0 从零开始——公网环境构建
Hyperledger Fabric 1.0 从零开始——内网(准离线)环境构建
Hyperledger Fabric 1.0 从零开始——创建Fabric多节点集群