Fabric--简单的资产Chaincode
簡單的資產Chaincode
應用程序是一個基本樣本鏈代碼,用于在分類賬上創建資產
安裝Go及Docker, Docker-compose, 并配置Go相應的環境變量
創建目錄
為chaincode應用程序創建一個目錄作為其子目錄
$ mkdir -p $GOPATH/src/test $ cd $GOPATH/src/test新建文件
新建一個文件,用于編寫Go代碼
$ touch test.go $ vim test.go編寫代碼
必須實現 Chaincode接口的Init和Invoke函數。因此,須在文件中添加go import語句以獲取鏈代碼的依賴。
導入chaincode shim包和 peer protobuf包。然后添加一個結構SimpleChaincdoe作為Chaincode函數的接收器
package mainimport ("fmt""github.com/hyperledger/fabric/core/chaincode/shim""github.com/hyperledger/fabric/protos/peer" )type SimpleChaincdoe struct { }初始化Chaincode
Init方法
- 獲取參數, 使用GetStringArgs 函數檢索調用 的參數
- 檢查合法性, 檢查參數數量是否為2個, 如果不是, 則返回錯誤信息
- 利用兩參數, 調用PutState方法向賬本中寫入狀態, 如果有錯誤則返回(shim.Error()), 否則返回nil(shim.Success)
調用實現
Invoke方法
驗證函數名稱為set或get,并調用那些鏈式代碼應用程序函數,通過shim.Success或shim.Error函數返回響應
- 獲取函數名與參數
- 對獲取到的參數名稱進行判斷, 如果為set, 則調用set方法, 反之調用get
- set/get函數返回兩個值(result, err)
- 如果err不為空則返回錯誤
- err為空則返回[]byte(result)
實現Chaincode應用
chaincode應用程序實現了兩個可以通過Invoke函數調用的函數(set/get)
為了訪問分類賬的狀態,利用 chaincode shim API 的ChaincodeStubInterface.PutState 和ChaincodeStubInterface.GetState函數
set函數, 返回兩個值
- 檢查參數個數是否為2
- 利用PutState方法將狀態寫入
- 如果成功,則返回要寫入的狀態, 失敗返回錯誤: fmt.Errorf(“…”)
get函數, 返回兩個值
- 接收參數并判斷個數 是否為1個
- 調用GetState方法返回并接收兩個返回值(value, err)
- 判斷err及value是否為空 return “”, fmt.Errorf(“……”)
- 返回值 return string(value), nil
main方法
func main() {if err := shim.Start(new(SimpleChaincdoe)); err != nil {fmt.Printf("Error starting SimpleAsset chaincode: %s", err)} }構建Chaincode
編譯chaincode
$ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim $ go build --tags nopkcs11使用開發模式測試
正常情況下chaincode由對等體啟動和維護。然而,在“開發模式”下,鏈碼由用戶構建并啟動
如果沒有安裝Hyperledger Fabric Samples請先安裝
如果沒有下載Docker images請先下載
跳轉至fabric-samples的chaincode-docker-devmode目錄
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/使用docker images查看Docker鏡像信息(顯示本地Docker Registry)
$ sudo docker images會看到如下輸出
REPOSITORY TAG IMAGE ID CREATED SIZE hyperledger/fabric-tools latest b7bfddf508bc About an hour ago 1.46GB hyperledger/fabric-tools x86_64-1.1.0 b7bfddf508bc About an hour ago 1.46GB hyperledger/fabric-orderer latest ce0c810df36a About an hour ago 180MB hyperledger/fabric-orderer x86_64-1.1.0 ce0c810df36a About an hour ago 180MB hyperledger/fabric-peer latest b023f9be0771 About an hour ago 187MB hyperledger/fabric-peer x86_64-1.1.0 b023f9be0771 About an hour ago 187MB hyperledger/fabric-javaenv latest 82098abb1a17 About an hour ago 1.52GB hyperledger/fabric-javaenv x86_64-1.1.0 82098abb1a17 About an hour ago 1.52GB hyperledger/fabric-ccenv latest c8b4909d8d46 About an hour ago 1.39GB hyperledger/fabric-ccenv x86_64-1.1.0 c8b4909d8d46 About an hour ago 1.39GB ......使用三個終端
終端1 啟動網絡
啟動網絡
$ sudo docker-compose -f docker-compose-simple.yaml up -d上面的命令以SingleSampleMSPSoloorderer配置文件啟動網絡,并以“dev模式”啟動對等體。它還啟動了兩個額外的容器 : 一個用于chaincode環境,一個用于與chaincode交互的CLI。創建和加入通道的命令被嵌入到CLI容器中,因此可以立即跳轉到鏈式代碼調用
終端2 建立并啟動鏈碼
打開第二個終端, 進入到chaincode-docker-devmode 目錄
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/進入
$ sudo docker exec -it chaincode bash命令提示符變為:
root@858726aed16e:/opt/gopath/src/chaincode#
編譯
進入test目錄編譯chaincode
root@858726aed16e:/opt/gopath/src/chaincode# cd test root@858726aed16e:/opt/gopath/src/chaincode/test# go build運行chaincode
CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=test:0 ./test終端3 使用鏈碼
$ sudo docker exec -it cli bash安裝及實例化
進入CLI容器后執行如下命令安裝及實例化chaincode
peer chaincode install -p chaincodedev/chaincode/test -n test -v 0 peer chaincode instantiate -n test -v 0 -c '{"Args":["a","10"]}' -C myc調用
進行調用,將a的值更改為20
peer chaincode invoke -n test -c '{"Args":["set", "a", "20"]}' -C myc執行成功, 輸出如下內容
...... ...... Chaincode invoke successful. result: status:200 payload:"20" ......查詢
查詢a的值
peer chaincode query -n test -c '{"Args":["query","a"]}' -C myc執行成功, 輸出: Query Result: 20
總結
以上是生活随笔為你收集整理的Fabric--简单的资产Chaincode的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Fabric--区块链应用开发
- 下一篇: solidity编码规范