這篇文章主要為大家展示了“如何使用Fabric2.0 Java SDK實現(xiàn)合約交易”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用Fabric2.0 Java SDK實現(xiàn)合約交易”這篇文章吧。
創(chuàng)新互聯(lián)建站是一家專注于成都網(wǎng)站設(shè)計、成都網(wǎng)站制作與策劃設(shè)計,平原網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設(shè)10年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:平原等地區(qū)。平原做網(wǎng)站價格咨詢:18980820575
在進行實踐前,有一個比較新的概念需要了解就是Gateway。 為了應(yīng)對由于Fabric網(wǎng)絡(luò)中的變化頻繁所造成的后果,F(xiàn)abric2.0 原本的SDK之上蓋了一層網(wǎng)關(guān)Gateway,用于減輕應(yīng)用程序的負(fù)擔(dān)。
具體拓?fù)浣Y(jié)構(gòu)如下:
MagnetoCorp和DigiBank應(yīng)用程序(發(fā)行和購買)將各自的網(wǎng)絡(luò)交互委托給其網(wǎng)關(guān)。每個網(wǎng)關(guān)都了解網(wǎng)絡(luò)通道拓?fù)?,其中包括兩個組織MagnetoCorp和DigiBank的多個peers和order,使應(yīng)用程序?qū)W⒂跇I(yè)務(wù)邏輯。節(jié)點間可以使用gossip協(xié)議在組織內(nèi)部和組織之間相互共識交互。
系統(tǒng)工具 | 版本 | 備注 |
---|---|---|
Window | 10 | |
Fabric | 2.0 | 已部署好mychannel通道以及mycc合約到兩個組織節(jié)點 |
Java | 1.8 | |
Maven | 3.5.2 |
Fabric網(wǎng)絡(luò)結(jié)構(gòu) |節(jié)點類型 |節(jié)點名 |所屬組織|ip |服務(wù)端口 |--|--|--|--|--| | orderer| orderer.example.com|-|192.168.2.104|7050 | peer | peer0.org1.example.com |org1|192.168.2.104|7051 | peer | peer1.org1.example.com |org1|192.168.2.104|8051 | peer | peer0.org2.example.com |org2|192.168.2.104|9051 | peer | peer1org2.example.com|org2|192.168.2.104|10051 | ca | ca1.org1.example.com|org1|192.168.2.104|7054 | ca | ca2.org1.example.com|org2|192.168.2.104|8054
新建一個Maven工程,添加以下依賴:
<dependency> <groupId>org.hyperledger.fabric</groupId> <artifactId>fabric-gateway-java</artifactId> <version>2.0.0</version> </dependency>
connectionProfile用于創(chuàng)建一個連接網(wǎng)絡(luò)對象,如果有跑過first-network的朋友,相比記得一個ccp.sh的命令,生成的connection-org1.json、connection-org1.yaml這種文件,其實這些就是我們所需要的connectionProfile,可以直接使用。當(dāng)然也可以自行編寫,自行編寫請參考官方模板
整體connectionProfile結(jié)構(gòu)如下 包含對象說明:
參數(shù)名 | 描述 |
---|---|
name | 自定義網(wǎng)絡(luò)名稱 |
version | 自定義網(wǎng)絡(luò)版本 |
client | 客戶端相關(guān)信息 |
channels | 網(wǎng)絡(luò)所包含的通道信息 |
organizations | 網(wǎng)絡(luò)中組織信息 |
orderers | 排序節(jié)點信息 |
peer | pee節(jié)點信息 |
certificateAuthorities | ca節(jié)點信息 |
其中節(jié)點對象有4中角色定義 |角色 |描述| |--|--| |endorsingPeer| 具有背書權(quán)限節(jié)點 |chaincodeQuery| 具有合約查詢權(quán)限節(jié)點 |ledgerQuery|具有賬本查詢權(quán)限節(jié)點 |eventSource| event hub節(jié)點
其中admin私鑰與admin簽名證書支持路徑與文件內(nèi)容,路徑使用參數(shù)path
,對應(yīng)值填寫路徑,文件內(nèi)容使用參數(shù)pem
,對應(yīng)值填寫私鑰或者證書內(nèi)容。
與排序節(jié)點類似,如果是tls必須配置tlsCACerts
與排序節(jié)點類似,如果是tls必須配置tlsCACerts
新建的工程目錄如下
src/main/java : 存放demo主程序類 src/main/resources/connection.json : 上面新建好的connectionProfile src/main/resources/crypto-config: 存放fabric網(wǎng)絡(luò)證書內(nèi)容(選擇用到的就行)
網(wǎng)關(guān)賬戶就是相當(dāng)于連接fabric網(wǎng)絡(luò)的fabric用戶對象。
//使用org1中的user1初始化一個網(wǎng)關(guān)wallet賬戶用于連接網(wǎng)絡(luò) Wallet wallet = Wallets.newInMemoryWallet(); Path certificatePath = credentialPath.resolve(Paths.get("signcerts", "User1@org1.example.com-cert.pem")); certificate = readX509Certificate(certificatePath); Path privateKeyPath = credentialPath.resolve(Paths.get("keystore", "priv_sk")); privateKey = getPrivateKey(privateKeyPath); //放進wallet wallet.put("user",Identities.newX509Identity("Org1MSP",certificate,privateKey));
賬戶對象都可以存放到wallet里面,方便存取。 證書對象使用的是org1的user私鑰,證書。
通過connectionProfile以及網(wǎng)關(guān)賬戶創(chuàng)建網(wǎng)關(guān)
//根據(jù)connection-org1.json 獲取Fabric網(wǎng)絡(luò)連接對象 GatewayImpl.Builder builder = (GatewayImpl.Builder) Gateway.createBuilder(); builder.identity(wallet, "user").networkConfig(NETWORK_CONFIG_PATH);
NETWORK_CONFIG_PATH : connectionProfile文件路徑
//連接網(wǎng)關(guān) gateway = builder.connect(); //獲取mychannel通道 Network network = gateway.getNetwork("mychannel"); //獲取合約對象 Contract contract = network.getContract("mycc");
網(wǎng)關(guān)連接后 getNetwork
:可以根據(jù)通道名稱獲取Fabric具體通道網(wǎng)絡(luò) network.getContract
:可以根據(jù)合約名稱獲取部署到對應(yīng)通道的智能合約對象
基于上一部分的智能合約,有一個addTen的交易,結(jié)果是對象加10
首先我們對合約對象a
當(dāng)前的值進行查詢
//查詢合約對象evaluateTransaction byte[] queryAResultBefore = contract.evaluateTransaction("query","a"); System.out.println("交易前:"+new String(queryAResultBefore, StandardCharsets.UTF_8));
然后調(diào)用addTen
進行a+10
// 創(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));
此處setEndorsingPeers
設(shè)置背書節(jié)點,這里選擇了通道中背書權(quán)限節(jié)點集合
交易完成后再次進行查詢
//查詢合約對象evaluateTransaction byte[] queryAResultAfter = contract.evaluateTransaction("query","a"); System.out.println("交易后:"+new String(queryAResultAfter, StandardCharsets.UTF_8));
最后控制臺輸出:
交易成功。
以上是“如何使用Fabric2.0 Java SDK實現(xiàn)合約交易”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!
本文題目:如何使用Fabric2.0JavaSDK實現(xiàn)合約交易
地址分享:http://jinyejixie.com/article8/jjhiip.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、定制網(wǎng)站、商城網(wǎng)站、網(wǎng)站排名、做網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)