Fabric1.4版本在dev模式下测试链码

Fabric1.4版本在dev模式下测试链码

按照一般的fabric开发学习过程,以及上一篇文章的基础上,我们下一步要实现的目标是自己手动部署智能合约,自己去把官方的例子手动跑通一次;然而在正式部署自己的项目的时候,我们需要自己手动编写链码;在自己编写智能合约的过程中,我们免不了会出一些bug,部署的过程又过于繁琐,因此官方提供了一个用于测试自己链码的功能。

在上一篇文章当中,我们的fabric1.4基本环境已经配置完毕;在开始dev模式开发之前,肯定是要清理现在的网络环境的,我们用下面两个命令来查询自己的网络环境。

docker ps
docker ps -a

查询到的现在存有的容器有这些:
在这里插入图片描述
那么我们得保证我们在启动dev模式之前,我们的网络环境是干净的,也就是说这两个命令查询不出任何东西,所以我们这里执行一下这个语句,来清除现有的docker

docker kill $(docker ps -a -q)
docker rm $(docker ps -qf status=exited)

(这里注意一下,docker ps -a这个命令可能会查询到一些异常状态的容器,而docker ps这个命令查询不出来,而且上面两个命令无法删除,这个时候用docker rm -f加上容器前面的id来强制删除)


随后,我们再运行docker ps 那两个命令,已经查询不到任何容器,那么我们就可以开始了
在这里插入图片描述
我们可以看到,目前我们网络环境是干净的,然后我们现在进入上一篇教程当中git拉下来的fabric-samples目录,有一个chaincode-docker-devmode目录,我们进入这个目录


这个时候,我们用xshell开启三个终端
第一个终端就在chaincode-docker-devmode目录下,开启整个网络环境

docker-compose -f docker-compose-simple.yaml up

我们没有加上-d这个参数,是因为方便我们查看日志,如果有报错的话可以直接看到;最后第一个终端就是这个样子
在这里插入图片描述


然后在第二个终端
我们直接输入下面这个命令,来管理我们的链码

docker exec -it chaincode bash

然后可以看到这个目录下面有很多文件夹,里面都是示例的智能合约;为了方便大家自己操作,这里我依旧用了官方的源码,但是不会去使用这些文件夹里面的东西,而是自己去新建一个文件夹
在这里插入图片描述

这里我们新建一个文件夹,由于我用的是官方的源码,所以这个文件夹的名字叫做example02,这里大家可以根据自己编写的智能合约来规定文件夹名字,比如我的智能合约的名字是Chain.go,那么这个文档的名字就叫做Chain。切记,前面的英文字母一定要保持一致,否则后面的步骤很可能会把自己弄混了。


此时我们这个example02文件夹是没有go文件(也就是链码,智能合约)的,所以我们这里上传一个自己的链码;容器内部上传文件要么是在外部 @容器id 加上路径,我觉得比较麻烦,所以这里我依旧采用之前的rz命令上传文件(因为无法用xftp上传)

apt-get update && apt-get install lrzsz

我们先安装一下rz这个命令包,然后上传文件
在这里插入图片描述
可以看到已经有一个go文件,并且它的名字和文件夹的名字是一致的
接下来我们要编译一下这个文件,因为貌似只有二进制文件才能调用

go build

然后我们可以看到这个文件夹下多出了一个二进制文件,它的名字和文件夹一致
在这里插入图片描述
接下来,我们在当前目录下,执行这一句代码,开启测试
这里说一下,后面example02指的就是那个生成的二进制文件,1.0是版本,后面会用到

CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=example02:1.0 ./example02

整个第二个终端就是这样
在这里插入图片描述


然后我们来看第三个终端
直接进入容器

docker exec -it cli bash

然后安装我们的智能合约
这里的-n 就是指的链码的名字 而-p指的是寻找链码的路径

peer chaincode install -n example02 -p chaincodedev/chaincode/example02 -v 1.0

安装了之后,如果日志打印Installed remotely response:<status:200 payload:“OK” >就说明可以了,有error一般是找不到路径文件什么的,或者已经安装了
接下来就是实例化,这里是用的官方的例子,所以实例化也差不多
这里的-c 是通道的名称 -n依旧是名字 -c是参数

peer chaincode instantiate -C myc -n example02 -c '{"Args":["init","a","100","b","200"]}'  -v 1.0

没报错就说明OK,这个时候终端二会打印日志
在这里插入图片描述
然后,我们就可以执行我们的链码了
这里用一个查询的功能举例,查询一下a的账户

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

然后终端三给我们的日志是这样的
在这里插入图片描述
终端二也有对应的日志
在这里插入图片描述
有关于命令:-c是参数(小写),比如我们刚才执行的query方法,看看官方的代码
在这里插入图片描述
可以看到args是表示一个字符串数组,来接受我们的参数的,而整个函数的名字是query,就是我们命令行里的query,命令行只有一个参数a,所以只var定义了一个A,后面也用len函数检查了是否输入的参数个数是1个;
而再看看我们实例化的时候的Init函数
在这里插入图片描述
可以看到函数名是Init,而且输入的参数个数不是4个的话,还会返回报错,这也就是为什么命令行会那么写的原因,这个是对大家编写自己的智能合约有帮助的。

既然是dev模式,若是测试出错误了也是很正常的,如果我们需要修改我们的源码,此时我们切入到第二个终端,同时按下crrl+c, 这个时候我们就已经退了出来,如果此时在终端三进行链码查询等操作,会报错;然后在终端二,我们把我们修改之后的链码再次上传到目录下,然后再次go build生成二进制文件,然后再一次

CORE_PEER_ADDRESS=peer:7052 CORE_CHAINCODE_ID_NAME=example02:1.0 ./example02

使用这个命令,启动环境;这个时候终端三不需要任何的操作,直接进行query等方法操作就行(不用再执行Init和install安装实例化一次)。

本文章为方便大家编写测试自己的智能合约所用,为后面的部署链码有一个预备处理。

猜你喜欢

转载自blog.csdn.net/weixin_44573310/article/details/108630904