溫馨提示×

溫馨提示×

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

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

如何使用IBM Blockchain Platform extension開發(fā)一個(gè)fabric智能合約

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

小編給大家分享一下如何使用IBM Blockchain Platform extension開發(fā)一個(gè)fabric智能合約,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

IBM Blockchain Platform extension是VSCode的一個(gè)插件,最新版本是v1.0.17。

該擴(kuò)展支持Hyperledger Fabric和IBM Blockchain Platform的完整開發(fā)工作流程:

  • 生成,編輯和打包智能合約

  • 使用簡單的預(yù)先配置的本地結(jié)構(gòu)網(wǎng)絡(luò)在本地部署和調(diào)試合同

  • 連接到任何Fabric環(huán)境進(jìn)行部署,包括IBM Blockchain Platform服務(wù)(在IBM Cloud上)或軟件(本地和多云)

  • 提交和評估交易,并開發(fā)客戶應(yīng)用程序

這個(gè)可謂是開發(fā)Fabric智能合約的神器,比之前的本地的自己搭環(huán)境不知道好哪去了。

那么有些小伙伴要問了,既然有這么好用的神器,有沒有簡單的介紹教程呢?

別急,下面就是。

安裝IBM Blockchain Platform extension for VS Code

IBM Blockchain Platform extension是工作在VS Code上面的,VS Code是微軟開源的編輯工具,也是一個(gè)非常好用的開發(fā)工具。

如果你已經(jīng)有了VS Code,點(diǎn)擊屏幕左側(cè)邊欄中的擴(kuò)展程序。 在頂部,在擴(kuò)展市場中搜索IBM Blockchain Platform。 單擊安裝,然后單擊重新加載。那么就安裝好了。

注意事項(xiàng):

Fabric是在docker環(huán)境中運(yùn)行的,智能合約現(xiàn)在可以用JavaScript, TypeScript, Java, Go 這四種語言來編寫。所以你需要如下的環(huán)境:

VS Code version 1.32 or greater
Node v8.x or greater and npm v5.x or greater
Docker version v17.06.2-ce or greater
Docker Compose v1.14.0 or greater

創(chuàng)建一個(gè)智能合約項(xiàng)目

IBM Blockchain Platform extension可以使用你選擇的Hyperledger Fabric支持的編程語言生成智能合約框架。里面已經(jīng)包含了簡單有用的智能合約。

在本例中,我們將使用TypeScript作為例子。

在左側(cè)邊欄中,單擊IBM Blockchain Platform圖標(biāo)(它看起來像一個(gè)正方形,如果這是你安裝的最新擴(kuò)展,則可能位于圖標(biāo)集的底部)。

將鼠標(biāo)懸停在SMART CONTRACT PACKAGES面板上,單擊“…”菜單,然后從下拉列表中選擇“創(chuàng)建智能合約項(xiàng)目”。

選擇一種智能合約語言。 JavaScript,TypeScript,Java和Go都可用。就本教程而言,請選擇TypeScript。

然后會詢問你是否要在生成的合同中命名資產(chǎn)(默認(rèn)是“ MyAsset”),當(dāng)然你可以修改成自己想要的資產(chǎn)名字。

選擇一個(gè)位置來保存項(xiàng)目。單擊瀏覽,然后單擊新建文件夾,然后根據(jù)需要命名項(xiàng)目(例如,“ blockchainExtProject”)。

單擊創(chuàng)建,然后選擇剛創(chuàng)建的新文件夾,然后單擊保存。

最后,從選項(xiàng)列表中選擇“添加到工作區(qū)”。

該擴(kuò)展程序?qū)⒏鶕?jù)你選擇的語言和資產(chǎn)名稱生成一個(gè)框架合同。完成后,你可以導(dǎo)航到“資源管理器”視圖(最有可能在左側(cè)欄中的頂部圖標(biāo),看起來像“文檔”圖標(biāo))并打開src / my-asset-contract.ts文件以查看你的智能合約代碼腳手架。

生成的文件應(yīng)該如下圖所示:

如何使用IBM Blockchain Platform extension開發(fā)一個(gè)fabric智能合約

接下來,我們將看一下生成的智能合約到底是做什么的。

理解智能合約

