超级账本Fabric-9.node测试
1. 准备工作
关闭网络
$ sudo ./byfn.sh -m down
1.1 进入到fabric-samples/fabcar目录中
1 | $ cd ../fabcar/ |
如果是完整的环境,目录中应该包含如下文件:
enrollAdmin.js invoke.js package.json query.js registerUser.js startFabric.sh
1.2 移除所有处于活动中的Docker容器
1 | $ sudo docker rm -f $(docker ps -aq) |
docker rm : 删除当前指定的Docker容器
docker rm -f $(docker ps -aq)
-f: 强制删除
查看Docker
1 | $ sudo docker ps |
1.3 清除所有的网络缓存
1 | $ sudo docker network prune |
1.4 删除链码图像(链码镜像)
删除fabcar智能合约的底层链码图像。如果您是第一次运行此项目可以不执行(系统上不会有此链接代码图像)
1 | $ sudo docker rmi dev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba |
删除指定的Docker镜像文件docker rmi image_id
1.5 安装客户端
安装应用程序的Fabric依赖关系
1 | $ npm install |
下载最好使用稳定的VPN
npm install: 根据 package.json 读取依赖的信息并安装
如果未安装Node则先按如下步骤安装Node及npm
安装nvm
1
2
3
4
5
6 > $ sudo apt update
> $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.10/install.sh | bash
>
> $ export NVM_DIR="$HOME/.nvm"
> $ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
>
####安装Node
1
2 > $ nvm install v8.11.1
>
检查Node版本
1
2 > $ node -v
>
输出:
v8.11.1
检查npm版本
1
2 > $ npm -v
>
输出:
5.6.0
在使用npm install命令的时候如果是第一次使用会出现报错
1
2
3
4 > npm ERR! path /home/parallels/Desktop/hyfa/fabric-samples/fabcar
> npm ERR! code EACCES
> npm ERR! errno -13
>
对此错误产生的原因是权限不够,因此需要对相应文件夹修改权限:
1
2 > sudo chown -R parallels:parallels ../fabcar
>
其中parallels为我自己本机登录用户的用户名,此处应根据个人情况不同而作出修改,查看此处信息的方法为进入到上一级目录中使用
ll
命令查看看
2. 启动网络
1 | $ sudo ./startFabric.sh |
该命令将启动各种Fabric实体,并启动用Golang编写的链式代码的智能合约容器
如出现以下错误
1
2 > ERROR: manifest for hyperledger/fabric-ca:latest not found
>
则说明环境中缺少 fabric-ca 镜像
1
2
3
4
5
6
7
8
9
10
11
12
13 > 下载镜像
> $ sudo docker pull hyperledger/fabric-ca:x86_64-1.1.0-preview
>
> 将其标记为最新
> $ sudo docker tag hyperledger/fabric-ca:x86_64-1.1.0-preview hyperledger/fabric-ca:latest
>
> 检查
> $ sudo docker images
>
> 重新启动
> $ sudo ./startFabric.sh
>
>
可选执行(流式处理CA日志, 打开新的终端并执行如下命令)
1 | $ sudo docker logs -f ca.example.com |
2.1 注册管理员用户
1 | $ node enrollAdmin.js |
命令执行后输出如下内容:
1 | Successfully enrolled admin user "admin" |
成功执行后会调用证书签名请求(CSR),并最终将eCert和密钥材料输出到此文件夹中./hfc-key-store
, 应用程序将在创建用户或加载身份对象时查找此位置
2.2 注册 user1用户
1 | $ node registerUser.js |
user1
该命令执行后调用CSR并将密钥和eCert输出到./hfc-key-store
子目录中
执行命令后输出如下:
1 | Successfully loaded admin from persistence |
2.3 查询分类帐
1 | $ node query.js |
命令执行后输出如下
1 | Successfully loaded user1 from persistence |
由Adriana拥有的黑色特斯拉Model S,由Brad拥有的红色Ford Mustang,由Pari拥有的紫色Fiat Punto等等。
分类账是基于K-V的,在上面的信息中,Key为CAR0至CAR9
打开query.js
1 | $ cat query.js |
发现应用程序的初始部分定义了某些变量,例如通道名称,证书存储位置和网络端点
1 | var channel = fabric_client.newChannel('mychannel'); |
query.js文件有如下代码使用第二个身份user1
作为此应用程序的签署实体。指定user1
为签名者
fabric_client.getUserContext('user1', true);
这是实现查询功能的语句块:
1 | // queryCar chaincode function - requires 1 argument, ex: args: ['CAR4'], |
当应用程序运行时,它会调用对等fabcar
体上的链式代码,运行其中的queryAllCars
函数,且不传递任何参数.
使用编辑器打开query.js
1 | $ vim query.js |
修改其查询块内容,更改queryAllCars
为queryCar
并将CAR4
作为特定Key为参数传递来执行此操作
1 | const request = { |
保存退出后运行:
1 | $ node query.js |
执行后返回如下
1 | Successfully loaded user1 from persistence |
使用该queryCar
功能,我们可以查询任何关键字(例如CAR0
)并获取与该车相对应的任何品牌,型号,颜色和所有者
2.4 更新分类帐
修改 invoke.js
, 找到var request
中的fcn
与args
, 添加一条新的数据
1 | $ vim invoke.js |
1 | var request = { |
保存退出后执行
1 | $ node invoke.js |
执行成功,输出如下
1 | Successfully loaded user1 from persistence |
返回query.js
并将参数由CAR4
更改为CAR10
1 | $ vim query.js |
1 | const request = { |
查询:
1 | node query.js |
输出内容如下:
1 | Successfully loaded user1 from persistence |
修改 invoke.js
, 修改CAR10的拥有者为 Dave
1 | $ vim invoke.js |
1 | var request = { |
保存退出并执行
1 | $ node invoke.js |
运行输出结果:
1 | Successfully loaded user1 from persistence |
问题
在执行 node invoke.js 命令后出现如下错误
1 | Store path:$HOME/hyfa/fabric-samples/fabcar/hfc-key-store |
此问题可以无视, 不会影响到后继查询命令 node query.js
的执行