作为应用级别来说,在fabric-sdk-java中,最常用的是query、invoke方法
public Map<String, Object> query(String peerName,String chaincodeName,String fcn,String[] args) throws Exception {
JustProperty conf = handle.getConf();
ChaincodeInfo chaincodeInfo = conf.getChaincodeInfo();
String channelName = chaincodeInfo.getChaincodeChannelName();
String ordererName = chaincodeInfo.getChaincodeOrdererName();
return handle.query(channelName,ordererName, peerName, chaincodeName, fcn, args);
}
读取配置文件里的参数存放在 JustProperty
JustProperty conf = handle.getConf();
下面我们来看一下query具体实现
public Map<String,Object> query(String channelName,String ordererName,String peerName,String chaincodename, String chaincodeFunction, String[] chaincodeArgs) throws Exception {
Map<String,Object> callback = new HashMap<>();
try{
Channel channel = reconstructChannel(channelName,ordererName,peerName);
client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
client.setUserContext(conf.enrollUser(ordererName));
ChaincodeID chaincodeID = ChaincodeID.newBuilder().setName(chaincodename).build();
logger.info("Channel Name is " + channel.getName());
logger.debug(format("Querying chaincode %s and function %s with arguments %s", chaincodename,
chaincodeFunction, Arrays.asList(chaincodeArgs).toString()));
QueryByChaincodeRequest queryByChaincodeRequest = client.newQueryProposalRequest();
queryByChaincodeRequest.setArgs(chaincodeArgs);
queryByChaincodeRequest.setFcn(chaincodeFunction);
queryByChaincodeRequest.setChaincodeID(chaincodeID);
Map<String, byte[]> tm2 = new HashMap<>();
tm2.put("HyperLedgerFabric", "QueryByChaincodeRequest:JavaSDK".getBytes(UTF_8));
tm2.put("method", "QueryByChaincodeRequest".getBytes(UTF_8));
queryByChaincodeRequest.setTransientMap(tm2);
logger.debug("Chaincode request args:- " + queryByChaincodeRequest.getArgs().toString());
Collection<ProposalResponse> queryProposals = channel.queryByChaincode(queryByChaincodeRequest, channel.getPeers());
for (ProposalResponse proposalResponse : queryProposals) {
if (!proposalResponse.isVerified() || proposalResponse.getStatus() != ProposalResponse.Status.SUCCESS) {
String errorMsg = "Failed query proposal from peer " + proposalResponse.getPeer().getName()
+ " status: " + proposalResponse.getStatus() + ". Messages: "
+ proposalResponse.getMessage() + ". Was verified : " + proposalResponse.isVerified();
logger.debug(errorMsg);
callback.put("state", 10010);
callback.put("payload", 0);
callback.put("message", "Failed query proposal from peer " + proposalResponse.getPeer().getName() + " status: " + proposalResponse.getStatus() + ". Messages: "
+ proposalResponse.getMessage() + ". Was verified : " + proposalResponse.isVerified());
throw new Exception(errorMsg);
} else {
String payload = proposalResponse.getProposalResponse().getResponse().getPayload().toStringUtf8();
callback.put("state", 10000);
callback.put("payload",payload);
callback.put("message", "success");
}
}
}catch (Exception e){
callback.put("state", 10010);
callback.put("message",e.getMessage());
return callback;
}
return callback;
}
构造channel 需要通道名称、排序节点参数、提交节点参数,这一步很关键,构造到相应的channel
public Channel reconstructChannel(String channelName,String ordererName,String peerName) throws Exception {
Channel channel = null;
logger.info(format("Running reconstruct channel:%s",channelName));
try{
client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
client.setUserContext(conf.enrollUser(ordererName));
Channel tempChannel = client.getChannel(channelName);
if(StringUtils.isNotNull(tempChannel)){
channel = tempChannel;
}else{
channel = client.newChannel(channelName);
}
String domainName = getName(ordererName);
for(OrdererUnit orderer : orgList){
if(orderer.getOrdererName().contains(domainName)){
channel.addOrderer(client.newOrderer(orderer.getOrdererName(),orderer.getOrdererLocation(),conf.getOrdererProperties(orderer.getOrdererName())));
}
}
for(PeerOrg peerOrg : peerOrgsList){
List<PeerUnit> peers = peerOrg.getPeers();
for(PeerUnit peerUnit : peers){
if(peerName.equals(peerUnit.getPeerName())){
Peer peer = client.newPeer(peerUnit.getPeerName(), peerUnit.getPeerLocation(), conf.getPeerProperties(peerUnit.getPeerName()));
Set<String> channels = null;
try{
channels = client.queryChannels(peer);
}catch (Exception e){
logger.error(e.getMessage());
}
if(StringUtils.isNotNull(channels)){
for(String str : channels){
if(str.equals(channelName)){
channel.addPeer(peer);
if(!channel.isInitialized()){
channel.initialize();
}
}
}
}
}
}
}
return channel;
}catch (Exception e){
String errMsg = "Handlers | recontructChannel "+e;
logger.error(errMsg);
}
return null;
}
然后,用HFClient 创建查询提案请求
QueryByChaincodeRequest queryByChaincodeRequest = client.newQueryProposalRequest();
queryByChaincodeRequest.setArgs(chaincodeArgs);
queryByChaincodeRequest.setFcn(chaincodeFunction);
queryByChaincodeRequest.setChaincodeID(chaincodeID);
Map<String, byte[]> tm2 = new HashMap<>();
tm2.put("HyperLedgerFabric", "QueryByChaincodeRequest:JavaSDK".getBytes(UTF_8));
tm2.put("method", "QueryByChaincodeRequest".getBytes(UTF_8));
queryByChaincodeRequest.setTransientMap(tm2);
channel 发送查询提案
Collection<ProposalResponse> queryProposals = channel.queryByChaincode(queryByChaincodeRequest, channel.getPeers());
最后处理提案的请求结果
for (ProposalResponse proposalResponse : queryProposals) {
if (!proposalResponse.isVerified() || proposalResponse.getStatus() != ProposalResponse.Status.SUCCESS) {
String errorMsg = "Failed query proposal from peer " + proposalResponse.getPeer().getName()
+ " status: " + proposalResponse.getStatus() + ". Messages: "
+ proposalResponse.getMessage() + ". Was verified : " + proposalResponse.isVerified();
logger.debug(errorMsg);
callback.put("state", 10010);
callback.put("payload", 0);
callback.put("message", "Failed query proposal from peer " + proposalResponse.getPeer().getName() + " status: " + proposalResponse.getStatus() + ". Messages: "
+ proposalResponse.getMessage() + ". Was verified : " + proposalResponse.isVerified());
throw new Exception(errorMsg);
} else {
String payload = proposalResponse.getProposalResponse().getResponse().getPayload().toStringUtf8();
callback.put("state", 10000);
callback.put("payload",payload);
callback.put("message", "success");
}
}
本文主要介绍了如何在应用层面使用Fabric-sdk-java,重点讲解了query和invoke方法的实现。首先,通过读取配置文件获取参数并存储。接着,详细阐述了创建channel的过程,包括通道名称、排序节点和提交节点的设置。然后,展示了如何创建查询提案请求,并通过channel发送该请求。最后,解释了如何处理提案请求的结果。

7590

被折叠的 条评论
为什么被折叠?



