fabric1.0 java sdk_Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用

1 packagecn.aberic.fabric;2

3 import staticjava.nio.charset.StandardCharsets.UTF_8;4

5 importjava.io.File;6 importjava.io.IOException;7 importjava.nio.file.Paths;8 importjava.security.NoSuchAlgorithmException;9 importjava.security.NoSuchProviderException;10 importjava.security.spec.InvalidKeySpecException;11 importjava.util.Collection;12 importjava.util.HashMap;13 importjava.util.LinkedList;14 importjava.util.Map;15 importjava.util.Properties;16 importjava.util.Set;17 importjava.util.concurrent.ExecutionException;18 importjava.util.concurrent.TimeoutException;19

20 importorg.apache.log4j.Logger;21 importorg.hyperledger.fabric.sdk.BlockEvent;22 importorg.hyperledger.fabric.sdk.BlockListener;23 importorg.hyperledger.fabric.sdk.ChaincodeID;24 importorg.hyperledger.fabric.sdk.Channel;25 importorg.hyperledger.fabric.sdk.HFClient;26 importorg.hyperledger.fabric.sdk.ProposalResponse;27 importorg.hyperledger.fabric.sdk.QueryByChaincodeRequest;28 importorg.hyperledger.fabric.sdk.SDKUtils;29 importorg.hyperledger.fabric.sdk.TransactionProposalRequest;30 importorg.hyperledger.fabric.sdk.exception.CryptoException;31 importorg.hyperledger.fabric.sdk.exception.InvalidArgumentException;32 importorg.hyperledger.fabric.sdk.exception.ProposalException;33 importorg.hyperledger.fabric.sdk.exception.TransactionException;34 importorg.hyperledger.fabric.sdk.security.CryptoSuite;35

36 importcom.google.protobuf.ByteString;37 importcom.google.protobuf.InvalidProtocolBufferException;38

39 importcn.aberic.fabric.bean.Chaincode;40 importcn.aberic.fabric.bean.Orderers;41 importcn.aberic.fabric.bean.Peers;42

43 public classChaincodeManager {44

45 private static Logger log = Logger.getLogger(ChaincodeManager.class);46

47 privateFabricConfig config;48 privateOrderers orderers;49 privatePeers peers;50 privateChaincode chaincode;51

52 privateHFClient client;53 privateFabricOrg fabricOrg;54 privateChannel channel;55 privateChaincodeID chaincodeID;56

57 publicChaincodeManager(FabricConfig fabricConfig)58 throwsCryptoException, InvalidArgumentException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, IOException, TransactionException {59 this.config =fabricConfig;60

61 orderers = this.config.getOrderers();62 peers = this.config.getPeers();63 chaincode = this.config.getChaincode();64

65 client =HFClient.createNewInstance();66 log.debug("Create instance of HFClient");67 client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());68 log.debug("Set Crypto Suite of HFClient");69

70 fabricOrg =getFabricOrg();71 channel =getChannel();72 chaincodeID =getChaincodeID();73

74 client.setUserContext(fabricOrg.getPeerAdmin()); //也许是1.0.0测试版的bug,只有节点管理员可以调用链码

75 }76

77 private FabricOrg getFabricOrg() throwsNoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, IOException {78

79 //java.io.tmpdir : C:\Users\yangyi47\AppData\Local\Temp\

80 File storeFile = new File(System.getProperty("java.io.tmpdir") + "/HFCSampletest.properties");81 FabricStore fabricStore = newFabricStore(storeFile);82

83 //Get Org1 from configuration

84 FabricOrg fabricOrg = newFabricOrg(peers, orderers, fabricStore, config.getCryptoConfigPath());85 log.debug("Get FabricOrg");86 returnfabricOrg;87 }88

89 privateChannel getChannel()90 throwsNoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, IOException, CryptoException, InvalidArgumentException, TransactionException {91 client.setUserContext(fabricOrg.getPeerAdmin());92 returngetChannel(fabricOrg, client);93 }94

