Hyperledger Fabric——balance transfer(六)查询
balance transfer 提供了很多查询接口,包括链码查询,根据区块号查询区块数据,根据交易ID查询交易信息,查询链上的区块数,查询已安装或已实例化的链码,查询通道。
源码解析
1.调用链码查询:调用指定背书节点上部署的普通chaincode对状态数据库进行查询操作,该方法只会发送交易提案到目标节点,并不会产生新的交易发送给排序服务。
// 调用指定节点上部署的普通链码进行查询
app.get('/channels/:channelName/chaincodes/:chaincodeName', async function(req, res) {
var channelName = req.params.channelName;
var chaincodeName = req.params.chaincodeName;
let args = req.query.args;
let fcn = req.query.fcn;
let peer = req.query.peer;
// 处理参数
args = args.replace(/'/g, '"');
args = JSON.parse(args);
logger.debug(args);
let message = await query.queryChaincode(peer, channelName, chaincodeName, args, fcn, req.username, req.orgname);
res.send(message);
});
// query.js中的queryChaincode()方法
var queryChaincode = async function(peer, channelName, chaincodeName, args, fcn, username, org_name) {
try {
// 创建client和channel对象
var client = await helper.getClientForOrg(org_name, username);
var channel = client.getChannel(channelName);
// 构造查询请求
var request = {
targets : [peer], // 允许指定多个节点
chaincodeId: chaincodeName,
fcn: fcn,
args: args
};
// 调用SDK中的queryByChaincode()方法,内部调用sendTransactionProposal()
// 向所有目标背书节点发送生成的交易提案,并提取出所有提案响应中的payload组成一个list返回
let response_payloads = await channel.queryByChaincode(request);
// 从响应内容中解析出查询结果, response_payloads是一个list类型
// 其中每个元素都是一个字节数组(bytes array),对应每一个指定节点的查询结果
if (response_payloads) {
for (let i = 0; i < response_payloads.length; i++) {
logger.info(args[0]+' now has ' + response_payloads[i].toString('utf8') +
' after the move');
}
return args[0]+' now has ' + response_payloads[0].toString('utf8') +
' after the move';
} else {
logger.error('response_payloads is null');
return 'response_payloads is null';
}
} catch(error) {
logger.error('Failed to query due to error: ' + error.stack ? error.stack : error);
return error.toString();
}
};
2.根据区块号查询区块数据
app.get('/channels/:channelName/blocks/:blockId', async function(req, res) {
let blockId = req.params.blockId;
let peer = req.query.peer;
let message = await query.getBlockByNumber(peer, req.params.channelName, blockId, req.username, req.orgname);
res.send(message);
});
var getBlockByNumber = async function(peer, channelName, blockNumber, username, org_name) {
try {
// 创建client和channel对象
var client = await helper.getClientForOrg(org_name, username);
var channel = client.getChannel(channelName);
// 调用SDK中的queryBlock方法,内部调用sendTransactionProposal()发送交易提案到背书节点,
// 背书节点会调用 QSCC 系统链码中的 GetBlockByNumber 接口从链上获取区块数据
let response_payload = await channel.queryBlock(parseInt(blockNumber, peer));
if (response_payload) {
logger.debug(response_payload);
return response_payload;
} else {
logger.error('response_payload is null');
return 'response_payload is null';
}
} catch(error) {
logger.error('Failed to query due to error: ' + error.stack ? error.stack : error);
return error.toString();
}
};
总结
其他的查询方法与上面查询区块的方法类似,都是先调用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(六)查询的更多相关文章
- Hyperledger Fabric——balance transfer(一)启动示例
Blacne transfer是Hyperledger fabric Node SDK的一个示例应用,主要使用了SDK中fabric-client 和 fabric-ca-client 模块中的API ...
- Hyperledger Fabric——balance transfer(四)安装和实例化chaincode
详细解析blance transfer示例的安装(install)和实例化(Instantiate)链码(chaincode)的过程.安装chaincode会根据本地的链码文件生成chaincode镜 ...
- Hyperledger Fabric——balance transfer(三)创建和加入Channel
详细解析blance transfer示例的创建通道(Channel)和加入节点到通道的过程. 创建Channel 1.首先看app.js的路由函数 var createChannel = requi ...
- Hyperledger Fabric——balance transfer(二)注册用户
详细分析blance transfer示例的用户注册(register)与登录(enroll)功能. 源码分析 1.首先分析项目根目录的app.js文件中关于用户注册和登录的路由函数.注意这里的tok ...
- Hyperledger Fabric——balance transfer(五)执行交易
链码安装和实例化之后就可以调用chaincode执行交易,下面分析简单的账户转账操作是如何完成的. 源码分析 1.首先看app.js的路由函数 app.post('/channels/:channel ...
- 搭建基于hyperledger fabric的联盟社区(六) --搭建node.js服务器
接下来我要做的是用fabric sdk来做出应用程序,代替CLI与整个区块链网络交互.并且实现一个http API,向社区提供一个简单的接口,使社区轻松的与区块链交互. 官方虽然提供了Node.JS, ...
- Hyperledger Fabric 1.0 从零开始(六)——创建Fabric多节点集群
4:创建Fabric多节点集群 4.1.配置说明 首先可以根据官方Fabric自带的e2e_cli列子中的集群方案来生成我们自己的集群,与案例不同的是我们需要把容器都分配到不同的服务器上,彼此之间通过 ...
- hyperledger fabric 1.0.5 分布式部署 (六)
如何在相同的peer 节点上创建多个 channel 作者在hyperledger fabric 1.0.5 分布式部署 (五)已经向读者们介绍了一个简单的fabric 的部署流程,那么根据上一篇博客 ...
- Hyperledger Fabric 2.x 自定义智能合约
一.说明 为了持续地进行信息的更新,以及对账本进行管理(写入交易,进行查询等),区块链网络引入了智能合约来实现对账本的访问和控制:智能合约在 Fabric 中称之为 链码,是区块链应用的业务逻辑. 本 ...
随机推荐
- pv(PageView)的解释
http://blog.sina.com.cn/s/blog_5007d1b10100moka.html 本文转自hblxp32151CTO博客,原文链接:http://blog.51cto.com/ ...
- Geomesa-Hbase集群部署
本文记录一下Geomesa-Hbase集群部署,在单机部署的基础上 https://www.cnblogs.com/help-silence/p/12817447.html 1.搭建集群 https: ...
- Linux下进程的创建(system(); fork(); exec*())
0. system(); system()函数通过调用shell程序来执行所指向的命令(效率低),相当于先fork(),再execve(): 特点:原进程和子进程各自运行,且原进程需要等子进程运行完后 ...
- ISA Introduction
介绍一下X86.MIPS.ARM三种指令集: 1. X86指令集 X86指令集是典型的CISC(Complex Instruction Set Computer)指令集. X86指令集外部看起来是CI ...
- Mobile Communication
最近面试有被问到LTE,感觉说得不太清楚,重新整理一遍. 一.第一代移动通信系统 1G,诞生于1980年左右.模拟通信系统,抗干扰性能差,使用FDMA技术,主要用来传输话音信号,最拉风的就是" ...
- MES系统介绍(一)
由于本人从事的行业主要为Mes行业,所以这里准备介绍一下Mes系统的基础概念和实际运用,并且以自己做过的一个实际案例(包括代码)来详细描述自己对Mes系统的认识,帮助小白扫盲,望大神勿喷. MES系统 ...
- 多重背包转化成完全背包 E - Charlie's Change
http://poj.org/problem?id=1787 这个题目我一看就觉得是一个多重背包,但是呢,我不知道怎么输出路径,所以无可奈何,我就只能看一下题解了. 看了题解发现居然是把多重背包转化成 ...
- LeetCode--LinkedList--141.Linked List Cycle(Easy)
141. Linked List Cycle(Easy)2019.7.10 题目地址https://leetcode.com/problems/linked-list-cycle/ Given a l ...
- 【Scala】用实例弄清楚scala几种函数的定义和特点
文章目录 作为参数的函数 匿名函数 柯里化函数(currying) 闭包函数 作为参数的函数 scala> val a1 = Array(1,2,3,4) //这是一个数组 a1: Array[ ...
- 【Hadoop离线基础总结】MapReduce入门
MapReduce入门 Mapreduce思想 概述 MapReduce的思想核心是分而治之,适用于大量复杂的任务处理场景(大规模数据处理场景). 最主要的特点就是把一个大的问题,划分成很多小的子问题 ...