安装环境的版本:
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
有疑问加站长微信联系(非本文作者)