Fabric java sdk 1.4簡(jiǎn)明教程

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

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

基本原理

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

fabric-sdk-java

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

java sdk brief

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

實(shí)現(xiàn)User接口

HFClient實(shí)例訪問(wèn)Fabric網(wǎng)絡(luò)的身份使用User接口實(shí)現(xiàn)對(duì)象來(lái)表征艘绍,因此我們需要定義一個(gè)簡(jiǎn)單的User接口實(shí)現(xiàn)類LocalUser

user impl

容易理解,一個(gè)用戶的身份是由它的證書來(lái)標(biāo)識(shí)的秫筏,同時(shí)交易還需要證書對(duì)應(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{             //實(shí)現(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){ /*見下文說(shuō)明*/ }

  @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接口用來(lái)提供對(duì)用戶的私鑰和證書的訪問(wèn)航夺,并且預(yù)置了一個(gè)適合X509證書的實(shí)現(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)換為私鑰對(duì)象
  return new X509Enrollment(privateKey,new String(certPem));  //創(chuàng)建并返回X509Enrollment對(duì)象
}

訪問(wèn)鏈碼

有了User接口實(shí)現(xiàn)類,接下來(lái)只要?jiǎng)?chuàng)建一個(gè)HFClient實(shí)例阳掐,然后獲取通道對(duì)象始衅,就可以查詢鏈碼,或者提交鏈碼交易了缭保。

完整的實(shí)現(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實(shí)例
    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實(shí)例
    HFClient client = HFClient.createNewInstance();
    client.setCryptoSuite(CryptoSuite.Factory.getCryptoSuite());
    client.setUserContext(user);
    
    //創(chuàng)建通道實(shí)例
    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());
  }
}

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市艺骂,隨后出現(xiàn)的幾起案子诸老,更是在濱河造成了極大的恐慌,老刑警劉巖彻亲,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件孕锄,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡苞尝,警方通過(guò)查閱死者的電腦和手機(jī)畸肆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宙址,“玉大人轴脐,你說(shuō)我怎么就攤上這事÷丈埃” “怎么了大咱?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)注益。 經(jīng)常有香客問(wèn)我碴巾,道長(zhǎng),這世上最難降的妖魔是什么丑搔? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任厦瓢,我火速辦了婚禮,結(jié)果婚禮上啤月,老公的妹妹穿的比我還像新娘煮仇。我一直安慰自己,他們只是感情好谎仲,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布浙垫。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪夹姥。 梳的紋絲不亂的頭發(fā)上杉武,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音佃声,去河邊找鬼艺智。 笑死,一個(gè)胖子當(dāng)著我的面吹牛圾亏,可吹牛的內(nèi)容都是我干的十拣。 我是一名探鬼主播,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼志鹃,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼夭问!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起曹铃,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缰趋,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后陕见,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘血,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年评甜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了灰粮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡忍坷,死狀恐怖粘舟,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情佩研,我是刑警寧澤柑肴,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站旬薯,受9級(jí)特大地震影響晰骑,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绊序,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一些侍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧政模,春花似錦、人聲如沸蚂会。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)胁住。三九已至趁猴,卻和暖如春刊咳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背儡司。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留捕犬,地道東北人碉碉。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓贴届,卻偏偏與公主長(zhǎng)得像毫蚓,于是被迫代替她去往敵國(guó)和親元潘。 傳聞我的和親對(duì)象是個(gè)殘疾皇子柬批,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容