14fabric node sdk1.4.8统计目前区块中的交易数
Posted 每天看一遍,防止恋爱&&堕落
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了14fabric node sdk1.4.8统计目前区块中的交易数相关的知识,希望对你有一定的参考价值。
文章目录
声明使用的版本
- fabric版本如下:1.4.8
- node-sdk版本:1.4.8
- node版本:v8.11.1
- ubuntu版本:16.04
本文要实现的功能
统计目前区块链中所有的交易信息
开始实现功能
了解block的结构体
之前说过,block对交易信息进行了封装,有的时候一个block包含有N个交易信息,这都是根据你在生成创世区块中设置的,相关设置如下
"Profiles":
"TwoOrgsOrdererGenesis":
"Orderer":
"OrdererType": "solo",
"Addresses": [
"orderer.zeng.com:7050"
],
"BatchTimeout": "2s",
"BatchSize":
"MaxMessageCount": 10,
"AbsoluteMaxBytes": "99 MB",
"PreferredMaxBytes": "512 KB"
,
...
先来频繁的进行交易
如果速度慢的话,每个区块就只有一个交易,那么不方便我们做测试,所以打算用最快的方式在几秒钟进行交易,则最快的方式是使用cli(可以多个节点同时提交)
export set CORE_PEER_LOCALMSPID=Org1MSP
export set CORE_PEER_ADDRESS=peer0.org1.zeng.com:7051
export set CORE_PEER_MSPCONFIGPATH=./crypto-config/peerOrganizations/org1.zeng.com/users/Admin@org1.zeng.com/msp
peer chaincode invoke -o orderer.zeng.com:7050 --tls true --cafile ./crypto-config/ordererOrganizations/zeng.com/tlsca/tlsca.zeng.com-cert.pem -C mychannel -n mycc -c '"Args":["invoke","a","b","40"]'
开始用sdk实现对应的功能
得到交易总数的思路
通过sdk官网提供的一行代码,给了我们思路
lock.data.data的长度,就代表了当前block的交易个数
写代码的思路
那么我们代码的思路如下
- 1、想办法得到最新区块的编号
- 2、从0开始到最大区块编号,调用按照编号获取区块的函数
- 3、累加统计每一个区块中交易的总数
按照思路实现代码
// 得到所有的交易信息
async function queryTransactionCount(orgAdminName, peerName, channelName)
try
// let config = getConfig();
const ccpPath = path.resolve(__dirname, "connect-sdk.json");
const ccp = JSON.parse(fs.readFileSync(ccpPath, 'utf8'));
const walletPath = path.join(process.cwd(), 'wallet');
const wallet = new FileSystemWallet(walletPath);
console.log(`Wallet path: $walletPath`);
// Check to see if we've already enrolled the user.
const userExists = await wallet.exists(orgAdminName);
if (!userExists)
console.log(`An identity for the user $orgAdminName does not exist in the wallet`);
console.log('Run the registerUser.js application before retrying');
return;
// Create a new gateway for connecting to our peer node.
const gateway = new Gateway();
await gateway.connect(ccp, wallet, identity: orgAdminName, discovery: enabled: true, asLocalhost: false );
// Get the network (channel) our contract is deployed to.
const client = gateway.getClient();
const target = client.getPeer(peerName);
const channel = client.getChannel(channelName);
const res = await channel.queryInfo(target, orgAdminName) // 返回当前块的信息
// console.log(res.height.low) // 得到当前最大块的编号
let totalTransCount = 0
for(let index = 0; index < res.height.low; index++)
let block = await channel.queryBlock(index, target)
// console.log(block.data.data.length)
totalTransCount += block.data.data.length
logger.debug("totalTransCount:", totalTransCount, " blockNum:", res.height.low)
catch (error)
console.error(`Failed to evaluate transaction: $error`);
process.exit(1);
调用测试
测试代码如下
async function test3()
const orgAdminName = "admin1"
const channelName = "mychannel"
const peerName = "peer0.org1.zeng.com"
const txId = "a36aaafac39eda715985ad25d547b61282822fac9e51a08e4fe5a44bd797b5b8"
await queryTransactionCount(orgAdminName, peerName, channelName)
test3();
调用后的输出内容
fabric-node2@fabric-node2:~/go/src/github.com/hyperledger/fabric-samples-1.4.8/first-network/test-crytogen/msp$ node chainCode.js
Wallet path: /home/fabric-node2/go/src/github.com/hyperledger/fabric-samples-1.4.8/first-network/test-crytogen/msp/wallet
[2021-04-27T10:02:06.028] [DEBUG] test - totalTransCount: 17 res.height.low: 10
假如当前区块有好几千万,如何做统计?
只能用数据库来保存,这是一个迭代的过程
整个部分所使用的头文件
'use strict';
const FileSystemWallet, Gateway, X509WalletMixin = require('fabric-network');
const Client = require('fabric-client');
const BlockDecoder = require('fabric-client/lib/BlockDecoder.js');
const ProtoLoader = require('fabric-client/lib/ProtoLoader');
const ledgerProto = ProtoLoader.load("fabric-client/lib" + '/protos/common/ledger.proto');
const utils = require('fabric-client/lib/utils.js');
const fs = require('fs');
const path = require('path');
const util = require('util');
const userOpt = require('./userOpt');
const incHashString, getConfig, loadWallet = require('./utils');
var log4js = require('log4js');
var getLogger = function(moduleName)
var logger = log4js.getLogger(moduleName);
// logger.setLevel('DEBUG');
logger.level = 'DEBUG';
return logger;
;
const logger = getLogger('test');
写在sdk的结束部分
这篇已经算是node sdk调用的最后一篇了,如果你顺利看到了这里,差不多sdk的功能你都已经能做出来了
接下来将要实现的一部分将为:
- 1、将sdk的功能封装到web中,期间需要涉及到node的web服务(正在纠结用koa还是express)
- 2、做一个建议的web管理系统,让用户进行使用(之前有用过vue,因为我个人原因又丢了一段时间)
- 3、补齐证书的生成部分(一直想要整理,但目前又太乱了)
参考网站
- Fabric v2.0 java-sdk 根据TXID查询区块并从区块解析数据
- Fabric区块链官方浏览器【中文版】
- fabric区块浏览器实践
- Fabric区块链官方浏览器【中文版】
- 超级账本Fabric查询历史交易的办法
- fabric node sdk官网对应block结构体的说明
以上是关于14fabric node sdk1.4.8统计目前区块中的交易数的主要内容,如果未能解决你的问题,请参考以下文章