Hyperledger fabric-sdk-java Basics Tutorial(转)
原文地址:Hyperledger fabric-sdk-java Basics Tutorial
This quick tutorial is for all Java developers, who started to look into Hyperledger Fabric platform (https://hyperledger.org/) and would like to use fabric-sdk-java for their projects.
When learning a new technology I always try to search for some minimal working example I can get up and running in my environment. This is a starting point for me to further play around with APIs, debug and get better handle of the framework.
There is a lot of good documentation and examples available on Hyperledger sites ( http://hyperledger-fabric.readthedocs.io and https://github.com/hyperledger/fabric-samples.git). What I have been missing is some minimal working project for Java developers using fabric-sdk-java. This tutorial tries to serve this purpose.
This tutorial assumes you are familiar with basics of Hyperledger fabric. If not, then I suggest you to look around and especially go through http://hyperledger-fabric.readthedocs.io/en/release/build_network.htmland http://hyperledger-fabric.readthedocs.io/en/release/write_first_app.html .
If you were successfully able to get through these two tutorials, then we are ready to have a look how to use fabric-sdk-java to do the same. We will use the fabcar example from https://github.com/hyperledger/fabric-samples.git to setup the network.
Tips:
fabric-samples/scripts/fabric-preload.sh
script will download the docker images and tag them for you.fabric-samples/fabcar/startFabric.sh
can be used to start the fabcar network- In case you are experiencing issues you might want to do some docker cleanup
# !!! THIS WILL REMOVE ALL YOUR DOCKER CONTAINERS AND IMAGES !!!
# remove all containers
$ docker rm $(docker ps -qa)
# remove all mages
$ docker rmi --force $(docker images -qa)
# prune networks
$ docker network prune
Enough talking and let’s get something up and running….
Clone the example code from here into demo directory
git clone https://github.com/lkolisko/scratch.git tutorial
and navigate to tutorial/hyperledger/fabric-sdk-java-scratch
.
The project itself has just 4 three important files.
- pom.xml —maven build file including dependency to fabric-sdk-java artifact. org.hyperledger.fabric-sdk-java: fabric-sdk-java:1.0.1 . There might be a new version available at the time you are reading this. You must ensure you fabric-sdk-java version is the same release series as the images used in fabric-samples. Otherwise you might run into incompatibility issues at protobuf leves or APIs.
- src/main/java/lkolisko/hyperledger/example/AppUser.java — this is minimal implementation of the User interface. The sdk itself does not provide implementation, therefore we must do here ourselves.
- src/main/java/lkolisko/hyperledger/example/HFJavaSDKBasicExample.java — this is the main class and will further talk about details bellow.
- src/main/resources/log4j.xml — log4j configuration. I highly suggest to set the root logger to debug. You will be able to see all the information about communication between client the other components of the fabric network.
Enrolling admin
We need to create fabric-ca client to be able to register and enroll users. To be precise it might not be necessary, as you already enrolled admin and user using fabric-ca-client
cli or following he fabcar example (the crypto material is available in fabric-samples/fabcar/hfc-key-store
and can be loaded) . But lets start from scratch and learn how to do that in Java.
CryptoSuite cryptoSuite = CryptoSuite.Factory.getCryptoSuite();
HFCAClient caClient = HFCAClient.createNewInstance(“grpc://localhost:7054”, null);
caClient.setCryptoSuite(cryptoSuite);
The grpc://localhost:7054
is the endpoint where fabric-ca server listens. You can check that running docker ps . The properties can be left empty or null for now.
Enroll Admin
To communicate with fabric components we have to have key pair and a certificate signed by the fabric-ca. We can either use the crypto material generated in fabric-samples/fabcar/hfc-key-store
. For the purpose of learning the API we will let the fabric-ca client generate the crypto material for us.
Enrollment adminEnrollment = caClient.enroll("admin", "adminpw");
AppUser admin = new AppUser("admin","org1", "Org1MSP", adminEnrollment);
The ca client will generate the key pair and CSR (certificate signature request) using the CryptoSuite and send it to the fabric-ca.
fabri-ca will
- authenticate admin using basic authentication
- perform verification e.g. check if max enrollment count for the account has not been reached
- sign the certificate
- store the certificate (along with its serial number, aki and other information)
- send it back to client
The Enrollment object contains private key and the certificate. The sample stores the object using Java Serialization. This is definitely a bad practice and is used just for the purpose of keeping the example simple.
Register and Enroll user
In the step two we are going to register a new user and enroll the user.
RegistrationRequest rr = new RegistrationRequest("hfuser", "org1");
String userSecret = caClient.register(rr, registrar);
Enrollment userEnrollment = caClient.enroll("hfuser", userSecret);
AppUser appUser = new AppUser("hfuser", "org1","Org1MSP", userEnrollment);
To do that RegistrationRequest
object with userId and affiliation has to be created. To understand what affiliation means, please refer here http://hyperledger-fabric-ca.readthedocs.io/en/latest/users-guide.html .
With the RegistrationRequest
we will call fabri-ca using registrar (admin) . The fabric-ca will answer with secret (password) we will use for enrollment of the user. This is the same as we did for the admin in the previous step.
At this moment we have admin — private key and signed certificate and user with private key and signed certificate. This opens as the door to talk to fabric itself.
Initialize HF Client
We will create client instance using HFClient factory and set the default crypto suite. Next we set use context. This will be the account under which we are going to talk to Hyperledger Fabric and its private key will be used to sign the request.
CryptoSuite cryptoSuite = CryptoSuite.Factory.getCryptoSuite();
HFClient client = HFClient.createNewInstance();
client.setCryptoSuite(cryptoSuite);
client.setUserContext(appUser);
Initialize Channel object
The interesting stuff happens in channel. Therefore we have to get the Channel
object. For this we need peer and orderer. The orderer is listening on 7050 and peer on 7051 and eventhub on 7053 ports of the localhost. We are not using TLS now so set the grpc protol. The orderer and peer names do not have to match the fqdn you see in the docker ps. The channel name for the sample is mychannel. After channel.initialize()
we are ready to go.
Peer peer = client.newPeer("peer", "grpc://localhost:7051"); EventHub eventHub = client.newEventHub("eventhub", "grpc://localhost:7053");
Orderer orderer = client.newOrderer("orderer", "grpc://localhost:7050");
Channel channel = client.newChannel("mychannel");
channel.addPeer(peer);
channel.addEventHub(eventHub);
channel.addOrderer(orderer);
channel.initialize();
Invoking chain code
We will invoke simple query on the fabric chain code. To do so QueryByChaincodeRequest
has to be set with chain code id fabcar
and function we would like to invoke queryAllCars
. Potentially you would like to pass arguments using setArgs
and version using setVersion
.
QueryByChaincodeRequest qpr = client.newQueryProposalRequest();
ChaincodeID fabcarCCId = ChaincodeID.newBuilder().setName("fabcar").build();
qpr.setChaincodeID(fabcarCCId);
qpr.setFcn("queryAllCars");
Collection<ProposalResponse> res = channel.queryByChaincode(qpr);
for (ProposalResponse pres : res) {
String stringResponse = new String(pres.getChaincodeActionResponsePayload());
log.info(stringResponse);
}
Once we are set, let submit the query request and enjoy the response. The response is protobuf backed object, therefore we just rely on simple toString here for simplicity.
Please do not consider the code above as a best practice to follow. We are ignoring handling invalid responses, exceptions, storing credentials using serialization and dozen of other bad practices. The purpose of the sample is to get something working with minimal effort and get you on track.
To study further I highly recommend checking
- https://github.com/hyperledger/fabric-sdk-java/blob/master/src/test/java/org/hyperledger/fabric/sdkintegration/End2endIT.java
- https://github.com/hyperledger/fabric-sdk-java/blob/master/src/test/java/org/hyperledger/fabric/sdkintegration/NetworkConfigIT.java .
Happy coding !
— Lukas
Hyperledger fabric-sdk-java Basics Tutorial(转)的更多相关文章
- HyperLedger/Fabric SDK使用Docker容器镜像快速部署上线
HyperLedger/Fabric SDK Docker Image 该项目在github上的地址是:https://github.com/aberic/fabric-sdk-container ( ...
- 区块链:基于Hyperledger Fabric的 java 客户端开发(java sdk /java api server/java event server)
fabric针对java 开发的部分支持不是很友好.基于目前较为稳定的fabric 1.4版本,我们封装了一个java sdk,apiserver,eventServer 封装java sdk的主要目 ...
- hyperledger fabric 中java chaincode 支持离线打包
联盟链由于其本身的特性,目前应用在一些大型国有企业银行比较多.出于安全考虑,这些企业一般会隔离外网环境.所以在实际生产需求中可能存在需要在一个离线的环境中打包安装chaincode的情况. 本文基于这 ...
- Hyperledger Fabric SDK use case 1
///////////////////////////////////////////////////////////////////////:End2endAndBackAgainIT 1.Crea ...
- hyperledger fabric超级账本java sdk样例e2e代码流程分析
一 checkConfig Before 1.1 private static final TestConfig testConfig = TestConfig.getConfig() ...
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用【补充】
在 Hyperledger Fabric 1.0 从零开始(十二)--fabric-sdk-java应用 中我已经把官方sdk具体改良办法,即使用办法发出来了,所有的类及文件都是完整的,在文章的结尾也 ...
- Hyperledger Fabric 1.0 从零开始(十二)——fabric-sdk-java应用
Hyperledger Fabric 1.0 从零开始(十)--智能合约 Hyperledger Fabric 1.0 从零开始(十一)--CouchDB 上述两章,最近网上各路大神文章云集,方案多多 ...
- 使用Node.JS访问Hyperledger Fabric的gRPC服务
在即将正式发布的Hyperledger Fabric SDK 1.0中,Hyperledger Fabric通过gRPC提供服务接口以取代现有的REST API.本文介绍了如何使用Node.JS访问H ...
- Hyperledger Fabric 2.x Java区块链应用
一.说明 在上一篇文章中 <Hyperledger Fabric 2.x 自定义智能合约> 分享了智能合约的安装并使用 cli 客户端进行合约的调用:本文将使用 Java 代码基于 fab ...
随机推荐
- android studio样式文件汇总
android studio样式文件汇总:shape.Theme|styles .selector 1:shape shape用于设定形状,有6个子标签,各属性如下: res/drawable/sty ...
- C#基础加强(8)之委托和事件
委托 简介 委托是一种可以声明出指向方法的变量的数据类型. 声明委托的方式 格式: delegate <返回值类型> 委托类型名(参数) ,例如: delegate void MyDel( ...
- ORACLE——存储过程
存储过程procedure 被内容来自<oracle从入门到精通——明日科技>一书 存储过程是一种命名的PL/SQL程序快,存储过程被保存在数据库中,它不可以被SQL语句直接执行或调用,只 ...
- 四、UI开发之核心基础——约束(实用)
概述 本节将会介绍最常用的几种约束,基本可以满足90%以上的UI布局要求. 先附上一份其他优秀博客https://blog.csdn.net/companion_1314/article/detail ...
- pytorch预训练模型的下载地址以及解决下载速度慢的方法
https://github.com/pytorch/vision/tree/master/torchvision/models 几乎所有的常用预训练模型都在这里面 总结下各种模型的下载地址: 1 R ...
- 25个SSH命令
OpenSSH是SSH连接工具的免费版本.telnet,rlogin和ftp用户可能还没意识到他们在互联网上传输的密码是未加密的,但SSH是加密的,OpenSSH加密所有通信(包括密码),有效消除了窃 ...
- python多线程学习二
本文希望达到的目标: 多线程同步原语:互斥锁 多线程队列queue 线程池threadpool 一.多线程同步原语:互斥锁 在多线程代码中,总有一些特定的函数或者代码块不应该被多个线程同时执行,通常包 ...
- 使用Sitecore的可视化路径分析器工具洞察客户360度行为
Path Analyzer背后的想法是观察,分析和理解您的潜在客户和客户在浏览您的网站时所遵循的网络旅程.他们最初来自哪里?他们的路径是“有机”(通过搜索引擎)还是来自付费广告?社交帖子?甚至是你发起 ...
- JS的防抖与节流
JS的防抖与节流在进行窗口的resize.scroll,输入框内容校验等操作时,如果事件处理函数调用的频率无限制,会加重浏览器的负担,导致用户体验非常糟糕.此时我们可以采用debounce(防抖)和t ...
- apache+jk+tomcat+ssl的https改造
项目背景 公司项目要进行https的改造,目前在测试环境搭建了一下,参考了网上的例子(http://blog.csdn.net/whumr1/article/details/7804992) 这里把主 ...