亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

HyperLeger Fabric開發(八)——HyperLeger Fabric鏈碼開發測試

發布時間:2020-10-19 07:34:53 來源:網絡 閱讀:875 作者:天山老妖S 欄目:軟件技術

HyperLeger Fabric開發(八)——HyperLeger Fabric鏈碼開發測試

一、鏈碼實例

SACC項目鏈碼實例如下:

package main

import (
   "fmt"

   "github.com/hyperledger/fabric/core/chaincode/shim"
   "github.com/hyperledger/fabric/protos/peer"
)

// SimpleAsset implements a simple chaincode to manage an asset
type SimpleAsset struct {
}

// Init方法在鏈碼實例化或鏈碼升級期間調用
func (t *SimpleAsset) Init(stub shim.ChaincodeStubInterface) peer.Response {
   // 從交易提案獲取參數
   args := stub.GetStringArgs()
   if len(args) != 2 {
      return shim.Error("Incorrect arguments. Expecting a key and a value")
   }

   // 存儲資產到賬本
   err := stub.PutState(args[0], []byte(args[1]))
   if err != nil {
      return shim.Error(fmt.Sprintf("Failed to create asset: %s", args[0]))
   }
   return shim.Success(nil)
}

// Invoke方法在鏈碼上執行每次交易時被調用 
func (t *SimpleAsset) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
   // 從交易提案提取參數
   fn, args := stub.GetFunctionAndParameters()

   var result string
   var err error
   if fn == "set" {
      result, err = set(stub, args)
   } else { // assume 'get' even if fn is nil
      result, err = get(stub, args)
   }
   if err != nil {
      return shim.Error(err.Error())
   }

   // Return the result as success payload
   return shim.Success([]byte(result))
}

// 在賬本上使用key-value設置資產,如果key存在,使用新的值更新
func set(stub shim.ChaincodeStubInterface, args []string) (string, error) {
   if len(args) != 2 {
      return "", fmt.Errorf("Incorrect arguments. Expecting a key and a value")
   }

   err := stub.PutState(args[0], []byte(args[1]))
   if err != nil {
      return "", fmt.Errorf("Failed to set asset: %s", args[0])
   }
   return args[1], nil
}

// 獲取指定資產key的值
func get(stub shim.ChaincodeStubInterface, args []string) (string, error) {
   if len(args) != 1 {
      return "", fmt.Errorf("Incorrect arguments. Expecting a key")
   }

   value, err := stub.GetState(args[0])
   if err != nil {
      return "", fmt.Errorf("Failed to get asset: %s with error: %s", args[0], err)
   }
   if value == nil {
      return "", fmt.Errorf("Asset not found: %s", args[0])
   }
   return string(value), nil
}

// 實例化期間在容器啟動鏈碼
func main() {
   if err := shim.Start(new(SimpleAsset)); err != nil {
      fmt.Printf("Error starting SimpleAsset chaincode: %s", err)
   }
}

二、鏈碼的單元測試

1、鏈碼的單元測試簡介

鏈碼開發完畢后,并不需要在區塊鏈環境中部署鏈碼才能進行調試,可以利用shim.MockStub來編寫單元測試代碼,直接在Go語言開發環境(無Fabric區塊鏈網絡的環境)中調試。

2、鏈碼測試代碼編寫

進入sacc目錄,新建一個編寫測試代碼的sacc_test.go文件

package main

import (
   "testing"
   "github.com/hyperledger/fabric/core/chaincode/shim"
   "fmt"
)

func TestSet(t *testing.T) {
   //模擬鏈碼部署
   scc := new(SimpleAsset)
   stub := shim.NewMockStub("SimpleAsset", scc)
   mockInit(t, stub, [][]byte{[]byte("user1"), []byte("0")})
   //調用鏈碼的交易方法
   invokeSet(t, stub, []string{"user1", "10000"})
   invokeSet(t, stub, []string{"user1", "1000"})
}

func mockInit(t *testing.T, stub *shim.MockStub, args [][]byte) {
   res := stub.MockInit("1", args)
   if res.Status != shim.OK {
      fmt.Println("Init failed", string(res.Message))
      t.FailNow()
   }
}

func invokeSet(t *testing.T, stub *shim.MockStub, args []string) {
   // invoke調用
   res := stub.MockInvoke("1", [][]byte{[]byte("set"), []byte(args[0]),[]byte(args[1])})
   fmt.Println("set(" + args[0]+","+ args[1]+")")
   if res.Status != shim.OK {
      fmt.Println("invoke set failed:", args[0], string(res.Message))
      t.FailNow()
   }
}

func TestGet(t *testing.T) {
   //模擬鏈碼部署
   scc := new(SimpleAsset)
   stub := shim.NewMockStub("SimpleAsset", scc)
   mockInit(t, stub, [][]byte{[]byte("user1"), []byte("10000")})
   //調用鏈碼
   invokeGet(t, stub, []string{"user1"})
}

