基于Fabric-sdk-java封装的一层应用级别的使用

本文主要介绍了如何在应用层面使用Fabric-sdk-java,重点讲解了query和invoke方法的实现。首先,通过读取配置文件获取参数并存储。接着,详细阐述了创建channel的过程,包括通道名称、排序节点和提交节点的设置。然后,展示了如何创建查询提案请求,并通过channel发送该请求。最后,解释了如何处理提案请求的结果。

 作为应用级别来说,在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");
                }
            }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值