实现一个简单的操作:根据key查询或修改value
链码内容如下:
package main
//导入链码依赖包
import(
"github.com/hyperledger/fabric/core/chaincode/shim"
"github.com/hyperledger/fabric/protos/peer"
"fmt"
)
//自定义结构体
type Chaincode struct {
}
//实现 Chaincode 接口必须重写 Init 与 Invoke 两个方法。
// 实例化/升级链码时被自动调用
func (t *Chaincode) Init(stub shim.ChaincodeStubInterface) peer.Response {
// 获取参数
_, args := stub.GetFunctionAndParameters()
// 判断参数长度是否为2个
if len(args) != 2 {
return shim.Error("指定了错误的参数个数")
}
err := stub.PutState(args[0], []byte(args[1]))
if err != nil {
return shim.Error("保存数据时发生错误...")
}
return shim.Success(nil)
}
//Invoke 函数
func (t *Chaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
// 获取调用链码时传递的参数内容(包括要调用的函数名及参数)
fun, args := stub.GetFunctionAndParameters()
//调用查询
if fun == "query"{
return query(stub, args)
}else if fun == "update"{
return update(stub, args)
}
return shim.Error("非法操作, 指定功能不能实现")
}
//实现更新函数
func update(stub shim.ChaincodeStubInterface, args []string) peer.Response {
if len(args) != 2{
return shim.Error("给定的参数个数不符合要求")
}
err := stub.PutState(args[0], []byte(args[1]))
if err != nil{
return shim.Error("错误...")
}
return shim.Success(nil)
}
//实现查询函数
func query(stub shim.ChaincodeStubInterface, args []string) peer.Response {
// 检查传递的参数个数是否为1
if len(args) != 1{
return shim.Error("指定的参数错误,必须且只能指定相应的Key")
}
// 根据指定的Key调用GetState方法查询数据
result, err := stub.GetState(args[0])
if err != nil {
return shim.Error("根据指定的 " + args[0] + " 查询数据时发生错误")
}
if result == nil {
return shim.Error("根据指定的 " + args[0] + " 没有查询到相应的数据")
}
// 返回查询结果
return shim.Success(result)
}
//编写主函数
func main() {
err := shim.Start(new(Chaincode))
if err != nil {
fmt.Printf("链码启动失败: %v", err)
}
}
接下来进行部署和测试
首先搭建网络:
docker-compose -f docker-orderer.yaml up -d
docker-compose -f docker-peer.yaml up -d
docker exec -it cli bash
peer channel create -o orderer.example.com:7050 -c mychannel -f ./channel-artifacts/mychannel.tx
peer channel join -b mychannel.block
然后部署实例化测试链码:
peer chaincode install -n mychannelzyp2 -p github.com/hyperledger/fabric/aberic/chaincode/go/zyp -v 1.0
peer chaincode instantiate -o orderer.example.com:7050 -C mychannel -n mychannelzyp2 -c '{"Args":["init","zyp","zyp"]}' -P "OR ('Org1MSP.member')" -v 1.0
查询:
peer chaincode query -C mychannel -n mychannelzyp2 -c '{"Args":["query","zyp"]}'
更新:
peer chaincode invoke -C mychannel -n mychannelzyp2 -c '{"Args":["update","zyp","wmf"]}'
再查询:
成功。