官方文档: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方法会被调用
链码生命周期
编写链码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