使用IBM Blockchain Platform extension开发你的第一个fabric智能合约docker
IBM Blockchain Platform extension是VSCode的一个插件,最新版本是v1.0.17。 typescript
该扩展支持Hyperledger Fabric和IBM Blockchain Platform的完整开发工做流程:npm
这个可谓是开发Fabric智能合约的神器,比以前的本地的本身搭环境不知道好哪去了。编程
那么有些小伙伴要问了,既然有这么好用的神器,有没有简单的介绍教程呢? api
别急,下面就是。数组
IBM Blockchain Platform extension是工做在VS Code上面的,VS Code是微软开源的编辑工具,也是一个很是好用的开发工具。网络
若是你已经有了VS Code,点击屏幕左侧边栏中的扩展程序。 在顶部,在扩展市场中搜索IBM Blockchain Platform。 单击安装,而后单击从新加载。那么就安装好了。框架
注意事项:Fabric是在docker环境中运行的,智能合约如今能够用JavaScript, TypeScript, Java, Go 这四种语言来编写。因此你须要以下的环境:async
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开头的行:这些是定义合同交易的函数-这些东西使你能够与分类帐进行交互。
咱们先看看createMyAsset函数:
@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()中的括号告诉你此函数会修改分类账的内容。
该函数称为createMyAsset,它接受myAssetId和一个值,二者均为字符串。 提交此事务后,将使用关键字myAssetId和值建立一个新资产。 例如,假设你要建立“ 001”,“my first asset”; 而后稍后,当你读取键001的值时,你会知道该特定状态的值是“my first asset”。
如今,看看下一个事务:
@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(false)开头-“ false”表示此函数一般不打算更改分类账的内容。 这样的事务,称为“查询”。如你所见,此函数仅采用myAssetId并返回键所指向的任何状态的值。
能够详细看下合同中的其余交易。 而后,你能够继续打包和部署该合同,从而来使用它。
如今,你已经建立了智能合约并了解其中的交易,是时候打包了。智能合约项目打包成.CDS文件,这是一种特殊类型的文件,能够安装在Hyperledger Fabric节点上。
在左侧边栏中,单击IBM Blockchain Platform图标。
将鼠标悬停在SMART CONTRACT PACKAGES面板上,单击“…”菜单,而后从下拉列表中选择“打包智能合约项目”。
若是一切顺利,你应该在列表中看到一个新程序包blockchainExtProject@0.0.1。
你刚建立的程序包能够安装到任何Hyperledger Fabric peer上(以正确的版本运行)。例如,你能够右键单击并选择“导出包”,而后使用IBM Blockchain Platform操做工具控制台将其部署到云环境中。如今,你将在VS Code扩展程序预配置的运行时本地部署程序包,所以如今无需导出程序包!
名为LOCAL FABRIC OPS的面板(在IBM Blockchain Platform视图中)使你能够在本地计算机上使用Docker操做简单的Hyperledger Fabric runtime。 最开始的时候Fabric应该是中止的:
Local Fabric runtime is stopped. Click to start.
单击该消息,扩展将开始为你扩展Docker容器。而后,你应该会看到消息“ Local Fabric运行时正在开始……”,当任务完成时,你将看到一组可扩展/可折叠部分,分别标记为“智能合约”,“通道”,“节点”和“组织。”
下面是他们的简单描述:
如今,你已经启动了本地Fabric运行时,如今该安装并实例化智能合约了……
在真实的网络中,每一个将支持交易的组织都将在其peer节点上安装智能合约,而后在通道上实例化该合约。 如今本地Fabric运行时只有一个组织(Org1),一个同级(peer0.org1.example.com)和一个通道(mychannel)。
所以,你只须要在该单个peer上安装合同,而后即可以在mychannel中实例化该合同。 方法以下:
你应该看到blockchainExtProject@0.0.1出如今智能合约>已安装列表下。
接下来,你将实例化智能合约…
在“本地FABRIC OPS”面板中,查找+实例化(在“智能合约”>“实例化”下),而后单击它。
系统会要求你选择一个channel。选择惟一的选项,mychannel。
而后,系统会要求你选择一个智能合约进行实例化。选择blockchainExtProject@0.0.1。
而后,系统将询问你要调用的函数。若是要在实例化过程当中使用特定功能,则能够在此处输入内容。如今只需按Enter便可跳过此步骤。
而后,系统会询问你是否要提供私有数据配置文件。对于本教程,只需单击“否”.
实例化可能比安装花费更长的时间-请注意成功消息,并在“智能合约”>“实例化”列表中显示blockchainExtProject@0.0.1,以确认它是否有效!
如今你的界面应该是这样的:
Fabric网关和Hyperledger Fabric网络的peer进行链接,客户端应用程序可使用该网关提交事务。当你在LOCAL FABRIC OPS中启动本地实例时,也会自动为你建立一个网关。你能够在FABRIC GATEWAYS下找到它,它称为“ local_fabric”。
要使用网关,你还须要用于在该网络上进行交易的身份。一样,对于本地Fabric运行时,已经为你设置了此时间。请注意,在FABRIC WALLETS下有一个名为local_fabric_wallet的钱包,其中包含一个名为admin的ID。若是将鼠标悬停在“ FABRIC GATEWAYS”面板中的“ local_fabric”上,你会看到它告诉你“关联的钱包:local_fabric_wallet”。
所以,你已经有了一个网关和一个带有单个身份的关联钱包,这意味着该网关可使用了。
单击local_fabric(在FABRIC GATEWAYS下)以经过此网关链接。
展开channel,而后展开mychannel和blockchainExtProject@0.0.1。你将看到智能合约中定义的全部交易的列表。
如今你须要建立资产。右键单击createMyAsset,而后选择Submit Transaction。系统将要求你提供交易参数:尝试[“ 001”,“my asset one”](或你喜欢的任何键和值,但请确保记住使用的键!)。
参数以JSON格式提交,所以请确保你彻底按照显示的方式输入输入内容,以便你根据此交易要求提交由2个字符串组成的数组。
接下来,以相似方式提交updateMyAsset。此次,为参数提供相同的键和不一样的值,例如[“ 001”,“my asset two”]。所以,如今分类账中的键001的值应该是“my asset two”。让咱们来检查一下……
readMyAsset用于读取而不是写入分类账,所以此次选择查询交易。输入[“ 001”](或任何你设置的键)做为参数。你应该在输出控制台中看到如下内容:
[SUCCESS] Returned value from readMyAsset: {"value":"my asset two"}
恭喜你,你已经完成了第一个智能合约!
更多教程请参考 flydean的博客