總目錄: 根據(jù)前面的步驟,,我們基于cli客戶端完成了一系列操作,但是正常情況下,,我們的工程一般會(huì)使用SDK去調(diào)用 網(wǎng)絡(luò)完成交易,,因此從這一章開(kāi)始實(shí)踐何基于Java SDK調(diào)用Fabric2.0網(wǎng)絡(luò)完成交易。 1.Gateway在進(jìn)行實(shí)踐前,,有一個(gè)比較新的概念需要了解就是Gateway,。 具體拓?fù)浣Y(jié)構(gòu)如下: MagnetoCorp和DigiBank應(yīng)用程序(發(fā)行和購(gòu)買)將各自的網(wǎng)絡(luò)交互委托給其網(wǎng)關(guān)。每個(gè)網(wǎng)關(guān)都了解網(wǎng)絡(luò)通道拓?fù)?,其中包括兩個(gè)組織MagnetoCorp和DigiBank的多個(gè)peers和order,,使應(yīng)用程序?qū)W⒂跇I(yè)務(wù)邏輯。節(jié)點(diǎn)間可以使用gossip協(xié)議在組織內(nèi)部和組織之間相互共識(shí)交互,。 2.環(huán)境準(zhǔn)備
Fabric網(wǎng)絡(luò)結(jié)構(gòu)
3.創(chuàng)建基礎(chǔ)工程新建一個(gè)Maven工程,,添加以下依賴: <dependency> <groupId>org.hyperledger.fabric</groupId> <artifactId>fabric-gateway-java</artifactId> <version>2.0.0</version> </dependency> 4.創(chuàng)建connectionProfileconnectionProfile用于創(chuàng)建一個(gè)連接網(wǎng)絡(luò)對(duì)象,如果有跑過(guò)first-network的朋友,,相比記得一個(gè)ccp.sh的命令,,生成的connection-org1.json、connection-org1.yaml這種文件,,其實(shí)這些就是我們所需要的connectionProfile,,可以直接使用。當(dāng)然也可以自行編寫,,自行編寫請(qǐng)參考官方模板 4.1 配置文件結(jié)構(gòu)說(shuō)明整體connectionProfile結(jié)構(gòu)如下
4.1.1 client4.1.2 channels
4.1.3 organizations其中admin私鑰與admin簽名證書支持路徑與文件內(nèi)容,,路徑使用參數(shù) 4.1.4 orderers4.1.5 peer與排序節(jié)點(diǎn)類似,,如果是tls必須配置tlsCACerts 4.1.6 certificateAuthorities與排序節(jié)點(diǎn)類似,,如果是tls必須配置tlsCACerts 5. JAVA工程目錄說(shuō)明新建的工程目錄如下 src/main/java : 存放demo主程序類 src/main/resources/connection.json : 上面新建好的connectionProfile src/main/resources/crypto-config: 存放fabric網(wǎng)絡(luò)證書內(nèi)容(選擇用到的就行) 6. 實(shí)踐6.1 創(chuàng)建網(wǎng)關(guān)賬戶網(wǎng)關(guān)賬戶就是相當(dāng)于連接fabric網(wǎng)絡(luò)的fabric用戶對(duì)象,。 //使用org1中的user1初始化一個(gè)網(wǎng)關(guān)wallet賬戶用于連接網(wǎng)絡(luò) Wallet wallet = Wallets.newInMemoryWallet(); Path certificatePath = credentialPath.resolve(Paths.get("signcerts", "[email protected]")); certificate = readX509Certificate(certificatePath); Path privateKeyPath = credentialPath.resolve(Paths.get("keystore", "priv_sk")); privateKey = getPrivateKey(privateKeyPath); //放進(jìn)wallet wallet.put("user",Identities.newX509Identity("Org1MSP",certificate,privateKey)); 賬戶對(duì)象都可以存放到wallet里面,方便存取,。 6.2 創(chuàng)建網(wǎng)關(guān)通過(guò)connectionProfile以及網(wǎng)關(guān)賬戶創(chuàng)建網(wǎng)關(guān) //根據(jù)connection-org1.json 獲取Fabric網(wǎng)絡(luò)連接對(duì)象 GatewayImpl.Builder builder = (GatewayImpl.Builder) Gateway.createBuilder(); builder.identity(wallet, "user").networkConfig(NETWORK_CONFIG_PATH);
6.3 連接網(wǎng)關(guān)//連接網(wǎng)關(guān) gateway = builder.connect(); //獲取mychannel通道 Network network = gateway.getNetwork("mychannel"); //獲取合約對(duì)象 Contract contract = network.getContract("mycc"); 網(wǎng)關(guān)連接后 6.4 交易基于上一部分的智能合約,,有一個(gè)addTen的交易,,結(jié)果是對(duì)象加10 首先我們對(duì)合約對(duì)象 //查詢合約對(duì)象evaluateTransaction byte[] queryAResultBefore = contract.evaluateTransaction("query","a"); System.out.println("交易前:"+new String(queryAResultBefore, StandardCharsets.UTF_8)); 然后調(diào)用 // 創(chuàng)建并且提交交易 byte[] invokeResult = contract.createTransaction("addTen") .setEndorsingPeers(network.getChannel().getPeers(EnumSet.of(Peer.PeerRole.ENDORSING_PEER))) .submit("a"); System.out.println(new String(invokeResult, StandardCharsets.UTF_8)); 此處 交易完成后再次進(jìn)行查詢 //查詢合約對(duì)象evaluateTransaction byte[] queryAResultAfter = contract.evaluateTransaction("query","a"); System.out.println("交易后:"+new String(queryAResultAfter, StandardCharsets.UTF_8)); 最后控制臺(tái)輸出: 交易成功,。 7. 總結(jié)在調(diào)用交易方面,,通過(guò)網(wǎng)關(guān)這種確實(shí)簡(jiǎn)單了很多,后面應(yīng)用程序進(jìn)行設(shè)計(jì)的時(shí)候,,可以將網(wǎng)關(guān)這個(gè)包單獨(dú)封裝,,應(yīng)用程序再進(jìn)行調(diào)用,可以基于網(wǎng)關(guān)這層保障應(yīng)用程序的業(yè)務(wù)穩(wěn)定性,。而再創(chuàng)建通道,、加入通道、部署合約等操作應(yīng)該還是SDK那套,,后續(xù)章節(jié)也將繼續(xù)實(shí)踐,。需要本章源碼的可以評(píng)論留言。 源碼:https://github.com/llzz9595/fabricdemo |
|