node测试

关闭网络

$ sudo ./byfn.sh -m down

进入到fabric-samples/fabcar目录中

$ cd ../fabcar/
$ ls

如果是完整的环境,目录中应该包含如下文件:

enrollAdmin.js invoke.js package.json query.js registerUser.js startFabric.sh

移除所有处于活动中的Docker容器

$ sudo docker rm -f $(docker ps -aq)

docker rm : 删除当前指定的Docker容器

​ docker rm -f $(docker ps -aq)

​ -f: 强制删除

查看Docker

$ sudo docker ps

清除所有的网络缓存:

$ sudo docker network prune

删除链码图像(链码镜像)

删除fabcar智能合约的底层链码图像。如果您是第一次运行此项目可以不执行(系统上不会有此链接代码图像)

$ sudo docker rmi dev-peer0.org1.example.com-fabcar-1.0-5c906e402ed29f20260ae42283216aa75549c571e2e380f3615826365d8269ba

删除指定的Docker镜像文件

​ docker rmi image_id

安装客户端

安装应用程序的Fabric依赖关系

$ npm install

下载最好使用稳定的VPN

npm install: 根据 package.json 读取依赖的信息并安装

如果未安装Node则先按如下步骤安装Node及npm

安装nvm

$ 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

$ nvm install v8.11.1

检查Node版本

$ node -v

输出: v8.11.1

检查npm版本

$ npm -v

输出: 5.6.0

启动网络

$ sudo ./startFabric.sh

该命令将启动各种Fabric实体,并启动用Golang编写的链式代码的智能合约容器


如出现以下错误

ERROR: manifest for hyperledger/fabric-ca:latest not found

则说明环境中缺少 fabric-ca 镜像

下载镜像
$ 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日志, 打开新的终端并执行如下命令)

$ sudo docker logs -f ca.example.com

注册管理员用户

$ node enrollAdmin.js

命令执行后输出如下内容:

Successfully enrolled admin user "admin"
Assigned the admin user to the fabric client ::{"name":"admin","mspid":"Org1MSP","roles":null,"affiliation":"","enrollmentSecret":"","enrollment":{"signingIdentity":"dc412dcc161b5732737e98e77fda03433b55408d79b10195f0ff150fc995924a","identity":{"certificate":"-----BEGIN CERTIFICATE-----\nMIICATCCAaigAwIBAgIUMjxyVKytJHiYigb+usxuVlmeI8kwCgYIKoZIzj0EAwIw\nczELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExFjAUBgNVBAcTDVNh\nbiBGcmFuY2lzY28xGTAXBgNVBAoTEG9yZzEuZXhhbXBsZS5jb20xHDAaBgNVBAMT\nE2NhLm9yZzEuZXhhbXBsZS5jb20wHhcNMTgwNDI2MDcyNzAwWhcNMTkwNDI2MDcz\nMjAwWjAhMQ8wDQYDVQQLEwZjbGllbnQxDjAMBgNVBAMTBWFkbWluMFkwEwYHKoZI\nzj0CAQYIKoZIzj0DAQcDQgAEszinoLQrvnKVYl9FUT8ebxT2jIz5lKCk5olL1cox\n/JchmLPG8Ew1roM2TgG64rvT1nrl1EvMwmD8oEOMgmGqwKNsMGowDgYDVR0PAQH/\nBAQDAgeAMAwGA1UdEwEB/wQCMAAwHQYDVR0OBBYEFNG9kJBZBDSOwFxVHTDByNOl\nMvDSMCsGA1UdIwQkMCKAIEI5qg3NdtruuLoM2nAYUdFFBNMarRst3dusalc2Xkl8\nMAoGCCqGSM49BAMCA0cAMEQCIA1Ugh8NW3tS0GkuUrURdwQrSnFkdWTQhJ1/GvRd\nJbeTAiBGdDpHu/6mZG8dpguA0EaqSHrWJBQra4Vj1Fm9F1+zNg==\n-----END CERTIFICATE-----\n"}}}

成功执行后会调用证书签名请求(CSR),并最终将eCert和密钥材料输出到此文件夹中./hfc-key-store, 应用程序将在创建用户或加载身份对象时查找此位置

