您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易”這篇文章吧。
在進(jìn)行實(shí)踐前,有一個(gè)比較新的概念需要了解就是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)。每個(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)部和組織之間相互共識交互。
系統(tǒng)工具 | 版本 | 備注 |
---|---|---|
Window | 10 | |
Fabric | 2.0 | 已部署好mychannel通道以及mycc合約到兩個(gè)組織節(jié)點(diǎn) |
Java | 1.8 | |
Maven | 3.5.2 |
Fabric網(wǎng)絡(luò)結(jié)構(gòu) |節(jié)點(diǎn)類型 |節(jié)點(diǎn)名 |所屬組織|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
新建一個(gè)Maven工程,添加以下依賴:
<dependency> <groupId>org.hyperledger.fabric</groupId> <artifactId>fabric-gateway-java</artifactId> <version>2.0.0</version> </dependency>
connectionProfile用于創(chuàng)建一個(gè)連接網(wǎng)絡(luò)對象,如果有跑過first-network的朋友,相比記得一個(gè)ccp.sh的命令,生成的connection-org1.json、connection-org1.yaml這種文件,其實(shí)這些就是我們所需要的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é)點(diǎn)信息 |
peer | pee節(jié)點(diǎn)信息 |
certificateAuthorities | ca節(jié)點(diǎn)信息 |
其中節(jié)點(diǎn)對象有4中角色定義 |角色 |描述| |--|--| |endorsingPeer| 具有背書權(quán)限節(jié)點(diǎn) |chaincodeQuery| 具有合約查詢權(quán)限節(jié)點(diǎn) |ledgerQuery|具有賬本查詢權(quán)限節(jié)點(diǎn) |eventSource| event hub節(jié)點(diǎn)
其中admin私鑰與admin簽名證書支持路徑與文件內(nèi)容,路徑使用參數(shù)path
,對應(yīng)值填寫路徑,文件內(nèi)容使用參數(shù)pem
,對應(yīng)值填寫私鑰或者證書內(nèi)容。
與排序節(jié)點(diǎn)類似,如果是tls必須配置tlsCACerts
與排序節(jié)點(diǎn)類似,如果是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初始化一個(gè)網(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); //放進(jìn)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)通道的智能合約對象
基于上一部分的智能合約,有一個(gè)addTen的交易,結(jié)果是對象加10
首先我們對合約對象a
當(dāng)前的值進(jìn)行查詢
//查詢合約對象evaluateTransaction byte[] queryAResultBefore = contract.evaluateTransaction("query","a"); System.out.println("交易前:"+new String(queryAResultBefore, StandardCharsets.UTF_8));
然后調(diào)用addTen
進(jìn)行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é)點(diǎn),這里選擇了通道中背書權(quán)限節(jié)點(diǎn)集合
交易完成后再次進(jìn)行查詢
//查詢合約對象evaluateTransaction byte[] queryAResultAfter = contract.evaluateTransaction("query","a"); System.out.println("交易后:"+new String(queryAResultAfter, StandardCharsets.UTF_8));
最后控制臺輸出:
交易成功。
以上是“如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。