天天看點

hyperledger-fabric Chaincode for Developers筆記

官方文檔:https://hyperledger-fabric.readthedocs.io/en/release-1.0/chaincode4ade.html

Chaincode 接口

type Chaincode interface {
   Init(stub ChaincodeStubInterface) pb.Response
   Invoke(stub ChaincodeStubInterface) pb.Response
}
           

Init 當鍊碼收到執行個體化或者更新類型的交易時,Init方法會被調用

Invoke 當鍊碼收到調用invoke或者查詢類型的交易時,Invoke方法會被調用

鍊碼生命周期

hyperledger-fabric Chaincode for Developers筆記

編寫鍊碼demo2.go

package main

import (
   "fmt"
      "github.com/hyperledger/fabric/core/chaincode/shim"
            "github.com/hyperledger/fabric/protos/peer"

   )

//聲明一個結構體
type Helloworld struct{

}

//添加Init方法
func (t *Helloworld) Init(stub shim.ChaincodeStubInterface) peer.Response{
        args := stub.GetStringArgs()
        err := stub.PutState(args[0],[]byte(args[1]))

        if err!=nil{
          shim.Error(err.Error())
        }

        return shim.Success(nil)
}

//添加Invoke 方法
func (t *Helloworld) Invoke (stub shim.ChaincodeStubInterface) peer.Response{
  fn,args := stub.GetFunctionAndParameters()
  //定義了兩個操作set和get
  if fn == "set" {
    return t.set(stub,args)
  }else if fn == "get"{
    return t.get(stub,args)
  }
  return shim.Error("Invoke fn error")
}

//實作set操作
func (t *Helloworld) set(stub shim.ChaincodeStubInterface  ,args []string) peer.Response{
  err := stub.PutState(args[0],[]byte(args[1]))
  if err != nil {
   return shim.Error(err.Error())
  }

  return shim.Success(nil)
}

//實作get操作
func (t *Helloworld) get(stub shim.ChaincodeStubInterface,args []string) peer.Response{
   value,err := stub.GetState(args[0])
   if err != nil {
     shim.Error(err.Error())
   }
   fmt.Println("success: "+ string(value))
   return shim.Success(value)
}

func main(){
   err := shim.Start(new(Helloworld ))
   if err != nil {
     fmt.Println("start not")
   }
}

           

Terminal 1 - Start the network

打開第一個指令視窗進入目錄:/fabric-samples/chaincode-docker-devmode$

執行下面的指令:

docker-compose -f docker-compose-simple.yaml up
           

Terminal 2 - Build & start the chaincode

打開第二個指令視窗

docker exec -it chaincode bash
           

執行上面指令後進入/opt/gopath/src/chaincode/demo (我的chaincode存放的目錄)

将上面的chaincode demo2.go檔案進行編譯執行

go build
           

遇到問題了

第一次執行

CORE_PEER_ADDRESS=peer:7051 CORE_CHAINCODE_ID_NAME=mydemo:0 ./demo
           

出現下方問題

–UTC [shim] chatWithPeer -> ERRO 003 Received error from server, ending chaincode stream: rpc error: code = Unimplemented desc = unknown service protos.ChaincodeSupport

第二次執行,将端口号改為7052即可

CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=mydemo:0 ./demo
           

Terminal 3 - Use the chaincode

打開第三個指令行視窗,執行下方指令後進入/opt/gopath/src/chaincodedev

docker exec -it cli bash
           

當遇到下方的問題:

Error response from daemon: Container 942f619639ed2131931d3bc40c5e24348c6b4ff89c878ca83f2a00ea5060d5b6 is not running

停止第一個視窗指令和第二個指令視窗的任務

執行 docker ps -qa | xargs docker stop 和 docker ps -qa | xargs docker rm 再重新開機啟動之前的操作。

下面開始安裝鍊碼

peer chaincode install -p chaincodedev/chaincode/demo -n mydemo -v 0
           

下面進行初始化

peer chaincode instantiate -n mydemo -v 0 -c '{"Args":["a","b"]}' -C myc
           

調用鍊碼set

peer chaincode invoke -n mydemo -c '{"Args":["set","a","20"]}' -C myc
           

調用鍊碼get查詢

peer chaincode query -n mydemo -c '{"Args":["get":"a"]}' -C myc
           

繼續閱讀