95 privateChannel getChannel(FabricOrg fabricOrg, HFClient client)96 throwsNoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, IOException, CryptoException, InvalidArgumentException, TransactionException {97 Channel channel =client.newChannel(chaincode.getChannelName());98 log.debug("Get Chain " +chaincode.getChannelName());99

100 //channel.setTransactionWaitTime(chaincode.getInvokeWatiTime());101 //channel.setDeployWaitTime(chaincode.getDeployWatiTime());

102

103 for (int i = 0; i < peers.get().size(); i++) {104 File peerCert = Paths.get(config.getCryptoConfigPath(), "/peerOrganizations", peers.getOrgDomainName(), "peers", peers.get().get(i).getPeerName(), "tls/server.crt")105 .toFile();106 if (!peerCert.exists()) {107 throw newRuntimeException(108 String.format("Missing cert file for: %s. Could not find at location: %s", peers.get().get(i).getPeerName(), peerCert.getAbsolutePath()));109 }110 Properties peerProperties = newProperties();111 peerProperties.setProperty("pemFile", peerCert.getAbsolutePath());112 //ret.setProperty("trustServerCertificate", "true");//testing113 //environment only NOT FOR PRODUCTION!

114 peerProperties.setProperty("hostnameOverride", peers.getOrgDomainName());115 peerProperties.setProperty("sslProvider", "openSSL");116 peerProperties.setProperty("negotiationType", "TLS");117 //在grpc的NettyChannelBuilder上设置特定选项

118 peerProperties.put("grpc.ManagedChannelBuilderOption.maxInboundMessageSize", 9000000);119 channel.addPeer(client.newPeer(peers.get().get(i).getPeerName(), fabricOrg.getPeerLocation(peers.get().get(i).getPeerName()), peerProperties));120 if(peers.get().get(i).isAddEventHub()) {121 channel.addEventHub(122 client.newEventHub(peers.get().get(i).getPeerEventHubName(), fabricOrg.getEventHubLocation(peers.get().get(i).getPeerEventHubName()), peerProperties));123 }124 }125

126 for (int i = 0; i < orderers.get().size(); i++) {127 File ordererCert = Paths.get(config.getCryptoConfigPath(), "/ordererOrganizations", orderers.getOrdererDomainName(), "orderers", orderers.get().get(i).getOrdererName(),128 "tls/server.crt").toFile();129 if (!ordererCert.exists()) {130 throw newRuntimeException(131 String.format("Missing cert file for: %s. Could not find at location: %s", orderers.get().get(i).getOrdererName(), ordererCert.getAbsolutePath()));132 }133 Properties ordererProperties = newProperties();134 ordererProperties.setProperty("pemFile", ordererCert.getAbsolutePath());135 ordererProperties.setProperty("hostnameOverride", orderers.getOrdererDomainName());136 ordererProperties.setProperty("sslProvider", "openSSL");137 ordererProperties.setProperty("negotiationType", "TLS");138 ordererProperties.put("grpc.ManagedChannelBuilderOption.maxInboundMessageSize", 9000000);139 ordererProperties.setProperty("ordererWaitTimeMilliSecs", "300000");140 channel.addOrderer(141 client.newOrderer(orderers.get().get(i).getOrdererName(), fabricOrg.getOrdererLocation(orderers.get().get(i).getOrdererName()), ordererProperties));142 }143

144 log.debug("channel.isInitialized() = " +channel.isInitialized());145 if (!channel.isInitialized()) {146 channel.initialize();147 }148 if(config.isRegisterEvent()) {149 channel.registerBlockListener(newBlockListener() {150

151 @Override152 public voidreceived(BlockEvent event) {153 //TODO

154 log.debug("========================Event事件监听开始========================");155 try{156 log.debug("event.getChannelId() = " +event.getChannelId());157 log.debug("event.getEvent().getChaincodeEvent().getPayload().toStringUtf8() = " +event.getEvent().getChaincodeEvent().getPayload().toStringUtf8());158 log.debug("event.getBlock().getData().getDataList().size() = " +event.getBlock().getData().getDataList().size());159 ByteString byteString = event.getBlock().getData().getData(0);160 String result =byteString.toStringUtf8();161 log.debug("byteString.toStringUtf8() = " +result);162

163 String r1[] = result.split("END CERTIFICATE");164 String rr = r1[2];165 log.debug("rr = " +rr);166 } catch(InvalidProtocolBufferException e) {167 //TODO

168 e.printStackTrace();169 }170 log.debug("========================Event事件监听结束========================");171 }172 });173 }174 returnchannel;175 }176

177 privateChaincodeID getChaincodeID() {178 returnChaincodeID.newBuilder().setName(chaincode.getChaincodeName()).setVersion(chaincode.getChaincodeVersion()).setPath(chaincode.getChaincodePath()).build();179 }180

181 /**

182 * 执行智能合约183 *184 *@paramfcn185 * 方法名186 *@paramargs187 * 参数数组188 *@return

189 *@throwsInvalidArgumentException190 *@throwsProposalException191 *@throwsInterruptedException192 *@throwsExecutionException193 *@throwsTimeoutException194 *@throwsIOException195 *@throwsTransactionException196 *@throwsCryptoException197 *@throwsInvalidKeySpecException198 *@throwsNoSuchProviderException199 *@throwsNoSuchAlgorithmException200 */

