(十一) Fabric2.0-使用編輯器調試go智能合約

總目錄:
(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合約

1. 環境準備

系統工具 版本
window 10
go 1.14
vscode 1.42.1

1.1 下載vscode go插件

打開vscode的插件管理,下載go插件如下:
在這裏插入圖片描述

2.編輯合約

2.1 創建合約

在本地gopath創建mychaincode01/test目錄,目錄名稱可自定義。
執行go mod init命令初始化go.mod 文件

2.1 編輯合約內容

我們先直接複製例子中的 abstore.go合約。

3. 編寫合約測試代碼

3.1 新建測試文件

在 abstore.go同目錄下,新建 abstore_test.go

引入以下依賴包:

import (
	"fmt"
	"testing"

	"github.com/hyperledger/fabric-chaincode-go/shim"
	"github.com/hyperledger/fabric-chaincode-go/shimtest"
)

我們主要使用shim以及shimtest去幫助我們模擬環境達到調試合約代碼的效果,因此上面的包是最基本的引入。

3.2 編寫測試內容並進行測試

3.2.1 state 查詢狀態

編寫測試查詢狀態方法如下:

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()
	}
}

3.2.2 init 初始化

編寫測試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輸出:

在這裏插入圖片描述
看到Pass成功即測試通過。

3.2.3 invoke交易

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一致

4.總結

項目總體目錄如下
在這裏插入圖片描述
通過shim包提供的mock進行調試確實是比較方便實際,不需要去另外部署容器,比較推薦。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章