總目錄:
(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進行調試確實是比較方便實際,不需要去另外部署容器,比較推薦。