开发者社区> ezpod> 正文

Fabric Java SDK 1.4简明教程

简介: 在超级账本Fabric区块链中,应用通过节点的RPC协议接口访问链码。Java应用可以使用官方提供的Fabric-sdk-java开发包来实现对链码的访问,java开发包封装了Fabric区块链的GRPC链码访问协议,有利于开发人员聚焦于业务逻辑。
+关注继续查看

在超级账本Fabric区块链中,应用通过节点的RPC协议接口访问链码。Java应用可以使用官方提供的Fabric-sdk-java开发包来实现对链码的访问,java开发包封装了Fabric区块链的GRPC链码访问协议,有利于开发人员聚焦于业务逻辑。本文将通过编写一个最简单的可以访问Fabric链码的Java应用,来帮助你快速上手Fabric区块链的Java应用开发。

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

基本原理

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

fabric-sdk-java

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

java sdk brief

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

实现User接口

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

user impl

容易理解,一个用户的身份是由它的证书来标识的,同时交易还需要证书对应的私钥,因此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());
  }
}

原文链接:Fabric-sdk-java链码访问快速上手 — 汇智网

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Java Web 简明教程
本教程用于介绍Java Web开发入门的方方面面,包括开发环境、工具、网页、Java、数据库等。
156 0
Java Web简明教程–Servlet篇[6]–漂亮的终结篇
本篇是Java Web开发系列的最后一篇,接下来猫哥将开始《猫哥带你去战斗—使用JSP+Servlet开发培训班作业管理系统》,新的系列将承接Java Web开发,主要依赖HTML、Java、Servlet、JSP这些基本技术开发一个培训班作业管理系统。
85 0
Java Web简明教程–Servlet篇[5]–犀利的内置对象
前面几篇写的内容挺多挺乱,稍微理顺下: 1,网站无非是前后台交互 2,目前我们的后台可以认为是Servlet 3,前台可以认为是JSP和HTML 4,Servlet因为可以写out.println(" ");等输出到前台的html内容,所以一定程度上它的输出可以认为是前台。 5,JSP因为可以在<%%>中间写Java代码后台逻辑,所以可以当后台使用
85 0
Java Web简明教程–Servlet篇[4]–JSP顺势而生
前一篇讲了利用HttpServletRequest可以获取网页请求相关的信息,之前我们已知道利用HttpServletResponse可以向网页返回(输出)信息。前一篇已经演示了获取网页请求中参数的方法,本篇就先来演示下Servlet如何响应网页的请求返回对应的信息给用户。
77 0
Java Web简明教程–Servlet篇[3]–获取网页数据
上篇讲了网页可以通过get或post方式向Servlet抛出请求,有时候呢,请求是带参数的。比如网页端想查询三班所有学生姓名,那么这个请求传递给Servlet处理时候,就要携带一个“三班”的参数信息,Servlet根据"三班"来返回该班学生姓名。所以,本篇主要内容:
191 0
Java Web简明教程–Servlet篇[2]–get与post
本篇主要涉及2个内容: 使用MyEclipse简化创建Servlet的过程 get与post请求的区别
135 0
Java Web简明教程–Servlet篇[1]–手(首)写Servlet
Java Web简明教程–Servlet篇[1]–手(首)写Servlet
155 0
Java Web简明教程–Servlet篇[0]–Servlet是干嘛的
Java Web简明教程–Servlet篇[0]–Servlet是干嘛的
105 0
Java Web简明教程–Java篇[14]–数据库操作简化
Java Web简明教程–Java篇[14]–数据库操作简化
68 0
Java Web简明教程–Java篇[13]–联表操作
Java Web简明教程–Java篇[13]–联表操作
141 0
+关注
ezpod
汇智网,http://www.hubwiz.com
文章
问答
视频
文章排行榜
最热
最新
相关课程
更多
相关电子书
更多
JAVA开发手册1.5.0
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多