总目录:
(0) 如何利用区块链保护知识产权
(一)HyperLedger Fabric 2.0-release测试网络部署
(二)Fabric2.0 first-network 生成配置说明
(三)Fabric2.0启动网络脚本配置剖析
(四)Fabric2.0通道实践
(五)Fabric2.0 智能合约实践- 安装以及定义智能合约
(六)Fabric2.0 智能合约实践- 升级智能合约
(七)Fabric2.0智能合约实践-设置背书策略
(八)Fabric2.0Java SDK实践-合约交易
(九)Fabric2.0 通道实践-更新通道配置
(十)Fabric2.0-动态添加组织
(十一) Fabric2.0-使用编辑器调试go智能合约
(十二)Fabric2.0-实现外部构建启动合约
工具人大胆试探raft共识-你没见过的raft算法解释
由于智能合约的一般运行环境是在docker容器里面,因此在调试智能合约的代码逻辑上面可能不是那么的方便,特别是对于智能合约开发人员来说,因此下面将基于vscode编辑器演示如何调试go合约
系统工具 | 版本 |
---|---|
window | 10 |
go | 1.14 |
vscode | 1.42.1 |
在本地gopath创建mychaincode01/test目录,目录名称可自定义。
执行go mod init命令初始化go.mod 文件
我们先直接复制例子中的 abstore.go合约。
在 abstore.go同目录下,新建 abstore_test.go
引入以下依赖包:
import (
"fmt"
"testing"
"github.com/hyperledger/fabric-chaincode-go/shim"
"github.com/hyperledger/fabric-chaincode-go/shimtest"
)
我们主要使用shim以及shimtest去帮助我们模拟环境达到调试合约代码的效果,因此上面的包是最基本的引入。
编写测试查询状态方法如下:
func checkState(t *testing.T, stub *shimtest.MockStub, name string, value string) {
bytes := stub.State[name]
if bytes == nil {
fmt.Println("State", name, "failed to get value")
t.FailNow()
}
if string(bytes) != value {
fmt.Println("State value", name, "was not", value, "as expected")
t.FailNow()
}
}
编写测试init方法
func checkInit(t *testing.T, stub *shimtest.MockStub, args [][]byte) {
res := stub.MockInit("1", args)
if res.Status != shim.OK {
fmt.Println("Init failed", string(res.Message))
t.FailNow()
}
}
测试方法如下:
func TestExample02_Init(t *testing.T) {
scc := new(ABstore)
stub := shimtest.NewMockStub("ex02", scc)
// Init A=123 B=234
checkInit(t, stub, [][]byte{[]byte("init"), []byte("A"), []byte("123"), []byte("B"), []byte("234")})
checkState(t, stub, "A", "123")
checkState(t, stub, "B", "234")
}
运行前要进行go mod vendor
下载依赖,添加断点,运行调试
右边可以看到变量值
控制台debug console输出:
invoke调用MockInvoke
func checkInvoke(t *testing.T, stub *shimtest.MockStub, args [][]byte) {
res := stub.MockInvoke("1", args)
if res.Status != shim.OK {
fmt.Println("Invoke", args, "failed", string(res.Message))
t.FailNow()
}
}
编写测试代码
func TestExample02_Invoke(t *testing.T) {
scc := new(ABstore)
stub := shimtest.NewMockStub("ex02", scc)
// Init A=567 B=678
checkInit(t, stub, [][]byte{[]byte("init"), []byte("A"), []byte("567"), []byte("B"), []byte("678")})
// Invoke A->B for 123
checkInvoke(t, stub, [][]byte{[]byte("invoke"), []byte("A"), []byte("B"), []byte("123")})
checkQuery(t, stub, "A", "444")
checkQuery(t, stub, "B", "801")
// Invoke B->A for 234
checkInvoke(t, stub, [][]byte{[]byte("invoke"), []byte("B"), []byte("A"), []byte("234")})
checkQuery(t, stub, "A", "678")
checkQuery(t, stub, "B", "567")
checkQuery(t, stub, "A", "678")
checkQuery(t, stub, "B", "567")
}
调试过程与3.2.2一致