尝试链码编写及部署测试

实现一个简单的操作:根据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"]}'

 再查询:

 成功。

猜你喜欢

转载自blog.csdn.net/weixin_48879513/article/details/121751989
今日推荐