官方文檔: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