生成的智能合約代碼支架提供了一些常見的操作示例,可用于與區(qū)塊鏈分類賬上的數(shù)據(jù)進(jìn)行交互。 其中my-asset-contract.ts就是生成的智能合約代碼。

/*
 * SPDX-License-Identifier: Apache-2.0
 */

import { Context, Contract, Info, Returns, Transaction } from 'fabric-contract-api';
import { MyAsset } from './my-asset';

@Info({title: 'MyAssetContract', description: 'My Smart Contract' })
export class MyAssetContract extends Contract {

    @Transaction(false)
    @Returns('boolean')
    public async myAssetExists(ctx: Context, myAssetId: string): Promise<boolean> {
        const buffer = await ctx.stub.getState(myAssetId);
        return (!!buffer && buffer.length > 0);
    }

    @Transaction()
    public async createMyAsset(ctx: Context, myAssetId: string, value: string): Promise<void> {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (exists) {
            throw new Error(`The my asset ${myAssetId} already exists`);
        }
        const myAsset = new MyAsset();
        myAsset.value = value;
        const buffer = Buffer.from(JSON.stringify(myAsset));
        await ctx.stub.putState(myAssetId, buffer);
    }

    @Transaction(false)
    @Returns('MyAsset')
    public async readMyAsset(ctx: Context, myAssetId: string): Promise<MyAsset> {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        const buffer = await ctx.stub.getState(myAssetId);
        const myAsset = JSON.parse(buffer.toString()) as MyAsset;
        return myAsset;
    }

    @Transaction()
    public async updateMyAsset(ctx: Context, myAssetId: string, newValue: string): Promise<void> {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        const myAsset = new MyAsset();
        myAsset.value = newValue;
        const buffer = Buffer.from(JSON.stringify(myAsset));
        await ctx.stub.putState(myAssetId, buffer);
    }

    @Transaction()
    public async deleteMyAsset(ctx: Context, myAssetId: string): Promise<void> {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        await ctx.stub.deleteState(myAssetId);
    }

}

請注意以@Transaction開頭的行:這些是定義合同交易的函數(shù)-這些東西使你可以與分類賬進(jìn)行交互。

我們先看看createMyAsset函數(shù):

@Transaction()
    public async createMyAsset(ctx: Context, myAssetId: string, value: string): Promise<void> {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (exists) {
            throw new Error(`The my asset ${myAssetId} already exists`);
        }
        const myAsset = new MyAsset();
        myAsset.value = value;
        const buffer = Buffer.from(JSON.stringify(myAsset));
        await ctx.stub.putState(myAssetId, buffer);
    }

@Transaction()中的括號告訴你此函數(shù)會修改分類帳的內(nèi)容。

該函數(shù)稱為createMyAsset,它接受myAssetId和一個(gè)值,兩者均為字符串。 提交此事務(wù)后,將使用關(guān)鍵字myAssetId和值創(chuàng)建一個(gè)新資產(chǎn)。 例如,假設(shè)你要?jiǎng)?chuàng)建“ 001”,“my first asset”; 然后稍后,當(dāng)你讀取鍵001的值時(shí),你會知道該特定狀態(tài)的值是“my first asset”。

現(xiàn)在,看看下一個(gè)事務(wù):

@Transaction(false)
    @Returns('MyAsset')
    public async readMyAsset(ctx: Context, myAssetId: string): Promise<MyAsset> {
        const exists = await this.myAssetExists(ctx, myAssetId);
        if (!exists) {
            throw new Error(`The my asset ${myAssetId} does not exist`);
        }
        const buffer = await ctx.stub.getState(myAssetId);
        const myAsset = JSON.parse(buffer.toString()) as MyAsset;
        return myAsset;
    }

這個(gè)以@Transaction(false)開頭-“ false”表示此函數(shù)通常不打算更改分類帳的內(nèi)容。 這樣的事務(wù),稱為“查詢”。如你所見,此函數(shù)僅采用myAssetId并返回鍵所指向的任何狀態(tài)的值。

可以詳細(xì)看下合同中的其他交易。 然后,你可以繼續(xù)打包和部署該合同,從而來使用它。

打包智能合約

現(xiàn)在,你已經(jīng)創(chuàng)建了智能合約并了解其中的交易,是時(shí)候打包了。智能合約項(xiàng)目打包成.CDS文件,這是一種特殊類型的文件,可以安裝在Hyperledger Fabric節(jié)點(diǎn)上。