注册 user1用户

$ node registerUser.js

user1

该命令执行后调用CSR并将密钥和eCert输出到./hfc-key-store子目录中

执行命令后输出如下:

Successfully loaded admin from persistence
Successfully registered user1 - secret:mrOjTeyeUmWY
Successfully enrolled member user "user1"
User1 was successfully registered and enrolled and is ready to intreact with the fabric network

查询分类帐

$ node query.js

命令执行后输出如下

Successfully loaded user1 from persistence
Query has completed, checking results
Response is  [{"Key":"CAR0", "Record"{"colour":"blue","make":"Toyota","model":"Prius","owner":"Tomoko"}},
{"Key":"CAR1", "Record":{"colour":"red","make":"Ford","model":"Mustang","owner":"Brad"}},{"Key":"CAR2", "Record":{"colour":"green","make":"Hyundai","model":"Tucson","owner":"Jin Soo"}},{"Key":"CAR3", "Record":{"colour":"yellow","make":"Volkswagen","model":"Passat","owner":"Max"}},{"Key":"CAR4", "Record":{"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}},{"Key":"CAR5", "Record":{"colour":"purple","make":"Peugeot","model":"205","owner":"Michel"}},{"Key":"CAR6", "Record":
{"colour":"white","make":"Chery","model":"S22L","owner":"Aarav"}},{"Key":"CAR7", "Record":{"colour":"violet","make":"Fiat","model":"Punto","owner":"Pari"}},{"Key":"CAR8", "Record":{"colour":"indigo","make":"Tata","model":"Nano","owner":"Valeria"}},{"Key":"CAR9", "Record":{"colour":"brown","make":"Holden","model":"Barina","owner":"Shotaro"}}]

由Adriana拥有的黑色特斯拉Model S,由Brad拥有的红色Ford Mustang,由Pari拥有的紫色Fiat Punto等等。

分类账是基于K-V的,在上面的信息中,Key为CAR0至CAR9

打开query.js

$ cat query.js

发现应用程序的初始部分定义了某些变量,例如通道名称,证书存储位置和网络端点

var channel = fabric_client.newChannel('mychannel');
var peer = fabric_client.newPeer('grpc://localhost:7051');
channel.addPeer(peer);var member_user = null;
var store_path = path.join(__dirname, 'hfc-key-store');
console.log('Store path:'+store_path);
var tx_id = null;

query.js文件有如下代码使用第二个身份user1作为此应用程序的签署实体。指定user1为签名者

fabric_client.getUserContext('user1', true);

这是实现查询功能的语句块:

// queryCar chaincode function - requires 1 argument, ex: args: ['CAR4'],
// queryAllCars chaincode function - requires no arguments , ex: args: [''],
const request = {//targets : --- letting this default to the peers assigned to the channelchaincodeId: 'fabcar',fcn: 'queryAllCars',args: ['']
};调用链码命令:chaincode query -n 链码名称 -C 通道名称 -c 调用链码时所需要传递的参数-c '{"Args":["FunctionName", "查询Key"]}'

当应用程序运行时,它会调用对等fabcar体上的链式代码,运行其中的queryAllCars函数,且不传递任何参数.

使用编辑器打开query.js

$ vim query.js

修改其查询块内容,更改queryAllCarsqueryCar并将CAR4作为特定Key为参数传递来执行此操作

const request = {//targets : --- letting this default to the peers assigned to the channelchaincodeId: 'fabcar',fcn: 'queryCar',args: ['CAR4']
};

保存退出后运行:

$ node query.js

执行后返回如下

Successfully loaded user1 from persistence
Query has completed, checking results
Response is  {"colour":"black","make":"Tesla","model":"S","owner":"Adriana"}

使用该queryCar功能,我们可以查询任何关键字(例如CAR0)并获取与该车相对应的任何品牌,型号,颜色和所有者

更新分类帐

修改 invoke.js, 找到var request中的fcnargs, 添加一条新的数据

$ vim invoke.js
    var request = {//targets: let default to the peer assigned to the clientchaincodeId: 'fabcar',fcn: 'createCar',args: ['CAR10','Chevy','Volt','Red','Nick'],chainId: 'mychannel',txId: tx_id};

保存退出后执行

$ node invoke.js

执行成功,输出如下

Successfully loaded user1 from persistence
Assigning transaction_id:  801d0636b9aa94cc7782af21ec2a10ebb12f929bd722afcee1f2b7b923485c82
Transaction proposal was good
Successfully sent Proposal and received ProposalResponse: Status - 200, message - "OK"
The transaction has been committed on peer localhost:7053
Send transaction promise and event listener promise have completed
Successfully sent transaction to the orderer.
Successfully committed the change to the ledger by the peer

返回query.js并将参数由CAR4更改为CAR10

$ vim query.js
const request = {//targets : --- letting this default to the peers assigned to the channelchaincodeId: 'fabcar',fcn: 'queryCar',args: ['CAR10']
};

查询:

node query.js

输出内容如下:

Successfully loaded user1 from persistence
Query has completed, checking results
Response is  {"colour":"Red","make":"Chevy","model":"Volt","owner":"Nick"}

修改 invoke.js, 修改CAR10的拥有者为 Dave

$ vim invoke.js
var request = {//targets: let default to the peer assigned to the clientchaincodeId: 'fabcar',fcn: 'changeCarOwner',args: ['CAR10','Dave'],chainId: 'mychannel',txId: tx_id
};

保存退出并执行

$ node invoke.js
$ node query.js

运行输出结果:

Successfully loaded user1 from persistence
Query has completed, checking results
Response is  {"colour":"Red","make":"Chevy","model":"Volt","owner":"Dave"}

问题:

在执行 node invoke.js 命令后出现如下错误

Store path:$HOME/hyfa/fabric-samples/fabcar/hfc-key-store
Successfully loaded user1 from persistence
Assigning transaction_id:  f80947242014765a46a17d797b45c8ed9a5db5cc936a57c731219d9e25646051
Transaction proposal was good
Successfully sent Proposal and received ProposalResponse: Status - 200, message - "OK"
Failed to invoke successfully :: TypeError: Cannot read property 'getConnectivityState' of undefined
$HOME/hyfa/fabric-samples/fabcar/node_modules/fabric-client/lib/EventHub.js:308if(self._stream) state = self._stream.call.channel_.getConnectivityState();^TypeError: Cannot read property 'getConnectivityState' of undefinedat ClientDuplexStream.<anonymous> ($HOME/hyfa/fabric-samples/fabcar/node_modules/fabric-client/lib/EventHub.js:308:56)at emitOne (events.js:116:13)at ClientDuplexStream.emit (events.js:211:7)at addChunk (_stream_readable.js:263:12)at readableAddChunk (_stream_readable.js:250:11)at ClientDuplexStream.Readable.push (_stream_readable.js:208:10)at Object.onReceiveMessage ($HOME/hyfa/fabric-samples/fabcar/node_modules/grpc/src/client_interceptors.js:1302:19)at InterceptingListener.recvMessageWithContext ($HOME/hyfa/fabric-samples/fabcar/node_modules/grpc/src/client_interceptors.js:629:19)at $HOME/hyfa/fabric-samples/fabcar/node_modules/grpc/src/client_interceptors.js:728:14

此问题可以无视, 不会影响到后继查询命令 node query.js 的执行

HyperLedger Fabric - 超级账本(8)Node测试相关推荐

  1. Hyperledger Fabric 超级账本的硬伤

    2019独角兽企业重金招聘Python工程师标准>>> Hyperledger Fabric 超级账本的硬伤 Hyperledger Fabric 超级账本的硬伤 Netkiller ...

  2. Hyperledger Fabric 超级账本实战项目(一、二)

    p1基础介绍 Fabric需要配置环境 hash概念:输入任何数据可以得到与其对应的hash值.发现不管data的长度是多少,它对应的hash长度是不变的:data也可以传空值,即空值也会对应一个ha ...

  3. Hyperledger Fabric 超级账本 Java 开发区块链环境构建

    面向 Java 开发人员的链代码简介 您听说过区块链超级账本Hyperledger Fabric?对Java开发人员有何用.我将分步展示用 Hyperledger Fabric v0.6来搭建开发环境 ...

  4. Hyperledger Fabric 超级账本 区块链技术 概述 优点

    超级账本概述 区块链的第一个也是最被广泛认可的应用是比特币,另一种加密货币以太坊采取了不同的方法,它集成了许多与比特币相同的特征,添加了智能合约来创建分布式应用程序的平台.比特币和以太坊属于区块链,我 ...

  5. HyperLedger Fabric - 超级账本(4)链码的概念与使用

    概念: Chaincode: 链上代码, 简称链码, 一般是指用户编写的应用代码 链码被部署在Fabric网络节点上, ​ Peer 节点 ​ – 背书节点 ​ – commit节点 ​ – Lead ...

  6. HyperLedger Fabric - 超级账本(2.2)启动网络 - 手动

    启动网络手动实现 实现步骤 生成组织关系和身份证书 确定是在 fabric-samples/first-network 路径下 $ cd hyfa/fabric-samples/first-netwo ...

  7. HyperLedger Fabric - 超级账本(6)转换配置添加组织到channel

    configtxlator转换配置/添加Org组织到channel 设置环境 进入到fabric-samples/first-network目录中, 执行.byfn.sh -m down关闭网络,清理 ...

  8. ubuntu18.04 快速搭建 Hyperledger Fabric超级账本框架

    这两天一直再配Hyperledger Fabric1.4的环境,找了很多资料,期间因为墙的原因找了很多博客的解决办法终于搭建成果,特此记录下来避免以后搭建出错. 文章目录 环境 步骤 1. ubunt ...

  9. Hyperledger -超级账本 学习报告

    Hyperledger -超级账本 学习报告 一.什么是区块链? 区块链的基本原理,基本组件包括: 交易:对账本状态的改变: 区块:记录交易和状态,是对当前账本状态的一次确认: 链:状态变化的日志记录 ...

最新文章

  1. Java 8 一行代码解决了空指针问题,太厉害了...
  2. 用pycharm写python_使用Pycharm编写第一个python程序
  3. 再谈类别不平衡问题:调节权重与魔改Loss的综合分析
  4. 常见WEB漏洞描述及修复建议(可收藏写报告用)-句芒安全实验室
  5. MSP, CMP傻傻分不清楚?一文读懂云管理的春天
  6. 构建azure对话机器人_如何在5分钟内使用Azure创建聊天机器人
  7. 从零开始--系统深入学习android(实践-让我们开始写代码-新手指南-6.使用Fragments构建动态UI)...
  8. JS History
  9. python基础篇——列表与列表算法(下)
  10. mysql触发器信号给qt_利用回调函数实现DLL与Qt主程序的数据交互,进一步实现对Qt主程序中的信号触发 - zcabcd123的专栏 - 博客频道 - CSDN.NET...
  11. 阿里 70 后程序员的 24 个“避坑”法则
  12. 未转变者服务器bug,未转变者攻略 unturned无敌BUG说明
  13. Rewrite 做二级域名转向
  14. 15个漂亮的企业网站设计案例欣赏
  15. windows 删除服务_哪些Windows 10 系统服务可以安全禁用?
  16. 共筑未来 | 思腾合力加入光合组织,完成国产信创兼容适配
  17. 苹果xsmax是什么接口_除了苹果,越来越多笔记本都带雷电3了,它凭什么号称最强接口?...
  18. MATLAB 多元线性回归(regress)
  19. pandas中强大的绘制图表功能——DataFrame.hist(),以及统计分析函数——DataFrame.describe()
  20. 【Mapreduce】Mapreduce实例——WordCount

热门文章

  1. mysql_assoc函数_关于PHP的函数mysql_fetch_assoc的问题
  2. 有用的一些链接Powerstore VxRail
  3. Steam Deck——硬盘,网络,模拟器一命通关教程
  4. 雷电助手连接不到服务器,雷电模拟器无法联网怎么办 雷电模拟器网络异常的解决办法...
  5. 计算机网络——基础篇
  6. 北京博奥智源,发布ERP系统之财务管理及成本核算模块开发功能
  7. [css] css 3d 动画,跟随鼠标移动做球形旋转
  8. 什么是TTO热转印色带?
  9. 给你的2D游戏添加3D效果
  10. 简单实现thinkPHP的excel导出