文章目录
- 安装IBM Blockchain Platform extension for VS Code
- 创建一个智能合约项目
- 理解智能合约
- 打包智能合约
- Local Fabric Ops
- 安装智能合约
- 实例化智能合约
- 提交和查询事务
使用IBM Blockchain Platform extension开发你的第一个fabric智能合约
IBM Blockchain Platform extension是VSCode的一个插件,最新版本是v1.0.17。
该扩展支持Hyperledger Fabric和IBM Blockchain Platform的完整开发工作流程:
- 生成,编辑和打包智能合约
- 使用简单的预先配置的本地结构网络在本地部署和调试合同
- 连接到任何Fabric环境进行部署,包括IBM Blockchain Platform服务(在IBM Cloud上)或软件(本地和多云)
- 提交和评估交易,并开发客户应用程序
这个可谓是开发Fabric智能合约的神器,比之前的本地的自己搭环境不知道好哪去了。
那么有些小伙伴要问了,既然有这么好用的神器,有没有简单的介绍教程呢?
别急,下面就是。
安装IBM Blockchain Platform extension for VS Code
IBM Blockchain Platform extension是工作在VS Code上面的,VS Code是微软开源的编辑工具,也是一个非常好用的开发工具。
如果你已经有了VS Code,点击屏幕左侧边栏中的扩展程序。 在顶部,在扩展市场中搜索IBM Blockchain Platform。 单击安装,然后单击重新加载。那么就安装好了。
注意事项:
Fabric是在docker环境中运行的,智能合约现在可以用JavaScript, TypeScript, Java, Go 这四种语言来编写。所以你需要如下的环境:
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
创建一个智能合约项目
IBM Blockchain Platform extension可以使用你选择的Hyperledger Fabric支持的编程语言生成智能合约框架。里面已经包含了简单有用的智能合约。
在本例中,我们将使用TypeScript作为例子。
在左侧边栏中,单击IBM Blockchain Platform图标(它看起来像一个正方形,如果这是你安装的最新扩展,则可能位于图标集的底部)。
将鼠标悬停在SMART CONTRACT PACKAGES面板上,单击“…”菜单,然后从下拉列表中选择“创建智能合约项目”。
选择一种智能合约语言。 JavaScript,TypeScript,Java和Go都可用。就本教程而言,请选择TypeScript。
然后会询问你是否要在生成的合同中命名资产(默认是“ MyAsset”),当然你可以修改成自己想要的资产名字。
选择一个位置来保存项目。单击浏览,然后单击新建文件夹,然后根据需要命名项目(例如,“ blockchainExtProject”)。
单击创建,然后选择刚创建的新文件夹,然后单击保存。
最后,从选项列表中选择“添加到工作区”。
该扩展程序将根据你选择的语言和资产名称生成一个框架合同。完成后,你可以导航到“资源管理器”视图(最有可能在左侧栏中的顶部图标,看起来像“文档”图标)并打开src / my-asset-contract.ts文件以查看你的智能合约代码脚手架。
生成的文件应该如下图所示:
接下来,我们将看一下生成的智能合约到底是做什么的。
理解智能合约
生成的智能合约代码支架提供了一些常见的操作示例,可用于与区块链分类账上的数据进行交互。 其中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开头的行:这些是定义合同交易的函数-这些东西使你可以与分类账进行交互。