在左側(cè)邊欄中,單擊IBM Blockchain Platform圖標(biāo)。

將鼠標(biāo)懸停在SMART CONTRACT PACKAGES面板上,單擊“…”菜單,然后從下拉列表中選擇“打包智能合約項(xiàng)目”。

如果一切順利,你應(yīng)該在列表中看到一個(gè)新程序包blockchainExtProject@0.0.1。

你剛創(chuàng)建的程序包可以安裝到任何Hyperledger Fabric peer上(以正確的版本運(yùn)行)。例如,你可以右鍵單擊并選擇“導(dǎo)出包”,然后使用IBM Blockchain Platform操作工具控制臺將其部署到云環(huán)境中?,F(xiàn)在,你將在VS Code擴(kuò)展程序預(yù)配置的運(yùn)行時(shí)本地部署程序包,因此現(xiàn)在無需導(dǎo)出程序包!

Local Fabric Ops

名為LOCAL FABRIC OPS的面板(在IBM Blockchain Platform視圖中)使你可以在本地計(jì)算機(jī)上使用Docker操作簡單的Hyperledger Fabric runtime。 最開始的時(shí)候Fabric應(yīng)該是停止的:

Local Fabric runtime is stopped. Click to start.

單擊該消息,擴(kuò)展將開始為你擴(kuò)展Docker容器。然后,你應(yīng)該會看到消息“ Local Fabric運(yùn)行時(shí)正在開始……”,當(dāng)任務(wù)完成時(shí),你將看到一組可擴(kuò)展/可折疊部分,分別標(biāo)記為“智能合約”,“通道”,“節(jié)點(diǎn)”和“組織?!?/p>

下面是他們的簡單描述:

  • “智能合約”部分向你顯示此網(wǎng)絡(luò)上的實(shí)例化和已安裝合約。本教程的接下來的兩個(gè)步驟將向你展示如何安裝并實(shí)例化打包的智能合約。

  • 在通道下有一個(gè)稱為“ mychannel”的通道。為了使用智能合約,必須在一個(gè)通道上實(shí)例化它。

  • “節(jié)點(diǎn)”部分包含一個(gè)對等節(jié)點(diǎn)(peer0.org1.example.com)。命名遵循Hyperledger Fabric約定,你可以從“ org1”部分看到此peer歸Org1所有。

  • 還有一個(gè)證書頒發(fā)機(jī)構(gòu)(CA)ca.org1.example.com和一個(gè)order節(jié)點(diǎn)orderer.example.com。

  • 在這個(gè)簡單的區(qū)塊鏈網(wǎng)絡(luò)中只有一個(gè)組織稱為“ Org1”。只有一個(gè)組織的網(wǎng)絡(luò)在現(xiàn)實(shí)世界中使用并不是很現(xiàn)實(shí),因?yàn)橹攸c(diǎn)是要在多個(gè)組織之間共享一個(gè)分類帳,但對于本地開發(fā)目的來說已經(jīng)足夠了。在“組織”下,你將看到Org1MSP:這是Org1的MSP ID。

現(xiàn)在,你已經(jīng)啟動(dòng)了本地Fabric運(yùn)行時(shí),現(xiàn)在該安裝并實(shí)例化智能合約了……

安裝智能合約

在真實(shí)的網(wǎng)絡(luò)中,每個(gè)將支持交易的組織都將在其peer節(jié)點(diǎn)上安裝智能合約,然后在通道上實(shí)例化該合約。 現(xiàn)在本地Fabric運(yùn)行時(shí)只有一個(gè)組織(Org1),一個(gè)同級(peer0.org1.example.com)和一個(gè)通道(mychannel)。

因此,你只需要在該單個(gè)peer上安裝合同,然后便可以在mychannel中實(shí)例化該合同。 方法如下:

  1. 在“本地FABRIC OPS”面板中,找到“ +安裝”(在“智能合約”>“已安裝”下),然后單擊它。

  2. 系統(tǒng)會要求你選擇一個(gè)節(jié)點(diǎn)。 選擇唯一的選項(xiàng)peer0.org1.example.com。

  3. 然后,系統(tǒng)會要求你選擇要安裝的軟件包。 blockchainExtProject@0.0.1。

