使用IBM Blockchain Platform extension开发你的第一个fabric智能合约(一)

简介: 使用IBM Blockchain Platform extension开发你的第一个fabric智能合约(一)

文章目录



使用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文件以查看你的智能合约代码脚手架。


生成的文件应该如下图所示:


image.png


接下来,我们将看一下生成的智能合约到底是做什么的。


理解智能合约


生成的智能合约代码支架提供了一些常见的操作示例,可用于与区块链分类账上的数据进行交互。 其中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开头的行:这些是定义合同交易的函数-这些东西使你可以与分类账进行交互。


相关文章
|
6月前
|
存储 JSON 安全
Hyperledger fabric智能合约编写(一)
本篇文章主要对链码编写的主要思路和部分API进行梳理。
|
存储 JSON JavaScript
fabric.js开发图片编辑器可以实现哪些功能?多图
使用fabric.js开发了图片编辑器,用文字加动图的形式直观的分享出来,帮助做功能参考,项目已开源。
fabric.js开发图片编辑器可以实现哪些功能?多图
在IBM Cloud中运行Fabric (二)
在IBM Cloud中运行Fabric (二)
在IBM Cloud中运行Fabric (二)
|
Kubernetes 区块链 数据安全/隐私保护
在IBM Cloud中运行Fabric (一)
在IBM Cloud中运行Fabric (一)
在IBM Cloud中运行Fabric (一)
|
JSON 区块链 数据格式
使用IBM Blockchain Platform extension开发你的第一个fabric智能合约 (二)
使用IBM Blockchain Platform extension开发你的第一个fabric智能合约 (二)
使用IBM Blockchain Platform extension开发你的第一个fabric智能合约 (二)
|
11月前
|
开发工具
IBM Watson提供的认知计算服务介绍
IBM Watson提供的认知计算服务介绍
|
传感器 人工智能 自然语言处理
IBM Watson 持续扩张,认知计算正悄然改变我们的生活
在去年 IBM 发布的一则很有创意的广告中,Watson 用 IBM 最新的认知计算机咨询单元与 Bob Dylan 聊了半分钟。Watson 说它每秒能读 8 亿页,并识别出 Dylan 作品中常用的主题,比如时间流逝和爱情消逝。
295 0
|
物联网 区块链 网络架构
带你读《基于区块链的物联网项目开发》之一:了解物联网并在IBM Watson物联网平台上开发
本书首先概述当前业务场景中的物联网概念,帮助读者在IBM Watson物联网平台上开发自己的设备,并使用Watson和Intel Edison创建物联网解决方案。之后介绍如何利用Hyperledger框架开发区块链网络,以及如何创建自己的集成区块链和物联网解决方案。接下来的章节讲述了如何在IBM Cloud平台利用物联网来实现端到端的区块链解决方案。最后,你将掌握如何将物联网和区块链技术融合,利用实践和驱动程序来开发实用集成解决方案。
|
人工智能
IBM Watson被曝给出错误癌症治疗建议,是悲剧还是误会?丨科技云·视角
曾经是公众心目中“人工智能”代名词的IBM Watson,在近4年砸下几百亿美元的研发投入后,前景反而愈发暗淡。医生抱怨Watson给出错误判断,多家医院终止了与Watson肿瘤相关项目,Watson真的能治病吗? 近日,外媒Stat News爆出了IBM的一份内部文件,其中提及Watson计算机经常给出错误的癌症治疗建议,比如给一个已经大出血的癌症病人开了有可能会导致出血的药。
9327 0
|
人工智能
IBM Watson健康部门裁员:花重金收购的医疗科技公司成重灾区
消息人士称,IBM Watson Health正在裁员50%至70%,之前收购的三家医疗科技公司的员工成为这次裁员的重灾区。同时,AI医疗行业数据不完整、隐私等问题,以及巨头之间的竞争,都给IBM Watson Health造成了压力。
1679 0

热门文章

最新文章