balance transfer 提供了很多查询接口,包括链码查询,根据区块号查询区块数据,根据交易ID查询交易信息,查询链上的区块数,查询已安装或已实例化的链码,查询通道。

源码解析

1.调用链码查询:调用指定背书节点上部署的普通chaincode对状态数据库进行查询操作,该方法只会发送交易提案到目标节点,并不会产生新的交易发送给排序服务。

  1. // 调用指定节点上部署的普通链码进行查询
  2. app.get('/channels/:channelName/chaincodes/:chaincodeName', async function(req, res) {
  3. var channelName = req.params.channelName;
  4. var chaincodeName = req.params.chaincodeName;
  5. let args = req.query.args;
  6. let fcn = req.query.fcn;
  7. let peer = req.query.peer;
  8. // 处理参数
  9. args = args.replace(/'/g, '"');
  10. args = JSON.parse(args);
  11. logger.debug(args);
  12. let message = await query.queryChaincode(peer, channelName, chaincodeName, args, fcn, req.username, req.orgname);
  13. res.send(message);
  14. });
  15. // query.js中的queryChaincode()方法
  16. var queryChaincode = async function(peer, channelName, chaincodeName, args, fcn, username, org_name) {
  17. try {
  18. // 创建client和channel对象
  19. var client = await helper.getClientForOrg(org_name, username);
  20. var channel = client.getChannel(channelName);
  21. // 构造查询请求
  22. var request = {
  23. targets : [peer], // 允许指定多个节点
  24. chaincodeId: chaincodeName,
  25. fcn: fcn,
  26. args: args
  27. };
  28. // 调用SDK中的queryByChaincode()方法,内部调用sendTransactionProposal()
  29. // 向所有目标背书节点发送生成的交易提案,并提取出所有提案响应中的payload组成一个list返回
  30. let response_payloads = await channel.queryByChaincode(request);
  31. // 从响应内容中解析出查询结果, response_payloads是一个list类型
  32. // 其中每个元素都是一个字节数组(bytes array),对应每一个指定节点的查询结果
  33. if (response_payloads) {
  34. for (let i = 0; i < response_payloads.length; i++) {
  35. logger.info(args[0]+' now has ' + response_payloads[i].toString('utf8') +
  36. ' after the move');
  37. }
  38. return args[0]+' now has ' + response_payloads[0].toString('utf8') +
  39. ' after the move';
  40. } else {
  41. logger.error('response_payloads is null');
  42. return 'response_payloads is null';
  43. }
  44. } catch(error) {
  45. logger.error('Failed to query due to error: ' + error.stack ? error.stack : error);
  46. return error.toString();
  47. }
  48. };

2.根据区块号查询区块数据

  1. app.get('/channels/:channelName/blocks/:blockId', async function(req, res) {
  2. let blockId = req.params.blockId;
  3. let peer = req.query.peer;
  4. let message = await query.getBlockByNumber(peer, req.params.channelName, blockId, req.username, req.orgname);
  5. res.send(message);
  6. });
  7. var getBlockByNumber = async function(peer, channelName, blockNumber, username, org_name) {
  8. try {
  9. // 创建client和channel对象
  10. var client = await helper.getClientForOrg(org_name, username);
  11. var channel = client.getChannel(channelName);
  12. // 调用SDK中的queryBlock方法,内部调用sendTransactionProposal()发送交易提案到背书节点,
  13. // 背书节点会调用 QSCC 系统链码中的 GetBlockByNumber 接口从链上获取区块数据
  14. let response_payload = await channel.queryBlock(parseInt(blockNumber, peer));
  15. if (response_payload) {
  16. logger.debug(response_payload);
  17. return response_payload;
  18. } else {
  19. logger.error('response_payload is null');
  20. return 'response_payload is null';
  21. }
  22. } catch(error) {
  23. logger.error('Failed to query due to error: ' + error.stack ? error.stack : error);
  24. return error.toString();
  25. }
  26. };

总结

其他的查询方法与上面查询区块的方法类似,都是先调用query.js的对应接口,再调用SDK中的对应接口,然后内部调用 sendTransactionProposal()来发送交易提案到背书节点,随后背书节点调用相应系统链码中的对应方法来进行查询。

查询功能 app调用 SDK调用 链码调用 链码方法fcn
链码查询 queryChaincode queryByChaincode chaincode query
根据区块号获取区块 getBlockByNumber queryBlock QSCC GetBlockByNumber
根据交易号获取交易 getTransactionByID queryTransaction QSCC GetTransactionByID
根据区块hash获取区块 getBlockByHash queryBlockByHash QSCC GetBlockByHash
查询链信息 getChainInfo queryInfo QSCC GetChainInfo
查询已安装链码 getInstalledChaincodes queryInstalledChaincodes LSCC getinstalledchaincodes
查询已实例化链码 getInstalledChaincodes queryInstantiatedChaincodes LSCC getchaincodes
查询链信息 getChainInfo queryInfo QSCC GetChainInfo
查询加入的通道 getChannels queryChannels CSCC GetChannels

Hyperledger Fabric——balance transfer(六)查询的更多相关文章

  1. Hyperledger Fabric——balance transfer(一)启动示例

    Blacne transfer是Hyperledger fabric Node SDK的一个示例应用,主要使用了SDK中fabric-client 和 fabric-ca-client 模块中的API ...

  2. Hyperledger Fabric——balance transfer(四)安装和实例化chaincode

    详细解析blance transfer示例的安装(install)和实例化(Instantiate)链码(chaincode)的过程.安装chaincode会根据本地的链码文件生成chaincode镜 ...

  3. Hyperledger Fabric——balance transfer(三)创建和加入Channel

    详细解析blance transfer示例的创建通道(Channel)和加入节点到通道的过程. 创建Channel 1.首先看app.js的路由函数 var createChannel = requi ...

  4. Hyperledger Fabric——balance transfer(二)注册用户

    详细分析blance transfer示例的用户注册(register)与登录(enroll)功能. 源码分析 1.首先分析项目根目录的app.js文件中关于用户注册和登录的路由函数.注意这里的tok ...

  5. Hyperledger Fabric——balance transfer(五)执行交易

    链码安装和实例化之后就可以调用chaincode执行交易,下面分析简单的账户转账操作是如何完成的. 源码分析 1.首先看app.js的路由函数 app.post('/channels/:channel ...

  6. 搭建基于hyperledger fabric的联盟社区(六) --搭建node.js服务器

    接下来我要做的是用fabric sdk来做出应用程序,代替CLI与整个区块链网络交互.并且实现一个http API,向社区提供一个简单的接口,使社区轻松的与区块链交互. 官方虽然提供了Node.JS, ...

  7. Hyperledger Fabric 1.0 从零开始(六)——创建Fabric多节点集群

    4:创建Fabric多节点集群 4.1.配置说明 首先可以根据官方Fabric自带的e2e_cli列子中的集群方案来生成我们自己的集群,与案例不同的是我们需要把容器都分配到不同的服务器上,彼此之间通过 ...

  8. hyperledger fabric 1.0.5 分布式部署 (六)

    如何在相同的peer 节点上创建多个 channel 作者在hyperledger fabric 1.0.5 分布式部署 (五)已经向读者们介绍了一个简单的fabric 的部署流程,那么根据上一篇博客 ...

  9. Hyperledger Fabric 2.x 自定义智能合约

    一.说明 为了持续地进行信息的更新,以及对账本进行管理(写入交易,进行查询等),区块链网络引入了智能合约来实现对账本的访问和控制:智能合约在 Fabric 中称之为 链码,是区块链应用的业务逻辑. 本 ...

随机推荐

  1. POJ1651:Multiplication Puzzle(区间dp)

    Multiplication Puzzle Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9419 Accepted: 5850 ...

  2. 15个Nodejs应用场景

    15个Nodejs应用场景 我们已经对Nodejs有了初步的了解,接下来看看Nodejs的应用场景. 2.1 Web开发:Express + EJS + Mongoose/MySQL express  ...

  3. 新手上路:Laravel-控制器基础

    1.控制器在哪 Controller目录默认存放于app\Htpp\Controllers下,当然,你可以自定义这个目录: Controllers文件夹有一个控制器基类Controller.php,你 ...

  4. Android Room SQLite持久层框架

    原文链接 前言 Android中提供了SQLite数据库进行数据的持久化 ,并提供了对应API访问数据库,而Room框架提供了SQLite数据访问抽象层,为高效的数据库访问层带来便捷 APP可以缓存用 ...

  5. USACO Training Section 1.1 贪婪的送礼者Greedy Gift Givers

    P1201 [USACO1.1]贪婪的送礼者Greedy Gift Givers 题目描述 对于一群(NP个)要互送礼物的朋友,GY要确定每个人送出的钱比收到的多多少.在这一个问题中,每个人都准备了一 ...

  6. 第K短路+严格第K短路

    所谓K短路,就是从s到t的第K短的路,第1短就是最短路. 如何求第K短呢?有一种简单的方法是广度优先搜索,记录t出队列的次数,当t第k次出队列时,就是第k短路了.但点数过大时,入队列的节点过多,时间和 ...

  7. 题解 bzoj 4398福慧双修(二进制分组)

    二进制分组,算个小技巧 bzoj 4398福慧双修 给一张图,同一条边不同方向权值不同,一条边只能走一次,求从1号点出发再回到1号点的最短路 一开始没注意一条边只能走一次这个限制,打了个从一号点相邻节 ...

  8. 顺序表的C语言实现

    在现实应用中,有两种实现线性表数据元素存储功能的方法,分别是顺序存储结构和链式存储结构.顺序表操作是最简单的操作线性表的方法.下面的代码实现了顺序表的几种简单的操作.代码如下 //start from ...

  9. KMP+Tire树(模板)

    \(\color{Red}{KMP板子}\) #include <bits/stdc++.h> using namespace std; const int maxn=1e6+9; int ...

  10. Z - New Year Tree CodeForces - 620E 线段树 区间种类 bitset

    Z - New Year Tree CodeForces - 620E 这个题目还没有写,先想想思路,我觉得这个题目应该可以用bitset, 首先这个肯定是用dfs序把这个树转化成线段树,也就是二叉树 ...