你應(yīng)該看到blockchainExtProject@0.0.1出現(xiàn)在智能合約>已安裝列表下。

接下來,你將實(shí)例化智能合約…

實(shí)例化智能合約

在“本地FABRIC OPS”面板中,查找+實(shí)例化(在“智能合約”>“實(shí)例化”下),然后單擊它。

系統(tǒng)會要求你選擇一個(gè)channel。選擇唯一的選項(xiàng),mychannel。

然后,系統(tǒng)會要求你選擇一個(gè)智能合約進(jìn)行實(shí)例化。選擇blockchainExtProject@0.0.1。

然后,系統(tǒng)將詢問你要調(diào)用的函數(shù)。如果要在實(shí)例化過程中使用特定功能,則可以在此處輸入內(nèi)容?,F(xiàn)在只需按Enter即可跳過此步驟。

然后,系統(tǒng)會詢問你是否要提供私有數(shù)據(jù)配置文件。對于本教程,只需單擊“否”.

實(shí)例化可能比安裝花費(fèi)更長的時(shí)間-請注意成功消息,并在“智能合約”>“實(shí)例化”列表中顯示blockchainExtProject@0.0.1,以確認(rèn)它是否有效!

現(xiàn)在你的界面應(yīng)該是這樣的:

如何使用IBM Blockchain Platform extension開發(fā)一個(gè)fabric智能合約

提交和查詢事務(wù)

Fabric網(wǎng)關(guān)和Hyperledger Fabric網(wǎng)絡(luò)的peer進(jìn)行連接,客戶端應(yīng)用程序可以使用該網(wǎng)關(guān)提交事務(wù)。當(dāng)你在LOCAL FABRIC OPS中啟動(dòng)本地實(shí)例時(shí),也會自動(dòng)為你創(chuàng)建一個(gè)網(wǎng)關(guān)。你可以在FABRIC GATEWAYS下找到它,它稱為“ local_fabric”。

要使用網(wǎng)關(guān),你還需要用于在該網(wǎng)絡(luò)上進(jìn)行交易的身份。同樣,對于本地Fabric運(yùn)行時(shí),已經(jīng)為你設(shè)置了此時(shí)間。請注意,在FABRIC WALLETS下有一個(gè)名為local_fabric_wallet的錢包,其中包含一個(gè)名為admin的ID。如果將鼠標(biāo)懸停在“ FABRIC GATEWAYS”面板中的“ local_fabric”上,你會看到它告訴你“關(guān)聯(lián)的錢包:local_fabric_wallet”。

因此,你已經(jīng)有了一個(gè)網(wǎng)關(guān)和一個(gè)帶有單個(gè)身份的關(guān)聯(lián)錢包,這意味著該網(wǎng)關(guān)可以使用了。

單擊local_fabric(在FABRIC GATEWAYS下)以通過此網(wǎng)關(guān)連接。

展開channel,然后展開mychannel和blockchainExtProject@0.0.1。你將看到智能合約中定義的所有交易的列表。

現(xiàn)在你需要?jiǎng)?chuàng)建資產(chǎn)。右鍵單擊createMyAsset,然后選擇Submit Transaction。系統(tǒng)將要求你提供交易參數(shù):嘗試[“ 001”,“my asset one”](或你喜歡的任何鍵和值,但請確保記住使用的鍵!)。

參數(shù)以JSON格式提交,因此請確保你完全按照顯示的方式輸入輸入內(nèi)容,以便你根據(jù)此交易要求提交由2個(gè)字符串組成的數(shù)組。

接下來,以類似方式提交updateMyAsset。這次,為參數(shù)提供相同的鍵和不同的值,例如[“ 001”,“my asset two”]。因此,現(xiàn)在分類帳中的鍵001的值應(yīng)該是“my asset two”。讓我們來檢查一下……

readMyAsset用于讀取而不是寫入分類帳,因此這次選擇查詢交易。輸入[“ 001”](或任何你設(shè)置的鍵)作為參數(shù)。你應(yīng)該在輸出控制臺中看到以下內(nèi)容:

[SUCCESS] Returned value from readMyAsset: {"value":"my asset two"}

恭喜你,你已經(jīng)完成了第一個(gè)智能合約!

以上是“如何使用IBM Blockchain Platform extension開發(fā)一個(gè)fabric智能合約”這篇文章的所有內(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