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