溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Fabric java sdk 1.4簡明教程

發(fā)布時間:2020-07-20 11:34:28 來源:網(wǎng)絡(luò) 閱讀:236 作者:小智123 欄目:編程語言

在超級賬本Fabric區(qū)塊鏈中,應(yīng)用通過節(jié)點(diǎn)的RPC協(xié)議接口訪問鏈碼。Java應(yīng)用可以使用官方提供的Fabric-sdk-java開發(fā)包來實現(xiàn)對鏈碼的訪問,開發(fā)包封裝了Fabric區(qū)塊鏈的GRPC鏈碼訪問協(xié)議,有利于開發(fā)人員聚焦于業(yè)務(wù)邏輯。不過Fabric-sdk-java的文檔質(zhì)量保持了Hyperledger Fabric產(chǎn)品一貫的不知所云,看起來實在是令人捉急。本文將嘗試編寫一個最簡單的可以訪問Fabric鏈碼的Java應(yīng)用,來幫助你快速上手Farbic區(qū)塊鏈的Java應(yīng)用開發(fā)。

如果希望快速掌握Fabric區(qū)塊鏈的鏈碼及應(yīng)用開發(fā),建議訪問匯智網(wǎng)的在線互動課程:

  • Fabric區(qū)塊鏈Java開發(fā)詳解
  • Fabric區(qū)塊鏈NodeJs開發(fā)詳解

基本原理

在Fabric區(qū)塊鏈中,應(yīng)用通過節(jié)點(diǎn)的RPC協(xié)議接口訪問鏈碼:

Fabric java sdk 1.4簡明教程

類似于Shim API對鏈碼通信協(xié)議的封裝,F(xiàn)abric Java SDK提供了 對節(jié)點(diǎn)RPC協(xié)議接口的封裝,其入口類為HFClient,對鏈碼的查詢和交易操作則 封裝在Channel類中:

Fabric java sdk 1.4簡明教程

由于Fabric是許可制區(qū)塊鏈,因此應(yīng)用也需要持有證書和私鑰以表征自己的身份,HFClient實例依賴于User接口的實現(xiàn)對象來訪問一個特定身份的證書和私鑰,因此在訪問 鏈碼之前,我們需要首先定義一個簡單的User接口實現(xiàn)類。

實現(xiàn)User接口

HFClient實例訪問Fabric網(wǎng)絡(luò)的身份使用User接口實現(xiàn)對象來表征,因此我們需要定義一個簡單的User接口實現(xiàn)類LocalUser

Fabric java sdk 1.4簡明教程

容易理解,一個用戶的身份是由它的證書來標(biāo)識的,同時交易還需要證書對應(yīng)的私鑰,因此LocalUser的核心邏輯就是利用指定的證書和私鑰PEM文件滿足User接口的要求。

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

import org.hyperledger.fabric.sdk.User;
import org.hyperledger.fabric.sdk.security.CryptoPrimitives;

public class LocalUser implements User{             //實現(xiàn)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接口用來提供對用戶的私鑰和證書的訪問,并且預(yù)置了一個適合X509證書的實現(xiàn)類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();            //載入密碼學(xué)套件
  PrivateKey privateKey = suite.bytesToPrivateKey(keyPem);    //將PEM文本轉(zhuǎn)換為私鑰對象
  return new X509Enrollment(privateKey,new String(certPem));  //創(chuàng)建并返回X509Enrollment對象
}

訪問鏈碼

有了User接口實現(xiàn)類,接下來只要創(chuàng)建一個HFClient實例,然后獲取通道對象,就可以查詢鏈碼,或者提交鏈碼交易了。

完整的實現(xiàn)代碼如下:

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");

    //創(chuàng)建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);

    //創(chuàng)建HFClient實例
    HFClient client = HFClient.createNewInstance();
    client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
    client.setUserContext(user);

    //創(chuàng)建通道實例
    Channel channel = client.newChannel("ch2");
    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());
  }
}

匯智網(wǎng)原創(chuàng),轉(zhuǎn)載請表明出處

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI