天天看点

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