2019独角兽企业重金招聘Python工程师标准>>>

在超级账本Fabric区块链中,应用通过节点的RPC协议接口访问链码。Java应用可以使用官方提供的Fabric-sdk-java开发包来实现对链码的访问,开发包封装了Fabric区块链的GRPC链码访问协议,有利于开发人员聚焦于业务逻辑。不过Fabric-sdk-java的文档质量保持了Hyperledger Fabric产品一贯的不知所云,看起来实在是令人捉急。本文将尝试编写一个最简单的可以访问Fabric链码的Java应用,来帮助你快速上手Farbic区块链的Java应用开发。

如果希望快速掌握Fabric区块链的链码及应用开发,建议访问汇智网的在线互动课程:

  • Fabric区块链Java开发详解
  • Fabric区块链NodeJs开发详解

基本原理

在Fabric区块链中,应用通过节点的RPC协议接口访问链码:

类似于Shim API对链码通信协议的封装,Fabric Java SDK提供了 对节点RPC协议接口的封装,其入口类为HFClient,对链码的查询和交易操作则 封装在Channel类中:

由于Fabric是许可制区块链,因此应用也需要持有证书和私钥以表征自己的身份,HFClient实例依赖于User接口的实现对象来访问一个特定身份的证书和私钥,因此在访问 链码之前,我们需要首先定义一个简单的User接口实现类。

实现User接口

HFClient实例访问Fabric网络的身份使用User接口实现对象来表征,因此我们需要定义一个简单的User接口实现类LocalUser

容易理解,一个用户的身份是由它的证书来标识的,同时交易还需要证书对应的私钥,因此LocalUser的核心逻辑就是利用指定的证书和私钥PEM文件满足User接口的要求。

首先按照User接口的要求完成类LocalUser的骨架:

import org.hyperledger.fabric.sdk.User;
import org.hyperledger.fabric.sdk.security.CryptoPrimitives;public class LocalUser implements User{             //实现User接口private String name;private String mspId;private Enrollment enrollment;LocalUser(String name,String mspId){this.name = name;this.mspId = mspId;}private Enrollment loadFromPemFile(String keyFile,String certFile){ /*见下文说明*/ }@Override public String getName(){ return name; }@Override public String getMspId() { return mspId}@Override public Enrollment getEnrollment() { return enrollment; }@Override public String getAccount() { return null; }@Override public String getAffiliation() { return null; }
}

在Fabric Java SDK中,Enrollment接口用来提供对用户的私钥和证书的访问,并且预置了一个适合X509证书的实现类X509Enrollment,因此我们可以从本地MSP目录中的PEM文件中载入用户私钥和签名证书:

private Enrollment loadFromPemFile(String keyFile,String certFile) throws Exception{byte[] keyPem = Files.readAllBytes(Paths.get(keyFile));     //载入私钥PEM文本byte[] certPem = Files.readAllBytes(Paths.get(certFile));   //载入证书PEM文本CryptoPrimitives suite = new CryptoPrimitives();            //载入密码学套件PrivateKey privateKey = suite.bytesToPrivateKey(keyPem);    //将PEM文本转换为私钥对象return new X509Enrollment(privateKey,new String(certPem));  //创建并返回X509Enrollment对象
}

访问链码

有了User接口实现类,接下来只要创建一个HFClient实例,然后获取通道对象,就可以查询链码,或者提交链码交易了。

完整的实现代码如下:

