溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易

發(fā)布時(shí)間:2021-12-29 09:12:58 來源:億速云 閱讀:266 作者:小新 欄目:互聯(lián)網(wǎng)科技

這篇文章主要為大家展示了“如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易”這篇文章吧。

1.Gateway

在進(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)如下: 如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易

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)部和組織之間相互共識交互。

2.環(huán)境準(zhǔn)備

系統(tǒng)工具版本備注
Window10
Fabric2.0已部署好mychannel通道以及mycc合約到兩個(gè)組織節(jié)點(diǎn)
Java1.8
Maven3.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

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)建connectionProfile

connectionProfile用于創(chuàng)建一個(gè)連接網(wǎng)絡(luò)對象,如果有跑過first-network的朋友,相比記得一個(gè)ccp.sh的命令,生成的connection-org1.json、connection-org1.yaml這種文件,其實(shí)這些就是我們所需要的connectionProfile,可以直接使用。當(dāng)然也可以自行編寫,自行編寫請參考官方模板

4.1 配置文件結(jié)構(gòu)說明

整體connectionProfile結(jié)構(gòu)如下 如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易 包含對象說明:

參數(shù)名描述
name自定義網(wǎng)絡(luò)名稱
version自定義網(wǎng)絡(luò)版本
client客戶端相關(guān)信息
channels網(wǎng)絡(luò)所包含的通道信息
organizations網(wǎng)絡(luò)中組織信息
orderers排序節(jié)點(diǎn)信息
peerpee節(jié)點(diǎn)信息
certificateAuthoritiesca節(jié)點(diǎn)信息
4.1.1 client

如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易

4.1.2 channels

如何使用Fabric2.0 Java SDK實(shí)現(xià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)

4.1.3 organizations

如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易

其中admin私鑰與admin簽名證書支持路徑與文件內(nèi)容,路徑使用參數(shù)path,對應(yīng)值填寫路徑,文件內(nèi)容使用參數(shù)pem,對應(yīng)值填寫私鑰或者證書內(nèi)容。

4.1.4 orderers

如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易

4.1.5 peer

與排序節(jié)點(diǎn)類似,如果是tls必須配置tlsCACerts 如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易

4.1.6 certificateAuthorities

與排序節(jié)點(diǎn)類似,如果是tls必須配置tlsCACerts

如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易

5. JAVA工程目錄說明

新建的工程目錄如下 如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易

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用戶對象。

          //使用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私鑰,證書。

6.2 創(chuàng)建網(wǎng)關(guān)

通過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文件路徑

6.3 連接網(wǎng)關(guān)

           //連接網(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)通道的智能合約對象

6.4 交易

基于上一部分的智能合約,有一個(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)合約交易

交易成功。

以上是“如何使用Fabric2.0 Java SDK實(shí)現(xiàn)合約交易”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問一下細(xì)節(jié)

免責(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)容。

AI