您好,登錄后才能下訂單哦!
這篇文章主要講解了“Fabric區(qū)塊鏈的Java應(yīng)用開發(fā)方法是什么”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Fabric區(qū)塊鏈的Java應(yīng)用開發(fā)方法是什么”吧!
在Fabric區(qū)塊鏈中,應(yīng)用通過節(jié)點的RPC協(xié)議接口訪問鏈碼:
類似于Shim API對鏈碼通信協(xié)議的封裝,F(xiàn)abric Java SDK提供了 對節(jié)點RPC協(xié)議 接口的封裝,其入口類為HFClient,對鏈碼的查詢和交易操作則 封裝在Channel類中:
由于Fabric是許可制區(qū)塊鏈,因此應(yīng)用也需要持有證書和私鑰以表征自己的身份,HFClient實例 依賴于User接口的實現(xiàn)對象 來訪問一個特定身份的證書和私鑰,因此在訪問 鏈碼之前,我們需要首先定義一個簡單的User接口實現(xiàn)類。
HFClient
實例訪問Fabric網(wǎng)絡(luò)的身份使用User
接口實現(xiàn)對象來表征,因此我們需要定義一個簡單的 User接口實現(xiàn)類LocalUser
:
容易理解,一個用戶的身份是由它的證書來標(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()); } }
感謝各位的閱讀,以上就是“Fabric區(qū)塊鏈的Java應(yīng)用開發(fā)方法是什么”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Fabric區(qū)塊鏈的Java應(yīng)用開發(fā)方法是什么這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。