package com.hubwiz.demo;import org.hyperledger.fabric.sdk.User;
import org.hyperledger.fabric.sdk.HFClient;
import org.hyperledger.fabric.sdk.Channel;
import org.hyperledger.fabric.sdk.Peer;
import org.hyperledger.fabric.sdk.Orderer;
import org.hyperledger.fabric.sdk.security.CryptoSuite;
import org.hyperledger.fabric.sdk.ChaincodeID;
import org.hyperledger.fabric.sdk.QueryByChaincodeRequest;
import org.hyperledger.fabric.sdk.ProposalResponse;
import org.hyperledger.fabric.sdk.TransactionProposalRequest;
import org.hyperledger.fabric.sdk.BlockEvent.TransactionEvent;import java.util.Collection;
import java.util.concurrent.CompletableFuture;public class App{public static void main(String[] args) throws Exception{System.out.println("counter app");//创建User实例String keyFile = "../solo-network/msp/keystore/user-key.pem";String certFile = "../solo-network/msp/signcerts/user-cert.pem";LocalUser user = new LocalUser("admin","SampleOrg",keyFile,certFile);//创建HFClient实例HFClient client = HFClient.createNewInstance();client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());client.setUserContext(user);//创建通道实例Channel channel = client.newChannel("ch1");Peer peer = client.newPeer("peer1`","grpc://127.0.0.1:7051");channel.addPeer(peer);Orderer orderer = client.newOrderer("orderer1","grpc://127.0.0.1:7050");channel.addOrderer(orderer);channel.initialize();//查询链码QueryByChaincodeRequest req = client.newQueryProposalRequest();ChaincodeID cid = ChaincodeID.newBuilder().setName("counter-cc").build();req.setChaincodeID(cid);req.setFcn("value");ProposalResponse[] rsp = channel.queryByChaincode(req).toArray(new ProposalResponse[0]);System.out.format("rsp message => %s\n",rsp[0].getProposalResponse().getResponse().getPayload().toStringUtf8());//提交链码交易TransactionProposalRequest req2 = client.newTransactionProposalRequest();req2.setChaincodeID(cid);req2.setFcn("inc");req2.setArgs("10");Collection<ProposalResponse> rsp2 = channel.sendTransactionProposal(req2);TransactionEvent event = channel.sendTransaction(rsp2).get();System.out.format("txid: %s\n", event.getTransactionID());System.out.format("valid: %b\n", event.isValid());}
}

汇智网原创,转载请表明出处

转载于:https://my.oschina.net/u/2472105/blog/3043979

Fabric java sdk 1.4简明教程相关推荐

  1. Fabric node sdk 1.4简明教程

    hyperledger fabric的node sdk最新版本为1.4,本文将介绍如何使用最新版本的fabric node sdk开发node.js应用,以实现与fabric区块链的交互,例如查询链码 ...

  2. Hyperledger Fabric Java SDK最新教程

    Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK ...

  3. fabric sdk java教程,Fabric Java SDK最新教程

    Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK ...

  4. fabric sdk java_Hyperledger Fabric Java SDK最新教程

    Fabric Java SDK是Fabric区块链官方提供的用于Java应用开发的SDK,全称为Fabric-sdk-java,网上可用资料不多,本文列出了精心整理的针对Fabric Java SDK ...

  5. Java手机游戏开发简明教程 (SunJava开发者认证程序员 郎锐)

    原文发布时间为:2008-07-30 -- 来源于本人的百度文章 [由搬家工具导入] Java手机游戏开发实例简明教程 (SunJava开发者认证程序员 郎锐) 一.手机游戏编写基础 1.手机游戏设计 ...

  6. fabric java sdk解析channel.queryTransactionByID(txId)方法的返回值

    解析区块链上具体某一个块的内容,官方java sdk已经给出了解析案例,具体解析过程也可参考QueryHandler#queryBlockChain. 但是如果要根据交易ID(txId)查找交易信息, ...

  7. appium java类库下载,appium 简明教程 (4)——appium client 的安装

    appium client 是对 webdriver 原生 api 的一些扩展和封装.它可以帮助我们更容易的写出用例,写出更好懂的用例. appium client 是配合原生的 webdriver ...

  8. mixin机器人java开发_Mixin 开发简明教程 1:写个机器人

    作者:Lyric  编辑:比特汪 本文已通过PRESSone合约购买个人授权许可(非排他性),可以点击阅读原文查看. 我是 @lyric,本教程应 Mixin COO @薄荷 邀约而写,旨在向区块链领 ...

  9. Realm Java 简明教程(1)

    Realm Java 简明教程 Realm 是一个轻量的android版本的数据存储库 Realm 是一个轻量的android版本的数据存储库,快速简洁的操作方式,使得其优势得以凸显,我们来看下一个实 ...

  10. java程序设计简明教程张晓龙_Java网络编程简明教程

    Java网络编程简明教程 网络编程 计算机网络相关概念 计算机网络是两台或更多的计算机组成的网络,同一网络内的任意两台计算机可以直接通信,所有计算机必须遵循同一种网络协议. 互联网 互联网是连接计算机 ...

最新文章

  1. 虚函数表 vtable
  2. 时间序列预测:I概述
  3. mysqldumper 与 Innobackupex的备份和恢复操作实验过程
  4. HttpWebRequest与HttpWebResponse进行数据采集时的注意点
  5. [BZOJ3626] [LNOI2014] LCA 离线 树链剖分
  6. Leetcode--820:单词的压缩编码(java)
  7. 【开源工程】视频主观质量评测工具 video quality compare tool
  8. leetcode 175. Combine Two Tables
  9. 免费的瓦片图集资源TiledMap
  10. 搜索和下载英文文献常用的网站
  11. laravel较优雅的分表关联查询(性能较好,SQL的数量=表的数量,涵盖了较多laravel手册推荐的方法)...
  12. 项目质量管理__七种基本质量工具__老七工具和新七工具
  13. weui表单添加功能_万能表单小程序 weui V8.1.16 weiqing功能模块 支持PC端管理 + 微信端管理 目前最强大的表单系统 weiqing微赞通用功能模块...
  14. 用HEdit解决因修改用户文件夹名在打开pip时遇到Fatal error in launcher: Unable to create process using 的问题
  15. 三、共阳数码管的静态显示
  16. kali系统破解WiFi密码(二)
  17. 离群值是什么意思_离群值!离群值?离群值!
  18. Python:信号量semaphore
  19. 用canvas做视频截图遇到的坑(已填坑)
  20. 多媒体应用开发-控制摄像头拍照

热门文章

  1. 4.linux基础1
  2. Scalaz(47)- scalaz-stream: 深入了解-Source
  3. jsp中的九大内置对象和四大作用域
  4. 使用DevExpress.XtraTabbedMdi.XtraTabbedMdiManager控件来加载MDI窗体
  5. IE下 jqModal的问题
  6. 关于网页导出Excel
  7. JVM第四节:JVM 执行子程序
  8. DevExpress 小结
  9. IDEA快速升级模块版本号
  10. Notes on Operating System