VSCode使用IBM Blockchain Platform插件开发智能合约

阿留神 · · 1662 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

安装环境的版本:

ubuntu:16.04

Vscode: 1.41.1


1、安装IBM Blockchain Platform插件

在extensions下搜索IBM Blockchain Platform,目前插件仅支持Windows 10, Linux, Mac OS这三种操作系统。


2、安装插件依赖的工具包:(注意依赖工具的版本号要求)

node --version:v10.18.0

npm --version:6.13.4

docker --version:18.09.7

docker-compose -version:1.25.1

go version:1.13.5


3、智能合约的创建和调试

点击走侧栏IBM Blockchain Platform插件,在SMART CONTRACTS右边的...点击“Create New Project”,选择Go语言,目录,自动生成一个project,生成的chaincode.go主要代码如下:

// Chaincode is the definition of the chaincode structure.

type Chaincode struct {

}

// Init is called when the chaincode is instantiated by the blockchain network.

func (cc *Chaincode) Init(stub shim.ChaincodeStubInterface) sc.Response {

fcn, params := stub.GetFunctionAndParameters()

fmt.Println("Init()", fcn, params)

return shim.Success(nil)

}

// Invoke is called as a result of an application request to run the chaincode.

func (cc *Chaincode) Invoke(stub shim.ChaincodeStubInterface) sc.Response {

fcn, params := stub.GetFunctionAndParameters()

fmt.Println("Invoke()", fcn, params)

return shim.Success(nil)

}

在chaincode_test.go中进行run test或者debug test:

func TestInit(t *testing.T) {

cc := new(Chaincode)

stub := shim.NewMockStub("chaincode", cc)

res := stub.MockInit("1", [][]byte{[]byte("initFunc")})

if res.Status != shim.OK {

t.Error("Init failed", res.Status, res.Message)

}

}

func TestInvoke(t *testing.T) {

cc := new(Chaincode)

stub := shim.NewMockStub("chaincode", cc)

res := stub.MockInit("1", [][]byte{[]byte("initFunc")})

if res.Status != shim.OK {

t.Error("Init failed", res.Status, res.Message)

}

res = stub.MockInvoke("1", [][]byte{[]byte("invokeFunc")})

if res.Status != shim.OK {

t.Error("Invoke failed", res.Status, res.Message)

}

}

debug console打印:

API server listening at: 127.0.0.1:30704

Init() initFunc []

PASS


4、打包智能合约

智能合约需要被写入到Golang中,所以需要将智能合约的源码需要拷贝到GOPATH的src目录下,具体步骤:

mkdir $GOPATH/src/github.com/chaincode_test