func invokeGet(t *testing.T, stub *shim.MockStub, args []string) {
   // invoke調用
   res := stub.MockInvoke("1", [][]byte{[]byte("get"), []byte(args[0])})
   fmt.Println("get(" + args[0]+ ")" + "->" + string(res.Payload))
   if res.Status != shim.OK {
      fmt.Println("invoke get failed:", args[0], string(res.Message))
      t.FailNow()
   }
}

// output:
//=== RUN   TestSet
//set(user1,10000)
//set(user1,1000)
//--- PASS: TestSet (0.00s)
//=== RUN   TestGet
//get(user1)->10000
//--- PASS: TestGet (0.00s)
//PASS

3、進行單元測試

在鏈碼目錄sacc下執行單元測試
go test -v sacc_test.go sacc.go

三、鏈碼的開發環境測試

1、啟動鏈碼開發調試環境

打開終端T1,進入chaincode-docker-devmode目錄,啟動Fabric網絡:
docker-compose -f docker-compose-simple.yaml up

2、編譯并啟動鏈碼

打開終端T2,進入chaincode容器
docker exec -it chaincode bash
進入SACC(簡單資產鏈碼)項目目錄:
cd sacc
編譯鏈碼:
go build -o sacc
啟動鏈碼:
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=sacc:0 ./sacc

3、操作鏈碼

打開終端T3,進入客戶端cli容器:
docker exec -it cli bash
安裝鏈碼:
peer chaincode install -p chaincodedev/chaincode/sacc -n sacc -v 0
安裝成功打印信息:Installed remotely response:<status:200 payload:"OK"
實例化鏈碼:
peer chaincode instantiate -n sacc -v 0 -c '{"Args":["user1","100"]}' -C myc
通道名稱必須是myc(創世區塊和配置交易的文件名稱為myc),否則將報錯信息:
Error: error getting channel (testchannel) orderer endpoint: error bad proposal response 500: access denied for [GetConfigBlock][testchannel]: Failed to get policy manager for channel [testchannel]
調用鏈碼,設置用戶user1的賬戶余額:
peer chaincode invoke -n sacc -c '{"Args":["set", "user1", "1000"]}' -C myc
查詢用戶user1的余額:
peer chaincode query -n sacc -c '{"Args":["get","user1"]}' -C myc

4、打包鏈碼

通過將鏈碼相關數據進行封裝, 可以實現對其進行打包和簽名操作。
打包鏈碼:
peer chaincode package -n sacc -p chaincodedev/chaincode/sacc -v 0 -s -S -i "AND('OrgA.admin')" ccpack.out
-s: 創建角色支持的CC部署規范包, 而不是原始的CC部署規范
-S: 如果創建CC部署規范方案角色支持,也與本地MSP簽名
-i: 指定實例化策略
打包后的文件, 可以直接用于install操作:
peer chaincode install ccpack.out
對一個打包文件進行簽名操作(添加當前MSP簽名到簽名列表中)
peer chaincode signpackage ccpack.out signedccpack.out

5、升級鏈碼

退出cli容器,停止chaincode容器。
在終端T2中重新進入chaincode容器:
docker exec -it chaincode bash
進入SACC項目:
cd sacc
編譯鏈碼:
go build -o sacc
啟動鏈碼:
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=sacc:1 ./sacc
將鏈碼sacc從版本0升級為版本1
打開終端T3,進入cli容器:
docker exec -it cli bash
安裝鏈碼:
peer chaincode install -p chaincodedev/chaincode/sacc -n sacc -v 1
升級鏈碼:
peer chaincode upgrade -n sacc -v 1 -c '{"Args":["user1", "10000"]}' -C myc
在對某鏈碼代碼升級前,推薦先將所有該鏈碼的容器停止,并從Peer上備份并移除舊鏈碼部署文件,然后先在個別Peer節點上部署新鏈碼,對原有數據進行測試,成功后再在其它節點上進行升級操作
查詢用戶user1的賬戶余額:
peer chaincode query -n sacc -c '{"Args":["get","user1"]}' -C myc

6、關閉Fabric網絡

刪除所有在運行的容器:
docker rm -f $(docker ps -aq)
清理Faric網絡緩存:
docker network prune

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

明水县| 华容县| 萨迦县| 交城县| 天津市| 涞水县| 池州市| 东光县| 金秀| 湾仔区| 中江县| 平湖市| 云和县| 得荣县| 镇赉县| 松江区| 革吉县| 泰和县| 泾阳县| 阿拉善右旗| 车致| 新乡县| 南充市| 太保市| 龙海市| 博白县| 施秉县| 务川| 两当县| 西盟| 万全县| 古浪县| 安塞县| 阳朔县| 湘阴县| 寿宁县| 茶陵县| 江山市| 历史| 叙永县| 吴江市|