简单的资产Chaincode

应用程序是一个基本样本链代码,用于在分类账上创建资产

准备条件

安装Go及Docker, Docker-compose, 并配置Go相应的环境变量

创建目录

为chaincode应用程序创建一个目录作为其子目录

$ mkdir -p $GOPATH/src/test

$ cd $GOPATH/src/test

新建文件

新建一个文件,用于编写Go代码

 $ touch test.go
 $ vim test.go

编写代码

package main

import (
	"fmt"
	"github.com/hyperledger/fabric/core/chaincode/shim"
	"github.com/hyperledger/fabric/protos/peer"
)

type TestChaincode struct {
}

//简单的资产管理,有两个功能分别为查询余额与修改余额
//分别是get/set
//初始化时jack账户默认100

func (t *TestChaincode) Init(stub shim.ChaincodeStubInterface) peer.Response {

	fmt.Println("开始实例化链码")

	_, args := stub.GetFunctionAndParameters()

	if len(args) != 2 {

		return shim.Error("给定的参数个数错误,必须初始账户名称及对应的初始余额")

	}
	err := stub.PutState(args[0], []byte(args[1]))
	if err != nil {
		fmt.Printf("保存数据发生错误:%v")

	}
	fmt.Println("初始化成功")

	return shim.Success(nil)
}

func (t *TestChaincode) Invoke(stub shim.ChaincodeStubInterface) peer.Response {

	fun, args := stub.GetFunctionAndParameters()

	if fun == "set" {
		return set(stub, args)
	} else if fun == "get" {
		return get(stub,args)
	}
	return shim.Error("非法操作 不能实现相应的功能")
}

func set(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 {
		fmt.Println("数据存储错误")
	}
	return shim.Success([]byte("修改数据成功"))

}

func get(stub shim.ChaincodeStubInterface,args []string) peer.Response {

	if len(args) != 1 {
		return shim.Error("必须指定账户的名称")
	}

	res,err:=stub.GetState(args[0])
	if err != nil {
		return shim.Error("查询失败")
	}

	if res == nil {
		return shim.Error("根据指定的账户查询信息时失败")
	}
	return shim.Success(res)

}

func main() {

	err := shim.Start(new(TestChaincode))

	if err != nil {
		fmt.Println("启动链码失败")
	}
}


构建Chaincode

编译chaincode

$ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim

$ go build --tags nopkcs11

使用开发模式测试

正常情况下chaincode由对等体启动和维护。然而,在“开发模式”下,链码由用户构建并启动

如果没有安装Hyperledger Fabric Samples请先安装

如果没有下载Docker images请先下载

跳转至 fabric-sampleschaincode-docker-devmode 目录

 
$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/

使用 docker images 查看Docker镜像信息(显示本地Docker Registry)

使用三个终端

终端1 启动网络

 
$ sudo docker-compose -f docker-compose-simple.yaml up -d

上面的命令以 SingleSampleMSPSolo orderer配置文件启动网络,并以“dev模式”启动对等体。它还启动了两个额外的容器 : 一个用于chaincode环境,一个用于与chaincode交互的CLI。创建和加入通道的命令被嵌入到CLI容器中,因此可以立即跳转到链式代码调用

终端2 建立并启动链码

打开第二个终端, 进入到 chaincode-docker-devmode 目录

$ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/

进入

 $ sudo docker exec -it chaincode bash

命令提示符变为:

root@858726aed16e:/opt/gopath/src/chaincode#

编译

进入test目录编译chaincode

root@858726aed16e:/opt/gopath/src/chaincode#  cd test

root@858726aed16e:/opt/gopath/src/chaincode/test#  go build

运行chaincode


CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=test:0 ./test

终端3 使用链码

$ sudo docker exec -it cli bash

安装及实例化

进入CLI容器后执行如下命令安装及实例化chaincode

peer chaincode install -p chaincodedev/chaincode/test -n test -v 0

peer chaincode instantiate -n test -v 0 -c '{"Args":["init","a","10"]}' -C
myc

调用

进行调用,将 a 的值更改为 20

peer chaincode invoke -n test -c '{"Args":["set", "a", "20"]}' -C
myc

执行成功, 输出如下内容

......
...... Chaincode invoke successful. result: status:200 payload:"20"
......

查询 查询a的值

peer chaincode invoke -n test -c '{"Args":["get","a"]}' -C myc

执行成功, 输出: Query Result: 20

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