201 public Mapinvoke(String fcn, String[] args)202 throwsInvalidArgumentException, ProposalException, InterruptedException, ExecutionException, TimeoutException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, CryptoException, TransactionException, IOException {203 Map resultMap = new HashMap<>();204

205 Collection successful = new LinkedList<>();206 Collection failed = new LinkedList<>();207

208 /// Send transaction proposal to all peers

209 TransactionProposalRequest transactionProposalRequest =client.newTransactionProposalRequest();210 transactionProposalRequest.setChaincodeID(chaincodeID);211 transactionProposalRequest.setFcn(fcn);212 transactionProposalRequest.setArgs(args);213

214 Map tm2 = new HashMap<>();215 tm2.put("HyperLedgerFabric", "TransactionProposalRequest:JavaSDK".getBytes(UTF_8));216 tm2.put("method", "TransactionProposalRequest".getBytes(UTF_8));217 tm2.put("result", ":)".getBytes(UTF_8));218 transactionProposalRequest.setTransientMap(tm2);219

220 Collection transactionPropResp =channel.sendTransactionProposal(transactionProposalRequest, channel.getPeers());221 for(ProposalResponse response : transactionPropResp) {222 if (response.getStatus() ==ProposalResponse.Status.SUCCESS) {223 successful.add(response);224 } else{225 failed.add(response);226 }227 }228

229 Collection> proposalConsistencySets =SDKUtils.getProposalConsistencySets(transactionPropResp);230 if (proposalConsistencySets.size() != 1) {231 log.error("Expected only one set of consistent proposal responses but got " +proposalConsistencySets.size());232 }233

234 if (failed.size() > 0) {235 ProposalResponse firstTransactionProposalResponse =failed.iterator().next();236 log.error("Not enough endorsers for inspect:" + failed.size() + " endorser error: " + firstTransactionProposalResponse.getMessage() + ". Was verified: "

237 +firstTransactionProposalResponse.isVerified());238 resultMap.put("code", "error");239 resultMap.put("data", firstTransactionProposalResponse.getMessage());240 returnresultMap;241 } else{242 log.info("Successfully received transaction proposal responses.");243 ProposalResponse resp =transactionPropResp.iterator().next();244 byte[] x =resp.getChaincodeActionResponsePayload();245 String resultAsString = null;246 if (x != null) {247 resultAsString = new String(x, "UTF-8");248 }249 log.info("resultAsString = " +resultAsString);250 channel.sendTransaction(successful);251 resultMap.put("code", "success");252 resultMap.put("data", resultAsString);253 returnresultMap;254 }255

256 //channel.sendTransaction(successful).thenApply(transactionEvent -> {257 //if (transactionEvent.isValid()) {258 //log.info("Successfully send transaction proposal to orderer. Transaction ID: " + transactionEvent.getTransactionID());259 //} else {260 //log.info("Failed to send transaction proposal to orderer");261 //}262 // //chain.shutdown(true);263 //return transactionEvent.getTransactionID();264 //}).get(chaincode.getInvokeWatiTime(), TimeUnit.SECONDS);

265 }266

267 /**

268 * 查询智能合约269 *270 *@paramfcn271 * 方法名272 *@paramargs273 * 参数数组274 *@return

275 *@throwsInvalidArgumentException276 *@throwsProposalException277 *@throwsIOException278 *@throwsTransactionException279 *@throwsCryptoException280 *@throwsInvalidKeySpecException281 *@throwsNoSuchProviderException282 *@throwsNoSuchAlgorithmException283 */

284 public Map query(String fcn, String[] args) throwsInvalidArgumentException, ProposalException, NoSuchAlgorithmException, NoSuchProviderException, InvalidKeySpecException, CryptoException, TransactionException, IOException {285 Map resultMap = new HashMap<>();286 String payload = "";287 QueryByChaincodeRequest queryByChaincodeRequest =client.newQueryProposalRequest();288 queryByChaincodeRequest.setArgs(args);289 queryByChaincodeRequest.setFcn(fcn);290 queryByChaincodeRequest.setChaincodeID(chaincodeID);291

292 Map tm2 = new HashMap<>();293 tm2.put("HyperLedgerFabric", "QueryByChaincodeRequest:JavaSDK".getBytes(UTF_8));294 tm2.put("method", "QueryByChaincodeRequest".getBytes(UTF_8));295 queryByChaincodeRequest.setTransientMap(tm2);296

297 Collection queryProposals =channel.queryByChaincode(queryByChaincodeRequest, channel.getPeers());298 for(ProposalResponse proposalResponse : queryProposals) {299 if (!proposalResponse.isVerified() || proposalResponse.getStatus() !=ProposalResponse.Status.SUCCESS) {300 log.debug("Failed query proposal from peer " + proposalResponse.getPeer().getName() + " status: " + proposalResponse.getStatus() + ". Messages: "

301 + proposalResponse.getMessage() + ". Was verified : " +proposalResponse.isVerified());302 resultMap.put("code", "error");303 resultMap.put("data", "Failed query proposal from peer " + proposalResponse.getPeer().getName() + " status: " + proposalResponse.getStatus() + ". Messages: "

304 + proposalResponse.getMessage() + ". Was verified : " +proposalResponse.isVerified());305 } else{306 payload =proposalResponse.getProposalResponse().getResponse().getPayload().toStringUtf8();307 log.debug("Query payload from peer: " +proposalResponse.getPeer().getName());308 log.debug("" +payload);309 resultMap.put("code", "success");310 resultMap.put("data", payload);311 }312 }313 returnresultMap;314 }315

316 }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值