cp chaincode/*go $GOPATH/src/github.com/chaincode_test/

拷贝完成后,在VSCode打开$GOPATH/src/github.com/chaincode_test/目录,点击走侧栏IBM Blockchain Platform插件,在SMART CONTRACTS右边的...点击“Package Open Project”,生成一个cds文件(Smart Contract packaged: /home/xxx/.fabric-vscode/packages/chaincode_test@1.0.cds)

可将cds文件导出。


5、将智能合同部署到预配置的 Hyperledger Fabric 网络

(1)使用以下步骤来部署预配置的网络:

确保 Docker 在计算机上运行。

在 VS Code 中打开 IBM Blockchain Platform 选项卡。

在 Fabric ENVIRONMENTS环境窗格中,单击Local Fabric。如果 Docker 正在运行,那么应该会下载并启动本地 Hyperledger Fabric 实例。

双击 Fabric GATEWAYS网关窗格中的Local Fabric 以连接到本地网络。缺省情况下,连接使用“Fabric 电子钱包”窗格中的管理员身份。可以通过右键单击 Fabric 环境窗格中的认证中心节点来创建新身份。然后,可以将此新身份添加到电子钱包并与本地 Fabric 连接相关联。

VS Code 扩展创建的是基本 Fabric 网络,其中包括一个排序节点、一个同级和一个认证中心。同级连接到名为 mychannel 的通道。可以在 Fabric 环境窗格中找到属于该网络的节点、组织和通道的列表。在这些节点上方,可以找到同级上已安装并在通道上实例化的智能合同的列表。

(2)停止、重新启动和除去预配置的网络

预配置的网络正在运行时,可以停止或重新启动该网络:

在 Fabric 环境窗格中,单击溢出菜单。

选择重新启动 Fabric 运行时或停止 Fabric 运行时以停止或重新启动容器。

还可以选择关闭 Fabric 运行时来完全除去本地 Fabric 网络。注:此除去操作将导致分类帐和全局状态数据丢失。

(3)将智能合同部署到预配置的网络

可以将智能合同窗格中的任何包部署到正在运行的预配置网络。

首先,需要在同级上安装智能合同:

在 Fabric 环境窗格中,Smart Contracts下的Installed单击+Install,安装智能合同。

选择要在其上安装智能合同的同级。

选择要安装的智能合同包,然后单击安装。

接下来,可以在通道上实例化智能合同:

在 Fabric 环境窗格中,单击实例化智能合同。

选择要实例化的已安装智能合同。

(可选)在智能合同中输入实例化函数的名称。如果使用的是缺省智能合同模板,那么不会使用实例化函数。

(可选)输入实例化函数所需的任何自变量。

(可选)如果智能合同使用了专用数据,请浏览至集合配置文件。

单击实例化。

实例化结果:Successfully instantiated smart contract

如果更改了智能合同代码,然后对其重新打包,那么可以升级实例化的智能合同,以将更新版本部署到网络:

确保要升级的智能合同已实例化。

将智能合同的新版本安装到同一网络上的同级。

右键单击实例化的智能合同,然后选择升级智能合同。

(可选)在实例化新智能合同后运行事务。


6、与智能合同进行交互

安装并实例化智能合同后,可以使用 Fabric GATEWAYS网关窗格向智能合同中的函数提交事务:

确保已安装并实例化智能合同,并且已连接到网络。

在 Fabric 网关窗格中,展开实例化的智能合同。

展开要与其进行交互的智能合同。您可以找到在智能合同下方列出的事务的列表。

右键单击要提交的事务,然后选择提交事务。例如,如果已创建并打包了示例债券智能合同,请单击 createBond。

输入事务需要的任何自变量,然后按 Enter 键。例如,输入 ["bond01","100"] 以创建第一个债券。


7、调试智能合同

可以使用调试视图在本地迭代性开发和调试智能合同,而不必在每次更改后都重新打包和升级智能合同。通过调试智能合同,可以利用断点和输出来逐步运行智能合同事务,从而确保事务按预期进行。

根据您使用的语言,您将需要安装一些必备软件:

如果要开发 Go 智能合同,请安装 Go 扩展。

如果要开发 Java 智能合同,请安装 Language Support for Java 扩展和 Debugger for Java 扩展。

如果要调试使用低级别编程模型编写的 Node(JavaScript 或 TypeScript)链代码,那么必须将 program 属性添加到 launch.json 中的启动配置,并提供调用 Shim.start 的文件的路径。例如:

{

    "type": "fabric:node",

    "request": "launch",

    "name": "Debug Smart Contract",

    "program": "${workspaceFolder}/dist/start.js"

}

其中,start.js 包含行 Shim.start(new Chaincode());。

使用以下步骤来调试智能合同:

确保已连接到本地 Fabric 网络。

在工作空间中打开智能合同项目。

在 VS Code 中,从左侧导航栏打开调试视图。

从左上角的下拉列表中选择调试智能合同配置。

单击启动按钮。扩展将自动打包、安装和实例化或升级本地网络上的智能合同。

如果要调试智能合同中的实例化函数,请使用以下示例编辑启动配置。

"env": {

    "CORE_CHAINCODE_ID_NAME": <name>:<version>

  }

name 是智能合同的名称。version 需要是与先前使用的版本不同的值。或者,如果使用的是 JavaScript 或 TypeScript,那么可以更新 package.json 文件中的 version。

通过单击智能合同文件中的相关行号,向智能合同添加断点。

在调试工具栏上,单击区块链按钮以实例化智能合同。

在调试工具栏上,单击区块链按钮以提交或评估事务。您还可以右键单击 Fabric 网关面板中的事务,以提交或评估这些事务。执行将在您定义的任何断点上暂停。

要在调试期间修改智能合同,请在对智能合同进行更改后单击重新启动按钮。重新启动调试意味着您无需再次实例化合同。


FAQ

1、编译IBM Blockchain Platform插件时,报错Failed to activate extension: Failed to execute command "npm" with arguments "rebuild, grpc, --target=6.1.5, --runtime=electron, --update-binary, --fallback-to-build, --target_arch=x64, --dist-url=https://atom.io/download/electron" return code 1

解决思路:在OUTPUT中查看具体的报错日志:Original error: Cannot find module '/home/liuyasen/.vscode/extensions/ibmblockchain.ibm-blockchain-platform-1.0.17/node_modules/grpc/src/node/extension_binary/electron-v6.1-linux-x64-glibc/grpc_node.node'

发现关于node下的grpc包安装不成功,给npm配置代理,重新执行编译IBM Blockchain Platform插件(或者新建一个node项目,用vscode执行一下,插件也会自动编译完成)。

npm配置代理:

在~/.npmrc文件里添加:

https-proxy=https://用户名:密码@proxy.com:80

http-proxy=http://用户名:密码@proxy.com:80

2、打包智能合约时,报错:The Go smart contract is not a subdirectory of the path specified by the environment variable GOPATH. Please correct the environment variable GOPATH.

解决思路:智能合约需要被写入到Golang中,所以需要将智能合约的源码需要拷贝到GOPATH的src目录下,具体步骤:

mkdir $GOPATH/src/github.com/chaincode_test

cp chaincode/*go $GOPATH/src/github.com/chaincode_test/

3、连接docker的镜像库报错:Error instantiating smart contract: error starting container: error starting container: Failed to generate platform-specific docker build: Failed to pull hyperledger/fabric-ccenv:1.4.4: API error (500): Get https://registry-1.docker.io/v2/: read tcp 10.43.147.60:45212->10.3.76.12:80: read: connection reset by peer

解决思路:配置docker代理,使其可以访问https://registry-1.docker.io/v2/地址。

参考链接:https://cloud.ibm.com/docs/services/blockchain?topic=blockchain-develop-vscode&locale=zh-cn#develop-vscode


有疑问加站长微信联系(非本文作者)

本文来自:简书

感谢作者:阿留神

查看原文:VSCode使用IBM Blockchain Platform插件开发智能合约

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1662 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传