超级账本Fabric-链码_简单资产
1、准备工作
应用程序是一个基本样本链代码,用于在分类账上创建资产
安装Go及Docker, Docker-compose, 并配置Go相应的环境变量
1.1 创建目录
为chaincode应用程序创建一个目录作为其子目录
1 | $ mkdir -p $GOPATH/src/test |
1.2 新建文件
新建一个文件,用于编写Go代码
1 | $ touch test.go |
2. 编写链码
必须实现 Chaincode接口的Init
和Invoke
函数。因此,须在文件中添加go import语句以获取链代码的依赖。
导入chaincode shim包和 peer protobuf包。然后添加一个结构SimpleChaincdoe
作为Chaincode函数的接收器
1 | package main |
2.1 初始化Chaincode
Init方法
- 获取参数, 使用GetStringArgs 函数检索调用 的参数
- 检查合法性, 检查参数数量是否为2个, 如果不是, 则返回错误信息
- 利用两参数, 调用PutState方法向账本中写入状态, 如果有错误则返回(shim.Error()), 否则返回nil(shim.Success)
1 | func (t *SimpleChaincdoe) Init(stub shim.ChaincodeStubInterface) peer.Response { |
2.2 调用实现
Invoke方法
验证函数名称为set
或get
,并调用那些链式代码应用程序函数,通过shim.Success
或shim.Error
函数返回响应
- 获取函数名与参数
- 对获取到的参数名称进行判断, 如果为set, 则调用set方法, 反之调用get
- set/get函数返回两个值(result, err)
- 如果err不为空则返回错误
- err为空则返回[]byte(result)
1 | func (t *SimpleChaincdoe) Invoke(stub shim.ChaincodeStubInterface) peer.Response { |
2.3 实现Chaincode应用
chaincode应用程序实现了两个可以通过Invoke
函数调用的函数(set/get)
为了访问分类账的状态,利用 chaincode shim API 的ChaincodeStubInterface.PutState 和ChaincodeStubInterface.GetState函数
2.3.1 set函数, 返回两个值
- 检查参数个数是否为2
- 利用PutState方法将状态写入
- 如果成功,则返回要写入的状态, 失败返回错误: fmt.Errorf(“…”)
1 | func set(stub shim.ChaincodeStubInterface, args []string) (string, error) { |
2.3.2 get函数, 返回两个值
- 接收参数并判断个数 是否为1个
- 调用GetState方法返回并接收两个返回值(value, err)
- 判断err及value是否为空 return “”, fmt.Errorf(“……”)
- 返回值 return string(value), nil
1 | func get(stub shim.ChaincodeStubInterface, args []string) (string, error) { |
main方法
1 | func main() { |
链码
3. 构建Chaincode
3.1 编译chaincode
1 | $ go get -u --tags nopkcs11 github.com/hyperledger/fabric/core/chaincode/shim |
3.2 使用开发模式测试
正常情况下chaincode由对等体启动和维护。然而,在“开发模式”下,链码由用户构建并启动
如果没有安装Hyperledger Fabric Samples请先安装
如果没有下载Docker images请先下载
跳转至fabric-samples
的chaincode-docker-devmode
目录
1 | $ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/ |
使用docker images
查看Docker镜像信息(显示本地Docker Registry)
1 | $ sudo docker images |
会看到如下输出
1 | REPOSITORY TAG IMAGE ID CREATED SIZE |
使用三个终端
终端1 启动网络
启动网络
1 | $ sudo docker-compose -f docker-compose-simple.yaml up -d |
上面的命令以SingleSampleMSPSolo
orderer配置文件启动网络,并以“dev模式”启动对等体。它还启动了两个额外的容器 : 一个用于chaincode环境,一个用于与chaincode交互的CLI。创建和加入通道的命令被嵌入到CLI容器中,因此可以立即跳转到链式代码调用
终端2 建立并启动链码
打开第二个终端, 进入到chaincode-docker-devmode
目录
1 | $ cd ~/hyfa/fabric-samples/chaincode-docker-devmode/ |
进入
1 | $ sudo docker exec -it chaincode bash |
命令提示符变为:
root@858726aed16e:/opt/gopath/src/chaincode#
编译
进入test目录编译chaincode
1 | root@858726aed16e:/opt/gopath/src/chaincode# cd test |
运行chaincode
1 | CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=test:0 ./test |
终端3 使用链码
1 | $ sudo docker exec -it cli bash |
安装及实例化
进入CLI容器后执行如下命令安装及实例化chaincode
1 | peer chaincode install -p chaincodedev/chaincode/test -n test -v 0 |
调用
进行调用,将a
的值更改为20
1 | peer chaincode invoke -n test -c '{"Args":["set", "a", "20"]}' -C myc |
执行成功, 输出如下内容
1 | ...... |
查询
查询a
的值
1 | peer chaincode query -n test -c '{"Args":["query","a"]}' -C myc |
执行成功, 输出: Query Result: 20